記錄一次使用NEC協(xié)議編碼的紅外遙控信號(hào)的解碼方式。
NEC協(xié)議簡要記錄
NEC協(xié)議是紅外遙控協(xié)議的一種,由其編碼的數(shù)據(jù)幀分別由引導(dǎo)碼、用戶碼、用戶碼(或者是用戶碼的反碼)、數(shù)據(jù)碼(即按鍵碼)和數(shù)據(jù)碼的反碼這五部分組成,最后還有一個(gè)停止位。引導(dǎo)碼表示即將開始傳輸32位的二進(jìn)制數(shù)據(jù);引導(dǎo)碼之后的部分長度為4字節(jié)一共32位;第一字節(jié)為用戶碼;第二字節(jié)可能是用戶碼,也可能是用戶碼的反碼,具體由廠商決定;第三字節(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,即可在開發(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; //開啟定時(shí)器0中斷
- TR0=1;
- }
- void EX0_init() //外部中斷0初始化
- {
- IT0=1; //設(shè)置外部中斷0為下降沿觸發(fā)
- EX0=1; //開啟外部中斷0
- EA=1; //開啟總中斷
- }
- 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ù)制代碼 原理圖:
1.png (104.7 KB)
下載附件
2021-6-5 01:14 上傳
2.png (35.02 KB)
下載附件
2021-6-5 01:14 上傳
3.png (140.55 KB)
下載附件
2021-6-5 01:14 上傳
【必讀】版權(quán)免責(zé)聲明
1、本主題所有言論和內(nèi)容純屬會(huì)員個(gè)人意見,與本論壇立場無關(guān)。2、本站對(duì)所發(fā)內(nèi)容真實(shí)性、客觀性、可用性不做任何保證也不負(fù)任何責(zé)任,網(wǎng)友之間僅出于學(xué)習(xí)目的進(jìn)行交流。3、對(duì)提供的數(shù)字內(nèi)容不擁有任何權(quán)利,其版權(quán)歸原著者擁有。請(qǐng)勿將該數(shù)字內(nèi)容進(jìn)行商業(yè)交易、轉(zhuǎn)載等行為,該內(nèi)容只為學(xué)習(xí)所提供,使用后發(fā)生的一切問題與本站無關(guān)。 4、本網(wǎng)站不保證本站提供的下載資源的準(zhǔn)確性、安全性和完整性;同時(shí)本網(wǎng)站也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的損失或傷害。 5、本網(wǎng)站所有軟件和資料均為網(wǎng)友推薦收集整理而來,僅供學(xué)習(xí)用途使用,請(qǐng)務(wù)必下載后兩小時(shí)內(nèi)刪除,禁止商用。6、如有侵犯你版權(quán)的,請(qǐng)及時(shí)聯(lián)系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|