#include "RF433.h"
/***************************************************
一个字码由 同步码 + 地址码 + 数据码 组成
遥控器的编码芯片不同(不同遥控器),需修改:
#define _start_us_min 80 //同步码用到
#define _start_us_max 120
#define _num0_us_min 15 //数据“0”用到
#define _num0_us_max 25
#define _num1_us_min 3 //数据“1”用到
#define _num1_us_max 14
*******************************************************/
/*************解码函数**********
//如果不需要对码注释下面这一段
Temp_addrh=(RF_data>>8);//地址码
Temp_addrl=(RF_data>>16);//
if((j!=2)&&(Temp_RF_Key==0x08))//对码,开关键
{
RF_Value_Cnt++;
if((j==1)&&(time_duima<40000)) //40000*0.05ms=2s (长按)对码
{
if(RF_Value_Cnt>20)
{
EA=0;
RF_Value_Cnt=0;
j=2;
time_duima=60020;
Address_l=Temp_addrl;
Address_h=Temp_addrh;
Write_Memory(); //写入存储
FLASH_FLAG=1; //对码成功标志
EA=1;
}
}
}
if(Address_l==Temp_addrl && Address_h==Temp_addrh)
*************************/
#define RF_Dat P23
uint16_t time_duima = 6100;
uchar timecnt1, timecnt0;
bit Jump_flag;
bit start_flag;
uchar cntint;
ulong RF_data;
uchar Temp_addrl = 0;
uchar Temp_addrh = 0;
uchar Address_l, Address_h; //地址码
uint RF_Key;
extern unsigned short int flag_S;
bit flash_1S;
void soft_decode(void); //译码函数
void soft_count(void) //接受码计数函数
{
if (time_duima < 6005)time_duima++;
if (!RF_Dat) //低电平
{
timecnt0++;
if (Jump_flag && timecnt0>=1)//timecnt0>=1的作用是低电平滤波,当433信号为高电平时出现了低电平杂波,
//一般杂波的持续时间不会大于50us,我们就把低于50us的低电平视为杂波,
//当然这个可以根据不同遥控器的情况把这个50us改为其他不会影响到程序解码的时间
{
Jump_flag = 0; //Jump_flag由0→1代表 低→高 跳变
}
}
else if (RF_Dat) //高电平
{
if (!Jump_flag && timecnt1>=1)//timecnt1>=1的作用是高电平滤波处理,防止在远处控制时出现高电平杂波,
//只有高于50us的高电平才是有效的高电平
{
Jump_flag = 1; //Jump_flag由1→0代表 高→低 跳变
soft_decode();
timecnt1 = 0;
timecnt0 = 0;
}
timecnt1++;
}
}
#define _120_us_min 2
#define _120_us_max 5
#define _360_us_min 6
#define _360_us_max 12
#define _3700_us_min 70//70
#define _3700_us_max 200//120
uint8_t g_RF_reset = 0;
extern uint8_t g_Save_Flag;//存储标志位
extern uint8_t g_u8twinkle_flag;
void soft_decode(void) //接受码处理函数
{
static uint8_t RF_reset_cnt = 0;
uint Temp_RF_Key = 0;
if (!start_flag)
{
if ((timecnt0 > _3700_us_min) && (timecnt0 < _3700_us_max)) //数据头
{
start_flag = 1;
cntint = 0;
Temp_RF_Key = 0;
RF_data = 0;
RF_reset_cnt = 0;
}
else
{
if(RF_reset_cnt++ > 50)
{
g_RF_reset = 1;//复位标志位,用了键值清零即可(消重复按键)
RF_Key = 0;//复位要清键值。
}
}
}
else if (start_flag == 1 && cntint < 24)
{
if ((timecnt0 >= _360_us_min) && (timecnt0 <= _360_us_max)) //数据 0
{
RF_data = RF_data << 1;
cntint++;
}
else if ((timecnt0 >= _120_us_min) && (timecnt0 <= _120_us_max)) //数据 1
{
RF_data = RF_data << 1;
RF_data |= 1;
cntint++;
}
else //if(timecnt1>20)
{
start_flag = 0;
cntint = 0;
} //key_infor=0;
}
if (cntint == 24)
{
cntint = 0;
start_flag = 0;
Temp_RF_Key = 0;
Temp_addrl = 0;
Temp_addrh = 0;
Temp_RF_Key = RF_data & 0x000000fff;
Temp_addrl = (RF_data >> 12) & 0xff;
Temp_addrh = (RF_data >> 20) & 0xf;
if (time_duima < 3000)
{
if (Temp_RF_Key != 0x00cf)time_duima = 6006;
else time_duima = time_duima;
}
if ((time_duima > 3050 && time_duima < 6004) && (Temp_RF_Key == 0x00cf))
{
time_duima = 6006;
Address_l = Temp_addrl;
Address_h = Temp_addrh;
g_Save_Flag = 1;//存储flag
g_u8twinkle_flag = 1;//闪烁flag
}
if (Address_l == Temp_addrl && Address_h == Temp_addrh)
// if(Temp_addrl == 0x3f && Temp_addrh == 0x07)//测试的遥控器
{
RF_Key = Temp_RF_Key;
}
}
}
//---------------------- file end -------------------------------