一、遥控器解码说明

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遥控信号解码(包含完整代码)的更多相关文章

  1. 315Mhz、433Mhz无线遥控信号的解码分析和模拟

    摘要 前段时间学习无线电的同时了解到arduino是作为技能尚未成熟技术宅的我继树莓派又一个不错的选择.于是花了200元购得3块arduino开发板(2*nano&1*uno)和其他传感器等, ...

  2. 解码红外遥控信号——使用遥控器的按键来调节LED的亮度

    程序开始时,提示遥控键0~4的代码,然后程序通过设置LED的亮度来对被按下的按钮作出响应,以0关闭LED,1~4提供增加的亮度. 代码如下:(需要使用IRremote库,可在库管理中搜索该库进行下载后 ...

  3. MP3 编码解码 附完整c代码

    近期一直不间断学习音频处理,一直也没想着要去碰音频编解码相关. 主要是觉得没什么实际的作用和意义. 不管视频编解码,图像编解码,音频编解码,都有很多组织基金在推动. 当然,在一些特定的情景下,需要用起 ...

  4. 基于Arduino、STM32进行红外遥控信号接收

    catalogue . 遥控器原理简介 . 红外遥控原理 . 常见红外遥控器红外线信号传输协议 . 遙控器的发展 . 实验过程 . 攻击面 . 基于STM32实现红外信号解码 1. 遥控器原理简介 0 ...

  5. RTL-SDR + GnuRadio+RFcat 分析、重放无线遥控信号

    0×00 前言 前段时间在<永不消逝的电波(二)HackRF入门:家用无线门铃信号重放> 一文中通过HackRF录制.重放了无线遥控信号,不过一直没来得及对信号进行分析,刚好在国外网站看到 ...

  6. Android 监听双卡信号强度(附完整代码)

    Android 监听双卡信号强度 监听单卡信号强度 监听单卡的信号强度非常简单直接用TelephonyManager.listen()去监听sim卡的信号强度. TelephonyManager = ...

  7. JPG学习笔记2(附完整代码)

    #topics h2 { background: rgba(43, 102, 149, 1); border-radius: 6px; box-shadow: 0 0 1px rgba(95, 90, ...

  8. java mail实现Email的发送,完整代码

    java mail实现Email的发送,完整代码 1.对应用程序配置邮件会话 首先, 导入jar <dependencies> <dependency> <groupId ...

  9. 新版本ffmpeg解码非完整H264帧失败

    按照ffmpeg/doc/examples/decoding_encoding.c中video_decode_example解码H264,新版本ffmpeg解码非完整H264帧,定量读取数据直接给av ...

随机推荐

  1. StringBuilder是不是线程安全的?

    测试条件: 开启2个并行执行任务,往同一个StringBuilder对象写入值 测试代码: ; static StringBuilder sbIsThreadSafe = new StringBuil ...

  2. UGUI Silder

    来我们看看这个像温度计的控件, 比如音量面板声音大小的控制.它是一个组合型控件由多个Image 和一个Slider组合而成 它的核心是Slider组件实现的. 简单介绍下Slider组件的属性: Fi ...

  3. jquery实现仿商品星级评价

    一,HTML部分 <div id="rating-star">     <a href="#">0</a>     < ...

  4. More is better(并差集)

    More is better Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 327680/102400K (Java/Other) To ...

  5. Struts2使用Interceptor实现权限控制的应用实例详解

    Struts2使用Interceptor实现权限控制的应用实例详解 拦截器:是Struts2框架的核心,重点之重.因此,对于我们要向彻底学好Struts2.0.读源码和使用拦截器是必不可少的.少说了. ...

  6. .NET 基础串讲

    C#基础 .NET介绍 —计算机发展史 第一代语言:机器语言 0101 第二代语言:汇编语言, 用一些简洁的英文字母.符号串来替代一个特定指令的二进制串 第三代语言:接近于数学语言或人的自然语言,同时 ...

  7. Sublime Text 添加到右键菜单 带菜单图标

    1.打开 regedit 2.找到节点 HKEY_CLASSSES_ROOT -> * -> Shell 3.右键选择新建“ 项 ” 这个项的名字将作为右键菜单的菜单名称,我用的“ Sub ...

  8. angular $location常用方法使用

    $location提供了一些常用的操作和获取地址栏里的地址的方法. <script type="text/javascript"> angular.module('ap ...

  9. js 去掉空格

    写成类的方法格式如下:(str.trim();)<script language="javascript"> String.prototype.trim=functio ...

  10. 班上有学生若干名,已知每名学生的成绩(整数),求班上所有学生的平均成绩,保留到小数点后两位。同时输出该平均成绩整数部分四舍五入后的数值。 第一行有一个整数n(1<= n <= 100),表示学生的人数。其后n行每行有1个整数,表示每个学生的成绩,取值在int范围内。

    #include<iostream> #include<iomanip> using namespace std ; int main() { int n; while(cin ...