打印
[热门应用]

红外协议之NEC协议

[复制链接]
924|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

NEC协议载波:38khz

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

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


沙发
余三水|  楼主 | 2019-2-28 10:34 | 只看该作者
NEC协议格式:

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

使用特权

评论回复
板凳
余三水|  楼主 | 2019-2-28 10:35 | 只看该作者
 以上是一个正常的序列,但可能存在一种情况:你一直按着1个键,这样的话发送的是以110ms为周期的重复码,如下图:



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



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

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

使用特权

评论回复
地板
余三水|  楼主 | 2019-2-28 10:36 | 只看该作者
代码如下:
 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 }

使用特权

评论回复
5
bvbgbhbn| | 2019-3-29 16:25 | 只看该作者
感谢分享!很不错的资料

使用特权

评论回复
6
余三水|  楼主 | 2019-7-31 14:52 | 只看该作者
bvbgbhbn 发表于 2019-3-29 16:25
感谢分享!很不错的资料

最好的实践办法就是抓波形,自己抓上几次波形,就对协议很清晰的了解了。

使用特权

评论回复
7
zlmin| | 2019-10-3 09:19 | 只看该作者
谢谢分享!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

356

帖子

1

粉丝