红外线接受程序 理解
生活随笔
收集整理的這篇文章主要介紹了
红外线接受程序 理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 /**************************************************************************************
2 * 紅外通信實驗 *
3 實現現象:下載程序后,數碼管顯示紅外遙控鍵值數據
4 注意事項: 紅外遙控器內的電池絕緣片一定要抽掉
5 通過該函數可以控制很多東西,因為每個按鍵都有一個固定的16定制的編碼,故而通過if語句來進行判斷這個
6 鍵是否按下,當按下的時候,就可以執行相應的動作
7 ***************************************************************************************/
8
9 #include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
10
11
12 typedef unsigned int u16; //對數據類型進行聲明定義
13 typedef unsigned char u8;
14
15 sbit LSA=P2^2;
16 sbit LSB=P2^3;
17 sbit LSC=P2^4;
18
19 sbit IRIN=P3^2;
20
21 u8 IrValue[6];
22 u8 Time;
23
24 u8 DisplayData[8];
25 u8 code smgduan[17]={
26 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
27 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
28 //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的顯示碼
29
30 /*******************************************************************************
31 * 函 數 名 : delay
32 * 函數功能 : 延時函數,i=1時,大約延時10us
33 *******************************************************************************/
34 void delay(u16 i)
35 {
36 while(i--);
37 }
38
39
40 /*******************************************************************************
41 * 函數名 :DigDisplay()
42 * 函數功能 :數碼管顯示函數
43 * 輸入 : 無
44 * 輸出 : 無
45 *******************************************************************************/
46 void DigDisplay()
47 {
48 u8 i;
49 for(i=0;i<3;i++)
50 {
51 switch(i) //位選,選擇點亮的數碼管,
52 {
53 case(0):
54 LSA=0;LSB=0;LSC=0; break;//顯示第0位
55 case(1):
56 LSA=1;LSB=0;LSC=0; break;//顯示第1位
57 case(2):
58 LSA=0;LSB=1;LSC=0; break;//顯示第2位
59 }
60 P0=DisplayData[2-i];//發送數據
61 delay(100); //間隔一段時間掃描
62 P0=0x00;//消隱
63 }
64 }
65
66
67 /*******************************************************************************
68 * 函數名 : IrInit()
69 * 函數功能 : 初始化紅外線接收
70 * 輸入 : 無
71 * 輸出 : 無
72 *******************************************************************************/
73
74 void IrInit()
75 {
76 IT0=1;//下降沿觸發 由于P3^2的引腳剛好連的是單片機的外部中斷0 ,故而通過外部中斷0來判斷起始碼9ms和4.5ms
77 EX0=1;//打開中斷0允許
78 EA=1; //打開總中斷
79
80 IRIN=1;//初始化端口 紅外接收端的引腳
81 }
82
83
84 /*******************************************************************************
85 * 函 數 名 : main
86 * 函數功能 : 主函數
87 * 輸 入 : 無
88 * 輸 出 : 無
89 *******************************************************************************/
90 void main()
91 {
92 IrInit();
93 while(1)
94 {
95 DisplayData[0] = smgduan[IrValue[2]/16];//得到16位數的高位
96 DisplayData[1] = smgduan[IrValue[2]%16];//得到16位數的低位
97 DisplayData[2] = smgduan[16];//數碼管前面定義的16為字母 H
98 DigDisplay();
99 }
100 }
101
102 /*******************************************************************************
103 * 函數名 : ReadIr()
104 * 函數功能 : 讀取紅外數值的中斷函數
105 * 輸入 : 無
106 * 輸出 : 無
107 *******************************************************************************/
108
109 void ReadIr() interrupt 0
110 {
111 u8 j,k;
112 u16 err;
113 Time=0;
114 delay(700); //7ms
115 if(IRIN==0) //確認是否真的接收到正確的信號
116 {
117
118 err=1000; //1000*10us=10ms,超過說明接收到錯誤的信號
119 /*當兩個條件都為真是循環,如果有一個條件為假的時候跳出循環,免得程序出錯的時
120 侯,程序死在這里*/
121 while((IRIN==0)&&(err>0)) //等待前面9ms的低電平過去
122 {
123 delay(1);
124 err--;
125 }
126 if(IRIN==1) //如果正確等到9ms低電平
127 {
128 err=500;
129 while((IRIN==1)&&(err>0)) //等待4.5ms的起始高電平過去
130 {
131 delay(1);
132 err--;
133 }
134 for(k=0;k<4;k++) //共有4組數據
135 {
136 for(j=0;j<8;j++) //接收一組數據
137 {
138
139 err=60;
140 while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
141 {
142 delay(1);
143 err--;
144 }
145 err=500;
146 while((IRIN==1)&&(err>0)) //計算高電平的時間長度。
147 {
148 delay(10); //0.1ms
149 Time++;
150 err--;
151 if(Time>30)
152 {
153 return;
154 }
155 }
156 IrValue[k]>>=1; //k表示第幾組數據 將四組字節放入其中
157 if(Time>=8) //如果高電平出現大于565us,那么是1 如果Time =8的時候,表示時間為0.1mS*8=0.8ms
158 {
159 IrValue[k]|=0x80; /*當時間大于565us的時候,為位1 這里相當于讀取(因為已經通過時間確定了位0還是位1相當于寫入了)
160 這個數據 ,因為是讀,故而才將IrValue[k]>>=1;放在IrValue[k]|=0x80;的上面
161 將其先放在高位,之后通過上面的IrValue[k]>>=1;
162 這個語句將其移到下一位 ,這樣就可以將其8位依次由低位移到高位 */
163 }
164 Time=0; //用完時間要重新賦值 當用Time確定完之后,就要重新賦0,一邊下一次使用
165 }
166 }
167 }
168 if(IrValue[2]!=~IrValue[3]) //用于判斷收到的數據是否正確 ,如果不正確,強行退出
169 {
170 return;
171 }
172 }
173 } View Code
?
轉載于:https://www.cnblogs.com/wises/p/9557572.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的红外线接受程序 理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue-cli代理解决跨域问题
- 下一篇: .net core mysql Code