/* 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晶振 不用任何红外,用连线的方式,与机顶盒交互 在机顶盒上测试可用! 发射的编码是 SendIRdata(0x48,0x77,0x01);这个一个向下的按键编码 机顶盒的GND接单片机的GND 机顶盒的红外接收引脚接单片机第21号引脚 注意是:接的是机顶盒 一体化红外接收的OUT引脚 */ #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;} if (flag){wave=1;} else{wave = 0;} Send_wave = ~wave; }
初级程序
/* 12T 单片机红外发射程序 单片机的GND接红外二极管的GND 单片机的IO接红外二极管的正极 红外二极管的正极上拉一个500欧电阻到VCC */ #include <REG51.h> sfr AUXR = 0x8E; static bit OP; //红外发射管的亮灭 static unsigned int count; //延时计数器 static unsigned int endcount; //终止延时计数 static unsigned char flag; //红外发送标志 sbit P3_4=P0^0; char iraddr1; //十六位地址的第一个字节 char iraddr2; //十六位地址的第二个字节 void delay() { int i,j; for(i=0;i<400;i++) { for(j=0;j<100;j++) { } } } void SendIRdata(char usercode1,char usercode2,char keycode) { int i; char irdata=usercode1; //发送9ms的起始码 endcount=223; flag=1; count=0; do{}while(count<endcount); //发送4.5ms的结果码 endcount=117; flag=0; count=0; do{}while(count<endcount); //发送十六位地址的前八位 irdata=usercode1; 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; } // for(i=0;i<8;i++) // { // //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平) // 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=usercode2; 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=keycode; 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=~keycode; 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; } endcount=10; flag=1; count=0; do{}while(count<endcount); flag=0; } 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;//开始计数 do{ delay(); SendIRdata(0x48,0x77,0x11); delay(); SendIRdata(0x48,0x77,0x12); delay(); SendIRdata(0x48,0x77,0x13); delay(); SendIRdata(0x48,0x77,0x14); delay(); SendIRdata(0x48,0x77,0x15); delay(); SendIRdata(0x48,0x77,0x16); delay(); SendIRdata(0x48,0x77,0x17); delay(); SendIRdata(0x48,0x77,0x18); delay(); SendIRdata(0x48,0x77,0x19); delay(); SendIRdata(0x48,0x77,0x10); delay(); SendIRdata(0x48,0x77,0x00); delay(); SendIRdata(0x48,0x77,0x01); delay(); SendIRdata(0x48,0x77,0x02); delay(); SendIRdata(0x48,0x77,0x03); delay(); SendIRdata(0x48,0x77,0x1F); }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; }
单片机的GND接红外接收头的GND
单片机的IO接红外接收头的TTL输出引脚
/* 89C52 @12M */ #include <REG51.h> sfr AUXR = 0x8E; static bit RealOutput; //红外发射管的亮灭 static unsigned int count; //延时计数器 static unsigned int endcount; //终止延时计数 static unsigned char flag; //红外发送标志 sbit Send_ISR=P2^0; sbit Runled =P2^1; char iraddr1; //十六位地址的第一个字节 char iraddr2; //十六位地址的第二个字节 unsigned char code key_0=0x10; unsigned char code key_1=0x11; unsigned char code key_2=0x12; unsigned char code key_3=0x13; unsigned char code key_4=0x14; unsigned char code key_5=0x15; unsigned char code key_6=0x16; unsigned char code key_7=0x17; unsigned char code key_8=0x18; unsigned char code key_9=0x19; unsigned char code key_up=0x19; unsigned char code key_down=0x19; unsigned char code key_left=0x19; unsigned char code key_right=0x19; unsigned char code key_menu=0x19; unsigned char code key_ok=0x19; unsigned char code key_back=0x1C; void delay(unsigned int a){ //12m@12t 1ms unsigned int i; while ( --a != 0 ) for (i=0;i<=20;i++); } void SendCode(unsigned char Code){ unsigned char irdata,i; irdata=Code; for(i=0;i<8;i++) { endcount=10; flag=1; count=0; do{}while(count<endcount); if(irdata%2) {endcount=41;} else{endcount=15;} flag=0; count=0; do{}while(count<endcount); irdata=irdata>>1; } } void SendIRdata(char keycode){ char usercode1=0x11; char usercode2=0x11; char irdata=usercode1; endcount=223; //发送9ms的起始码,. flag=1; count=0; do{}while(count<endcount); endcount=117; //发送4.5ms的结果码 flag=0; count=0; do{}while(count<endcount); SendCode(usercode1); SendCode(usercode2); SendCode(keycode); SendCode(~keycode); endcount=100; flag=1; count=0; do{}while(count<endcount); flag=0; } void main(void) { count = 0; flag = 0; RealOutput = 0; Send_ISR = 0; EA = 1; //允许CPU中断 TMOD = 0x11; //设定时器0和1为16位模式1 ET0 = 1; //定时器0中断允许 TH0 = 0xFF; TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次 TR0 = 1; //开始计数 while(1){ SendIRdata(key_0); delay(1000); SendIRdata(key_1); delay(1000); // Runled=!Runled; // delay(1000); } } void timeint(void) interrupt 1 { TH0=0xFF; TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次 count++; // if (flag) {RealOutput=~RealOutput;} if (flag) {RealOutput=0;} else{RealOutput = 1;} Send_ISR = RealOutput; }
编译
Rebuild target 'Target 1' assembling STARTUP.A51... compiling send_ISR.C... linking... Program Size: data=17.1 xdata=0 code=337 creating hex file from "Send_ISR"... "Send_ISR" - 0 Error(s), 0 Warning(s).
本文出自 “魂斗罗” 博客,谢绝转载!