博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
红外协议之NEC协议
阅读量:6572 次
发布时间:2019-06-24

本文共 2079 字,大约阅读时间需要 6 分钟。

NEC协议载波:38khz

其逻辑1与逻辑0的表示如图所示:

逻辑1为2.25ms,脉冲时间560us;逻辑0为1.12ms,脉冲时间560us。所以我们根据脉冲时间长短来解码。推荐载波占空比为1/3至1/4。

NEC协议格式:

首次发送的是9ms的高电平脉冲,其后是4.5ms的低电平,接下来就是8bit的地址码(从低有效位开始发),而后是8bit的地址码的反码(主要是用于校验是否出错)。然后是8bit 的命令码(也是从低有效位开始发),而后也是8bit 的命令码的反码。

  以上是一个正常的序列,但可能存在一种情况:你一直按着1个键,这样的话发送的是以110ms为周期的重复码,如下图:

就是说,发了一次命令码之后,不会再发送命令码,而是每隔110ms时间,发送一段重复码。

重复码由9ms高电平和2.25ms的低电平以及560us的高电平组成。

需要注意的是:1838红外一体接收头为了提高接受灵敏度。输入高电平,其输出的是相反的低电平。

 

  搞了一个下午和晚上,NEC解码出来还是有点细微差错。查了很久,也没有收获。心里有点小郁闷。今早起来,仔细地看了看他人的参考代码。突然被下面一个小小的细节折服了。

请注意这段代码:

1 void hal_NEC_decode(uchar *addr,uchar *addrt,uchar *comm,uchar *commt) 2 { 3     uchar i,j,k; 4     uchar tmp1=0; 5  6     while(NECFinshFlag==0); 7     NECFinshFlag=0; 8  9     for(i=0,k=1;i<4;i=i+1)10     {11         for(j=1;j<=8;j++)12         {13             if(NECTimerTable[k++] > 7)14             {15                 tmp1 |=0x80;16             }17             tmp1 >>=1;18         }19         switch(i)20         {21             case 0:*addr=tmp1;break;22             case 1:*addrt=tmp1;break;23             case 2:*comm=tmp1;break;24             case 3:*commt=tmp1;break;25         }26         tmp1=0;27     }28 }

最后tmp1的值是被右移了1位。所以改为下代码

1 void hal_NEC_decode(uchar *addr,uchar *addrt,uchar *comm,uchar *commt) 2 { 3     uchar i,j,k; 4     uchar tmp1; 5  6     while(NECFrameFlag==0); 7     NECFrameFlag=0; 8  9     for(i=0,k=1;i<4;i=i+1)10     {    11         tmp1=0;12         for(j=0;j<8;j++)13         {    14             tmp1 >>=1;//事先右移一位,防止最后一次循环的出错15             if(NECTimerTable[k++] >8)16             {17                 tmp1 |=0x80;18             }    19         }20         switch(i)21         {22             case 0:*addr=tmp1;break;23             case 1:*addrt=tmp1;break;24             case 2:*comm=tmp1;break;25             case 3:*commt=tmp1;break;26         }        27     }28 }

  仅仅修改了这么一个代码顺序,程序就能比较完美的解析NEC协议来了。可见写程序,小小的细节也是非常重要,可能会牵扯到整个的成功。

  总结:以后编写按1bit(不管是从LSB还是MSB开始)接收组成一个字节的程序,要格外的注意循环左移或者右移的情况。实现将临时变量移动一下,免得最后1位还需要移动而造成的错误。

  最后附上NEC协议的命令码(市面上常见的遥控板)

转载于:https://www.cnblogs.com/yulongchen/archive/2013/04/12/3017409.html

你可能感兴趣的文章
ECSHOP的订单状态在数据库中的表现(order_status, shipping_status, pay_status)
查看>>
深度学习成长的烦恼
查看>>
Android 开发之 bindService() 通信
查看>>
PC-如何禁用 Cookie
查看>>
poj 1094
查看>>
如何做一份能忽悠投资人的PPT
查看>>
Java 基础【13】 I/O流概念分析整理
查看>>
数据结构 单一列表
查看>>
Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战
查看>>
和“黑凤梨”一样搞笑的谐音词
查看>>
EM算法(Expectation Maximization Algorithm)
查看>>
C# 操作iis6、iis7 301
查看>>
从零开始学 iOS 开发的15条建议
查看>>
SQL Server 合并复制遇到identity range check报错的解决
查看>>
深入理解C# 静态类与非静态类、静态成员的区别
查看>>
精灵菜单
查看>>
【Leetcode】Path Sum II
查看>>
设计模式 总揽 通过这篇随笔可以访问所需要了解的设计模式
查看>>
Photoshop和WPF双剑配合,打造炫酷个性的进度条控件
查看>>
2014最不受欢迎10编程语言种
查看>>