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,当下次下降沿到来时我们计算定时器中断的次数,这样我们就能很好的区分不同宽度的脉冲了。实际上,我们红外接收头收到的信号的是有毛刺的,在下降沿中断触发后,要做延时去抖处理。