單片機(jī)紅外接收與紅外發(fā)射
掃描二維碼
隨時隨地手機(jī)看文章
1. 紅外接收1.1 說明1.2 NEC協(xié)議1.3 關(guān)于紅外接收的波形1.4 解碼1.4 紅外對射思考2. 紅外發(fā)射2.1 紅外發(fā)射管參數(shù)2.2 紅外發(fā)射電路搭建2.3 程序設(shè)計2.5 實驗結(jié)果2.4 紅外發(fā)射電路目前遇到的問題3. 總結(jié)
1. 紅外接收
1.1 說明
我們采用的是 HS0038B 這個紅外一體化接收頭 ,所以在使用時需要按照具體協(xié)議來進(jìn)行解析。

當(dāng)連接好設(shè)備后就可以進(jìn)行數(shù)據(jù)分析了,首先看一段數(shù)據(jù)

HS0038B 這個紅外一體化接收頭,當(dāng)收到有載波的信號的時候,會輸出一個低電平,空閑的時候會輸出高電平,我們用邏輯分析儀抓出來一個紅外按鍵通過HS0038B 解碼后的圖形來了解一下。
1.2 NEC協(xié)議
NEC 協(xié)議的數(shù)據(jù)格式包括了引導(dǎo)碼、用戶碼、用戶碼(或者用戶碼反碼)、按鍵鍵碼和鍵碼反碼,最后一個停止位。停止位主要起隔離作用,一般不進(jìn)行判斷,編程時我們也不予理會。其中數(shù)據(jù)編碼總共是 4 個字節(jié) 32 位。
第一個字節(jié)是用戶碼,第二個字節(jié)可能也是用戶碼,或者是用戶碼的反碼,具體由生產(chǎn)商決定,第三個字節(jié)就是當(dāng)前按鍵的鍵數(shù)據(jù)碼,而第四個字節(jié)是鍵數(shù)據(jù)碼的反碼,可用于對數(shù)據(jù)的糾錯。

這個 NEC 協(xié)議,表示數(shù)據(jù)的方式不像我們之前學(xué)過的比如 UART 那樣直觀,而是每一位數(shù)據(jù)本身也需要進(jìn)行編碼,編碼后再進(jìn)行載波調(diào)制。
-
引導(dǎo)碼:9ms 的載波+4.5ms 的空閑。
-
比特值“0”:560us 的載波+560us 的空閑。
-
比特值“1”:560us 的載波+1.68ms 的空閑。
1.3 關(guān)于紅外接收的波形
通過邏輯分析儀對紅外接收管上的數(shù)據(jù)采集,基本上可以對數(shù)據(jù)的采集進(jìn)行一個比較準(zhǔn)確的時序圖。
關(guān)于紅外接收管的電路連接其實很簡單,就是接電源和數(shù)據(jù)引腳即可

以下就是我們通過邏輯分析儀采集到的波形

通過對數(shù)據(jù)的采集,我們可以對其進(jìn)行解碼。
1.4 解碼
一般來說,解碼放在中斷中,這里的中斷一般是GPIO的上升沿或者下降沿中斷。對于一般的程序而言,這樣的設(shè)計是沒有問題的。其原理可以描述如下:
(1)當(dāng)來一個一個下降沿中斷時,進(jìn)入中斷處理函數(shù),處理事件
(2)當(dāng)延時6ms后檢測到該電平依然為低電平,該事件有效
(3)收集四組數(shù)據(jù):用戶碼,用戶反碼,按鍵碼,按鍵反碼,存到數(shù)組中
(4)校驗數(shù)據(jù),一般而言,都是可以先校驗按鍵碼與按鍵反碼是否正確,若正確表示解碼正確
(5)處理按鍵碼
以上是處理該問題的基本辦法,編碼如下:
//NEC 紅外0數(shù)據(jù)格式 解析 int IR0_IN(void) { unsigned char j,k,N=0; // EX0 = 0; //第一步:判斷紅外是否有效 if (IR0IN == 1)
{ //信號無效 return -1;
} //第二步:信號有效,延時檢測,確認(rèn)IR信號出現(xiàn) ET0 = 0;
IRdelay(5); if (IR0IN == 1)
{ //不是有效的電平 ET0 = 1; return -2;
} //第三步:等IR變?yōu)楦唠娖?,跳過9ms的前導(dǎo)低電平信號。 while (!IR0IN)
{
IRdelay(1);
} //收集四組數(shù)據(jù):用戶碼,用戶反碼,按鍵碼,按鍵反碼 for (j=0;j<4;j++)
{ for (k=0;k<8;k++) //每組數(shù)據(jù)有8位 { //等 IR 變?yōu)榈碗娖剑^4.5ms的前導(dǎo)高電平信號。 while (IR0IN)
{
IRdelay(1);
} //等 IR 變?yōu)楦唠娖?/span> while (!IR0IN)
{
IRdelay(1);
} //計算IR高電平時長 while (IR0IN)
{ //0.14ms計數(shù)過長自動離開。 IRdelay(1);
N++; if (N>=30)
{
ET0=1; return -3;
}
}
IR0COM[j]=IR0COM[j] >> 1; //數(shù)據(jù)最高位補“0” if (N>=8) {IR0COM[j] = IR0COM[j] | 0x80;} //數(shù)據(jù)最高位補“1” N=0;
}//end for k }//end for j //按鍵碼是否正確 if (IR0COM[2]!=~IR0COM[3])
{
ET0 = 1; return -4;
}
ET0 = 1; return 1;
}
但是如果需要檢測兩個紅外光,該方法就有缺陷,因為要用到兩個中斷引腳,這對于單片機(jī)來說,是比較困難的。
為了解決這個問題,我們可以采用定時器定時去查詢引腳狀態(tài)的方式進(jìn)行。
比如我們可以采用定時器0去定時讀取電平狀態(tài)。如果信號有效則保存下來。
所以我們可以采用100us的定時器Timer0進(jìn)行
void Timer0Init(void) //100微秒@22.1184MHz {
AUXR |= 0x80; //定時器時鐘1T模式 TMOD &= 0xF0; //設(shè)置定時器模式 TL0 = 0x9A; //設(shè)置定時初值 TH0 = 0xA9; //設(shè)置定時初值 TF0 = 0; //清除TF0標(biāo)志 TR0 = 1; //定時器0開始計時 ET0 = 1; //允許T0中斷 EA = 1;
TR0 = 1;
}
定時器開啟后,不斷的查詢兩個引腳的狀態(tài)即可實現(xiàn)該過程。
1.4 紅外對射思考
如果要實現(xiàn)紅外對射的功能

2. 紅外發(fā)射
2.1 紅外發(fā)射管參數(shù)
目前采用的紅外發(fā)射管為TSAL6200

2.2 紅外發(fā)射電路搭建


2.3 程序設(shè)計
通過對紅外發(fā)射管的研究發(fā)現(xiàn),當(dāng)紅外發(fā)射管發(fā)出38Khz的波形時,接收管上輸出的是低電平,其他情況下,紅外接收管上接收的電平為高電平,所以要讓紅外接收管上的電平為特定的波形,需要采用26us的定時器。
目前由于我手上只有S8550三極管,所以當(dāng)引腳輸出高電平時,三極管不導(dǎo)通,低電平時三極管導(dǎo)通。
根據(jù)定時器計算26us的定時器中斷
void Timer_Routine(void) interrupt 1 {
TL0 = 0xE8; //設(shè)置定時初值 TH0 = 0xFD; //設(shè)置定時初值 count++; if(flag == 1)
{
OP = ~OP;
} else {
OP = 0;
} if(send_ir_flag == 1)
{
IR1_SEND = OP;
}else {
IR2_SEND = OP;
}
}
然后主要是按照協(xié)議發(fā)送數(shù)據(jù)即可
//紅外發(fā)射函數(shù) void SendIRdata(char user_data,char key_data) { //1.發(fā)送開始碼 9ms send_code(1,9000); //2.發(fā)送4.5ms結(jié)果碼 send_code(0,4500); //3.發(fā)送用戶碼 send_data(user_data); //send_code(0,4279); //4.發(fā)送用戶反碼 send_data(~user_data); //send_code(0,4279); //5.發(fā)送按鍵碼 send_data(key_data); //send_code(0,4279); //6.發(fā)送按鍵反碼 send_data(~key_data); //7.發(fā)送結(jié)束碼 send_code(1,560);
}
以上就是紅外發(fā)射的基本情況。
2.5 實驗結(jié)果
通過邏輯分析儀對數(shù)據(jù)的采集,我們得到如下的數(shù)據(jù)

通過放大,可以看到波形的基本情況

該信號基本上是我們發(fā)射出來的信號。
調(diào)試手段:由于紅外發(fā)射管發(fā)射出來的光線人眼是看不到的,所以可以打開手機(jī)攝像頭拍紅外攝像頭,可以看到當(dāng)紅外發(fā)射管發(fā)射數(shù)據(jù)時,是有顏色的。
2.4 紅外發(fā)射電路目前遇到的問題
紅外發(fā)射管發(fā)射的距離達(dá)不到要求,只能在1m的范圍之內(nèi)數(shù)據(jù)有效,其他的情況下數(shù)據(jù)無效。對于該問題,有兩點猜測
(1)紅外發(fā)射與紅外接收頭不匹配,造成數(shù)據(jù)沒辦法很好接收到
(2)紅外發(fā)射管功率不夠
3. 總結(jié)
對于以上的測試及調(diào)節(jié)手段,遇到了一些問題,主要是對硬件部分的不熟悉帶來了一些麻煩。其實對于紅外接收部分的調(diào)試還是很順利的,只是到了紅外接收部分,卻遇到了一些問題,其中有一個問題就是由于沒有發(fā)送結(jié)束碼,導(dǎo)致數(shù)據(jù)始終接收不到,后來通過對紅外遙控的數(shù)據(jù)采集,才發(fā)現(xiàn)了問題的原因。后來又遇到紅外發(fā)射管發(fā)射距離太短的問題,目前嘗試各種辦法,無果,所以該問題目前先放一放。