SYN480R模块解码EV1527教程

2019-04-15 12:51发布

1. EV1527帧结构
EV1527 每帧数据由同步码和24位的数据码组成,数据码又分为地址码(20位)和按键码(4位)。
以我手头上的433Mhz的EV1527遥控器为例,遥控波形如下。433EV1527遥控波形
bit0:400us高电平+800us低电平
bit1:1ms高电平+200us低电平
  • 同步码(黑 {MOD}线条部分):高电平400us+低电平9ms。
  • 地址码(橙 {MOD}线条部分):20个数据位,共24ms。
  • 按键码(红 {MOD}线条部分):4个数据位,共4.8ms。
    2. 解码原理
    同步码和bit1、bit0的低电平持续时间都不一样。通过定时器计算低电平时间来判断同步码、bit1、bit0。
    3. SYN480R解码代码
    设置一个50us中断一次的定时器,每次中断调用soft_count()函数。
    修改后面的数值就可以在其他不同的模块上用
    #define _start_us_min 160
    #define _start_us_max 200
    #define _num0_us_min 10
    #define _num0_us_max 20
    #define _num1_us_min 0
    #define _num1_us_max 8
    代码注释都非常详细,我就不再废话了。如果有不懂的可以直接问我。
.h文件 #ifndef _SOFT_DECODE_ #define _SOFT_DECODE_ #include "N76E003.h" #define uint unsigned int #define uchar unsigned char #define ulong unsigned long //50us #define _start_us_min 160 #define _start_us_max 200 #define _num0_us_min 10 #define _num0_us_max 20 #define _num1_us_min 0 #define _num1_us_max 8 extern uchar IR_Key; extern uchar Temp_addrl; extern uchar Temp_addrh; extern uchar Address_l; extern uchar Address_h; extern uint RF_Value_Cnt; extern uint release_key; extern bit IR_OVER; void soft_count(); void soft_decode(); #endif .c文件 #include "SOFT_DECODE.h" sbit RF_Dat = P1^7; //红外接收引脚 ulong RF_data; uchar Temp_addrl,Temp_addrh,Address_l,Address_h;//地址码 uchar cntint,IR_Key; //接收位数据的个数,数据 bit start_flag=0,IR_OVER; //检测到码头start_flag置1,反之置0,接收完一组数据后IR_OVER置1,反之清0 bit Jump_flag; //电平跳变标志 uint release_key; //松手计数 uint Low; //低电平计数 uint RF_Value_Cnt; //长按计数 /**----------------------------------------------------------------------------------------------** **函数名 :低电平脉宽测量函数 **功能说明:计算低电平时间(LOW),50us调用一次 **----------------------------------------------------------------------------------------------**/ void soft_count()//接受码计数函数 { if(RF_Dat==0) //低电平 { Low++; if(Jump_flag)Jump_flag=0; //Jump_flag由0→1代表 低→高 跳变 } else if(RF_Dat==1) //高电平 { if(!Jump_flag) { Jump_flag=1; //Jump_flag由1→0代表 高→低 跳变 soft_decode(); Low=0; } } } /**----------------------------------------------------------------------------------------------** **函数名 :解码函数 **----------------------------------------------------------------------------------------------**/ void soft_decode()//接受码处理函数 { // uchar i; if(start_flag==0) { if(( Low > _start_us_min ) && ( Low < _start_us_max )) //同步码 { start_flag=1; cntint=0;//数据长度 IR_Key=0; RF_data=0; LED=1; } else { // LED=!LED;//1khz RF_Value_Cnt=0; // long_key_flag=0; release_key++; if(release_key>500)release_key=500; } } else if((start_flag==1)&&(cntint<24)) { if(( Low > _num0_us_min ) && ( Low < _num0_us_max )) //数据 0 700us { RF_data=RF_data<<1; cntint++; } else if(( Low > _num1_us_min ) && ( Low < _num1_us_max )) //数据 1 120-200us { RF_data=RF_data<<1; RF_data|=1; cntint++; } else { start_flag=0; cntint=0; } } if(cntint==24) { release_key=0; RF_Value_Cnt++; if(RF_Value_Cnt>500)RF_Value_Cnt=500; cntint=0; start_flag=0; IR_Key=RF_data&0x0000000f; //取4位数据 Temp_addrl=(RF_data>>4)&0x000000ff; //地址共20位,只取16位。 Temp_addrh=(RF_data>>12)&0x000000ff; IR_OVER=1; } } 程序下载