|
最近需要使用的一個(gè)16按鍵433M搖控器方案,一時(shí)沒(méi)有找到好的程序參考,于是自已設(shè)計(jì)了一個(gè)程序使用,效果很好。設(shè)計(jì)思想,首先通過(guò)示波器抓出接收板數(shù)據(jù)波形,分析波形特征。一般都是首先同步信號(hào)出現(xiàn),約10MS左右低電平,之后跟著出現(xiàn)數(shù)據(jù)信號(hào),一般來(lái)講是地址+數(shù)據(jù),其實(shí)我們不用管,只要程序能分析出同步信號(hào)之間的數(shù)據(jù)就行。數(shù)據(jù)0=0.4ms高電平+1.2ms低電平的組合,數(shù)據(jù)1=1.2ms高電平+0.4ms低電平的組合,數(shù)據(jù)25位。我們定義一個(gè)32位的變量,將數(shù)據(jù)一位一位的移進(jìn)變量中,最后得出變量值,于是解碼成功。連續(xù)解碼出5組數(shù)據(jù)進(jìn)行對(duì)比,如其中有2組以上的碼相同,則認(rèn)為相同的數(shù)據(jù)解碼正確。解程序使用0.1mS定時(shí)器中斷,用來(lái)檢測(cè)數(shù)據(jù)電平。詳見(jiàn)程序:
bit F_TongBu_Flag=0; //低電平同步頭標(biāo)志
u8 Da_cont_HV=0; //高電平計(jì)數(shù)
u8 Da_cont_LV=0; //低電平計(jì)數(shù)
u8 MoveBit=0; //移位
bit starLVFlag=0; //高電平開(kāi)始后才能使用的低電平檢測(cè)標(biāo)志
u32 xdata DataBuf[5]={0}; //臨時(shí)保存25位數(shù)據(jù)區(qū)
u32 xdata T433M_data=0x00000000;
u32 xdata T433M_Tem=0;
void Init433M(); //初始化433M接收設(shè)置數(shù)據(jù)
void Timer0Init(void) //100微秒@24.000MHz
{
AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0xA0; //設(shè)置定時(shí)初值
TH0 = 0xF6; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
ET0=1; //打開(kāi)中斷
IP|=0X02; IPH|=0X02; //最高優(yōu)先級(jí)
}
void TM0_Isr() interrupt 1 //定時(shí)器0中斷函數(shù)0.1mS
{
if(!T_433M&&!F_TongBu_Flag) // 數(shù)據(jù)腳低電平&&未檢測(cè)到同步
{
Da_cont_LV++; //開(kāi)始計(jì)數(shù),0.1ms累加
if(Da_cont_LV>80) //大于8ms
{
F_TongBu_Flag=1; //周步標(biāo)志有效
// printf("0X%lX.\r\n",T433M_data);
Init433M(); //初始化433M接收設(shè)置數(shù)據(jù)
}
}
else
{
Da_cont_LV=0;
}
if(F_TongBu_Flag) //同步標(biāo)志有效且高電平
{
if(T_433M) //同步標(biāo)志有效且高電平
{
starLVFlag=1; //高電平開(kāi)始后才能使用的低電平檢測(cè)標(biāo)志
Da_cont_HV++; //高電平計(jì)數(shù)
if(Da_cont_HV>=250) //電平計(jì)數(shù)異常,一般不會(huì)有這種情況
{
F_TongBu_Flag=0; Da_cont_HV=0; Da_cont_LV=0; return; //返回
}
}
else
{
if(starLVFlag) //當(dāng)高電平過(guò)后的低電平時(shí),開(kāi)始判斷高電平的寬度
{
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; //周步標(biāo)志有效
}
}
Da_cont_HV=0; //判斷完后高電平計(jì)數(shù)復(fù)位
}
}
}
}
/*100US中斷,測(cè)量同步低電平連續(xù)約12mS,0數(shù)據(jù)為H:0.44ms+L:1.32ms,1數(shù)據(jù)為H:1.32ms+L:0.44mm,一串25位。
解碼編程:首先檢測(cè)同步頭,>連續(xù)200次低電平,同步頭出現(xiàn),進(jìn)入第一個(gè)高電平時(shí)間檢測(cè),若高電平檢測(cè)次數(shù)
大于6,小于9,為0數(shù)據(jù),若大于20小于26,為高。繼續(xù)檢測(cè)下一個(gè)高電平,如連續(xù)30個(gè)低電平,結(jié)束檢測(cè),重新檢測(cè)同步頭
在500MS內(nèi),進(jìn)行一次數(shù)據(jù)比對(duì),當(dāng)有兩組數(shù)據(jù)為相同時(shí),可得出這個(gè)數(shù)據(jù)為一組正確的數(shù)據(jù)。
*/
void Init433M() //初始化433M接收設(shè)置數(shù)據(jù)
{
MoveBit=30; //移位設(shè)置
T433M_data=0x00000000; //數(shù)據(jù)復(fù)位
T433M_Tem=0;
Da_cont_HV=0;
Da_cont_LV=0;
starLVFlag=0;
//高電平開(kāi)始后才能使用的低電平檢測(cè)標(biāo)志
}
|
評(píng)分
-
查看全部評(píng)分
|