//此程序在硬件上测试通过,要弄懂的话就要去看看HT6221的时序图。
//此程序可以将读到的键值,地址码通过串口发送到计算机,上位机可用串口调试助手查看。
///C51的红外解码程序,可以根据需要自己修改:
////////////////////////////
//11.0592Mhz
#include //根据自己的接线来改 sbit IRIN = P3^2; //红外接收器数据线 sbit led = P3^7; //指示灯 //////////////////////////////////////////// //定义数组IRCOM,分别装解码后得到的数据 //IRCOM[0] 低8位地址码 //IRCOM[1] 高8位地址码 //IRCOM[2] 8位数据码 //IRCOM[3] 8位数据码的反码 ///////////////////////////////////////////// #define uchar unsigned char #define uint unsigned int uchar IRCOM[4]=0; bit flag=0; bit flagcom=0; //串口发送标志 /********************/ void delay014ms(unsigned char x); //x*0.14MS void IR_init(void); void delay014ms(unsigned char x) //x*0.14MS STC10F04延时约0.15MS { unsigned char i; while(x--) { for (i = 0; i<125; i++) //13 {;} } } /////////////// //初始化 //////////// void IR_init(void) { EA=1; EX0=1; //允许总中断中断,使能 INT0 外部中断 IT0=1; //触发方式为脉冲负边沿触发 IRIN=1; //I/O口初始化 } ////////// //解码过程 ////////////// void IR_CODE(void) interrupt 0 //在外部中断子程序中解码 { unsigned char j,k,N=0; EX0 = 0; delay014ms(15); if (IRIN==1) { EX0 =1; return; } //确认IR信号出现 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。 {delay014ms(1);} for (j=0;j<4;j++) //收集四组数据 { for (k=0;k<8;k++) //每组数据有8位 { while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。 {delay014ms(1);} while (!IRIN) //等 IR 变为高电平 {delay014ms(1);} while (IRIN) //计算IR高电平时长 { delay014ms(1); N++; if (N>=30) { EX0=1; return;} //0.14ms计数过长自动离开。 } //高电平计数完毕 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补"0" if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补"1" N=0; } } if (IRCOM[2]!=~IRCOM[3]) //不等的话表示解码失败 { IRCOM[4]=0; EX0=1; return; } flagcom = 1; //正确解码后,置串口发送标志 flag = !flag;//pro();//解码成功后运行的程序 EX0=1; return; } //主程序 void main(void) { unsigned char k; IR_init( ); //初始化外部中断0 SCON=0x50; //串口 方式 1 TMOD=0x20; //T1 方式 1 TL1=0xfd; //波特率 9600 的常数 TH1=0xfd; TR1=1; //开定时器1 flag = 0; while(1) { led=flag; if(flagcom) { flagcom = 0; for(k=0;k<4;k++) { SBUF=IRCOM[k]; //串口输出键盘输入的值 while(TI==0); //是否发送完毕 TI=0; } } } }