摘要:通過對紅外遙控器發射編碼的分析,提出了一種以單片機AT89s52為核心的自學習型紅外遙控器的設計和實現方案。在方案中采用測量脈沖寬度的方法來學習紅外遙控編碼,采用索引存儲的方法來保存學習到的紅外編碼,采用單片機定時器來產生紅外編碼發射所需要的38khz紅外載波。大量的實驗數據表明,文章提出的設計方案解決了紅外學習效率不高,存儲空間利用率低的問題。特別是索引存儲的設計方法對編碼的成功學習和存儲起到了關鍵作用,值得推廣。
關鍵詞:自學習;AT89S52 紅外遙控器;索引存儲
中圖分類號:TP368.1文獻標識碼:B文章編號:1009-3044(2008)24-1257-03
Design and Realization of a Learning Infrared Remote Controller
LIN Ling, YU De-hai
(Department of Computer Science and Technology, Changchun University of Technology,Changchun 130012, China)
Abstract: Through the analysis of the infrared emission coding, This paper presents a kind of design scheme of infrared remote controller based on the MCU AT89s52.In this paper, the remote controller learns infrared code by pulse width measuring, saves code by index, outputs carrier wave by timer. A large number of experiments show that the design proposed in this paper has solved the issues infrared learning efficiency not high, a low utilization rate of storage space. In particular the method of index storage played a key role during coding learned and saved successfully, it should be promoted.
Key words: self-learning; AT89S52 infrared controller;index storage
1 引言
人們生活水平的提高推動了家電業的快速發展,使越來越多的電器進入家庭,特別是實用方便的帶紅外遙控的電器在普通家庭中是隨處可見。但是隨之而來,新的問題出現了:家里遙控器太多,不能通用,在使用過程中容易產生混亂等等,這些問題給人們生活帶來了諸多不便。為此,本文設計了以AT89s52為核心的自學習型紅外遙控器,實現一器多用,并能隨時更新內容,適應每個用戶的特殊需求。
2 學習型紅外遙控器的設計思想
當紅外遙控器的某個鍵被按下時,會發射出一組串行二進制遙控編碼脈沖。該脈沖由引導碼、系統碼及其反碼、功能碼及其反碼組成。在實際的遙控器生產廠家中,不同廠家通過設置這些編碼以及碼長區分不同廠家或不同型號的紅外遙控器。因此想解碼所有不同廠家的紅外遙控器是不現實的。
本系統設計思想是不考慮紅外編碼方式,僅利用單片機AT89s52對紅外遙控編碼的脈沖寬度進行測量,并原封不動把發射信號中高低電平的時間寬度記錄保存到E2PROM指定的地址中。當要發射紅外信號時,從E2PROM中取出數據并還原出相應的紅外遙控編碼,并調制到38kHz的載波信號上。最后,通過三極管放大電路驅動紅外發光二極管發射紅外信號,達到學習和發射的目的,從而實現一個遙控器控制多種紅外遙控設備。

圖1 硬件結構框
3 硬件電路設計
硬件結構框圖如圖1所示。
3.1 紅外接收電路
紅外接收電路選用市面上常用的一體化紅外接收頭HS0038B。它的特點是集光電轉換、解碼和放大于一體,只需少量外接元件就能完成紅外接收到輸出TTL電平信號。HS0038B平時輸出為高電平,當接收到遙控信號時,輸出為低高電平組成的脈沖。也就是說,接收時1個碼由1個低電平后跟1個高電平構成。經實驗所得高低電平的長度通常為幾毫秒到十幾毫秒,一個遙控信號包括的碼位從十幾位到三十三位不等。另外,一般的遙控器編碼在長按按鍵的時候,會連續的發數據,可能是同樣的數據,也有可能是個特定的所謂重復幀,雖然幀間的間隔大小不等,但一般在20-100ms之間,而有效的0和1的編碼時間卻基本小于10ms,就是說大致上15ms之內沒有信號收到就表示當前的數據幀已經接收完畢。所以本遙控器紅外接收電路設計成圖2所示。

圖2 接收電路

圖3 紅外發射電路

圖4 系統軟件主流程
輸出信號接單片機INT0端,同時該信號經過非門之后接INT1端,兩個外部中斷設置成下降沿觸發,在INT0中斷的時候開始記錄低電平的寬度,在INT1中斷的時候記錄高電平的寬度,同時判斷計數值是否超過范圍來確定是否接收完畢。這種方法的優點是軟件反應較快,中斷處理部分不占用太多的時間。
3.2 紅外發射電路
紅外發射電路如圖3所示。當系統進入發射功能時,AT89s52首先從HD7279A讀取用戶按鍵碼,然后從E2PROM中取出相應鍵值的遙控基帶信號,即紅外遙控編碼的高、低電平持續時間,同時直接用定時器T1來產生38KHz的載波信號。最后,將基帶信號調制到載波上,經三極管放大驅動紅外發射管輻射出940nm的紅外脈沖信號。
3.3 存儲電路
選擇采用I2C總線的串行E2PROM(AT24C256)作為片外存儲器,其存儲容量為32768字節,即32KB,足夠存儲大量的數據。
3.4 鍵盤顯示電路
選擇串行接口的HD7279A,該芯片可同時驅動8位共陰數碼管或64只獨立的智能顯示驅動芯片,該芯片同時還可連接多達64鍵的鍵盤矩陣,單片即可完成LED顯示、鍵盤接口的全部功能。在本系統中連接四個LED數碼管(用于顯示鍵碼和狀態信息等)和49個按鍵,其中1個學習鍵,14個設備鍵,34個功能鍵。也就是說本遙控器最多可學習14種設備。
4 軟件實現
本系統軟件主流程如圖4所示。
4.1 紅外編碼的學習
通常記錄一個碼需要4個字節,即TH0、TL0、TH1、TL1,而對AT24c256寫一個字節至少需要4ms,故不能一邊接收一邊存儲,只能將學習到的計時值暫存在RAM中,待接收完畢再轉存入AT24c256中。我們知道紅外編碼一幀信息通常為33個碼(當然也有非標準的,不過很少見),這樣就需要132個字節的RAM,如果將這些編碼不加處理的全部存放在E2PROM中,需要的空間就比較大。同時由于存在計時誤差,對于同一種碼,在接收到時不一定完全一樣,其高低電平常常在一個很小的范圍波動。基于以上原因,本設計采用下面方法來實現學習一個鍵。
第一步根據按下的設備按鍵鍵碼讀出存放在E2PROM公共鍵碼區記錄的公共鍵碼。假設讀出的公共鍵碼存入RAM中數組sharekey[ ]。
第二步接收遙控信號(假設存入數組remotedata[ ]),并將其與讀出的公共鍵碼逐一比較,找出新碼(一般不超過10個),也即差別較大的碼。 然后將找到的新碼添加到數組sharekey[ ]中。最后將所有的公共碼存入E2PROM。所謂差別較大就是指相比較的兩個碼的定時器1、定時器0的高位相等,低位相差大于20H(TH1和TH0相等,TL1或TL0的差值大于20H)。
第三步采用索引的方式記錄該幀信號中的所有碼位,即將數組remotedata[ ]中每一碼位與sharekey[ ]中的碼比較,如果相差不大(比如0x04號碼),就用該碼號來記錄此碼位。這樣一個碼位只需要一個字節來記錄,而原來需要二個字節,節省了一半的E2PROM資源。最后將索引存入E2PROM中功能鍵碼對應的地址處。
具體學習子程序流程圖如圖5所示。在本系統中為了提高計時準確度,在設計中斷處理函數時采用了如下方法:在進入INT0的中斷時,關閉T1,判斷(判斷計時值是否超過了15ms,超過就清EA,表示一幀數據接收完畢)并讀入TH1和TL1的值(該值為前一個高電平脈沖寬度值),然后開啟T0開始記錄低電平脈沖寬度;在進入INT1中斷時,關閉T0,判斷并讀入TH0和TL0的值(該值為前一個低電平脈沖寬度值),然后開啟T1開始記錄高電平脈沖寬度。
4.2 數據的存儲
本系統將E2PROM劃分為M個空間。相同設備的鍵碼存放在一個空間中,然后再把每個設備指令的空間分成N份,每份空間存放一個功能鍵編碼。按照這個思路,容量為32KB的AT24c256,按存放14種設備計算,每種設備占空間為2304字節:設備公共鍵碼區32字節,功能鍵碼區2244字節(每個鍵占空間66字節,按34個鍵計算),留余量28字節(便于地址分配)。具體地址分配如表一所示。具體尋址計算方法如下:本系統中假定功能鍵鍵值范圍為0x00~0x22,設備鍵鍵值范圍為0x30~0x3d(這里鍵值是根據按鍵與芯片HD7279A連接來確定的,連接不同,按鍵返回的鍵值也不同。詳情可參考芯片hd7972a技術手冊)。設備鍵公共碼首址=(設備鍵鍵值-0x30)*2304,功能鍵碼首址=公共碼首址+0x20+(功能鍵鍵值*66)。這里2304是每個設備所占空間大小,0x20是公共鍵碼區大小,66是每個功能鍵碼索引所占空間大小。
表1 設備地址分配表


圖5學習子程序流程圖
圖6 發射子程序流程圖
4.3 紅外編碼的發射
發射流程圖如圖6所示。當進入發射狀態時,先根據按下的設備鍵從相對應的設備公共鍵碼區讀出公共鍵碼,然后根據按下的功能鍵尋址讀入功能鍵編碼索引,最后根據索引與公共鍵碼轉換出功能鍵實際編碼,并按位取反送入發射口。這里要按位取反的原因得從接收原理分析起,當無遙控信號輸入時,HS0038B輸出端保持高電平,有信號時才出現低電平。所以根據發射電路,需將信號取反,再從P0.3口輸出。
5 結論
脈寬測量和索引存儲的結合提高了學習效率、準確率、存儲空間利用率。實際測試中,對市面上流行的各種紅外遙控器編碼的學習之后,都能控制相應的紅外遙控設備。另外我們可以加上無線射頻電路,實現無線到紅外的轉發達到穿墻遙控。還可以將學習到的編碼通過串口上傳到智能家居的網關,實現遠程遙控家用電器,使傳統家電在智能家居系統中占有一席之地,也為現代家庭從傳統家電向智能家電過渡提供了一種擇中的方案。
參考文獻:
[1] 李光飛,李良兒.單片機C程序設計實例指導[M].北京:北京航空航天大學出版社,2005.
[2] 張毅剛.單片機原理及應用[M],北京:高等教育出版社,2003.
[3] 王為青,程國剛.單片機Keil Cx51應用開發技術[M].北京:人民郵電出版社,2006.
[4] 何立民.MCS-51系列單片機應用系統設計[M].北京:北京航空航天大學出版社,1990.
[5] 李冬梅,高文煥.通用學習式紅外遙控器中數據壓縮與識別算法[J].清華大學學報(自然科學版),2000,40(7):85-88.
[6] 凌志斌,鄧超平,鄭益慧,等.紅外遙控技術及其解碼方案[J].微處理機,2003,(6):59-62.
[7] 趙海蘭,紅外學習機的設計原理及應用[J],電子世界,2004,(12):23-24.
[8] 黃濤,褚淑杰.基于紅外通信的智能家居系統[J].微計算機信息,2005,21(1):41-43.
[9] 北京凌志比高科技有限公司.HD7279A中文手冊[EB/OL].[2008-05-24].http://www.bitcode.com.cn.
[10] 廣州周立功單片機發展有限公司.AT24C256中文手冊[EB/OL].[2008-05-24].http://www.zlgmcu.com.cn.