遙控器使用方便,功能多.目前已廣泛應用在電視機、VCD、DVD、空調等各種家用電器中,且價格便宜,市場上非常容易買到。如果能将遙控器上許多的按鍵解碼出來.用作單片機系統的輸入.則解決了常規矩陣鍵盤線路闆過大、布線複雜、占用I/O口過多的弊病。而且通過使用遙控器,操作時可實現人與設備的分離,從而更加方便使用。下面以TC9012編碼芯片的遙控器為例。談談如何用常用的51系統單片機進行遙控的解碼。
通用紅外遙控系統由發射和接收兩大部分組成,應用編/解碼專用集成電路芯片來進行控制操作,如圖所示。發射部分包括鍵盤矩陣、編碼調制、LED紅外發送器;接收部分包括光、電轉換放大器、解調、解碼電路。
一、編碼格式
1、0和1的編碼
當發射器按鍵按下後,即有遙控碼發出,所按的鍵不同遙控編碼也不同。這種遙控碼具有以下特征:采用脈寬調制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的“1”,其波形如圖所示。
遙控器發射的信号由一串0和1的二進制代碼組成.不同的芯片對0和1的編碼有所不同。通常有曼徹斯特編碼和脈沖寬度編碼。TC9012的0和1采用PWM方法編碼,即脈沖寬度調制,其0碼和1碼如圖所示(以遙控接收輸出的波形為例)。0碼由0.56ms低電平和0。56ms高電平組合而成,脈沖寬度為1.12ms.1碼由0.56ms低電平和1.69ms高電平組合而成,脈沖寬度為2.25ms。在編寫解碼程序時.通過判斷脈沖的寬度,即可得到0或1。
UPD6121G産生的遙控編碼是連續的32位二進制碼組,其中前16位為用戶識别碼,能區别不同的電器設備,防止不同機種遙控碼互相幹擾,如我們可以同時使用電視機、機頂盒、功放等遙控器,但它們不會産生誤觸發。該芯片的用戶識别碼固定為十六進制01H;後16位為8位操作碼(功能碼)及其反碼。UPD6121G最多額128種不同組合的編碼。遙控器在按鍵按下後,周期性地發出同一種32位二進制碼,周期約為108ms。一組碼本身的持續時間随它包含的二進制“0”和“1”的個數不同而不同,大約在45~63ms之間。
2、按鍵的編碼
當我們按下遙控器的按鍵時,遙控器将發出如圖2的一串二進制代碼,我們稱它為一幀數據。根據各部分的功能。可将它們分為5部分,分别為引導碼、用戶識别碼、用戶識别碼反碼、數據碼、數據反碼。遙控器發射代碼時.均是低位在前,高位在後。由圖3分析可以得到.引導碼高電平為4.5ms,低電平為4.5ms,當接收到此碼時,表示一幀數據的開始。單片機可以準備接收下面的數據。用戶識别碼由8位二進制組成,共256種.圖中地址碼重發了一次,主要是加強遙控器的可靠性.如果兩次地址碼不相同,則說明本幀數據有錯,應丢棄。不同的設備可以擁有不同的用戶識别碼.因此。同種編碼的遙控器隻要設置地址碼不同,也不會相互幹擾。圖中的地址碼為十六進制的0EH(注意低位在前)。在同一個遙控器中,所有按鍵發出的地址碼都是相同的,數據碼為8位,可編碼256種狀态,代表實際所按下的鍵。數據反碼是數據碼的各位求反,通過比較數據碼與數據反碼,可判斷接收到的數據是否正确。如果數據碼與數據反碼之間的關系不滿足相反的關系.則本次遙控接收有誤,數據應丢棄。在同一個遙控器上.所有按鍵的數據碼均不相同。在圖3中,數據碼為十六進制的0CH,數據反碼為十六進制的0F3H(注意低位在前),兩者之和應為0FFH。
二、單片機遙控接收電路
紅外遙控接收可采用較早的紅外接收二極管加專用的紅外處理電路的方法。如CXA20106,此種方法電路複雜,現在一般不采用。較好的接收方法是用一體化紅外接收頭,它将紅外接收二極管、放大、解調、整形等電路做在一起,隻有三個引腳。分别是 5V電源、地、信号輸出。常用的一體化接收頭的外形及引腳見紅外接收頭的信号輸出接單片機的INTO或INTl腳。典型電路如圖5所示。圖中增加了一隻PNP型三極管對輸出信号進行放大。
三、遙控信号的解碼算法及程序編制
平時,遙控器無鍵按下。紅外發射二極管不發出信号,遙控接收頭輸出信号1,有鍵按下時,0和1編碼的高電平經遙控頭倒相後會輸出信号0.由于與單片機的中斷腳相連,将會引起單片機中斷(單片機預先設定為下降沿産生中斷)。單片機在中斷時使用定時器0或定時器1開始計時.到下一個脈沖到來時,即再次産生中斷時,先将計時值取出。清零計時值後再開始計時.通過判斷每次中斷與上一次中斷之間的時間間隔。便可知接收到的是引導碼還是0和1。如果計時值為9ms。接收到的是引導碼,如果計時值等于1.12ms,接收到的是編碼0。如果計時值等于2.25ms.接收到的是編碼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左右均可。根據碼的格式,應該等待9ms的起始碼和4.5ms的結果碼完成後才能讀碼。
以接收TC9012遙控器編碼為例,解碼方法如下:
(1)設外部中斷0(或者1)為下降沿中斷,定時器0(或者1)為16位計時器,初始值均為O。
(2)第一次進入遙控中斷後,開始計時。
(3)從第二次進入遙控中斷起,先停止計時,并将計時值保存後,再重新計時。如果計時值等于前導碼的時間,設立前導碼标志。準備接收下面的一幀遙控數據,如果計時值不等于前導碼的時間,但前面已接收到前導碼,則判斷是遙控數據的0還是1。
(4)繼續接收下面的地址碼、數據碼、數據反碼。
(5)當接收到32位數據時,說明一幀數據接收完畢。此時可停止定時器的計時,并判斷本次接收是否有效.如果兩次地址碼相同且等于本系統的地址,數據碼與數據反碼之和等于0FFH,則接收的本幀數據碼有效。否則丢棄本次接收到的數據。
(6)接收完畢,初始化本次接收的數據,準備下一次遙控接收。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!