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;                             /* 清除高电平时间计数             */
   		}			
   	}				
   }
}

  • 9
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Arduino红外接收解码转发一体是一种功能强大的设备,它可以接收红外信号并解码,然后将解码后的信号转发到其他设备。 首先,Arduino红外接收模块可以接收红外线传输的信号。它能够感应到红外线的发射器发出的信号,并将其接收到。 其次,这个模块还具有解码功能。它可以解码接收到的红外信号,将其转换成数字或其他可识别的格式。这个功能对于控制其它设备非常有用,例如控制电视机、空调等。 最后,Arduino红外接收解码转发一体还可以将解码后的信号转发到其他设备。它可以通过输出接口将解码后的信号传递给其他设备,进而实现远程控制或信息传递的功能。 总结来说,Arduino红外接收解码转发一体设备是一种可编程的电子模块,具备接收红外信号、解码信号和转发信号的功能。它可以用于很多领域,例如智能家居、遥控器、无线通信等。这种设备的使用极大地提升了红外控制的便捷性和可扩展性。 ### 回答2: Arduino 红外接收解码转发一体是指通过使用Arduino开发板和红外接收头模块实现对红外信号的接收、解码和转发功能的集成设计。 首先, 需要连接红外接收头模块到Arduino的数字IO引脚上。接收头模块能够接收来自红外遥控器发送的红外信号,将接收到的信号转换为电信号输入到Arduino开发板上。 接着, Arduino通过编程使用红外库来解码接收到的信号。红外库通常包含了各种红外编码解码协议,例如NEC、Sony等。根据接收到的信号编码,可以通过红外库提供的函数来解码信号, 获取按下的按钮信息等。 最后, 当信号被解码之后,可以通过编程来控制其他设备的状态转换或执行相应的动作。比如,可以通过Arduino的数字IO引脚来控制LED的开关、驱动电机、改变显示屏等。 整个过程中,Arduino的编程起到了关键的作用。我们需要编写代码来控制红外接收头模块的引脚接收信号,使用红外库来解码信号,并根据解码结果控制其他设备的状态转换。 通过这种方式,我们可以实现红外信号的接收、解码和转发功能的一体化设计。这种集成设计可以广泛应用于遥控器、家庭自动化、智能家居等领域,为我们的生活带来更多的便利性和智能化。 ### 回答3: Arduino红外接收解码转发一体是指在Arduino开发板上集成了红外接收解码和转发功能的一种设计。通常情况下,利用红外接收模块可以接收并解码来自红外遥控器发送的信号,而红外发射模块可以将解码后的信号通过红外光线发送出去。 在Arduino上实现红外接收解码转发一体的过程,首先需要连接红外接收模块和红外发射模块到Arduino开发板上。红外接收模块通过数据线连接到Arduino的数字引脚,而红外发射模块则通过数字引脚连接到Arduino。 接下来,在Arduino的编程环境中,可以使用红外接收库和红外发射库来实现红外接收解码和转发的功能。通过调用相应的函数,可以读取红外遥控器发送的信号,同时对信号进行解码解码后的信号可以通过红外发射模块发送出去,实现转发的功能。 这样的设计可以在很多应用场合中发挥作用。例如,可以将其应用在智能家居系统中,通过红外接收模块接收来自遥控器的指令,然后解码并转发到其他设备,如电视、空调等,实现对其的控制。另外,还可以将其应用在自动化系统中,比如利用红外接收模块接收红外传感器发送的信号,然后解码并根据不同的信号进行相应的动作。 总之,Arduino红外接收解码转发一体的设计,在实际应用中具有很大的灵活性和可扩展性,可以方便地实现红外信号的接收、解码和转发功能,并且可以根据具体的需求进行编程定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值