文档介绍:用AT89S51单片机制作红外电视遥控器
38〜40kHz的方波进
一般红外电视遥控器的输出都是用编码后串行数据对 行脉冲幅度调制而产生的。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。 这 种遥控码具有以下特征: 0xE6; //设定时值0为38K也就是每隔26us中断一次
TR0 = 1 ;//开始计数
iraddr1=3; iraddr2=252;
do{
delay();
SendIRdata(12);
} while (1);
}
//定时器0中断处理
void timeint( void) interrupt 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<endcount);
//发送的结果码 endcount=117
flag=0;
count=0;
do。while (count<endcount);
//发送十六位地址的前八位
irdata=iraddr1;
for (i=0;i<8;i++)
{
//先发送的38KH0外波(即编码中的低电平) endcount=10;
flag=1;
count=0;
do{} while (count<endcount);
//停止发送红外信号(即编码中的高电平)
if (irdata-(irdata/2)*2)//判断二进制数个位为1还是0
{
endcount=41; //1 为宽的高电平 } else { endcount=15; //0为窄的高电平 } flag=0; count=0; do{} while (count<endcount);
irdata=irdata>>1;
}
//发送十六位地址的后八位 irdata=iraddr2;
for (i=0;i<8;i++) {
endcount=10; flag=1; count=0;
do。while (count<endcount);
if (irdata-(irdata/2)*2) {
endcount=41;
} else { endcount=15;
} flag=0;
count=0;
do{} while (count<endcount);
irdata=irdata>>1;
}
//发送八位数据 irdata=p_irdata;
for( i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do。while (count<endcount);
if( irdata-(irdata/2)*2)
{
endcount=41;
} else { endcount=15;
}
flag=0;
count=0