標題: 第18章-單片機紅外通信 [打印本頁]
作者: wul 時間: 2016-3-28 23:22
標題: 第18章-單片機紅外通信
51單片機輕松入門—基于STC15W4K系列(C語言版)
李友全 編著 詳見:http://www.denmoz.com/bbs/dpj-37954-1.html
第18章 紅外通信
1 電路圖
2 程序移植
0.png (203.99 KB, 下載次數(shù): 187)
下載附件
2016-3-28 23:03 上傳
紅外遙控普遍運用在家用電器上,在工業(yè)控制中,對于存在高壓、輻射、有毒
氣體、粉塵等場合,可以使用紅外遙控。
1電路圖
1號單片機與紅外接收頭連接電路如圖所示,紅外接收頭一般都可互換使用。
1.png (130 KB, 下載次數(shù): 207)
下載附件
2016-3-28 23:03 上傳
2 程序移植
例18.4 紅外接收數(shù)據(jù),使用一個定時器模擬外中斷方式,并通過串口發(fā)送接收到的用戶碼 與鍵碼,R/C時鐘:22.1184MHz,波特率9600, 要求串口助手按字符格式顯示。 程序優(yōu)點:通用性極強,可使用任意IO口接收紅外數(shù)據(jù),紅外接收部分自適應R/C時鐘頻率
5~35M,模擬串口輸出部分需要根據(jù)R/C時鐘頻率調整延時函數(shù)參數(shù),此程序移植時只需更
改紅外接收引腳定義與模擬串口發(fā)送引腳即可。
#include "STC15W4K.H"
#define MAIN_Fosc 22.1184 // 定義主時鐘, 紅外接收會自動適應5~36MHZ,
#define User_code 0xFD02 // 定義紅外接收用戶碼 sbit Ir_Pin = P3^6; // 定義紅外接收輸入端口 sbit TXD1 = P3^1; // 定義模擬串口發(fā)送腳 void InitTimer0(void)
{
TMOD = 0x01; // 16位計數(shù)方式. TH0 = Timer0_Reload / 256;
TL0 = Timer0_Reload % 256; ET0 = 1;
TR0 = 1; EA = 1;
}
void main(void)
{
InitTimer0(); // 初始化Timer0
PrintString("定時器0初始化完畢\r\n"); // 上電后串口發(fā)送一條提示信息
while(1)
{
if(IR_OK) // 接收到一幀完整的紅外數(shù)據(jù)
{
PrintString("紅外鍵碼: 0x"); // 提示紅外鍵碼 Tx1Send(HEX2ASCII(IR_code >> 4)); // 鍵碼高半字節(jié) Tx1Send(HEX2ASCII(IR_code)); // 鍵碼低半字節(jié) if(IrUserErr) // 用戶碼錯誤,則發(fā)送用戶碼
{
Tx1Send(' '); // 發(fā)空格 Tx1Send(' '); // 發(fā)空格 PrintString("用戶碼: 0x"); // 提示用戶碼 Tx1Send(HEX2ASCII(IR_UserH >> 4)); // 用戶碼高字節(jié)的高半字節(jié) Tx1Send(HEX2ASCII(IR_UserH)); // 用戶碼高字節(jié)的低半字節(jié) Tx1Send(HEX2ASCII(IR_UserL >> 4)); // 用戶碼低字節(jié)的高半字節(jié) Tx1Send(HEX2ASCII(IR_UserL)); // 用戶碼低字節(jié)的低半字節(jié)
}
Tx1Send(0x0d); // 發(fā)回車 Tx1Send(0x0a); // 發(fā)回車
IR_OK = 0; // 清除IR鍵按下標志
}
}
}
程序運行結果如下圖所示。
2.png (310.73 KB, 下載次數(shù): 192)
下載附件
2016-3-28 23:03 上傳
只要單片機能獲取紅外鍵碼,單片機就可根據(jù)不同的鍵碼執(zhí)行不同的控制功能。
程序:
1.1—IR查詢方式解碼:
2.3—IR-中斷方式(復雜的)
IR中斷方式(簡單版)的單片機紅外解碼程序:http://www.denmoz.com/bbs/dpj-47283-1.html
只用一個單片機定時器的紅外接收解碼程序:http://www.denmoz.com/bbs/dpj-47284-1.html
全部完整的4個源碼請下載附件:
第18章 紅外通信.rar
(84.33 KB, 下載次數(shù): 169)
2016-3-28 23:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: lizhendong 時間: 2016-10-4 23:16
太好了,謝謝
作者: 國君 時間: 2018-7-10 15:25
路過學習學習。。。。。。。。。。
作者: xiexugang 時間: 2018-10-20 10:16
不錯,很好的應用實例
作者: 北極泥 時間: 2018-11-1 09:13
很給力
作者: 水泊之星 時間: 2018-11-3 18:01
很實用,謝謝
作者: 無聊到處逛 時間: 2019-1-24 22:59
剛好,需要用到,謝謝了
作者: jpg阿福 時間: 2019-11-30 21:52
你好我是小白 請問一下:我用IR中斷的形式寫的串口顯示按鍵碼的程序 ,內容上面大致和您的大致相同,可是在按下同一個按鍵兩次后就顯示其他的數(shù)碼(不是正常的00 ff 開頭的數(shù)碼) 我開始以為是程序的問題 但是第二次的顯示還是正確的第三次錯誤,我就想不出來是什么原因了,您能指導指導嗎? 必要的話可以叫我貼出程序出來 謝謝! 各位看到的朋友如果可以的話也請幫幫忙,。感謝。
作者: herui2128 時間: 2020-2-17 13:19
路過,學習大神的編程思路
作者: qiuabc1234 時間: 2020-4-24 15:06
jpg阿福 發(fā)表于 2019-11-30 21:52
你好我是小白 請問一下:我用IR中斷的形式寫的串口顯示按鍵碼的程序 ,內容上面大致和您的大致相同,可是在 ...
我比你白,是不是按鍵按下時連續(xù)發(fā)射信號?該搞個松開按鍵才發(fā)射的程序。或是你那個變量發(fā)射后沒復位?發(fā)射完復位
作者: 君工創(chuàng) 時間: 2021-11-16 11:57
沒看見連續(xù)鍵的解碼部份。
| 歡迎光臨 (http://www.denmoz.com/bbs/) |
Powered by Discuz! X3.1 |