NEC红外线编码协议

红外遥控协议-NEC协议

为方便理解所看到的波形是从红外接收管出来的信号,跟协议所说的信号高低(0或1)刚好相反

NEC协议是众多红外遥控协议的其中一种,除NEC外,还有RC5、RC6等其它的。市面上买到的非学习型万能电视遥控器大多集成一种或多种编码是NEC型的,我买的二个遥控器中就有三种以上编码是NEC的。

NEC编码的一帧(通常按一下遥控器按钮所发送的数据)由引导码、地址码及数据码组成,,如下图所示,把地址码及数据码取反的作用是加强数据的正确性。

IR NEC Protocol

引导码及数据的定义如下图所示,当一直按住一个按钮的时候,会隔110ms左右发一次引导码(重复),并不带任何数据

引导码及数据

以下是用示波器采集到的一直按住某个按钮时的波形:

image

按一下按钮的波形:

image


一、遥控器解码说明

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=0;
    //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 = 0;
        switch (IrState)
        {
            case IR_STATE_IDLE:
                INTEDG = 1;//Rising edge trigger
                IrState = IR_STATE_LEAD_ON;
                break;
            case IR_STATE_LEAD_ON:
                INTEDG = 0;//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 = 0;
                    BitCounter = 0;
                    Repeat = 0;
                }
                else
                {
                    if ((t0 > IR_R_Min) && (t0 < IR_R_Max))
                    {
                        if ((Repeat)&&(SystemState == POWER_ON_STATE))
                        { 
                            Repeat = 0;//IR key Repeat
                        }
                    }
                    else
                    {
                        Repeat = 0;
                    }
                    
                    INTEDG = 0;
                    IrState = IR_STATE_IDLE;
                }
                break;
            case IR_STATE_CUSTOM:
                if ((t0 > IR_L_Min) && (t0 < IR_L_Max))
                {
                    IrCustom >>= 1; 
                }
                else
                {
                    if ((t0 > IR_H_Min) && (t0 < IR_H_Max))
                    {
                        IrCustom = ((IrCustom >> 1) | 0x8000); 
                    }
                    else
                    {
                        INTEDG = 0;
                        IrState = IR_STATE_IDLE;
                        Repeat = 0;
                        break;
                    }
                }
                
                
                if (++BitCounter == 16)
                {
                    if (IrCustom != CustomCode)
                    {
                        INTEDG = 0;
                        IrState = IR_STATE_IDLE;
                        Repeat = 0;
                        break;
                    }
                    IrState = IR_STATE_DATA1;
                    BitCounter = 0;
                    IrKeyCode = 0;
                }
                break;
            case IR_STATE_DATA1:
                BitCounter++;
                if ((t0 > IR_L_Min) && (t0 < IR_L_Max))
                {
                    IrKeyCode >>= 1; 
                }
                else
                {
                    if ((t0 > IR_H_Min) && (t0 < IR_H_Max))
                    {
                        IrKeyCode = ((IrKeyCode >> 1) | 0x80); 
                    }
                    else
                    {
                        INTEDG = 0;
                        IrState = IR_STATE_IDLE;
                        Repeat = 0;
                        break;
                    }
                }
                if (BitCounter == 8)
                {
                    IrState = IR_STATE_DATA2;
                    BitCounter = 0;
                    IrData = 0;
                }
                break;
            case IR_STATE_DATA2:
                BitCounter++;
                if ((t0 > IR_L_Min) && (t0 < IR_L_Max))
                {
                    IrData >>= 1; 
                }
                else
                {
                    if ((t0 > IR_H_Min) && (t0 < IR_H_Max))
                    {
                        IrData = ((IrData >> 1) | 0x80); 
                    }
                    else
                    {
                        INTEDG = 0;
                        IrState = IR_STATE_IDLE;
                        Repeat = 0;
                        break;
                    }
                }
                if (BitCounter == 8)
                {
                    INTEDG = 0;
                    IrState = IR_STATE_IDLE;
                    IrData = ~IrData;
                    if (IrKeyCode == IrData)
                    {
                                                    // Check if data is valid
                    }
                    else
                    {
                        Repeat = 0;
                    }
                }
                break;
        }
        INTF=0; 
    }
    GIE=1;
}

  • 5
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: iMaster NCE是华为公司的一款网络云引擎产品,简称为NCE(Network Cloud Engine)。它是一种用于企业网络的解决方案,通过软硬件结合的方式,提供了高性能、高可靠性和高可伸缩性的网络服务。 iMaster NCE产品文档是一份详细介绍NCE产品的文件,主要包含了产品的功能、架构、操作和配置等方面的信息。该文档旨在帮助用户了解和使用iMaster NCE产品,提供了全面的技术支持和操作指南。 该产品文档通常包括以下内容: 1. 产品概述:介绍iMaster NCE的特点、适用场景、主要功能等。 2. 系统架构:详细描述了iMaster NCE的整体架构,包括硬件和软件组成部分,并说明各个组件的功能和作用。 3. 安装与配置:提供了NCE的安装和配置指南,包括系统安装、网络部署、设备连接和初始化等步骤。 4. 系统管理:介绍了如何进行系统管理和维护工作,包括用户管理、设备管理、监控和故障排除等。 5. 功能说明:详细描述了iMaster NCE提供的各种功能,如网络管理、安全管理、流量管理等,以及各功能的具体操作方法。 6. 常见问题解答:列举了一些常见的问题和解答,以帮助用户快速解决一些常见的操作和配置问题。 总的来说,iMaster NCE产品文档是用户了解和使用该产品的重要参考资料,它提供了全面、详细和系统的信息,帮助用户更好地使用和管理NCE产品,提高企业网络的性能和效果。 ### 回答2: iMaster NCE产品文档是一份详细介绍iMaster NCE产品功能和使用方法的文档。iMaster NCE是华为公司推出的一款网络云管理平台。 该产品文档由多个部分组成,包括产品概述、安装指南、配置指南、故障处理指南等内容。产品概述部分介绍了iMaster NCE的特点和优势,以及适用的场景和用户群体。 安装指南部分详细说明了产品的安装步骤和要求,包括硬件和软件环境要求,安装前的准备工作,以及具体的安装过程。 配置指南部分介绍了iMaster NCE的各项功能和配置方法,包括网络拓扑管理、设备配置管理、用户权限管理等。通过详细的说明和示例,用户可以轻松地了解和配置相关功能。 故障处理指南部分提供了常见故障的解决方法和建议,帮助用户在使用过程中快速排除问题并恢复正常运行。 此外,产品文档还包括了一些额外的附录,如术语解释、常见问题解答等,方便用户在使用过程中查询和参考。 总之,iMaster NCE产品文档是一份全面而详细的文档,可以帮助用户正确安装、配置和使用iMaster NCE产品,提高网络管理效率和运维能力。用户只需按照文档的指引进行操作,即可充分发挥iMaster NCE的功能和优势。 ### 回答3: iMaster NCE是华为企业商用网络解决方案的一部分,它是华为的一种高性能、可靠且智能的网络控制与管理平台。 iMaster NCE的产品文档主要包括以下几个方面的内容: 1. 产品介绍:该部分会详细介绍iMaster NCE的概述、功能特点、工作原理等,让用户对产品有一个全面的了解。 2. 系统架构:该部分会详细描述iMaster NCE的整体架构,包括各个组件的功能和相互关系,以及与其他系统的接口。 3. 功能说明:该部分会列举iMaster NCE的各项功能模块,并详细说明每个功能模块的作用和使用方法,用户可以根据实际需求选择需要的功能模块。 4. 安装部署:该部分会提供iMaster NCE的安装和部署指南,包括硬件和软件的要求,以及具体的安装过程和注意事项。 5. 配置与管理:该部分会详细介绍iMaster NCE的配置和管理方法,包括系统设置、设备接入、网络拓扑配置等,让用户能够轻松进行系统配置和管理。 6. 故障排除:该部分会提供iMaster NCE的故障排除步骤和常见故障解决办法,帮助用户在使用过程中能够快速识别和解决问题。 通过阅读iMaster NCE的产品文档,用户可以全面了解该产品的功能和使用方法,能够更好地进行系统部署、配置和管理,同时也能够快速解决可能出现的故障。iMaster NCE的产品文档的编写旨在为用户提供全方位的帮助和指导,确保用户能够充分发挥该产品的优势,提升网络运维的效率和质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值