最近做了一个调试红外遥控三色灯的实习,花了一个多月的时间研究基于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.判断停止位

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

最新文章

  1. 【JavaScript】操作Canvas画图
  2. Twentydaysgone
  3. koa框架异步返回值的操作(co,koa-compose)
  4. java web 100个知识点
  5. 菜菜CPP日记
  6. [Tool] PowerDesigner
  7. MyEclipse护眼模式、字体大小的调整
  8. Java 对时间和日期的相关处理
  9. dubbo源码之三——dubbo重构
  10. 使用PHP+ajax打造聊天室应用
  11. leetcode:Reverse Integer(一个整数反序输出)
  12. Lucene Field
  13. Rewrite的QSA是什么意思?
  14. python数据库做成邮箱的注册系统!
  15. Centos memcached的php拓展 管理界面
  16. ecshop 去版权(前台)
  17. 深度解读阿里巴巴云原生镜像分发系统 Dragonfly
  18. ssh连接时提示THE AUTHENTICITY OF HOST XX CAN’T BE ESTABLISHED
  19. POJ1287 Networking【最小生成树】
  20. vs里32位项目和64位项目的区别

热门文章

  1. Python编码问题:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(12
  2. js-innerHTML
  3. 移动web开发准备知识点
  4. PCH文件
  5. Java中长度为0的数组与null的区别
  6. ArrowLayer : A coustom layer animation
  7. Tomcat version 7.0 only support J2EE 1.2。。。。。。。
  8. 1.3 PROGRAM DEVELOPMENT ENVIRONMENT
  9. eclipse搭建servlet项目
  10. maven - dependencies与dependencyManagement的区别