HT6221發(fā)送紅外HS0038解碼程序
1 可以用,要弄懂的話就要去看看HT6221的時序圖。
2
3 C51的紅外解碼程序,可以根據(jù)需要自己修改:
4 /////////////////////////////////////////////
5 //12Mhz
6 //根據(jù)自己的接線來改
7 sbit IRIN = P3^2; //紅外接收器數(shù)據(jù)線
8 /////////////////////////////////////////////
9
10 ////////////////////////////////////////////
11 //定義數(shù)組IRCOM,分別裝解碼后得到的數(shù)據(jù)
12 //IRCOM[0] 低8位地址碼
13 //IRCOM[1] 高8位地址碼
14 //IRCOM[2] 8位數(shù)據(jù)碼
15 //IRCOM[3] 8位數(shù)據(jù)碼的反碼
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; //觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)
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 } //確認(rèn)IR信號出現(xiàn)
57 while (!IRIN) //等IR變?yōu)楦唠娖?,跳過9ms的前導(dǎo)低電平信號。
58 {delay014ms(1);}
59
60 for (j=0;j<4;j++) //收集四組數(shù)據(jù)
61 {
62 for (k=0;k<8;k++) //每組數(shù)據(jù)有8位
63 {
64 while (IRIN) //等 IR 變?yōu)榈碗娖?,跳過4.5ms的前導(dǎo)高電平信號。
65 {delay014ms(1);}
66 while (!IRIN) //等 IR 變?yōu)楦唠娖?/p>
67 {delay014ms(1);}
68 while (IRIN) //計算IR高電平時長
69 {
70 delay014ms(1);
71 N++;
72 if (N>=30)
73 { EX0=1;
74 return;} //0.14ms計數(shù)過長自動離開。
75 } //高電平計數(shù)完畢
76 IRCOM[j]=IRCOM[j] >> 1; //數(shù)據(jù)最高位補(bǔ)“0”
77 if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //數(shù)據(jù)最高位補(bǔ)“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 }
所謂解碼就是能用單片機(jī)把以不同寬度的脈沖區(qū)別開來,一種比較好思路就是計算兩次下降沿間隔時間,當(dāng)單片機(jī)外部中斷1口有下降沿時中斷一次,并啟動定時器,定時器定50us,當(dāng)下次下降沿到來時我們計算定時器中斷的次數(shù),這樣我們就能很好的區(qū)分不同寬度的脈沖了。實際上,我們紅外接收頭收到的信號的是有毛刺的,在下降沿中斷觸發(fā)后,要做延時去抖處理。