《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 紅外遙控器解碼軟件設(shè)計(jì)及應(yīng)用
紅外遙控器解碼軟件設(shè)計(jì)及應(yīng)用
來(lái)源:微型機(jī)與應(yīng)用2011年第21期
劉萬(wàn)斌,,于 群
(山東科技大學(xué) 信息與電氣工程學(xué)院,山東 青島 266510)
摘要: 基于AT87C52單片機(jī)的萬(wàn)能遙控器解碼及其應(yīng)用,提出了一種簡(jiǎn)易的紅外遙控器解碼方法,,此法可以在完全不知遙控引導(dǎo)碼和結(jié)束碼使用的編碼規(guī)則的情況下,,直接解碼,自主定義1和0,。具有操作簡(jiǎn)便,,可移植性強(qiáng)的特點(diǎn)。
Abstract:
Key words :

摘  要: 傳統(tǒng)的紅外遙控器解碼,,需要預(yù)知發(fā)射端紅外編碼格式,,不同的編碼格式軟件不通用,可移植性差,。通過(guò)對(duì)遙控器紅外信號(hào)的采集,、分析,提出基于AT87C52單片機(jī)外部中斷,,利用HS0038紅外線接收器的紅外遙控器的解碼軟件的設(shè)計(jì)及其應(yīng)用,,可以在不掌握遙控器的編碼格式的情況下,破譯每個(gè)鍵的紅外編碼,,進(jìn)而將其擴(kuò)展為單片機(jī)的鍵盤系統(tǒng),。其程序通用性好,裝置集成化高,,可以方便地應(yīng)用于其他紅外遙控接收裝置,。
關(guān)鍵詞: 單片機(jī);外部中斷,;紅外遙控器,;解碼;鍵盤

 紅外遙控器是一種無(wú)線的,、非接觸控制裝置,,具有抗干擾能力強(qiáng)、信息傳輸可靠,、功耗低,、成本低的特點(diǎn),廣泛應(yīng)用于日常生活和工業(yè)中[1],。由于不同公司生產(chǎn)的遙控器編碼碼制往往不同,,通常不可移植??紤]到C語(yǔ)言與匯編語(yǔ)言相比具有書寫方便易于開發(fā)等特點(diǎn),,本文設(shè)計(jì)了一種簡(jiǎn)單的紅外線接收電路,通過(guò)C語(yǔ)言軟件設(shè)計(jì),,實(shí)現(xiàn)對(duì)萬(wàn)用遙控器的解碼,,可以方便地應(yīng)用于其他紅外遙控設(shè)備,。
1 系統(tǒng)的實(shí)現(xiàn)
1.1 紅外信號(hào)的構(gòu)成

 紅外通信主要由發(fā)射和接收兩部分組成。發(fā)射端將待發(fā)送的二進(jìn)制信號(hào)編碼成一系列脈沖串信號(hào),,通過(guò)紅外發(fā)射管發(fā)送,。接收端接收信號(hào)的同時(shí),對(duì)紅外信號(hào)進(jìn)行放大,、檢波,、整形后得到TTL電平編碼,送入單片機(jī)處理[2],。紅外發(fā)射二極管發(fā)送的信號(hào)是頻率為38 kHz的間斷脈沖串,,相當(dāng)于用二進(jìn)制信號(hào)的編碼乘以頻率為38 kHz的脈沖信號(hào)得到的間斷脈沖串。如圖1所示,,A是二進(jìn)制信號(hào)的編碼波形,,B是頻率為38 kHz周期為26 μs的連續(xù)脈沖串,C是經(jīng)調(diào)制后的間斷脈沖串(相當(dāng)于C=A×B),,用于紅外發(fā)射二極管發(fā)送的波形。圖1中,,待發(fā)送的二進(jìn)制數(shù)據(jù)為101,。
1.2 紅外發(fā)射接收部分設(shè)計(jì)
 本文采用的紅外遙控器共6個(gè)鍵,分別是開關(guān),、震動(dòng),、氣泡、定時(shí),、加溫,、減溫。接收的部分選用HS0038紅外接收探頭,,接收頻率為38 kHz,、周期為26 μs的紅外信號(hào)。HS0038是黑色環(huán)氧樹脂封裝,,不受日光,、熒光燈等光源干擾,內(nèi)附磁屏蔽,,功耗低,,靈敏度高。在用小功率發(fā)射管發(fā)射信號(hào)的情況下,,其接收距離可達(dá)35 m,;它能與TTL、CMOS電路兼容,;HS0038為直立側(cè)面收光型,,同時(shí)能對(duì)信號(hào)進(jìn)行放大,、檢波、整形得到TTL電平的編碼信號(hào),。3個(gè)管腳分別是地,、+5 V電源、解調(diào)信號(hào)輸出端,。
 紅外解碼電路如圖2所示,,當(dāng)HS0038接收到紅外信號(hào)時(shí),輸出端輸出脈沖,,觸發(fā)三極管導(dǎo)通,,發(fā)光二極管通電發(fā)光[3],這樣可以直觀地看到發(fā)射,、接收部分是否正常工作,。輸出端接AT87C52單片機(jī)的T0口,下降沿觸發(fā)T0計(jì)數(shù)器計(jì)數(shù)[4],。

2 解碼方案
 單片機(jī)T0口接收到脈沖下降沿后,,T0計(jì)數(shù)器計(jì)數(shù),下一次下降沿觸發(fā)計(jì)數(shù)器停止,,并把結(jié)果存在預(yù)先設(shè)置好的數(shù)組中,。數(shù)組里面的數(shù)字代表一個(gè)信號(hào)的長(zhǎng)短。雖然不同廠商的紅外遙控器編碼形制不同,,但在所有的編碼中,,0、1信號(hào)只有長(zhǎng)度的區(qū)別,。根據(jù)這個(gè)原理,,對(duì)采集到的信號(hào)組進(jìn)行分析,定義長(zhǎng)的信號(hào)為1,,短的信號(hào)為0,。反復(fù)實(shí)驗(yàn)就得到各個(gè)按鍵的編碼,破解后的遙控器可以用作單片機(jī)的擴(kuò)展鍵盤,。圖3為解碼程序主流程圖,。

 

 


 void int1()
{
       IT0=1;  //下降沿觸發(fā)外部中斷IT0,;
           EX0=1,; //允許外部中斷;
           EA=1,;  //CPU中斷總允許,;
}
           void main()
{
           int i=0,j=0,;  //設(shè)置變量,;
           int1(),;      //初始化;
           TMOD=0x01,;//定時(shí)模式,;
           TH0=0;    //計(jì)數(shù)器高8位清零,;
           TL0=0,;    //計(jì)數(shù)器低8位清零;
           TR0=1,;    //開啟定時(shí)器,;
           Running=0; //設(shè)置引導(dǎo)碼標(biāo)志位,,初始值為“0”,;
           Time=0;   //接收次數(shù)
}
 for(i=0,;i<32,;i++)
{   
 calendar[i]=0; //清空信號(hào)存儲(chǔ)數(shù)組
}
}
void s_int0(void) interrupt 0 using 0://外部中斷T0[5]
  int th,,tl,; //設(shè)置變量用于暫時(shí)存儲(chǔ)計(jì)數(shù)器里的數(shù)值
             TR0=0; //關(guān)閉定時(shí)器,;
 if(running==0) //判斷引導(dǎo)碼標(biāo)志位的數(shù)值是否為“0”
     {
    running=1;   //標(biāo)志位置“1”,;
      }
   else         //已經(jīng)接收過(guò)引導(dǎo)碼,;
   {
        th=TH0;
        tl=TL0,;
        calendar[time]=th*256+tl,; //高8位與低8位整合
為一個(gè)數(shù),存入數(shù)組中,;
         time++ ,;  //采樣次數(shù)標(biāo)志位加1;
        if(time>=32) //判斷是否采集夠32位
          {
               EA=0,;  //關(guān)總中斷,;
               EX0=0;//關(guān)外部中斷,;
         }
    }
        TH0=0,;   //計(jì)數(shù)器高8位清零;
        TL0=0,;   //計(jì)數(shù)器低8位清零,;
    TR0=1,;  //開啟定時(shí)器;
}
 數(shù)據(jù)分析:以開關(guān)鍵為例,,采到的數(shù)據(jù)如表1所示,。

 由表1可以看出,開頭與結(jié)尾的3個(gè)信號(hào)時(shí)間比較長(zhǎng),,其余的信號(hào)可分為兩種(大約是1 100和2 200),。開頭的13 521是引導(dǎo)碼,結(jié)尾的40 498和11 235是終止碼,。把2 200定義為邏輯1,,1 100定義為邏輯0,得到第一個(gè)鍵碼制為00FF30CF,。用同樣的方法得到其他鍵的碼值分別為00FF10EF,、00FF20DF、00FF00FF,、00FF807F,、00FFA05F。前16位相同,,是客戶代碼,。
3 應(yīng)用
 遙控器解碼之后,可以通過(guò)單片機(jī)將其用于其他裝置(此系統(tǒng)已成功應(yīng)用于本實(shí)驗(yàn)室的微機(jī)繼電保護(hù)系統(tǒng)中),。由于計(jì)數(shù)器低8位的數(shù)值對(duì)整體影響不大,,本文根據(jù)高8位的數(shù)值判斷收到的信號(hào)為0或1,根據(jù)之前測(cè)得脈沖范圍,,規(guī)定TH0接收的數(shù)值在0x07~0x09之間,,鍵位碼為1;數(shù)值在0x02~0x05之間,,鍵位碼為0,。如此循環(huán)即可得到一個(gè)完整的碼值。然后進(jìn)入功能實(shí)現(xiàn)區(qū),,用戶可以根據(jù)自己的需要,,定義鍵位功能,具有很高的靈活性,。
應(yīng)用部分軟件設(shè)計(jì):
(1)讀鍵位循環(huán)的代碼如下:
 void s_int0(void)interrupt 0 using 0
 {      int th,,tl;
        th=TH0,;
         tl=TL0,;
        calendar[time]=th*256+tl;
          if((TH0>=0x07)&&(TH0<=0x09)) 
 //如果高8位數(shù)值在0x07~0x09之間,;
       {codegroup=(codegroup*2+1),; //在鍵位碼結(jié)尾加1,;
        }       
    else if((TH0>=0x02)&&(TH0<=0x05))
//如果高8位數(shù)值在0x02~0x05之間;
      { codegroup=codegroup*2,; //在鍵位碼結(jié)尾加0,;
      }    
            else{leader=0;}
                 time++,;
           }
(2)鍵位功能代碼如下:
if(code1==0x30CF)    //讀鍵位碼
      {     while(code1==0x30CF),; //確認(rèn)鍵位碼
         code1=0;      //清空碼值,,等待下一次按鍵
            (實(shí)現(xiàn)功能1)
    }
 if(code1==0x10EF)
      {  while(code1==0x10EF),;
        code1=0;
        (實(shí)現(xiàn)功能2)
…………………………
    if(code1==0x00FF)
      { while(code1==0xA05F),;
           code1=0,;
         (實(shí)現(xiàn)功能6)
        }
基于AT87C52單片機(jī)的萬(wàn)能遙控器解碼及其應(yīng)用,提出了一種簡(jiǎn)易的紅外遙控器解碼方法,,此法可以在完全不知遙控引導(dǎo)碼和結(jié)束碼使用的編碼規(guī)則的情況下,,直接解碼,自主定義1和0,。具有操作簡(jiǎn)便,,可移植性強(qiáng)的特點(diǎn)。
參考文獻(xiàn)
[1] 戴培山,,馮承德,,劉棟.基于keilC51的紅外解碼設(shè)計(jì)[J].自動(dòng)化儀器與儀表,2003(6):11-23.
[2] 盧靈,,劉遠(yuǎn)峰.紅外通信技術(shù)在溫濕度變送器上的應(yīng)用[J].微計(jì)算機(jī)信息,,2010(9-2):158-160.
[3] 童詩(shī)白,華成英.模擬電子技術(shù)基礎(chǔ)(第四版)[M].北京:高等教育出版社,,1980.
[4] 魏立峰,王寶興.單片機(jī)原理與應(yīng)用技術(shù)[M].北京:北京大學(xué)出版社,,2006.
[5] 馬忠梅,,籍順心,張凱,,等.單片機(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì)(第四版)[M].北京:北京航空航天大學(xué)出版社,,2007.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載,。