HT6221發(fā)送紅外HS0038解碼程序
1 可以用,要弄懂的話就要去看看HT6221的時(shí)序圖。
2
3 C51的紅外解碼程序,可以根據(jù)需要自己修改:
4 /////////////////////////////////////////////
5 //12Mhz
6 //根據(jù)自己的接線來(lái)改
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 //解碼過(guò)程
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信號(hào)出現(xiàn)
57 while (!IRIN) //等IR變?yōu)楦唠娖?,跳過(guò)9ms的前導(dǎo)低電平信號(hà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)榈碗娖?,跳過(guò)4.5ms的前導(dǎo)高電平信號(hào)。
65 {delay014ms(1);}
66 while (!IRIN) //等 IR 變?yōu)楦唠娖?/p>
67 {delay014ms(1);}
68 while (IRIN) //計(jì)算IR高電平時(shí)長(zhǎng)
69 {
70 delay014ms(1);
71 N++;
72 if (N>=30)
73 { EX0=1;
74 return;} //0.14ms計(jì)數(shù)過(guò)長(zhǎng)自動(dòng)離開(kāi)。
75 } //高電平計(jì)數(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();//解碼成功后運(yùn)行的程序
89 EX0=1;
90 return;
91 }
所謂解碼就是能用單片機(jī)把以不同寬度的脈沖區(qū)別開(kāi)來(lái),一種比較好思路就是計(jì)算兩次下降沿間隔時(shí)間,當(dāng)單片機(jī)外部中斷1口有下降沿時(shí)中斷一次,并啟動(dòng)定時(shí)器,定時(shí)器定50us,當(dāng)下次下降沿到來(lái)時(shí)我們計(jì)算定時(shí)器中斷的次數(shù),這樣我們就能很好的區(qū)分不同寬度的脈沖了。實(shí)際上,我們紅外接收頭收到的信號(hào)的是有毛刺的,在下降沿中斷觸發(fā)后,要做延時(shí)去抖處理。