|
記錄一次使用NEC協(xié)議編碼的紅外遙控信號(hào)的解碼方式。
NEC協(xié)議簡(jiǎn)要記錄
NEC協(xié)議是紅外遙控協(xié)議的一種,由其編碼的數(shù)據(jù)幀分別由引導(dǎo)碼、用戶(hù)碼、用戶(hù)碼(或者是用戶(hù)碼的反碼)、數(shù)據(jù)碼(即按鍵碼)和數(shù)據(jù)碼的反碼這五部分組成,最后還有一個(gè)停止位。引導(dǎo)碼表示即將開(kāi)始傳輸32位的二進(jìn)制數(shù)據(jù);引導(dǎo)碼之后的部分長(zhǎng)度為4字節(jié)一共32位;第一字節(jié)為用戶(hù)碼;第二字節(jié)可能是用戶(hù)碼,也可能是用戶(hù)碼的反碼,具體由廠商決定;第三字節(jié)是當(dāng)前按鍵的按鍵碼;第四字節(jié)是按鍵碼的反碼;停止位主要起隔離作用,一般不進(jìn)行判斷,也不需要理會(huì)。每一字節(jié)的數(shù)據(jù)從低位到高位依次發(fā)送。
NEC協(xié)議編碼方式
NEC協(xié)議的每一比特?cái)?shù)據(jù)本身也需要進(jìn)行編碼,編碼后再進(jìn)行載波調(diào)制。
引導(dǎo)碼:9ms的高電平 + 4.5ms的低電平
比特值0:0.56ms的高電平 + 0.56ms的低電平
比特值1:0.56ms的高電平 + 1.68ms的低電平
發(fā)射端和接收端的電平相反,即:
引導(dǎo)碼:9ms的低電平 + 4.5ms的高電平
比特值0:0.56ms的低電平 + 0.56ms的高電平
比特值1:0.56ms的低電平 + 1.68ms的高電平
源程序記錄
按下紅外遙控器的任一按鍵1~9,即可在開(kāi)發(fā)板的數(shù)碼管模塊的左邊第一位上顯示對(duì)應(yīng)的按鍵數(shù)字。
- #include<reg51.h>
- sbit OUTPUT=P3^2; //P3.2引腳為單片機(jī)外部中斷0的觸發(fā)引腳,同時(shí)連接紅外接收模塊IR 1838的輸出端,在模塊輸出信號(hào)的同時(shí)進(jìn)入外部中斷0的服務(wù)函數(shù)
- sbit Wei=P2^7; //數(shù)碼管模塊位鎖存
- unsigned char Code[9]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數(shù)碼管顯示從“1”到“9”的段碼
- unsigned char Code0[4];
- unsigned char Code1[33];
- unsigned char time;
- bit m,n; //定義兩個(gè)標(biāo)志位;標(biāo)志位m表示一幀數(shù)據(jù)解碼完畢,標(biāo)志位n表示一幀數(shù)據(jù)接收完畢
- void ET_0() interrupt 1 using 1 //定時(shí)器0中斷
- {
- time++; //對(duì)兩個(gè)下降沿之間的時(shí)間間隔進(jìn)行計(jì)數(shù)
- }
- void EX_0() interrupt 0 //外部中斷0
- {
- static unsigned char i;
- static bit START;
- if(START)
- {
- if(time<63&&time>=33) //引導(dǎo)碼,9ms+4.5ms
- {
- i=0;
- }
- Code1[i]=time; //存儲(chǔ)兩個(gè)下降沿之間的時(shí)間間隔,將用于數(shù)據(jù)幀的“0”和“1”
- time=0;
- i++;
- if(i==33)
- {
- n=1;
- i=0;
- }
- }
- else
- {
- time=0;
- START=1;
- }
- }
- void ET0_init() //定時(shí)器0中斷初始化
- {
- TMOD=0x02; //定時(shí)器0工作在方式2
- TH0=0x00; //重載值
- TL0=0x00; //初始值
- ET0=1; //開(kāi)啟定時(shí)器0中斷
- TR0=1;
- }
- void EX0_init() //外部中斷0初始化
- {
- IT0=1; //設(shè)置外部中斷0為下降沿觸發(fā)
- EX0=1; //開(kāi)啟外部中斷0
- EA=1; //開(kāi)啟總中斷
- }
- void DECODE() //紅外解碼
- {
- unsigned char i,j,k;
- unsigned char x,y;
- k=1;
- for(i=0;i<4;i++) //對(duì)數(shù)據(jù)幀中的4個(gè)字節(jié)進(jìn)行處理
- {
- for(j=1;j<=8;j++) //對(duì)一個(gè)字節(jié)中的8位進(jìn)行處理
- {
- x=Code1[k];
- if(x>7) //時(shí)間間隔大于某值則為1,與晶振(12MHz)相關(guān),允許誤差
- {
- y|=0x80;
- }
- if(j<8)
- {
- y>>=1;
- }
- k++;
- }
- Code0[i]=y;
- y=0;
- }
- m=1;
- }
- void NUMBER() //將紅外遙控器的按鍵值轉(zhuǎn)換為數(shù)碼管的段值
- {
- switch(Code0[2])
- {
- case 0x0c:P0=Code[0];break;
- case 0x18:P0=Code[1];break;
- case 0x5e:P0=Code[2];break;
- case 0x08:P0=Code[3];break;
- case 0x1c:P0=Code[4];break;
- case 0x5a:P0=Code[5];break;
- case 0x42:P0=Code[6];break;
- case 0x52:P0=Code[7];break;
- case 0x4a:P0=Code[8];break;
- default:break;
- }
- m=0;
- }
- void main()
- {
- ET0_init();
- EX0_init();
-
- P0=0xfe; //取數(shù)碼管模塊左邊第一位選通
- Wei=1;
- Wei=0;
-
- while(1)
- {
- if(n)
- {
- DECODE();
- n=0;
- }
- if(m)
- {
- NUMBER();
- }
- }
- }
復(fù)制代碼
原理圖
|
評(píng)分
-
查看全部評(píng)分
|