NEC红外线解码协议
非常精简的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红外线解码协议相关推荐
- NEC红外线编码协议
红外遥控协议-NEC协议 为方便理解所看到的波形是从红外接收管出来的信号,跟协议所说的信号高低(0或1)刚好相反 NEC协议是众多红外遥控协议的其中一种,除NEC外,还有RC5.RC6等其它的.市面上 ...
- 4.4 51单片机-NEC红外线遥控器解码
4.4 NEC红外线遥控器解码 4.4.1 接收头原理图介绍 图4-4-1 实验板上的红外线接收头是接在单片机的P3.2 IO口上,要使用红外线接收功能,需要将红外线接收头的跳线帽接上. 图4-4- ...
- 使用PY003基于外部中断+定时器的方式实现NEC红外解码
写在前边 最近项目用到一款遥控器是38K红外载波,NEC协议的,找了很多帖子有看到用外部中断下降沿判断(但可惜判定数据的方式是while在外部中断里面死等的),有看到用100us定时器定时刷来判断,感 ...
- aac蓝牙编解码协议_最新的真无线蓝牙耳机选购指南
点击蓝字 关注我们 真无线蓝牙耳机选购指南 蓝牙耳机真无线的一些科普内容 解码方案: 目前流行的解码方案包括SBC.apt-X.AAC.LDAC和三星的Scalable与华为HWA独家技术.使用SBC ...
- FFmpeg之视频封装格式、流媒体协议、视频编解码协议和传输流格式、时间戳和时间基、视频像素数据
通用视频分析工具:Mediainfo.Elecard StreamEye(视频编码分析工具); 视频封装格式: ********************MP4****************** MP ...
- 红外线遥控协议简介(NEC格式)
平常工作中接触的都是NEC格式的遥控器,这里也只讲NEC格式的. 当按下遥控器的一个按键时,会发出一帧的数据,这一帧的数据的组成分别是:引导码.地址码.地址码的反码.数据码和数据码的反码. 当发送的地 ...
- aac蓝牙编解码协议_蓝牙音频编码哪个音质好?今天我们来逐一解读
家有影院致力于帮助渴望学习.热爱电影.希望通过自己双手搭建出适合自己的家庭影院的朋友.如果你是这样的人,我们和500位同样热爱家庭影院的伙伴愿意一起帮助你实现梦想.同时,我们还能帮助你找到价格优惠的靠 ...
- 走进音视频的世界——Opus编解码协议
Opus是一种开源免费的音频编解码器,支持音乐和语音,具有低延时.带内FEC.DTX.PLC等特点,默认22.5ms延时,非常适用网络实时传输.官网:https://www.opus-codec.or ...
- aac蓝牙编解码协议_「干货」蓝牙耳机编码格式(SBC、AAC、aptX)都有啥区别?...
自从2016年,苹果在新款的iPhone上,取消了传统的3.5mm耳机接口,就带来了蓝牙耳机的蓬勃发展. 受益于市场的不断增长,蓝牙耳机的技术也在不断进步,现在市面上可供选择的蓝牙耳机可谓是相当的多. ...
最新文章
- STM32串口接收数据
- 防止Domino邮件服务器作为垃圾邮件转发服务器
- 屏幕按压力度android,android手机 N 所支持的压感技术
- php+我的第一个程序,2. 第一个 C 程序
- like ,order 使用索引
- 没有工作怎么申请贷款?
- border,padding,margin盒模型理解
- python牛顿法寻找极值_python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例...
- mysql之批量删除
- TADVAlertWindow
- (centos6.5)MySQL服务安装
- vue单页面应用中node做反向代理的原理
- 【NB-IoT模块显示屏逻辑显示】
- 斐讯k2路由器v22.4.6.3版本刷breed刷华硕固件方法
- js数据的编码和解码
- 老生常谈:frame和Bounds的区别
- 笔记本电脑数字键盘打不出数字的解决方案
- Docker Compose搭建TDengine集群
- smc数显压力表设定方法_psi与kpa换算(smc数显压力表设定方法)
- Python验证信用卡号的有效性(算法)(称为Luhn检测或者mod 10 检测)
热门文章
- 什么是Ntrip?Ntrip协议简介
- 3:表的基本操作-MySQL
- 什么是Spark、Spark特点、Spark Streaming和Storm的区别
- 打造个人版微信小程序(1)——本地开发api接口调用
- R数据分析:如何做数据的非线性关系,多项式回归的做法和解释
- 华清远见百度网盘实训笔记
- jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 14
- 交付实施工程师是做什么的?
- asp毕业设计—— 基于asp+access的实验室设备管理系统设计与实现(毕业论文+程序源码)——实验室设备管理系统
- 新一配:程序员因一行代码被老板开除,网友评论:你这不是脱裤子放屁吗?