紅外線接收控制器的制作 在生活中,我們常用到紅外線控制各類電器,如彩電、空調、電風扇等。為我們帶來較多的方便。但有時我們仍感到不方便。如看完電視后,用遙控器只能關掉電視主電源,電視仍處于待機狀態。使用者還得走到電視跟前.按下電小視電源開關方能放心。若想看電視。還得動身開電視,顯得很麻煩。尤其是冬天躺在床上看電視,上上下下,深感不便。本文以利用紅外遙控器來遙控風扇的制作方法為例(可任選一只紅外線遙控器.能調速,軟件稍作改變,可增加定時功能等),來介紹紅外線接收控制器的制作方法,如果制作電視交流電源的開、關控制器,可與電視共用一只遙控器,制作也較簡單些。 制作思路 紅外遙控發射器是利用紅外線作載體傳送信息的,發射周期不等的經過調制后串行碼.該串行碼一般由引導碼、用戶識別碼、操作碼組成。經紅外接收頭解碼后得到一串周期不等的矩形波。如示意圖1。 不同型號的遙控發射器的波形寬度不同。即周期T1、T2……不同.在不知手頭遙控發射器的波形周期的情況下.首先要制作一個檢測紅外線周期的工具。根據測得的周期規律來制作紅外線接收控制器。 制作方法 檢測紅外周期的器件制作.見圖2。 當紅外接收頭沒有接收到發射器發送來的紅外線.其輸出端輸出高電平(約 5V)。當接收到紅外線,輸出端電平變低.送到單片機AT89C2051的外部中斷1口即INT1,使其發生中斷而進入中斷服務:啟動定時器1并開M-I-數。相當于在圖1的A點.1個周期后即C點。單片機第二次中斷。關定時器1.記下周期T1(實際上只記下TH1的數值。 TL1的值可以丟棄)。然后清TH1、TL1,再啟動定時器1重新計數,第二個周期完后,同樣會引起單片機發生中斷.再記下周期T2'…一,如此記下40-50個周期(一般紅外編碼為4字節.即32BIT.之前還有引導碼。又因接收到的紅外數據不一定是從引導碼開始,要分析一次完整的串行碼,應盡可能多記下紅外矩形波周期數)。接收完后,通過按輕觸開關將各記下的各周期的THl在數碼管顯示出來以作分析(每按一次輕觸開關,顯示下一個周期數)。 編程方法 在main()中開中斷。啟動定時器1.即EA=I;EX1=1:IT1=1;TRI=I: 在外部中斷1的服務程序中編寫如下語名:#defineCNT50//預測50個紅外線周期 DATA Byte value_h[CNT]://記錄周期的變量(數組) DATA Byte count=0;//接收到的周期數 void int1(void)interrupt 2{ if(TH1==TL1&&TL1==0)//判斷是否是第一次接收到紅外數據 { TR1=1: }elseI TRl=0;value_h[count]:THl; THl=TLl=0;TRI=I:count ; if(count==CNT) { EXl=0:count=u; l} l 假設接收到的TH的數值為:30,50.04,08,08,08,04,04,04,04,04,08,08,08,04,04,04,04。08,04,04,08,04,04,04,04,04,04,08,08,04.08,08,08,08,3f,50.... 稍作分析可知。表示高低電平的有效數為:04,08。若將04定作低電平.08定作高電平.舍棄其他數據,得到4字節數據即:01110000。01110000,10010000。01101111。轉為十六進制后得:70h,70h,90h,6fh,至此得到遙控發射器剛才按下的鍵值碼.用同樣的方法可以測得其他鍵鍵值碼。假設有:70h,70h,0x90,0x6f。//0鍵70h,70h.0x00,0xff。//1鍵70h,70h.0xd0,0x2f//power鍵 根據以上數據分析得.每鍵碼為4字節.前2字節固定不變,為用戶識別碼。后2字節均不同,是操作碼。將遙控器上的各鍵鍵值碼測出后,根據這些數據可以根據制作需要進行編程了。因鍵值碼為4字節太長。不利于編程,需要將各鍵鍵值轉為相對應的1字節的數據,如:70h,70h,0x90,0x6f,對應于O,70h,70h,0x00,0xff對應于1..…· 轉換方法: 建立一個數組,將上述測得的各鍵碼按順序放入數組中(去掉用戶識別碼) code Byte arr[][2]= { 0x90,0x6f.//0,盡可能按鍵0、鍵1..·…的先后順序放,以符合習慣 0x00,0xff,//1 …… Oxl0,0xef.//9 0xd0, Ox2f //power 13 }; 在接收紅外線的外部中斷1函數中編寫如下的鍵碼轉換語句: DATA Byte arrtmp[4]; DATA Byte Keytmp;//轉換后的鍵值寄存變量 DATA Byte Keyval=NOKEY; bit KeyOk;//鍵值轉換完成與否的標志 bit d_Ok;//接收到一個完整的鍵碼標志 void Ex_int(void)interrupt 2 { Byte i; Byte(*p)[2]; …… if(d_Ok)//若接收到完整的鍵碼 { d_Ok=0://清除 if(arrtmp[0]==0x70&&arrtmp[1] ==0x70){//鍵碼轉換 for(p=arr,bO:i<14:i 。p ) {if(arrtmp[2]==*(*p 0)&&arrtmp[3] ==*(*p 1)) { Keytmp=i:KeyOk=1;//鍵值 轉換成功標志 break; }else{Keytmp=NOKEY;l//未 接收到完整的鍵值 } }eIse{Keytmp=NOKEY;} } l 經過轉換后的Keytmp為0、1、2……的整數.然后再編寫主函數、調速函數(參源程序)。來進行電風扇調速。 有關電路的一些解釋:單片機U1(AT89C2051)P37腳輸出高低電平通過R13控制光耦可控硅MOC3041(參數可在《電子制作》網站查找)通斷.通過控制其通斷時間比來達到電風扇調速。 有關紅外周期檢測和電風扇調速實例的源程序可在本刊網站上下載。 |