基于定时器捕获功能的红外解码程序(NEC协议)
文章目录
- 前言
- 一、红外协议简介
- 1. ITT Protocol
- 2. NEC 协议
- 3. Nokia NRC17 协议
- 二、红外解码程序(NEC协议)
- 1. 软硬件环境及红外解码状态图
- 2. 基于定时器捕获中断方式的NEC协议红外解码程序
- 总结
前言
在可视范围内,红外遥控是设备最廉价的遥控实现方式。该技术兼具应用实现原理简单、器件廉价的优势,成为我们日常设备控制的理想方式。目前几乎所有的视频和音频设备都可以通过这种方式遥控。
本文将简单介绍一些日常使用到的消费类电器红外控制协议,着重介绍NEC协议,并基于MSP430单片机的定时器捕获功能实现红外解码。
一、红外协议简介
1. ITT Protocol
ITT 红外协议不使用调制信号,直接发送是区别于其他协议的重要特点。
每个信号都是由 14 个 10us 时间间隔的脉冲信号组成来发送,解码则是根据脉冲的间隔进行。
该协议非常实用,并耗能很低,大大提高了电池寿命。
一个红外信号通过 14 个脉冲发送,每个脉冲都是 10us 长。
通常使用三个不同的时间间隔去区分一个信号:
100us 表示逻辑 0;
200us 表示逻辑 1;
300us 则表示起始条件脉冲(lead-in)和结束条件脉冲(lead-out);
2. NEC 协议
该协议由 NEC 开发,具有以下特征:
8 位地址码,8 位命令码;
完整发射两次地址码和命令码,以提高可靠性;
脉冲时间长短调制方式;
38KHz 载波频率;
位时间 1.12ms 或 2.25ms;
NEC 协议根据脉冲时间长短解码。每个脉冲为 560us 长的 38KHz 载波(约 21 个载波周期)。
逻辑”1”脉冲时间为 2.25ms;
逻辑”0”脉冲时间为 1.12ms。
推荐的载波周期为 1/4 或者 1/3,即 38K 载波信号的周期里,只有 1/4 或者 1/3是高电平。
注:发送端与接收端的信号电平正好发生翻转;
3. Nokia NRC17 协议
Nokia 协议使用 17 位比特发送红外指令;
8 位命令码,4 位地址码 4 子码;
38K 载波,双向解码;
位传送时间 1ms ;
该协议采用所谓的不归零法解调 38K 载波,所有位的时间都相等且都为 1ms,每位都有一半的时间(500us)都是 38K 载波,剩下一半时间时空闲的低电平。逻辑 1 位表示为前面的一半时间为 38K 的载波,后面一半时间为低电平,反之逻辑 0 位刚好相反。
注:此外市场上也存在其他的协议,如夏普协议、索尼 SIRC 协议、飞利浦 RC-5 协议等。
二、红外解码程序(NEC协议)
1. 软硬件环境及红外解码状态图
芯片:MSP430FR57xx;
编译环境:Code Composer Studio;
注:下面程序中新增加了一个用于检验传输地址、数据的状态:IRDA_RECEIVE_CHECKOUT;
2. 基于定时器捕获中断方式的NEC协议红外解码程序
代码如下:
#include <string.h>
#include "sysclock.h"#include "gpio.h"
#include "timer.h"
#include "mcu_api.h"
#include "protocol.h"// 红外解码状态机
//(空闲、下降沿9ms、上升沿4.5ms、接收数据、信号检验、0、1信号判断、重复发送——2.25秒)
#define IRDA_IDLE_STATE 0
#define IRDA_RECEIVE_9MS_LEADING 1
#define IRDA_RECEIVE_4MS_LEADING 2
#define IRDA_RECEIVE_32BIT_DATA 3
#define IRDA_RECEIVE_CHECKOUT 4
#define IRDA_1_0_IDENTIFY 5
#define IRDA_REPEAT_CODE 6// 红外初始状态(空闲)、存储数据、计数、解码完成标志位
uint8_t irde_state = IRDA_IDLE_STATE;
uint8_t irde_bytes[4] = {0,0,0,0};
uint8_t irde_bit_counts = 0;
uint8_t irde_ok = 0;// 复位状态机
void reset_state_machine(void)
{irde_ok = 0;irde_bit_counts = 0;irde_state = IRDA_IDLE_STATE;TA0CCTL0 |= (CM_2 + CCIS_0 + SCS + CAP + CCIE); // 重新设置为下降沿捕获
}uint16_t intervl_time;//定时器中断:TIMER0_A0_VECTOR
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer0_A3_CCR_ISR(void)
{intervl_time = TA0CCR0; // 将捕获到的值取出来TA0R = 0; // 将计时器再次清零 The TAxR register is the count of Timer_A.TA0CCTL0 ^= (CM_1 | CM_2); //改变捕获模式switch(irde_state){case IRDA_IDLE_STATE: // 处于空闲状态且进入中断——下降沿,9msirde_state = IRDA_RECEIVE_9MS_LEADING;break;case IRDA_RECEIVE_9MS_LEADING: // 处于9ms状态且进入中断if ((intervl_time > 8500) && (intervl_time < 9500)) // 9000{irde_state = IRDA_RECEIVE_4MS_LEADING; // 进入4.5ms}else{reset_state_machine(); // 状态机复位}break;case IRDA_RECEIVE_4MS_LEADING:if ((intervl_time > 4000) && (intervl_time < 5000)) //4500{irde_state = IRDA_RECEIVE_32BIT_DATA;}else if ((intervl_time > 2000) && (intervl_time < 3000)) //2250{irde_state = IRDA_REPEAT_CODE; // 发送重复信号}else{reset_state_machine();}break;case IRDA_RECEIVE_32BIT_DATA: // 处于接收32bitif (irde_bit_counts >= 32) // 判断传输是否完成32个字符{irde_state = IRDA_RECEIVE_CHECKOUT; // 传输地址、数据检验reset_state_machine();irde_ok = 1;}else{irde_state = IRDA_1_0_IDENTIFY;}break;case IRDA_RECEIVE_CHECKOUT: // 处于传输地址、数据检验// 判断传输是否完成 0地址 1地址反 2数据 3数据反 数据传输有误if ((irde_bytes[0] == ~irde_bytes[1]) && (irde_bytes[2] == ~irde_bytes[3])){reset_state_machine();irde_ok = 1; // 数据全部传输完成并检验}else{reset_state_machine();}break;case IRDA_1_0_IDENTIFY:irde_bytes[irde_bit_counts/8] >>= 1; // 数据最高位补“0” 4*8 = 32个数if ((intervl_time > 1500) && (intervl_time < 1800)){irde_bytes[irde_bit_counts/8] |= 0x80; // 数据最高位补“1”}irde_bit_counts++;irde_state = IRDA_RECEIVE_32BIT_DATA; // 继续接收32bitbreak;case IRDA_REPEAT_CODE:reset_state_machine();irde_ok = 1;break;}
}
总结
1)在可视范围内,红外遥控是设备最廉价的遥控实现方式;
2)市场上存在不少红外控制协议,NEC协议使用较多;
3)NEC协议完整发射两次地址码和命令码,可靠性较高;
4)基于MSP430单片机的定时器捕获功能实现红外解码;
以上便是本文的全部内容,希望本文能对大家理解和运用红外遥控及解码方法有所帮助。
当然,本文内容如有错误或不严谨之处,也恳请大家及时指出,谢谢!
基于定时器捕获功能的红外解码程序(NEC协议)相关推荐
- 使用c++ 实现定时触发键盘事件_基于定时器捕获测量脉宽的应用示例
我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法.这里以STM32的定时器为例来介绍基于其捕获功能实现对脉宽的测量的思路及过程. 一般来讲,使用STM32定时器的捕获功能来实 ...
- 基于定时器捕获测量脉宽的应用示例
我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法.这里以STM32的定时器为例来介绍基于其捕获功能实现对脉宽的测量的思路及过程. 一般来讲,使用STM32定时器的捕获功能来实 ...
- STC15系列 8系列解码红外遥控器(NEC协议)(12mhz)
本次解码过程,使用[外部中断0],[定时器0]相互组合 废话少续,直接上源代码,只需要简单修改,即可完成配置 /*=========================================== ...
- 求义隆单片机c语言红外解码程序,只用一个单片机定时器的红外接收解码程序...
/****************<51单片机轻松入门-基于STC15W4K系列>配套例程 ************* ★★★★★★★★★★★★★★★★★★★★★★★★ <51单片机 ...
- c语言红外解码程序,[转载]红外遥控和C语言51红外遥控解码程序设计实例
什么是红外线?人的眼睛能看到的可见光按波长从长到短排列,依次为红.橙.黄.绿.青.蓝.紫.其中红光的波长范围为0.62-0.76μm:比红光波长还长的光叫红外线.红外遥控在生产和生活中应用越来越广泛, ...
- 利用MSP430F5529定时器捕获功能,实现信号周期或频率的测量
// 这个程序利用TIMER A0生成1KHz的方波,从引脚P1.3输出,送到引脚P7.4, // 再利用TIMER B0测量周期.为测试方便,引脚P1.0输出32KHz的ACLK, // 引脚P2. ...
- 使用PY003基于外部中断+定时器的方式实现NEC红外解码
写在前边 最近项目用到一款遥控器是38K红外载波,NEC协议的,找了很多帖子有看到用外部中断下降沿判断(但可惜判定数据的方式是while在外部中断里面死等的),有看到用100us定时器定时刷来判断,感 ...
- 实验4 基于预测分析表法的语法分析程序_第三十届 脑功能磁共振数据处理分析培训班...
北京赛博尔医药科技有限公司(www.cibrmed.com)将于2019年 7月6日 至 2019年7月11日(周六至下周四)举办第三十届脑功能磁共振数据处理分析培训班(课程内容详见课表安排).欢迎大 ...
- 万能遥控程序c语言,51单片机万能红外遥控解码程序
51hei单片机论坛里流传的遥控解码程序现在都弱爆了根本解不了现在的遥控自己写个万能红外遥控解码 本程序中需要用的头文件下载:http://www.51hei.com/mcu/2564.html // ...
最新文章
- 使用Spring容器
- ZJU-java进阶笔记 第三周(对象容器)
- 正则表达式表示任意字符
- 程序员在很多人心里的作用...
- Java面试中常问的计算机网络方面问题
- kali下Wreckuests | DDOS Atacks With HTTP-Flood
- r与python自然语言处理_Python自然语言处理实践: 在NLTK中使用斯坦福中文分词器 | 我爱自然语言处理...
- Linux上的.NET框架Mono 2.0发布
- 在文件编辑器中添加dock菜单项_将应用程序添加到Mac 的Dock的简便方法
- 手把手带你阅读Mybatis源码(三)缓存篇
- 基于比较的排序算法集
- 桌面 计算机 win7,计算机动态桌面,教您如何在win7中设置计算机动态桌面
- Python 操作谷歌浏览器
- 洛谷 P5713 【深基3.例5】洛谷团队系统
- java mongodb avg_Java-mongodb-AggregationOutput(分组、统计)
- 网络攻防技术-Lab5-shellcode编写实验(SEED Labs – Shellcode Development Lab)
- 新型红包套路,论推广和运营,灰产们真是一把好手
- 正太分布函数和反函数 标量值函数 (借鉴)
- Skia引擎API整理介绍(skia in Android 2.3 trunk)
- 基于HTML+JS实现的简易双色球滚动代码
热门文章
- 【收藏】计算机专业必读的经典书籍,不看后悔系列
- JAVA毕业设计高校教材征订管理系统计算机源码+lw文档+系统+调试部署+数据库
- 你的团队是王者还是青铜(上)
- SQL SERVER 添加一个不可为空的字段
- 【HaaS Python硬件积木】甲醛传感器
- 去劳保局学计算机要多长时间,打社保清单再也不用去社保局了,有电脑就能操作...
- 互联网舆情监测系统的发展阶段,TOOM互联网舆情监测系统有哪些?
- 360文档服务器怎么登陆,360移动开放平台
- 用代码拆掉你思维的墙
- 请问一下这个j1是什么啊,是排阻吗?