用單片機解碼紅外遙控器
遙控器使用方便,功能多.目前已廣泛應用在電視機、VCD、DVD、空調等各種家用電器中,且價格便宜,市場上非常容易買到。如果能將遙控器上許多的按鍵
解碼出來.用作單片機系統的輸入.則解決了常規矩陣鍵盤線路板過大、布線複雜、佔用I/O口過多的弊病。而且通過使用遙控器,操作時可實現人與裝置的分
離,從而更加方便使用。下面以TC9012編碼晶片的遙控器為例。談談如何用常用的51系統單片機進行遙控的解碼。 一、編碼格式 1、0和1的編碼
遙控器發射的訊號由一串O和1的二進位程式碼群組成.不同的晶片對0和1的編碼有所不同。通常有曼徹斯特編碼和脈衝寬度編碼。TC9012的O和1採用PWM
方法編碼,即脈衝寬度調製,其O碼和1碼1所示(以遙控接收輸出的波形為例)。O碼由O.56ms低電平和0.56ms高電平組合而成.脈衝寬度為
1.12ms.1碼由0.56ms低電平和1.69ms高電平組合而成.脈衝寬度為2.25ms。在編寫解碼程式時.通過判斷脈衝的寬度,即可得到0或
1。 2、按鍵的編碼
當我們按下遙控器的按鍵時,遙控器將發出2的一串二進位代碼,我們稱它為一幀資料。根據各部分的功能。可將它們分為5部分,分別為引導碼、地址碼、地
址碼、資料碼、資料反碼。遙控器發射代碼時.均是低位在前。高位在後。由圖2分析可以得到.引導碼高電平為4.5ms,低電平為4.5ms。當
接收到此碼時.表示一幀資料的開始。單片機可以準備接收下面的資料。地址碼由8位二進位組成,共256種.圖中地址碼重發了一次。主要是加強遙控器的可靠
性.如果兩次地址碼不相同.則說明本幀資料有錯.應丟棄。不同的裝置可以擁有不同的地址碼.因此。同種編碼的遙控器只要設定地址碼不同,也不會相互幹擾。
圖中的地址碼為十六進位的0EH(注意低位在前)。在同一個遙控器中.所有按鍵發出的地址碼都是相同的。資料碼為8位,可編碼256種狀態,代表實際所按
下的鍵。資料反碼是資料碼的各位求反,通過比較資料碼與資料反碼.可判斷接收到的資料是否正確。如果資料碼與資料反碼之間的關係不滿足相反的關係.則本次
遙控接收有誤.資料應丟棄。在同一個遙控器上.所有按鍵的資料碼均不相同。在圖2中,資料碼為十六進位的0CH,資料反碼為十六進位的0F3H(注意低位
在前).兩者之和應為0FFH。 二、單片機遙控接收電路
紅外遙控接收可採用較早的紅外接收二極體加專用的紅外處理電路的方法。如CXA20106,此種方法電路複雜,現在一般不採用。較好的接收方法是用一體化
紅外接收頭,它將紅外接收二極體、放大、解調、整形等電路做在一起,只有三個引腳.分別是+5V電源、地、訊號輸出。常用的一體化接收頭的外形及引腳見圖
3和圖4。紅外接收頭的訊號輸
出接單片機的INTO或INTl腳.典型電路5所示.圖中增加了一隻PNP型三極體對輸出訊號進行放大。 三、遙控訊號的解碼演算法及程式編製
平時。遙控器無鍵按下。紅外發射二極體不發出訊號,遙控接收頭輸出訊號1。有鍵按下時.O和1編碼的高電平經遙控頭倒相後會輸出訊號O.由於與單片機的中
斷腳相連,將會引起單片機中斷(單片機預先設定為下降沿產生中斷)。單片機在中斷時使用定時器0或定時器1開始計時.到下一個脈衝到來時,即再次產生中斷
時,先將計時值取出。清零計時值後再開始計時.通過判斷每次中斷與上一次中斷之間的時間間隔。便可知接收到的是引導碼還是
O和1。如果計時值為9ms。接收到的是引導碼,如果計時值等於1.12ms,接收到的是編碼O。如果計時值等於2
25ms.接收到的是編碼1。在判斷時間時,應考慮一定的誤差值。因為不同的遙控器由於晶振參數等原因,發射及接收到的時間也會有很小的誤差。
以接收TC9012遙控器編碼為例,解碼方法如下: (1)設外部中斷0(或者1)為下降沿中斷,定時器0(或者1)為16位計時器.初始值均為O。
(2)第一次進入遙控中斷後,開始計時。
(3)從第二次進入遙控中斷起,先停止計時。並將計時值儲存後,再重新計時。如果計時值等於前置碼的時間,設立前置碼標誌。準備接收下面的一幀遙控資料,
如果計時值不等於前置碼的時間,但前面已接收到前置碼,則判斷是遙控資料的O還是1。 (4)繼續接收下面的地址碼、資料碼、資料反碼。
(5)當接收到32位元據時,說明一幀資料接收完畢。此時可停止定時器的計時,並判斷本次接收是否有效.
-------------------------------------------------------------------------------------------------------------------------
遙控器在按鍵按下後,周期性地發出同一種32位二進位碼,周期約為108ms。一組碼本身的期間隨它包含的二進位“0”和“1”的個數不同而不同,大約在45~63ms之間,圖4為發射波形圖。
圖4 遙控連發訊號波形
當一個鍵按下超過36ms,振蕩器使晶片啟用,將發射一組108ms的編碼脈衝,這108ms發射代碼由一個引導碼(9ms),一個結果碼(4.5ms),低8位地址碼(9ms~18ms),高8位地址碼(9ms~18ms),8位元據碼(9ms~18ms)和這8位元據的反碼(9ms~18ms)組成。如果鍵按下超過108ms仍未鬆開,接下來發射的代碼(連發碼)將僅由起始碼(9ms)和結束碼(2.25ms)組成。
圖5 引導碼 圖6連發碼
------------------------------------------------------------------------------------------
註:代碼寬度演算法:
16位地址碼的最短寬度:1.12×16=18ms 16位地址碼的最長寬度:2.24ms×16=36ms
易知8位元據代碼及其8位反代碼的寬度和不變:(1.12ms+2.24ms)×8=27ms
∴32位代碼的寬度為(18ms+27ms)~(36ms+27ms)
1. 解碼的關鍵是如何識別“0”和“1”,從位的定義我們可以發現“0”、“1”均以0.56ms的低電平開始,不同的是高電平的寬度不同,“0”為0.56ms,“1”為1.68ms,所以必鬚根據高電平的寬度區別“0”和“1”。如果從0.56ms低電平過後,開始延時,0.56ms以後,若讀到的電平為低,說明該位為“0”,反之則為“1”,為了可靠起見,延時必須比0.56ms長些,但又不能超過1.12ms,否則如果該位為“0”,讀到的已是下一位的高電平,因此取(1.12ms+0.56ms)/2=0.84ms最為可靠,一般取0.84ms左右均可。
2. 根據碼的格式,應該等待9ms的起始碼和4.5ms的結果碼完成後才能讀碼。