红外遥控NEC协议使用总结

最近做了一个调试红外遥控三色灯的实习,花了一个多月的时间研究基于NEC协议的红外遥控,下面是这次实习技术方面的总结。

 

一、NEC协议特征:

 

  1. 8位地址和8位命令长度
  2. 每次传输两遍地址(用户码)和命令(按键值)
  3. 通过脉冲串之间的时间间隔来实现信号的调制(PPM)
  4. 38Khz载波
  5. 每位的周期为1.12ms(低电平)或者2.25ms(高电平)

 

 

二、NEC协议的典型脉冲链:

上图所示为NEC协议的典型脉冲链。协议规定低位首先发送。首先发送9ms+4.5ms的引导码,接下来是两字节用户码,第三字节是数据码,用来判断按键值,第四字节是数据反码,可以用来校验,提高按键的准确性。

 

三、NEC协议脉冲链的其他图片

 

 

除了引导码、用户码和数据码以外,协议最后还有一个1bit的停止位,用于数据发送完毕判断。另外在NEC协议中,似乎没有说明停止位的高低电平持续时间。

 

四、NEC协议的高低电平辨别方式

 

用户码和数据码中的‘0’和‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式(PPM)。

其中位0首先为0.56ms的高电平,然后是0.565ms的低电平;位1首先是0.56ms的高电平,然后是1.69ms的低电平。

 

五、编程注意事项

1.红外接收头引脚信号是相反的电平

以上电平是从发射头角度来看,红外接收头引脚输出的是相反的电平。

如图,即没有数据传输时,P3.2引脚保持为高电平,当接收到数据时,首先是引导码,9ms的低电平和4.5ms的高电平,然后是32位数据和1位停止位。一般来说,P3.2与单片机的某中断引脚相连,当接收数据时,低电平会触发中断。

 

2.数据从LSB(低位)开始发送,所以选择右移方式接收数据。

四个字节的数据都是先发送D0,最后发送D7。所以接收到1位数据后,给变量的最高位赋值,右移。或者先右移,再给变量的最高位赋值。

 

3.可以用一个数组保存32个数据的持续时间,用于后面判断高低电平。

用定时器对两个数据(中断)之间的时间计时,并保存这个持续时间用于以后判断是位1还是位0。

 

4.可以用2字节,4字节变量存储32个数据,以节省代码空间

可以用两个16位的int型变量存储数据,第一个int变量存储用户码,第二个存储数据码和数据反码。也可以用一个32位long型的变量存储所有数据。

 

5.判断停止位

接收到停止位后可以屏蔽红外引脚的中断,防止后面数据的干扰,解码成功后在开启中断。

 


  • 20
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是51单片机红外遥控发射NEC协议的程序代码: ``` #include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar code table[33] = {0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff}; uchar count, i, j; void delay(uint x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void sendone(void) { P1 = 0; delay(1); P1 = 1; delay(2); P1 = 0; delay(1); } void sendzero(void) { P1 = 0; delay(1); P1 = 1; delay(1); P1 = 0; delay(2); } void send(uchar data) { uchar i; for(i=0;i<8;i++) { if(data&0x01) sendone(); else sendzero(); data >>= 1; } } void main() { TMOD = 0x01; TH0 = 0xFC; TL0 = 0x67; TR0 = 1; ET0 = 1; EA = 1; while(1) { send(0x00); send(0x00); send(0x00); send(0x00); send(0x00); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); send(0xff); send(0x00); delay(100); } } void timer0() interrupt 1 { TH0 = 0xFC; TL0 = 0x67; count++; if(count == 15) { P1 = 1; delay(1); P1 = 0; count = 0; } } ``` 该程序使用了51单片机的定时器和外部中断,通过红外发射管发送NEC协议格式的红外码。在main函数中循环发送了一组红外码,通过定时器中断控制红外码的发送频率。其中sendone和sendzero函数分别表示发送1和0的红外码,send函数用于发送8位数据。注意在使用该程序时需要根据具体硬件电路设计进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值