NEC協(xié)議紅外遙控器_第1頁
NEC協(xié)議紅外遙控器_第2頁
NEC協(xié)議紅外遙控器_第3頁
NEC協(xié)議紅外遙控器_第4頁
NEC協(xié)議紅外遙控器_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

NEC協(xié)議紅外遙控器家電遙控器通信距離往往要求不高,而紅外的成本比其他無線設備要低的多,所以家電遙控器應用中紅外始終占據(jù)著一席之地。遙控器的基帶通信協(xié)議許多,也許有幾十種,常用的就有ITT協(xié)議、NEC協(xié)議、Sharp協(xié)議、PhilipsRC-5協(xié)議、SonySIRC協(xié)議等。用的最多的就是NEC協(xié)議了,因此我們KST-51開發(fā)板隨板的遙控器直接采納NEC協(xié)議,我們這節(jié)課也以NEC協(xié)議標準來講解一下。

NEC協(xié)議的數(shù)據(jù)格式包括了引導碼、用戶碼、用戶碼(或者用戶碼反碼)、按鍵鍵碼和鍵碼反碼,最終一個停止位,停止位主要起隔離作用,一般不進行推斷,編程時我們也不予理睬。其中數(shù)據(jù)編碼總共是4個字節(jié)32位,如圖1所示。第一個字節(jié)是用戶碼,其次個字節(jié)可能也是用戶碼,或者是用戶碼的反碼,詳細由生產(chǎn)商打算,第三個字節(jié)就是當前按鍵的鍵數(shù)據(jù)碼,而第四個字節(jié)是鍵數(shù)據(jù)碼的反碼,可用于對數(shù)據(jù)的糾錯。

圖1NEC協(xié)議數(shù)據(jù)格式

這個NEC協(xié)議,表示數(shù)據(jù)的方式不像我們之前學過的比如uart那樣直觀,而是每一位數(shù)據(jù)本身也需要進行編碼,編碼后再進行載波調(diào)制。

引導碼:9ms的載波+4.5ms的空閑。

比特值“0”:560us的載波+560us的空閑。

比特值“1”:560us的載波+1.68ms的空閑。

結合圖1我們就能看明白了,最前面黑乎乎的一段,是引導碼的9ms載波,緊接著是引導碼的4.5ms的空閑,而后邊的數(shù)據(jù)碼,是眾多載波和空閑交叉,它們的長短就由其要傳遞的詳細數(shù)據(jù)來打算。我們的HS0038B這個紅外一體化接收頭,當收到有載波的信號的時候,會輸出一個低電平,空閑的時候會輸出高電平,我們用規(guī)律分析儀抓出來一個紅外按鍵通過HS0038解碼后的圖形來了解一下,如圖2所示。

圖2紅外遙控器按鍵編碼

從圖上可以看出,先是9ms載波加4.5ms空閑的起始碼,數(shù)據(jù)碼是低位在前,高位在后,數(shù)據(jù)碼第一個字節(jié)是8組560us的載波加560us的空閑,也就是0x00,其次個字節(jié)是8組560us的載波加1.68ms的空閑,可以看出來是0xFF,這兩個字節(jié)就是用戶碼和用戶碼的反碼。按鍵的鍵碼二進制是0x0B,反碼就是0xF3,最終跟了一個560us載波停止位。對于我們的遙控器來說,不同的按鍵,就是鍵碼和鍵碼反碼的區(qū)分,用戶碼是一樣的。這樣我們就可以通過單片機的程序,把當前的按鍵的鍵碼給解出來。

我們前邊學習中斷的時候,學到51單片機有外部中斷0和外部中斷1這兩個外部中斷。我們的紅外接收引腳接到了P3.3引腳上,這個引腳的其次功能就是外部中斷1。在寄存器TCON中的bit3和bit2這兩位,是和外部中斷1相關的兩位。其中IE1是外部中斷標志位,當外部中斷發(fā)生后,這一位被自動置1,和定時器中斷標志位TF相像,進入中斷后會自動清零,也可以軟件清零。bit2位是設置外部中斷類型的,假如bit2位為0,那么只要P3.3為低電平就可以觸發(fā)中斷,假如bit2位為1,那么P3.3從高電平到低電平的下降沿發(fā)生才可以觸發(fā)中斷。此外,外部中斷1使能位是EX1。那下面我們就把程序?qū)懗鰜?,使用?shù)碼管把遙控器的用戶碼和鍵碼顯示出來。

Infrared.c文件主要是用來檢測紅外通信的,當發(fā)生外部中斷后,進入外部中斷,通過定時器1定時,首先對引導碼推斷,而后對數(shù)據(jù)碼的每個位逐位獵取凹凸電平的時間,從而得知每一位是0還是1,最終把數(shù)據(jù)碼解出來。

/***********************infrared.c文件程序源代碼*************************/

#includereg52.h

sbitIR_INPUT=P3^3;//紅外接收引腳

bitirflag=0;//紅外接收標志,收到一幀正確數(shù)據(jù)后置1

unsignedcharircode[4];//紅外代碼接收緩沖區(qū)

voidInitInfrared(void)//紅外功能的初始化函數(shù)

{

TMOD=0x0F;//清零T1的掌握位

TMOD|=0x10;//配置T1為模式1

TR1=0;//停止T1計數(shù)

ET1=0;//禁止T1中斷

IT1=1;//設置INT1為負邊沿觸發(fā)

EX1=1;//使能INT1中斷

}

unsignedintGetHighTime(void)//獵取高電平常間

{

TH1=0;//清零T1計數(shù)初值

TL1=0;

TR1=1;//啟動T1計數(shù)

while(IR_INPUT)//紅外輸入引腳為1時循環(huán)檢測等待,變?yōu)?時則結束本循環(huán)

{

if(TH1=0x40)

{//當T1計數(shù)值大于0x4000,即高電平持續(xù)時間超過約18ms時,

break;//強制退出循環(huán),是為了避開信號特別時,程序假死在這里。

}

}

TR1=0;//停止T1計數(shù)

return(TH1*256+TL1);//返回T1的計數(shù)值

}

unsignedintGetLowTime(void)//獵取低電平常間

{

TH1=0;//清零T1計數(shù)初值

TL1=0;

TR1=1;//啟動T1計數(shù)

while(!IR_INPUT)//紅外輸入引腳為0時循環(huán)檢測等待,變?yōu)?時則結束本循環(huán)

{

if(TH1=0x40)

{//當T1計數(shù)值大于0x4000,即低電平持續(xù)時間超過約18ms時,

break;//強制退出循環(huán),是為了避開信號特別時,程序假死在這里。

}

}

TR1=0;//停止T1計數(shù)

return(TH1*256+TL1);//返回T1的計數(shù)值

}

voidEXINT1_ISR()interrupt2//INT1中斷服務函數(shù),執(zhí)行紅外接收及解碼

{

unsignedchari,j;

unsignedcharbyt;

unsignedinttime;

//接收并判定引導碼的9ms低電平

time=GetLowTime();

if((time7833)||(time8755))//時間判定范圍為8.5~9.5ms,

{//超過此范圍則說明為誤碼,直接退出

IE1=0;//退出前清零INT1中斷標志

return;

}

//接收并判定引導碼的4.5ms高電平

time=GetHighTime();

if((time3686)||(time4608))//時間判定范圍為4.0~5.0ms,

{//超過此范圍則說明為誤碼,直接退出

IE1=0;

return;

}

//接收并判定后續(xù)的4字節(jié)數(shù)據(jù)

for(i=0;i4;i++)//循環(huán)接收4個字節(jié)

{

for(j=0;j8;j++)//循環(huán)接收判定每字節(jié)的8個bit

{

//接收判定每bit的560us低電平

time=GetLowTime();

if((time313)||(time718))//時間判定范圍為340~780us,

{//超過此范圍則說明為誤碼,直接退出

IE1=0;

return;

}

//接收每bit高電平常間,判定該bit的值

time=GetHighTime();

if((time313)(time718))//時間判定范圍為340~780us,

{//在此范圍內(nèi)說明該bit值為0

byt=1;//因低位在先,所以數(shù)據(jù)左移,高位為0

}

elseif((time1345)(time1751))//時間判定范圍為1460~1900us,

{//在此范圍內(nèi)說明該bit值為1

byt=1;//因低位在先,所以數(shù)據(jù)左移,

byt|=0x80;//高位置1

}

else//不在上述范圍內(nèi)則說明為誤碼,直接退出

{

IE1=0;

return;

}

}

ircode[i]=byt;//接收完一個字節(jié)后保存到緩沖區(qū)

}

irflag=1;//接收完畢后設置標志

IE1=0;//退出前清零INT1中斷標志

}

大家在閱讀這個文件里的代碼時,會發(fā)覺我們在獵取凹凸電平常間的時候做了超時推斷if(TH1=0x40),這個超時推斷一方面是應對空間突發(fā)的紅外干擾信號,假如我們不做超時推斷,程序有可能會始終等待下一個跳變才會停止檢測,造成程序假死。另外一個方面,遙控器的單按按鍵和持續(xù)按住按鍵發(fā)出來的信號是不同的。我們先來對比一下兩種按鍵方式的信號狀態(tài),如圖3和4所示。

圖3紅外單次按鍵時序圖

圖4紅外持續(xù)按鍵時序圖

單次按鍵的結果3和我們之前的圖2是一樣的,這個不需要再解釋。而持續(xù)按鍵,首先會發(fā)出一個和單次按鍵一樣的波形出來,經(jīng)過也許40ms后,會產(chǎn)生一個9ms載波加2.25ms空閑,再跟一個停止位的波形,而后只要你還在按住按鍵,每經(jīng)過也許96ms就會產(chǎn)生9ms載波加2.25ms空閑加停止位這樣的重復波形。我們?nèi)藶榘聪掳存I的時候,很難掌握按下的時間,因此后邊的很簡單消失這種連續(xù)波形,我們加上超時推斷也可以有效的避開進入連續(xù)波形的死循環(huán)中去。

/***********************main.c文件程序源代碼*************************/

#includereg52.h

sbitADDR3=P1^3;//LED選擇地址線3

sbitENLED=P1^4;//LED總使能引腳

unsignedcharcodeLedChar[]={//數(shù)碼管顯示字符轉換表

0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E

};

unsignedcharLedBuff[6]={//數(shù)碼管顯示緩沖區(qū)

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF

};

unsignedcharT0RH=0;//T0重載值的高字節(jié)

unsignedcharT0RL=0;//T0重載值的低字節(jié)

externbitirflag;

externunsignedcharircode[4];

voidConfigTimer0(unsignedintms);

externvoidInitInfrared(void);

voidmain()

{

P0=0xFF;//P0口初始化

ADDR3=1;//選擇數(shù)碼管

ENLED=0;//LED總使能

InitInfrared();//初始化紅外功能

ConfigTimer0(1);//配置T0定時1ms

EA=1;//開總中斷

//PT0=1;//配置T0中斷為高優(yōu)先級

while(1)

{

if(irflag)//接收到紅外數(shù)據(jù)時刷新顯示

{

irflag=0;

LedBuff[5]=LedChar[ircode[0]4];//用戶碼顯示

LedBuff[4]=LedChar[ircode[0]0x0F];

LedBuff[1]=LedChar[ircode[2]4];//鍵碼顯示

LedBuff[0]=LedChar[ircode[2]0x0F];

}

}

}

voidConfigTimer0(unsignedintms)//T0配置函數(shù)

{

unsignedlongtmp;

tmp=11059200/12;//定時器計數(shù)頻率

tmp=(tmp*ms)/1000;//計算所需的計數(shù)值

tmp=65536-tmp;//計算定時器重載值

tmp=tmp+15;//修正中斷響應延時造成的誤差

T0RH=(unsignedchar)(tmp8);//定時器重載值拆分為凹凸字節(jié)

T0RL=(unsignedchar)tmp;

TMOD=0xF0;//清零T0的掌握位

TMOD|=0x01;//配置T0為模式1

TH0=T0RH;//加載T0重載值

TL0=T0RL;

ET0=1;//使能T0中斷

TR0=1;//啟動T0

}

voidInterruptTimer0()interrupt1//T0中斷服務函數(shù)

{

staticunsignedchariled=0;

TH0=T0RH;//定時器重新加載重載值

TL0=T0RL;

//LED數(shù)碼管動態(tài)掃描

P0=0xFF;//關閉全部段選位,顯示消隱

P1=(P10xF8)|iled;//位選索引值賦值到P1口低3位

P0=LedBuff[iled];//相應顯示緩沖區(qū)的值賦值到P0口

if(iled5)//位選索引0-5循環(huán),因有6個數(shù)碼管

il

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論