HT6221发送红外HS0038解码程序
1 可以用,要弄懂的话就要去看看HT6221的时序图。 2 3 C51的红外解码程序,可以根据需要自己修改: 4 ///////////////////////////////////////////// 5 //12Mhz 6 //根据自己的接线来改 7 sbit IRIN = P3^2; //红外接收器数据线 8 ///////////////////////////////////////////// 9 10 //////////////////////////////////////////// 11 //定义数组IRCOM,分别装解码后得到的数据 12 //IRCOM[0] 低8位地址码 13 //IRCOM[1] 高8位地址码 14 //IRCOM[2] 8位数据码 15 //IRCOM[3] 8位数据码的反码 16 ///////////////////////////////////////////// 17 uchar IRCOM[4]=0; 18 19 #define uchar unsigned char 20 #define uint unsigned int 21 /********************************************/ 22 void delay014ms(unsigned char x); //x*0.14MS 23 void IR_init(void); 24 void IR_CODE(void); 25 26 void delay014ms(unsigned char x) //x*0.14MS 27 { 28 unsigned char i; 29 while(x--) 30 { 31 for (i = 0; i<13; i++) {} 32 } 33 } 34 35 /////////////////////////////////////// 36 //初始化 37 ////////////////////////////////////// 38 void IR_init(void) 39 { 40 EX0=1; //允许总中断中断,使能 INT0 外部中断 41 TCON = 0x01; //触发方式为脉冲负边沿触发 42 IRIN=1; //I/O口初始化 43 } 44 45 ///////////////////////////////////// 46 //解码过程 47 ///////////////////////////////////// 48 void IR_CODE(void) 49 { 50 unsigned char j,k,N=0; 51 EX0 = 0; 52 delay014ms(15); 53 if (IRIN==1) 54 { EX0 =1; 55 return; 56 } //确认IR信号出现 57 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。 58 {delay014ms(1);} 59 60 for (j=0;j<4;j++) //收集四组数据 61 { 62 for (k=0;k<8;k++) //每组数据有8位 63 { 64 while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。 65 {delay014ms(1);} 66 while (!IRIN) //等 IR 变为高电平 67 {delay014ms(1);} 68 while (IRIN) //计算IR高电平时长 69 { 70 delay014ms(1); 71 N++; 72 if (N>=30) 73 { EX0=1; 74 return;} //0.14ms计数过长自动离开。 75 } //高电平计数完毕 76 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0” 77 if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1” 78 N=0; 79 } 80 } 81 if (IRCOM[2]!=~IRCOM[3]) //不等的话表示解码失败 82 { 83 IRCOM[4]=0; 84 EX0=1; 85 return; 86 } 87 88 pro();//解码成功后运行的程序 89 EX0=1; 90 return; 91 }
所谓解码就是能用单片机把以不同宽度的脉冲区别开来,一种比较好思路就是计算两次下降沿间隔时间,当单片机外部中断1口有下降沿时中断一次,并启动定时器,定时器定50us,当下次下降沿到来时我们计算定时器中断的次数,这样我们就能很好的区分不同宽度的脉冲了。实际上,我们红外接收头收到的信号的是有毛刺的,在下降沿中断触发后,要做延时去抖处理。