/*
89C52RC 12M晶振 红外发射试验,
在红外解码和机顶盒上都测试可用!
发射的编码是 SendIRdata(0x48,0x77,0x01);这个一个向下的按键编码
红外发射管的正极接VCC 5V
红外发射管的负极接21号引脚
*/
#include <REG51.h>
static bit wave; //红外发射管的亮灭
static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
static bit flag; //红外发送标志
sbit Send_wave=P2^0;
void delay(){ //1秒的延时
int i,j;
for(i=0;i<400;i++) {
for(j=0;j<100;j++) {
}
}
}
void SendByte(unsigned char OneByte){ //发送一个8bit数据
unsigned char irdata,i;
irdata=OneByte;
for(i=0;i<8;i++) {
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata & 1){endcount=41;} //如果末位是1,电平持续时间会长一些
else{ endcount=15;} //如果末位是0,电平持续时间短长一些
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
}
void SendIRdata(char usercode1,char usercode2,char keycode){
endcount=223; //发送9ms的起始码,在接受端的红外一体化输出,会有一个下降沿
flag=1;
count=0;
do{}while(count<endcount);
endcount=117; //发送4.5ms的结果码
flag=0;
count=0;
do{}while(count<endcount);
SendByte(usercode1); //发送十六位地址的前八位
SendByte(usercode2); //发送十六位地址的后八位
SendByte(keycode); //发送编码
SendByte(~keycode); //发送编码的反码
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
flag=0;
}
void timeinit(void){ //12M晶振 产生38K载波
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
TH0 = 0xFF;
TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次
TR0 = 1;//开始计数
}
void main(void) {
count = 0;
flag = 0;
wave = 0;
Send_wave = 0;
timeinit();
while(1){
delay();
SendIRdata(0x48,0x77,0x01);
}
}
//定时器0中断处理
void timeint(void) interrupt 1 { //12M晶振,产生38K的载波
TH0=0xFF;
TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
count++;
if (flag){wave=~wave;}
else{wave = 0;}
Send_wave = wave;
}
经典程序2: 不用红外与机顶盒交互
/*
89C52RC 12M晶振 不用任何红外,用连线的方式,与机顶盒交互
在机顶盒上测试可用!
发射的编码是