记录一次使用NEC协议编码的红外遥控信号的解码方式。
NEC协议简要记录
NEC协议是红外遥控协议的一种,由其编码的数据帧分别由引导码、用户码、用户码(或者是用户码的反码)、数据码(即按键码)和数据码的反码这五部分组成,最后还有一个停止位。引导码表示即将开始传输32位的二进制数据;引导码之后的部分长度为4字节一共32位;第一字节为用户码;第二字节可能是用户码,也可能是用户码的反码,具体由厂商决定;第三字节是当前按键的按键码;第四字节是按键码的反码;停止位主要起隔离作用,一般不进行判断,也不需要理会。每一字节的数据从低位到高位依次发送。
NEC协议编码方式
NEC协议的每一比特数据本身也需要进行编码,编码后再进行载波调制。
- 引导码:9ms的高电平 + 4.5ms的低电平
- 比特值
0
:0.56ms的高电平 + 0.56ms的低电平
- 比特值
1
:0.56ms的高电平 + 1.68ms的低电平
发射端和接收端的电平相反,即:
- 引导码:9ms的低电平 + 4.5ms的高电平
- 比特值
0
:0.56ms的低电平 + 0.56ms的高电平
- 比特值
1
:0.56ms的低电平 + 1.68ms的高电平
源程序记录
按下红外遥控器的任一按键1
~9
,即可在开发板的数码管模块的左边第一位上显示对应的按键数字。
源程序
#include<reg51.h>
sbit OUTPUT=P3^2; sbit Wei=P2^7;
unsigned char Code[9]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char Code0[4]; unsigned char Code1[33]; unsigned char time;
bit m,n;
void ET_0() interrupt 1 using 1 { time++; }
void EX_0() interrupt 0 { static unsigned char i; static bit START; if(START) { if(time<63&&time>=33) { i=0; } Code1[i]=time; time=0; i++; if(i==33) { n=1; i=0; } } else { time=0; START=1; } }
void ET0_init() { TMOD=0x02; TH0=0x00; TL0=0x00; ET0=1; TR0=1; }
void EX0_init() { IT0=1; EX0=1; EA=1; }
void DECODE() { unsigned char i,j,k; unsigned char x,y; k=1; for(i=0;i<4;i++) { for(j=1;j<=8;j++) { x=Code1[k]; if(x>7) { y|=0x80; } if(j<8) { y>>=1; } k++; } Code0[i]=y; y=0; } m=1; }
void NUMBER() { 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; Wei=1; Wei=0; while(1) { if(n) { DECODE(); n=0; } if(m) { NUMBER(); } } }
|
原理图
参考资料:
51单片机红外通信解码教程
51单片机—红外遥控
51单片机红外通讯
红外遥控NEC协议使用总结
IR–NEC协议