|
7黑幣
本帖最后由 2013yu 于 2015-1-24 13:27 編輯
51hei開發(fā)板上的一個315M無線遙控程序,我想利用每個遙控器地址碼的不同來區(qū)分不同的遙控器,遙控器的地址碼我已經(jīng)焊接好設(shè)置成1FFF FFF0,
我想在程序中設(shè)置一個地址碼,用來和接收到的地址碼作比較,如果設(shè)置的地址碼和接收到的相同就解碼,1FFF FFF0轉(zhuǎn)換成16進(jìn)制是11101010和10101000,大家?guī)臀铱纯醇t字部分如何改,謝謝大家了
#include"AT89x52.h"
//#include"global.h"
#include"intrins.h"
#include"51hei.H"
#define uchar unsigned char
#define uint unsigned int
uchar Rem_Code[3];
uchar Addr_Code_H=?
uchar Addr_Code_L=?
uint TimeCount;
sbit Get_Rem=P3^2;
/* //延時函數(shù)
void Delay100us(void)
{
uchar i;
for(i=0;i<55;i++)
{
_nop_();
}
}
*/
void delay8(uint t)
{
while(--t);
}
void Delay100us(void)
{
delay8(13); //8-18
}
//因?yàn)樗母袷绞?0表示"0"11表示"1"01表示"F"所以我們要把12位乘以2等于24位剛好是3個字節(jié)
//第一二個字節(jié)是地址碼,第三個字節(jié)是數(shù)據(jù)碼
//發(fā)射芯片采用的是PT2262芯片用4.7M的震蕩電阻315M發(fā)射
//遙控我們?nèi)磕J(rèn)地址碼是 FFFFFFFF 單片機(jī)解碼出來就是0x55 0x55
//遙控處理函數(shù)
void Remote_Process(void)
{
uchar i,j,Count=0;
Delay100us();
if(TimeCount>0)//當(dāng)按鍵按下釋放后該值不在賦值就同通過遞減直到該值等于0
{//等于0后表示按鍵釋放
TimeCount--;
}
if(Get_Rem==0)//如果有低電平就進(jìn)入解碼
{
for(Count=0;Count<100;Count++)//判斷12毫秒左右的引導(dǎo)碼
{
Delay100us();//100us*100=10ms
if(Get_Rem==1)//如果在延時10毫秒期間有高電平出現(xiàn)就是干擾信號退出解碼
{
return;
}
}
while(Get_Rem==0);//等待低電平結(jié)束
for(j=0;j<3;j++)//8位地址碼加4位數(shù)據(jù)碼
{
for(i=0;i<8;i++)
{
Count=0;
do
{
Delay100us();
Count++;
if(Count>20)//如果在大于2毫秒高電平還沒有結(jié)束認(rèn)為是干擾退出解碼
{//理論上是1.2毫秒,我們2毫秒留有余量,防止遙控批量中的誤差
return;
}
}while(Get_Rem==1);//計算高平時間并等待結(jié)束
Count=0;
do
{
Delay100us();
Count++;
if(Count>20)//如果在大于2毫秒低平還沒有結(jié)束認(rèn)為是干擾退出解碼
{
return;
}
}while(Get_Rem==0);//計算低電平時間并等待結(jié)束
Rem_Code[j]<<=1;//數(shù)據(jù)從高位開始接收所以每次向左移一位
if(Count<8)//如果低電平時間小于800毫秒認(rèn)為該位為1
{
Rem_Code[j]++;
}
}
}
if(TimeCount==0) //為0表示是新的一次按下對其進(jìn)行處理
{ // 如過該值大于0表示已經(jīng)按下不在處理,保證按下一次只做一次處理
if((Rem_Code[0]==Addr_Code_H)&&(Rem_Code[0]==Addr_Code_L)) //把接收到的地址碼與程序中設(shè)置的地址碼作比較如果相同就執(zhí)行數(shù)據(jù)碼
{
if(Rem_Code[2]==Key_A) //如果數(shù)據(jù)與A鍵的值相等表示A鍵按下對其處理
{//試驗(yàn)用A鍵來控制繼電器的開關(guān)
Com_Relay;//繼電器取反
Nokia3310();//顯示繼電器的狀態(tài)
Bz_Out();//蜂鳴器響一聲
}
}
//P2_2=0;
}
TimeCount=1000;//按鍵按下標(biāo)志
}
}
void main()
{
AUXR=0x01;
P1_4=0;
guandz();
guanled();
while(1)
{
Remote_Process();//遙控處理
}
}
|
|