//**************************************************************
//名称:代码()
/*--------------------------------------------------------------
描述 :
一般红外电视遥控器万能遥控器代码表的输出都是用编码后串行数据对38~40kHz的方波进行
脉冲幅度调制而产生 的.当发射器按键按下后万能遥控器代码表,即有遥控码发出,所按的键
不合 遥控编码也不合 。这种遥控码具有以下特点 万能遥控器代码表:
采取 脉宽调制的串行码,以脉宽为0.565ms、距离 0.56ms、周期为1.125ms的
组合表示 二进制的“0”万能遥控器代码表;以脉宽为0.565ms、距离 1.685ms、周期为2.25ms
的组合表示 二进制的“1”。上述“0”和“1”构成 的32位二进制码经38kHz
的载频进行二次调制,然后再经由过程 红外发射二极管产生 红外线向空间发射。
一般电视遥控器的遥控编码是持续 的32位二进制码组,个中 前16位为用户识
别码,能差别 不合 的红外遥控设备 ,防止不合 机种遥控码互相干 扰。后16位
为8位的操作码和8位的操作反码,用于查对 数据是否接收 精确 。
根据 红外编码的格局 ,发送数据前须要 先发送9ms的肇端 码和4.5ms的成果 码。
接收 方一般应用 TL0038一体化红外线接收 器进行接收 解码,当TL0038接收 到
38kHz红外旌旗灯号 时,输出端输出低电平,不然 为高电平。
所以红外遥控器发送红外旌旗灯号 时,参考上面遥控串行数据编码波形图,在低
电平处发送38kHz红外旌旗灯号 ,高电平处则不发送红外旌旗灯号 。
----------------------------------------------------------------*/
//编辑 :js
//日期:2008.12.31
//****************************************************************
展开 全文
#define uchar unsigned char //定义 一下便利 应用
#define uint unsigned int
#define ulong unsigned long
#include reg51.h //包含 一个51标准 内核的头文件
static bit OP; //红外发射管的亮灭
static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char flag; //红外发送标记
char iraddr1; //十六位地址的第一个字节
char iraddr2; //十六位地址的第二个字节
void SendIRdata(char p_irdata);
void delay();
//**************************************************************
void main(void)
{
count=0;
flag=0;
OP=0;
P3_4=0;
EA = 1; //许可 CPU中断
TMOD = 0x11; //设准时 器0和1为16位模式1
ET0 = 1; //准时 器0中断 许可
TH0 = 0xFF;
TL0 = 0xE6; //设准时 值0为38K 也就是每隔26us中断 一次
TR0 = 1; //开端 计数
iraddr1=3;
iraddr2=252;
do{
delay();
SendIRdata(12);
}
while(1);
}
//**************************************************************
//准时 器0中断 处理
void timeint(void) 1
{
TH0=0xFF;
TL0=0xE6; //设准时 值为38K 也就是每隔26us中断 一次
count++;
if (flag==1)
{OP=~OP;}
else
{OP = 0;}
P3_4 = OP;
}
//**************************************************************
void SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata;
//发送9ms的肇端 码
endcount=223;
flag=1;
count=0;
do{}while(count)
//发送4.5ms的成果 码
endcount=117;
flag=0;
count=0;
do{}while(count)
//----------------------发送十六位地址的前八位-------------------
irdata=iraddr1;
for(i=0;i8;i++)
{
//先发送0.56ms的38KHZ红外波
endcount=10; //(即编码中0.56ms的低电平)
flag=1;
count=0;
do{}while(count)
//停止 发送红外旌旗灯号 (即编码中的高电平)
if(irdata-(irdata/2)*2) //断定 个位为1照样 0
{ endcount=41; //1为宽的高电平
}
else
{ endcount=15; //0为窄的高电平
}
flag=0;
count=0;
do{}while(count)
irdata=irdata1;
}
//-----------------------发送十六位地址的后八位-------------------
irdata=iraddr2;
for(i=0;i8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count)
if(irdata-(irdata/2)*2)
{endcount=41;}
else
{endcount=15;}
flag=0;
count=0;
do{}while(count)
irdata=irdata1;
}
//-----------------------发送八位数据------------------------------
irdata=p_irdata;
for(i=0;i8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count)
if(irdata-(irdata/2)*2)
{endcount=41;}
else
{ endcount=15;}
flag=0;
count=0;
do{}while(count)
irdata=irdata1;
}
//-------------------------发送八位数据的反码----------------------
irdata=~p_irdata;
for(i=0;i8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count)
if(irdata-(irdata/2)*2)
{endcount=41;}
else
{endcount=15;}
flag=0;
count=0;
do{}while(count)
irdata=irdata1;
}
endcount=10;
flag=1;
count=0;
do{}while(count) flag=0;
}
//**************************************************************
void delay()
{
int i,j;
for(i=0;i400;i++)
{
for(j=0;j100;j++) { };
}
}
原文链接: