国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標(biāo)題:
基于51單片機(jī)的NEC協(xié)議編碼紅外解碼方法與程序
[打印本頁(yè)]
作者:
coolfire
時(shí)間:
2021-6-5 01:15
標(biāo)題:
基于51單片機(jī)的NEC協(xié)議編碼紅外解碼方法與程序
記錄一次使用NEC協(xié)議編碼的紅外遙控信號(hào)的解碼方式。
NEC協(xié)議簡(jiǎn)要記錄
NEC協(xié)議是紅外遙控協(xié)議的一種,由其編碼的數(shù)據(jù)幀分別由引導(dǎo)碼、用戶碼、用戶碼(或者是用戶碼的反碼)、數(shù)據(jù)碼(即按鍵碼)和數(shù)據(jù)碼的反碼這五部分組成,最后還有一個(gè)停止位。引導(dǎo)碼表示即將開始傳輸32位的二進(jìn)制數(shù)據(jù);引導(dǎo)碼之后的部分長(zhǎng)度為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 上傳
歡迎光臨 ELEOK (http://www.afoofa.cn/)
Powered by Discuz! X5.0