最近需要使用的一个16按键433M摇控器方案,一时没有找到好的程序参考,于是自已设计了一个程序使用,效果很好。设计思想,首先通过示波器抓出接收板数据波形,分析波形特征。一般都是首先同步信号出现,约10MS左右低电平,之后跟着出现数据信号,一般来讲是地址+数据,其实我们不用管,只要程序能分析出同步信号之间的数据就行。数据0=0.4ms高电平+1.2ms低电平的组合,数据1=1.2ms高电平+0.4ms低电平的组合,数据25位。我们定义一个32位的变量,将数据一位一位的移进变量中,最后得出变量值,于是解码成功。连续解码出5组数据进行对比,如其中有2组以上的码相同,则认为相同的数据解码正确。解程序使用0.1mS定时器中断,用来检测数据电平。详见程序:
bit F_TongBu_Flag=0; //低电平同步头标志
u8 Da_cont_HV=0; //高电平计数
u8 Da_cont_LV=0; //低电平计数
u8 MoveBit=0; //移位
bit starLVFlag=0; //高电平开始后才能使用的低电平检测标志
u32 xdata DataBuf[5]={0}; //临时保存25位数据区
u32 xdata T433M_data=0x00000000;
u32 xdata T433M_Tem=0;
void Init433M(); //初始化433M接收设置数据
void Timer0Init(void) //100微秒@24.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xA0; //设置定时初值
TH0 = 0xF6; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1; //打开中断
IP|=0X02; IPH|=0X02; //最高优先级
}
void TM0_Isr() interrupt 1 //定时器0中断函数0.1mS
{
if(!T_433M&&!F_TongBu_Flag) // 数据脚低电平&&未检测到同步
{
Da_cont_LV++; //开始计数,0.1ms累加
if(Da_cont_LV>80) //大于8ms
{
F_TongBu_Flag=1; //周步标志有效
// printf("0X%lX.\r\n",T433M_data);
Init433M(); //初始化433M接收设置数据
}
}
else
{
Da_cont_LV=0;
}
if(F_TongBu_Flag) //同步标志有效且高电平
{
if(T_433M) //同步标志有效且高电平
{
starLVFlag=1; //高电平开始后才能使用的低电平检测标志
Da_cont_HV++; //高电平计数
if(Da_cont_HV>=250) //电平计数异常,一般不会有这种情况
{
F_TongBu_Flag=0; Da_cont_HV=0; Da_cont_LV=0; return; //返回
}
}
else
{
if(starLVFlag) //当高电平过后的低电平时,开始判断高电平的宽度
{
starLVFlag=0;
if(Da_cont_HV>2&&Da_cont_HV<8) //如果高电平大于0.2小于0.6ms,
{
T433M_Tem=0;
T433M_data|=T433M_Tem<<MoveBit;
if(MoveBit>0)
{ MoveBit--;}
else
{F_TongBu_Flag=0;}
}
else
{
if(Da_cont_HV>8&&Da_cont_HV<18)
{
T433M_Tem=1;
T433M_data|=T433M_Tem<<MoveBit;
if(MoveBit>0)
{ MoveBit--;}
else
{ F_TongBu_Flag=0;}
}
else
{
F_TongBu_Flag=0;Da_cont_LV=0; //周步标志有效
}
}
Da_cont_HV=0; //判断完后高电平计数复位
}
}
}
}
/*100US中断,测量同步低电平连续约12mS,0数据为H:0.44ms+L:1.32ms,1数据为H:1.32ms+L:0.44mm,一串25位。
解码编程:首先检测同步头,>连续200次低电平,同步头出现,进入第一个高电平时间检测,若高电平检测次数
大于6,小于9,为0数据,若大于20小于26,为高。继续检测下一个高电平,如连续30个低电平,结束检测,重新检测同步头
在500MS内,进行一次数据比对,当有两组数据为相同时,可得出这个数据为一组正确的数据。
*/
void Init433M() //初始化433M接收设置数据
{
MoveBit=30; //移位设置
T433M_data=0x00000000; //数据复位
T433M_Tem=0;
Da_cont_HV=0;
Da_cont_LV=0;
starLVFlag=0;
//高电平开始后才能使用的低电平检测标志
}
|