基于單片機系統(tǒng)的紅外遙控器應(yīng)用
紅外遙控器由于其體積小、功耗低、功能強、成本低的特點,已經(jīng)在家電產(chǎn)品設(shè)備中廣泛應(yīng)用?,F(xiàn)代智能化儀器儀表系統(tǒng)、工業(yè)設(shè)備中的控制輸入也較多地使用紅外遙控器。本文給出紅外遙控器信號發(fā)射原理、紅外接收器的連接方式和單片機軟件解碼應(yīng)用程序,并提供了一種對未知格式的遙控器信號碼檢測的應(yīng)用程序。
1 紅外遙控器信號發(fā)射原理簡介
通用紅外發(fā)射器由指令鍵、指令信號產(chǎn)生電路、調(diào)制電路、驅(qū)動電路及紅外發(fā)射器組成。如圖1所示。
遙控器所產(chǎn)生的脈沖編碼的格式一般為:
引導(dǎo)脈沖(頭)─識別碼(用戶碼)─鍵碼─鍵碼的反碼
其引導(dǎo)脈沖為寬度是10 ms左右的一個高脈沖和一個低脈沖的組合,用來標(biāo)識指令碼的開始。識別碼、鍵碼、鍵碼的反碼均為數(shù)據(jù)編碼脈沖,用二進制數(shù)表示。“0”和“1”均由ms量級的高低脈沖的組合代表。識別碼(即用戶碼)是對每個遙控系統(tǒng)的標(biāo)識。通過對識別碼的檢驗,每個遙控器只能控制一個設(shè)備動作,有效的防止了多個設(shè)備之間的串?dāng)_。當(dāng)指令鍵按下時,指令信號產(chǎn)生電路便產(chǎn)生脈沖編碼。鍵碼后面一般還要有鍵碼的反碼,用來檢驗鍵碼接收的正確性,防止誤動作,增強系統(tǒng)的可靠性。這些指令信號由調(diào)制電路調(diào)制成32~40 kHz的信號,經(jīng)調(diào)制后輸出,最后由驅(qū)動電路驅(qū)動紅外發(fā)射器件(LED)發(fā)出紅外遙控信號。
2 紅外遙控器信號接收芯片外圍電路
接收電路可以使用集成紅外接收器成品,一般不需要任何外接元件就能完成從紅外接收到輸出TTL電平兼容信號的所有工作。注意選擇接收器件時要保證接收器件的中心頻率與發(fā)射信號的中心頻率相匹配。接收器對外只有3個引腳:VCC,GND和1個脈沖信號輸出OUT。與單片機接口非常方便,如圖2所示。
脈沖信號輸出接CPU的普通輸入引腳或中斷輸入引腳(IO/INT)。采取這種連接方法,軟件解碼既可工作于查詢方式,也可工作于中斷方式。在實際應(yīng)用中,還可以進一步增加抑制干擾電路和提高驅(qū)動能力電路,增強系統(tǒng)的穩(wěn)定性。
3 未知信號格式遙控器信號碼的識別
在應(yīng)用系統(tǒng)中,要完成對遙控器信號的解碼并實現(xiàn)對系統(tǒng)功能的控制,必須了解遙控器信號碼(即遙控器所發(fā)射脈沖流)的格式,即信號的引導(dǎo)脈沖高低脈沖的寬度、“0”,“1”的表示法,以及遙控器識別碼、各個功能鍵的鍵碼。對信號碼的識別應(yīng)該從分析脈沖流的各個高、低脈沖的時間入手,通過分析各個高、低脈沖的時間,分析得出信號碼的格式。下面提供一種軟件測試信號碼的方法,以供參考。
筆者采用PIC16C72單片機,4 MHz晶振,紅外發(fā)射器芯片為BA6121-001,通過軟件中斷的方法,對手中未知格式的信號碼進行測試識別。遙控器接收器OUT端接RB0/INT,測得在遙控器空閑的情況下輸出為高,INT首先采用下降沿觸發(fā)。第一次INT發(fā)生時,啟動定時器,每次中斷要將觸發(fā)形式設(shè)置為上一次觸發(fā)的相反形式,以保證在下次電平變化時產(chǎn)生中斷;定時器溢出中斷記錄每次脈沖期間定時器溢出的次數(shù);為了提高檢測精度,應(yīng)提高定時器的時間分辨率,但過高的時間分辨率會引起單個脈沖期間定時器溢出,記錄每個脈沖期間溢出次數(shù)又浪費了大量數(shù)據(jù)寄存器。這里筆者采取了折中的辦法,即數(shù)據(jù)寄存器高6位只記錄定時器值的高6位,低2 位用來記錄定時器溢出次數(shù),既節(jié)省了數(shù)據(jù)寄存器數(shù)量,又在一定程度上保證了較高的檢測精度。數(shù)據(jù)存儲格式如圖3所示。
由于此程序只為測試程序,可在仿真器中讀出寄存器組中所記錄的各高低脈沖所對應(yīng)的定時器值,計算得出高低脈沖的時間數(shù)據(jù),分析數(shù)據(jù)可知遙控器信號碼的格式。下面給出部分INT和定時器0中斷服務(wù)程序:
[!--empirenews.page--]
這里需要合理設(shè)置定時器的預(yù)分頻值,筆者多次實驗,得出較為合理的預(yù)分頻值為1∶8,定時器時間分辨率為8μs,最大定時時間為 (4×256+252)×8×1μs=10.2 ms,測量精度達到最高,誤差為32μs。通過對所得數(shù)據(jù)分析,得出遙控器的信號碼格式如圖4所示。
圖中“頭”(即引導(dǎo)脈沖):低8.84 ms,高4.40 ms。 “1”:低0.60 ms,高1.62 ms;“0”:0.60 ms低,0.50ms高;16 b識別碼:19D6H采用PIC16C72單片機,最多可以檢測54 b的信號碼,足以滿足一般情況下的需求。
4 軟件解碼應(yīng)用程序
在已知遙控器信號碼格式的條件下,可以通過單片機軟件程序?qū)崿F(xiàn)解碼。以筆者手中的遙控器為例,根據(jù)上面已測得的信號碼,采用PIC16C54單片機,4 MHz晶振,提供一種軟件解碼的應(yīng)用程序。
PIC16C54單片機是一款有著較高性能價格比的低檔單片機,最適合低價格、低功耗、小體積的設(shè)備。PIC16C54沒有中斷系統(tǒng),程序采用軟件查詢法,查詢輸入引腳的電平變化,采用定時器定時,根據(jù)定時器的記錄值和已知的信號格式比較,判斷各部分接收是否正確以及分辨鍵碼并執(zhí)行相應(yīng)的命令。
由于遙控器脈寬時間值是在一個小范圍內(nèi)波動,而且檢測過程中定時器也存在誤差。因此,對信號的識別不能采取精確比較法,本程序采用了區(qū)間比較法,即判斷定時器的記錄值是否在預(yù)先計算的區(qū)間內(nèi)。由88于引導(dǎo)脈沖和數(shù)據(jù)脈沖的時間相差很大,解碼時對定時器采用不同的預(yù)分頻,以盡量提高解碼的準(zhǔn)確度?! ?/p>
①引導(dǎo)脈沖判斷:低8.84 ms,高4.40 ms,預(yù)分頻1∶64,理論計算得定時器值應(yīng)為:低8AH,高44H。如實際所得低部分在85H和90H之間、高部分在40H和4AH之間,則認(rèn)為引導(dǎo)脈沖接收正確。
②“0”,“1”判斷:數(shù)據(jù)脈沖流的低電平脈寬相同,忽略不判斷;高電平脈寬是判斷數(shù)據(jù)流每位是“0”還是“1”的依據(jù)。“0”對應(yīng)高0.50 ms,“1”對應(yīng)高1.62 ms,預(yù)分頻1∶8,理論計算得定時器值應(yīng)為:“0”對應(yīng)高3EH,“1”對應(yīng)高0CAH。如所得“0”對應(yīng)高在39H和42H之間、“1”對應(yīng)高在 0C5H和0D0H之間則認(rèn)為接收正確。
③判斷16 b識別碼是否和已知的識別碼(19D6H)相同。
④判斷8 b鍵碼是否與8 b鍵碼的反碼相對應(yīng)。⑤根據(jù)鍵碼,選擇所應(yīng)執(zhí)行的命令。
由于篇幅所限,僅給出判斷“0”部分程序:
注意,在程序容易發(fā)生死循環(huán)或者出錯的地方,要檢驗定時器是否溢出。一旦發(fā)生溢出,要立即使程序復(fù)位,以便程序能夠在出錯之后返回到程序開始部分,增強系統(tǒng)的可靠性?;谝陨显O(shè)計思想可以在多種單片機上實現(xiàn)遙控器的解碼。讀者可自行嘗試應(yīng)用中斷方法實現(xiàn)遙控器的信號解碼。
本文所介紹的紅外遙控器接收發(fā)送原理及信號碼識別和解碼程序,可以方便地移植到其他系統(tǒng),其方法簡潔靈活。此方法具有一般性,對于具體的應(yīng)用,可自行變通。
參考文獻
[1]竇振中.PIC系列單片機原理和程序設(shè)計[M].北京:北京航空航天大學(xué)出版社,1998.