非常精简的NEC红外解码程序,适合程序存储空间低的单片机(C语言)

注意:之所以程序精简,是因为解码NEC协议时只计算协议中的高电平时间,不去计算低电平时间。对应的,可能会出现未知干扰波造成解码失败。

解码之前,我们先来熟悉一下NEC协议:

1、NEC协议载波:38khz
2、NEC编码格式为:引导码+8bit用户码+8bit用户反码+8bit数据码+8bit数据反码+重复码
3、NEC协议格式:

上图是一个完整的波形,其中每隔110ms发送一个重复码。
4、对应单片机解码需要用到的:

知道这些我们就可以开始解码了。(如有错误,请高手指出 ^_^ ^_^)

/* 寄存器定义 */
uint8_t  IRHigh;                                          /* 计数IR脚高电平时间              */
uint8_t  IRReceiveCnt;                                    /* IR接收数据计数                  */
uint16_t UserCodeVal;                                     /* 用户码                          */
uint16_t DataCodeVal;                                     /* 数据码                          */
uint32_t DecodeVal;                              /* 32位数据 用户码+用户反码+数据码+数据反码 */
/* 位定义 */
#define IR_OK                    UserFlag.0               /* 解码完成时置一                  */
#define IR_START_SIGNAL          UserFlag.1               /* 红外解码引导码 检测到引导码置一 */
#define IR_PIN_START             UserFlag.2               /* IO电平状态标志                  */
/* 宏定义 */
#define USER_CODE                0x10ED                     /* 用户码 校验数据               *//*******************************************************************************************
*                                   简易的NEC红外解码程序
* 1.此函数只是粗略的检测NEC协议中的高电平时间
* 2.此函数通过判断IO口状态+定时器扫描的方式完成的
* 3.此函数非常精简 用应广XY_IDE编译出来的文件只占79个程序空间 非常适合程序空间小的单片机
* 4.此函数解码是依据MSB优先传输,正好和NEC相反(LSB优先传输),特此注明
* 5.此函数没有对解码出来的数据进行校验 (数据码+数据反码=0xff 用户码+用户反码=0xff )
****声明:此函数仅作为参考程序 如需商业使用 还请自行验证
****验证平台:应广XY150C单片机+标准NEC协议遥控器
********************************************************************************************/
void IRDecode(void){                                   /* 此函数 100us扫描一次             */if(!IR_OK){                                        /* 解码完成为1                      */if(IR_PIN_START){if(!IR){               IR_PIN_START = 0; } /* 判断引脚电平状态 下降沿          */if(IRHigh<49){         IRHigh++;         } /* 计时IR脚高电平时间            */}else{                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         if(IR){                IR_PIN_START = 1;                      /* 判断引脚电平状态 上升沿          */if(IR_START_SIGNAL){                   /* 检测到引导码 可以开始解码        */if(IRHigh>=13 && IRHigh<=19){       /* 数据1      1.7ms高电平           */                IRReceiveCnt++;                /* 接收的信号次数计数               */DecodeVal<<=1;                      DecodeVal++;                   /* 将数据存入 接收数据寄存器中      */}else if(IRHigh>=4 && IRHigh<=8){   /* 数据 0    0.56ms高电平           */                            IRReceiveCnt++;                /* 接收的信号次数计数               */DecodeVal<<=1;                 /* 将数据存入 接收数据寄存器中      */}else{IR_START_SIGNAL = 0;           /* 错误信号  复位解码状态           */IRReceiveCnt    = 0;}if(IRReceiveCnt==32){      /* 32个信号为一个周期 16位用户码+16位数据码 */UserCodeVal = DecodeVal>>16;  /* 取用户码                          */DataCodeVal = DecodeVal;      /* 取数据码                          */if(UserCodeVal == USER_CODE){ /* 校验用户码                        */      IR_OK = 1;                /* 解码完成                          */}  IR_START_SIGNAL = 0;IRReceiveCnt    = 0;}     }if(IRHigh>=44){                           /* 高电平信号4.4ms-4.8ms 为引导码  */IRReceiveCnt    = 0;IR_START_SIGNAL = 1;if(IRHigh==49){IR_START_SIGNAL = 0;}/* 错误信号   复位解码状态        */}IRHigh = 0;                             /* 清除高电平时间计数             */}            }               }
}

NEC红外线解码协议相关推荐

  1. NEC红外线编码协议

    红外遥控协议-NEC协议 为方便理解所看到的波形是从红外接收管出来的信号,跟协议所说的信号高低(0或1)刚好相反 NEC协议是众多红外遥控协议的其中一种,除NEC外,还有RC5.RC6等其它的.市面上 ...

  2. 4.4 51单片机-NEC红外线遥控器解码

    4.4  NEC红外线遥控器解码 4.4.1 接收头原理图介绍 图4-4-1 实验板上的红外线接收头是接在单片机的P3.2 IO口上,要使用红外线接收功能,需要将红外线接收头的跳线帽接上. 图4-4- ...

  3. 使用PY003基于外部中断+定时器的方式实现NEC红外解码

    写在前边 最近项目用到一款遥控器是38K红外载波,NEC协议的,找了很多帖子有看到用外部中断下降沿判断(但可惜判定数据的方式是while在外部中断里面死等的),有看到用100us定时器定时刷来判断,感 ...

  4. aac蓝牙编解码协议_最新的真无线蓝牙耳机选购指南

    点击蓝字 关注我们 真无线蓝牙耳机选购指南 蓝牙耳机真无线的一些科普内容 解码方案: 目前流行的解码方案包括SBC.apt-X.AAC.LDAC和三星的Scalable与华为HWA独家技术.使用SBC ...

  5. FFmpeg之视频封装格式、流媒体协议、视频编解码协议和传输流格式、时间戳和时间基、视频像素数据

    通用视频分析工具:Mediainfo.Elecard StreamEye(视频编码分析工具); 视频封装格式: ********************MP4****************** MP ...

  6. 红外线遥控协议简介(NEC格式)

    平常工作中接触的都是NEC格式的遥控器,这里也只讲NEC格式的. 当按下遥控器的一个按键时,会发出一帧的数据,这一帧的数据的组成分别是:引导码.地址码.地址码的反码.数据码和数据码的反码. 当发送的地 ...

  7. aac蓝牙编解码协议_蓝牙音频编码哪个音质好?今天我们来逐一解读

    家有影院致力于帮助渴望学习.热爱电影.希望通过自己双手搭建出适合自己的家庭影院的朋友.如果你是这样的人,我们和500位同样热爱家庭影院的伙伴愿意一起帮助你实现梦想.同时,我们还能帮助你找到价格优惠的靠 ...

  8. 走进音视频的世界——Opus编解码协议

    Opus是一种开源免费的音频编解码器,支持音乐和语音,具有低延时.带内FEC.DTX.PLC等特点,默认22.5ms延时,非常适用网络实时传输.官网:https://www.opus-codec.or ...

  9. aac蓝牙编解码协议_「干货」蓝牙耳机编码格式(SBC、AAC、aptX)都有啥区别?...

    自从2016年,苹果在新款的iPhone上,取消了传统的3.5mm耳机接口,就带来了蓝牙耳机的蓬勃发展. 受益于市场的不断增长,蓝牙耳机的技术也在不断进步,现在市面上可供选择的蓝牙耳机可谓是相当的多. ...

最新文章

  1. STM32串口接收数据
  2. 防止Domino邮件服务器作为垃圾邮件转发服务器
  3. 屏幕按压力度android,android手机 N 所支持的压感技术
  4. php+我的第一个程序,2. 第一个 C 程序
  5. like ,order 使用索引
  6. 没有工作怎么申请贷款?
  7. border,padding,margin盒模型理解
  8. python牛顿法寻找极值_python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例...
  9. mysql之批量删除
  10. TADVAlertWindow
  11. (centos6.5)MySQL服务安装
  12. vue单页面应用中node做反向代理的原理
  13. 【NB-IoT模块显示屏逻辑显示】
  14. 斐讯k2路由器v22.4.6.3版本刷breed刷华硕固件方法
  15. js数据的编码和解码
  16. 老生常谈:frame和Bounds的区别
  17. 笔记本电脑数字键盘打不出数字的解决方案
  18. Docker Compose搭建TDengine集群
  19. smc数显压力表设定方法_psi与kpa换算(smc数显压力表设定方法)
  20. Python验证信用卡号的有效性(算法)(称为Luhn检测或者mod 10 检测)

热门文章

  1. 什么是Ntrip?Ntrip协议简介
  2. 3:表的基本操作-MySQL
  3. 什么是Spark、Spark特点、Spark Streaming和Storm的区别
  4. 打造个人版微信小程序(1)——本地开发api接口调用
  5. R数据分析:如何做数据的非线性关系,多项式回归的做法和解释
  6. 华清远见百度网盘实训笔记
  7. jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 14
  8. 交付实施工程师是做什么的?
  9. asp毕业设计—— 基于asp+access的实验室设备管理系统设计与实现(毕业论文+程序源码)——实验室设备管理系统
  10. 新一配:程序员因一行代码被老板开除,网友评论:你这不是脱裤子放屁吗?