51單片機輕松入門—基于STC15W4K系列(C語言版)
李友全 編著 詳見:http://www.zg4o1577.cn/bbs/dpj-37954-1.html
第18章 紅外通信 1 電路圖 2 程序移植
0.png (203.99 KB, 下載次數: 187)
下載附件
2016-3-28 23:03 上傳
紅外遙控普遍運用在家用電器上,在工業控制中,對于存在高壓、輻射、有毒 氣體、粉塵等場合,可以使用紅外遙控。
1電路圖 1號單片機與紅外接收頭連接電路如圖所示,紅外接收頭一般都可互換使用。
1.png (130 KB, 下載次數: 207)
下載附件
2016-3-28 23:03 上傳
2 程序移植
例18.4 紅外接收數據,使用一個定時器模擬外中斷方式,并通過串口發送接收到的用戶碼 與鍵碼,R/C時鐘:22.1184MHz,波特率9600, 要求串口助手按字符格式顯示。 程序優點:通用性極強,可使用任意IO口接收紅外數據,紅外接收部分自適應R/C時鐘頻率 5~35M,模擬串口輸出部分需要根據R/C時鐘頻率調整延時函數參數,此程序移植時只需更 改紅外接收引腳定義與模擬串口發送引腳即可。 #include "STC15W4K.H" #define MAIN_Fosc 22.1184 // 定義主時鐘, 紅外接收會自動適應5~36MHZ, #define User_code 0xFD02 // 定義紅外接收用戶碼 sbit Ir_Pin = P3^6; // 定義紅外接收輸入端口 sbit TXD1 = P3^1; // 定義模擬串口發送腳 void InitTimer0(void) { TMOD = 0x01; // 16位計數方式. TH0 = Timer0_Reload / 256; TL0 = Timer0_Reload % 256; ET0 = 1; TR0 = 1; EA = 1; } void main(void) { InitTimer0(); // 初始化Timer0 PrintString("定時器0初始化完畢\r\n"); // 上電后串口發送一條提示信息 while(1) { if(IR_OK) // 接收到一幀完整的紅外數據 { PrintString("紅外鍵碼: 0x"); // 提示紅外鍵碼 Tx1Send(HEX2ASCII(IR_code >> 4)); // 鍵碼高半字節 Tx1Send(HEX2ASCII(IR_code)); // 鍵碼低半字節 if(IrUserErr) // 用戶碼錯誤,則發送用戶碼 { Tx1Send(' '); // 發空格 Tx1Send(' '); // 發空格 PrintString("用戶碼: 0x"); // 提示用戶碼 Tx1Send(HEX2ASCII(IR_UserH >> 4)); // 用戶碼高字節的高半字節 Tx1Send(HEX2ASCII(IR_UserH)); // 用戶碼高字節的低半字節 Tx1Send(HEX2ASCII(IR_UserL >> 4)); // 用戶碼低字節的高半字節 Tx1Send(HEX2ASCII(IR_UserL)); // 用戶碼低字節的低半字節 } Tx1Send(0x0d); // 發回車 Tx1Send(0x0a); // 發回車 IR_OK = 0; // 清除IR鍵按下標志 } } }
程序運行結果如下圖所示。
2.png (310.73 KB, 下載次數: 192)
下載附件
2016-3-28 23:03 上傳
只要單片機能獲取紅外鍵碼,單片機就可根據不同的鍵碼執行不同的控制功能。
程序:
1.1—IR查詢方式解碼:
2.3—IR-中斷方式(復雜的)
IR中斷方式(簡單版)的單片機紅外解碼程序:http://www.zg4o1577.cn/bbs/dpj-47283-1.html
只用一個單片機定時器的紅外接收解碼程序:http://www.zg4o1577.cn/bbs/dpj-47284-1.html
全部完整的4個源碼請下載附件:
第18章 紅外通信.rar
(84.33 KB, 下載次數: 169)
2016-3-28 23:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|