NEC遥控信号解码(包含完整代码)
一、遥控器解码说明
1、遥控器的编码格式常见有两种,一种是NEC 格式,一种是RC5 格式。遥控器发出的信号,通过一个红外的接收头之后,信号被送到MCU 的一个中断引脚。通过MCU 来识别不同的时序,来实现遥控器按键信号的解码。
2、遥控器时序图及数据格式(NEC 格式)
数据格式:

遥控器发送的数据码由以下部分组成:引导码,8位的客户码,8位客户码的补码,8位的按键值,8位按键值的补码;
具体的时序:
单次按键时的时序:

注: 一个完整的周期是108 ms
连续按键时的时续:

在单次按键的时序之后,紧跟如下时序:(周期也是108ms)
二、软件设计思想及处理函数
根据遥控器信号时序的特点,在设计软件时,需要利用时序,首先找到引导区,再读取客户码(可以一次读取16位),识别是否为厂家所制定的数值;之后读取8位的按键值,并将读取到的数据保存起来。
需要定义的在遥控器解码过程中用到的状态值:
#define IR_STATE_IDLE 0x00 #define IR_STATE_LEAD_ON 0x01 #define IR_STATE_LEAD_OFF 0x02 #define IR_STATE_CUSTOM 0x03 #define IR_STATE_DATA1 0x04 #define IR_STATE_DATA2 0x05
同时定义一下描述高低电平持续时间的一个常量
#define IR_R_Max 40 #define IR_R_Min 30 #define IR_H_Max 40 #define IR_H_Min 30 #define IR_L_Max 20 #define IR_L_Min 15
定义以下变量:
static unsigned char IrState ; static unsigned char IrData; static unsigned short IrCustom;
解码的过程如下:遥控器的解码是在中断处理函数中完成的,当MCU 的中断引脚发生电平变化时,会引发中断;
void interrupt NEC_IR(void)
{
-------------------------------------
NEC遥控器中断处理
------------------------------------
}
关于RC5 格式的遥控器解码
RC5 格式的遥控器除了时序和NEC格式的遥控器有一点差别之外,软件的解码过程基本类似,不再单独描述。
三、遥控器信号解码的流程

四、实现的代码(基于PIC芯片)
//----------------------------------------------------------------------------
// Function Name: NEC_IR
// Description:IR interrupt manage
// Params: None
// Returns: None
// Notes: SYS INT service process
//----------------------------------------------------------------------------
void interrupt NEC_IR(void)
{
unsigned char t0;
//here first things to disable the interupt!
GIE=;
//IR Intrupt input here.
//preamble=9ms" --|__|--" + 4.5ms"_|--|_",others Data high 2.25ms and low 1.25ms;
//Data =" --|__|--" + "_|--|_" high 2.25ms and low 1.25ms.
//Repeat==9ms" --|__|--" + 2.25 ms"_|--|_".
if(INTF)
{
t0 = TMR0;
TMR0 = ;
switch (IrState)
{
case IR_STATE_IDLE:
INTEDG = ;//Rising edge trigger
IrState = IR_STATE_LEAD_ON;
break;
case IR_STATE_LEAD_ON:
INTEDG = ;//Falling edge trigger
if((t0 > Pream_L_Min) && (t0 < Pream_L_Max))
{
IrState = IR_STATE_LEAD_OFF;
}
else
{
IrState = IR_STATE_IDLE;
}
break;
case IR_STATE_LEAD_OFF:
if ((t0 > Pream_S_Min) && (t0 < Pream_S_Max))
{
IrState = IR_STATE_CUSTOM;
IrCustom = ;
BitCounter = ;
Repeat = ;
}
else
{
if ((t0 > IR_R_Min) && (t0 < IR_R_Max))
{
if ((Repeat)&&(SystemState == POWER_ON_STATE))
{
Repeat = ;//IR key Repeat
}
}
else
{
Repeat = ;
}
INTEDG = ;
IrState = IR_STATE_IDLE;
}
break;
case IR_STATE_CUSTOM:
if ((t0 > IR_L_Min) && (t0 < IR_L_Max))
{
IrCustom >>= ;
}
else
{
if ((t0 > IR_H_Min) && (t0 < IR_H_Max))
{
IrCustom = ((IrCustom >> ) | 0x8000);
}
else
{
INTEDG = ;
IrState = IR_STATE_IDLE;
Repeat = ;
break;
}
}
)
{
if (IrCustom != CustomCode)
{
INTEDG = ;
IrState = IR_STATE_IDLE;
Repeat = ;
break;
}
IrState = IR_STATE_DATA1;
BitCounter = ;
IrKeyCode = ;
}
break;
case IR_STATE_DATA1:
BitCounter++;
if ((t0 > IR_L_Min) && (t0 < IR_L_Max))
{
IrKeyCode >>= ;
}
else
{
if ((t0 > IR_H_Min) && (t0 < IR_H_Max))
{
IrKeyCode = ((IrKeyCode >> ) | 0x80);
}
else
{
INTEDG = ;
IrState = IR_STATE_IDLE;
Repeat = ;
break;
}
}
)
{
IrState = IR_STATE_DATA2;
BitCounter = ;
IrData = ;
}
break;
case IR_STATE_DATA2:
BitCounter++;
if ((t0 > IR_L_Min) && (t0 < IR_L_Max))
{
IrData >>= ;
}
else
{
if ((t0 > IR_H_Min) && (t0 < IR_H_Max))
{
IrData = ((IrData >> ) | 0x80);
}
else
{
INTEDG = ;
IrState = IR_STATE_IDLE;
Repeat = ;
break;
}
}
)
{
INTEDG = ;
IrState = IR_STATE_IDLE;
IrData = ~IrData;
if (IrKeyCode == IrData)
{
// Check if data is valid
}
else
{
Repeat = ;
}
}
break;
}
INTF=;
}
GIE=;
}
NEC遥控信号解码(包含完整代码)的更多相关文章
- 315Mhz、433Mhz无线遥控信号的解码分析和模拟
摘要 前段时间学习无线电的同时了解到arduino是作为技能尚未成熟技术宅的我继树莓派又一个不错的选择.于是花了200元购得3块arduino开发板(2*nano&1*uno)和其他传感器等, ...
- 解码红外遥控信号——使用遥控器的按键来调节LED的亮度
程序开始时,提示遥控键0~4的代码,然后程序通过设置LED的亮度来对被按下的按钮作出响应,以0关闭LED,1~4提供增加的亮度. 代码如下:(需要使用IRremote库,可在库管理中搜索该库进行下载后 ...
- MP3 编码解码 附完整c代码
近期一直不间断学习音频处理,一直也没想着要去碰音频编解码相关. 主要是觉得没什么实际的作用和意义. 不管视频编解码,图像编解码,音频编解码,都有很多组织基金在推动. 当然,在一些特定的情景下,需要用起 ...
- 基于Arduino、STM32进行红外遥控信号接收
catalogue . 遥控器原理简介 . 红外遥控原理 . 常见红外遥控器红外线信号传输协议 . 遙控器的发展 . 实验过程 . 攻击面 . 基于STM32实现红外信号解码 1. 遥控器原理简介 0 ...
- RTL-SDR + GnuRadio+RFcat 分析、重放无线遥控信号
0×00 前言 前段时间在<永不消逝的电波(二)HackRF入门:家用无线门铃信号重放> 一文中通过HackRF录制.重放了无线遥控信号,不过一直没来得及对信号进行分析,刚好在国外网站看到 ...
- Android 监听双卡信号强度(附完整代码)
Android 监听双卡信号强度 监听单卡信号强度 监听单卡的信号强度非常简单直接用TelephonyManager.listen()去监听sim卡的信号强度. TelephonyManager = ...
- JPG学习笔记2(附完整代码)
#topics h2 { background: rgba(43, 102, 149, 1); border-radius: 6px; box-shadow: 0 0 1px rgba(95, 90, ...
- java mail实现Email的发送,完整代码
java mail实现Email的发送,完整代码 1.对应用程序配置邮件会话 首先, 导入jar <dependencies> <dependency> <groupId ...
- 新版本ffmpeg解码非完整H264帧失败
按照ffmpeg/doc/examples/decoding_encoding.c中video_decode_example解码H264,新版本ffmpeg解码非完整H264帧,定量读取数据直接给av ...
随机推荐
- 解决Webservice内存溢出-用XmlWriter
XmlWriter 表示一个编写器,该编写器提供一种快速.非缓存和只进的方式来生成包含 XML 数据的流或文件.这个就可以不占用内存,将数据放入磁盘中.也就不会出现内存溢出 public class ...
- 九、 合成(Composite)模式 --结构模式(Structural Pattern)
合成模式:有时又叫做部分-整体模式(Part-Whole).合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 合成模式分为安全式和透明式 ...
- C语言调用库函数实现生产者消费者问题
#include<stdio.h> #include<stdlib.h> #include<semaphore.h> #include<pthread.h&g ...
- Impala 4、Impala JDBC
• 配置: – impala.driver=org.apache.hive.jdbc.HiveDriver – impala.url=jdbc:hive2://node2:21050/;auth=no ...
- Zookeeper 1、Zookeeper 定义与工作原理
1.什么是Zookeeper » Zookeeper 是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式协调服务 » 它包含一个简单的原语集,分布式应用程序可以基于它实现同步 ...
- Linux中shell文件操作大全
1.创建文件夹#!/bin/shmkdir -m 777 "%%1" 2.创建文件#!/bin/shtouch "%%1" 3.删除文件#!/bin/shrm ...
- textField 判断输入长度限制
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementS ...
- 棋盘覆盖(大数阶乘,大数相除 + java)
棋盘覆盖 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的 ...
- java值传递
Java使用按值传递的函数调用方式,这往往使我感到迷惑.因为在基础数据类型和对象的传递上,我就会纠结于到底是按值传递,还是按引用传递.其实经过学习,Java在任何地方,都一直发挥着按值传递的本色. 首 ...
- Android应用程序与SurfaceFlinger服务的关系概述和学习计划
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7846923 SurfaceFlinger服务负 ...