摘要:紅外遙控器在家電產(chǎn)品中已廣泛使用。在嵌入式系統(tǒng)應用方面,紅外信號解碼的方法也是多種多樣。本文簡要介紹紅外遙控器解碼的硬件構(gòu)成與軟件編程思路,然后針對兩種常用的紅外編碼結(jié)構(gòu),闡述了使用51單片機定時器門控方式解碼的具體方法,并給出了代碼示例與軟件流程。
關鍵詞:紅外解碼;門控方式;51單片機
引言
隨著家用電器、試聽產(chǎn)品的普及,紅外遙控器已經(jīng)被廣泛應用在各種類型的家電產(chǎn)品中(如遙控開關、智能開關等)。紅外遙控是一種把紅外線作為載體的控制方式,由于其波長遠小于無線電的波長,因此在采用紅外遙控方式時不會干擾其他電器的正常使用,也不會影響臨近的無線電設備。另外,紅外遙控器件具有體積小、功耗低、性價比高的優(yōu)點,是理想的人機輸入設備,非常適合電子工程師和電子愛好者DIY開發(fā)與制作。紅外遙控系統(tǒng)主要由發(fā)射和接收兩大部分組成,由于發(fā)射部分使用的是購買來的遙控器成品,所以本文的重點是紅外接收、解碼部分。下面將從硬件結(jié)構(gòu)和軟件編程兩個方面出發(fā),介紹一種基于51系列單片機匯編語言的紅外遙控解碼新方法。
1 硬件構(gòu)成
紅外接收頭的種類很多,本文使用的是市場上常見的VS1838B,外觀如圖1所示。它采用內(nèi)、外雙屏蔽直捅式封裝,輸出匹配TTL、CMOS電平,靈敏度高,抗干擾性能好,接收距離可達20 m。從正面看,其3個引腳分別是信號輸出端、電源地與電源正。硬件電路連接非常簡單,如圖2所示。圖中0.1μF瓷片電容用來濾波,供電引腳與電源之間接入100Ω的電阻以進一步降低電源干擾。在本文中信號輸出端接51單片機最小系統(tǒng)的外部中斷1口(即P3.3),這樣一個簡單的硬件電路就搭好了。
2 軟件編程方法
2.1 基本方法介紹
大多數(shù)人使用的方法是在兩次外部中斷下降沿中,通過軟件手動開啟與關閉定時器得到時間寬度。本文的思路是通過51單片機固有的外部中斷與定時器自動配合的“門控方式”來獲得紅外信號波形信息。具體做法如下:參考表1,設置51單片機定時器工作方式寄存器(TMOD)
Bit7=1,即定時器T1為門控方式。此時只有當T1運行控制化TR1=1并且外部中斷1為高電平時,定時器T1才啟動;TR1=0或者外部中斷1為低電平時T1就自動停止計數(shù)。
每次當信號是高電平時定時器1自動開始計時,下降沿信號來臨的時候,在外部中斷1中自動獲取TH1與TL1的值,這樣就得到了信號的時間寬度,從而可以區(qū)分出引導碼、重復碼、位0、位1的信息,再經(jīng)過后續(xù)的軟件處理就可以得到紅外遙控按鍵的鍵碼了。紅外遙控器解碼的關鍵在于對發(fā)射器波形規(guī)范的理解,常見的遙控器編碼有32位和42位兩種模式,主要區(qū)別在于系統(tǒng)碼的位數(shù)不一樣。值得注意的是,同樣位數(shù)模式的遙控器的結(jié)束碼也可能會不同。另外在按鍵連按狀態(tài)下,不同遙控器發(fā)出的重復碼各異,這些都會影響到程序的編寫。下文將列舉出兩款不同位數(shù)的遙控器,分別闡述其門控方式下的軟件編程思路。
2.2 32位編碼
硬件使用的是購置的超薄型遙控器,內(nèi)置芯片為uPD6121G,采用NEC32位格式。其數(shù)據(jù)格式如圖3所示,包括了起始碼、用戶碼、數(shù)據(jù)碼和數(shù)據(jù)反碼。其中,起始碼由9 ms高電平和4.5 ms低電平構(gòu)成,后接16位用戶碼、8位數(shù)據(jù)碼以及8位數(shù)據(jù)反碼。數(shù)據(jù)反碼是數(shù)據(jù)碼取反后的編碼,編程時可以用于數(shù)據(jù)糾錯。位定義如圖4所示,位1用高電平0.56 ms加低電平1.68 ms表示。位0用高電平0.56 ms加低電平0.56 ms表爾。要注意的是當一直按住按鍵時,芯片發(fā)出一次鍵碼后就不停地發(fā)重復碼了,寫程序時對重復碼要有特別的區(qū)分,其重復碼的波形如圖5所示。
了解了各種碼制的區(qū)別后,就可以開始著手寫程序了。紅外解碼程序主要包括了中斷初始化函數(shù)和中斷子函數(shù)兩個部分。另外,由于一體化接收頭輸出信號與發(fā)射波形是反向的,在定時器中記錄的實際是紅外波形中低電平的時間長度。
2.2.1 初始化函數(shù)
在初始化函數(shù)中主要是對中斷1和定時器1的特殊功能寄存器單元進行定義,同時對相關工作單元進行初始化。初始化代碼如下:
2.2.2 中斷子函數(shù)
中斷子函數(shù)中得到了一體化接收頭高電平的時間寬度,以此來區(qū)分起始碼、信息位和重復碼。如果是起始碼,就轉(zhuǎn)入初始化處理模塊;如果是信息位則通過右移操作將0、1信息存入定義好的寄存器單元,直到獲得所需的4字節(jié)數(shù)據(jù)為止。注意在子函數(shù)中利用TH1保護ACC和利用ADD來獲得0、1信息位的技巧。
2.2.3 主監(jiān)控程序中對IRKeyReady標志的處理
在主監(jiān)控程序中,不斷查詢IRKeyReady標志。如果標志置位,則在主程序巾進入鍵值處理,判斷鍵值的類型,以便實現(xiàn)遙控器按鍵的功能。代碼如下:
2.3 42位編碼
硬件使用57L5彩電遙控器,其內(nèi)部紅外發(fā)射專用集成電路為TC7461,采用42位的編碼結(jié)構(gòu),包含13位用戶碼、13位用戶反碼、8位數(shù)據(jù)碼和8位數(shù)據(jù)反碼。42位編碼結(jié)構(gòu)如圖6所示。引導碼由9 ms的載波和4.5 ms的載波關斷波形所構(gòu)成,作為用戶碼、數(shù)據(jù)碼以及它們的反碼的先導。信息位0與1的定義與上述NEC32位格式相同。但是長按鍵時,其重復碼的前13.5 ms與引導碼是一樣的,在編程中要特別處理,其重復碼波形如圖7所示。
初始化階段與32位的基本類似,但由于重復碼的波形和起始碼相同,為了區(qū)分清楚,這里引用了狀態(tài)機的方法,添加了狀態(tài)寄存器IR57 L5Satus和計數(shù)寄存器IRSysCodeCnt,初始化時都先清零。以數(shù)值0、1、2來表示3種不同的狀態(tài)。每種狀態(tài)具體的功能如下:
◆為0時進入引導碼或重復碼,然后賦值IR57L5Satus為1。
◆為1時進入26個系統(tǒng)位階段,為了簡單起見,在這里跳過它們,并未存儲。賦值IR57L5Satus為2。同時在這個狀態(tài),初始化2個數(shù)據(jù)存儲寄存器IRCode和IRCode+1。
◆為2時收數(shù)據(jù)碼,16位收到后,賦值IR57L5Satus為0。
限于篇幅,這里不列出具體代碼,其中斷子程序軟件流程如圖8所示。
3 調(diào)試
在測試程序的過程中需要示波器與串口調(diào)試助手軟件。示波器用于檢測紅外發(fā)射波形是否符合規(guī)范。而通過編寫單片機串口程序,并借助于串口調(diào)試助手軟件,可以將紅外數(shù)據(jù)接收單元的信息發(fā)送到PC機上,而后通過與遙控器說明書比對,以證實數(shù)據(jù)碼的準確性。這種紅外解碼方法在本人制作的硬件時鐘和多溫區(qū)控制系統(tǒng)等項目中都有應用,數(shù)據(jù)接收準確、使用效果良好。