無(wú)線遙控EV1527解碼源碼分享
U8 code WirelessButtonValue[12]={0x03,0x0C,0x0F,0x30,0x33,0x3C,0x3F,0xC0,0xC3,0xCC,0xCF,0xF0};//無(wú)線遙控器碼值1-12,
U8 code WirelessButtonValue_EV1527[12]={0xB1,0xBC,0xB5,0xB2,0xBA,0xB3,0xB4,0xB9,0xBB,0xB8,0xB6,0xBE};//無(wú)線遙控器碼值1-12,
void Decode()? //Decode是無(wú)線解碼函數(shù)
{?
I=0;//用來(lái)記錄位數(shù),正常會(huì)收到24位。見(jiàn)78行定義
if(TimeCount > 0)? //當(dāng)按鍵按下釋放后該值不再賦值,就通過(guò)遞減直到該值等于0
{
TimeCount--; //超時(shí)變量自減,等于0后表示按鍵釋放
}
while(WuXian_IN == 0)//如果無(wú)線輸入信號(hào)為0一直等待,等待高電平出現(xiàn)
{
Time_out++;//超時(shí)變量自增
if(Time_out>=25000)//超時(shí)退出
{ //Uart1Send(1);
Time_out=0;//超時(shí)變量清零
TR0 = TH0 = TL0 = 0;//關(guān)閉定時(shí)器T0,并重置TH0、TL0
EX0 = 1; //開(kāi)啟外部中斷0
return;
}
}//無(wú)線輸入的while結(jié)束
??
Time_out=0;//超時(shí)變量清零
while(I < 24) //共接收24位,大于等于24位跳出while循環(huán)
{
while(WuXian_IN == 0)? ? //無(wú)線輸入信號(hào)等于0,等待高電平到來(lái)
{
Time_out++; //超時(shí)變量自增
if(Time_out>=25000)? //超時(shí)退出
{//Uart1Send(2);
Time_out=0;//超時(shí)變量清零
TR0 = TH0 = TL0 = 0;? //關(guān)閉定時(shí)器T0,并重置TH0、TL0
EX0 = 1;? ? ? ?//開(kāi)啟外部中斷0
return;//返回值,????
}//while無(wú)線信號(hào)輸入判斷結(jié)束
} //while位判定結(jié)束?
? ??
Time_out=0;//超時(shí)變量清零
TL = TL0;//定時(shí)器低8位清零
TH = TH0;//定時(shí)器高8位清零
TH0 = TL0 = 0; //記錄低電平長(zhǎng)度
L = TH;//高8位賦值給L
L = ((L << 8) + TL); //將計(jì)時(shí)器的高低8位合并
if(I == 0) //處理同步位
{
if(L > 1400)? //確認(rèn)是引導(dǎo)頭(判斷同步位低電平時(shí)長(zhǎng)31a)2360
{
M = L / 31;//M即4a亦即是窄電平的時(shí)長(zhǎng) M=4CLK
}
else? //不符合規(guī)則(出錯(cuò))
{
I = TR0 = TH0 = TL0 = 0;//記錄位、定制器控制位、定時(shí)器初始值等清零
err = 1;//報(bào)錯(cuò)
break;
}//不合規(guī)報(bào)錯(cuò)花
}//同步處理if花
else
{
//短555 長(zhǎng)1666
//4.7M的振蕩電阻時(shí)同步位的低電平時(shí)長(zhǎng)為L(zhǎng)=15378uS;即31a
//4.7M的振蕩電阻時(shí)窄電平時(shí)長(zhǎng)為M=492uS;即4a
//4.7M的振蕩電阻時(shí)寬電平時(shí)長(zhǎng)為1488uS即12a
//以下語(yǔ)句即判斷窄電平與寬電平的寬度是否合格
?/*
窄電平時(shí)長(zhǎng)為M即 M=4a;a為一個(gè)振蕩頻率, fosc=(2x1000x16/Rosc(KΩ))KHz,
fosc單位為KHz, (Rosc為振蕩電阻,單位為KΩ),則一個(gè)振蕩周期T=1/fosc
例如常用振蕩電阻為4.7M;則振蕩頻率a=fosc=1/(2x1000x16/4700)=6.8KHz,
則振蕩周期T=1/6.8K=147uS,即窄電平M=a=4T=588us;則寬電平3xM=3a=1764us;
程序中窄電平的誤差范圍為正(M+M/4)負(fù)(M-M/4)一個(gè)振蕩周期a=M/4;
程序中寬電平的誤差范圍為正(M * 3 + M / 2)負(fù)(M * 3 - M / 2) 兩個(gè)振蕩周期2a=M/2;
*/
//如果窄電平小于4a與大于4a或?qū)掚娖叫∮?2a與大于12a則表示出錯(cuò)
if(((L < M - M / 4) && (L > M + M / 4)) || ((L < M * 3 - M / 2) && (L > M * 3 + M / 2)))??
{? ?//窄電平的誤差范圍為正(M+M/4)負(fù)(M-M/4)一個(gè)振蕩周期a=M/4;
? I = TR0 = TH0 = TL0 = 0; //寬電平的誤差范圍為正(M * 3 + M / 2)負(fù)(M * 3 - M / 2) 兩個(gè)振蕩周期2a=M/2;
? err = 1;//報(bào)錯(cuò)
? break;//跳出
}//報(bào)錯(cuò)判斷
}//處理同步位if 記錄位不等于0花
while(WuXian_IN == 1) //若是無(wú)線輸入等于1,等待低電平到來(lái)
? ? {
Time_out++;//超時(shí)變量自增
if(Time_out>=25000) //超時(shí)退出
{//Uart1Send(3);
Time_out=0;//超時(shí)變量清零
TR0 = TH0 = TL0 = 0; //關(guān)閉定時(shí)器T0,并重置TH0、TL0
EX0 = 1;//開(kāi)啟外部中斷0
return;//返回值
}
}//判定無(wú)線信號(hào)不等于1結(jié)束
Time_out=0;//超時(shí)變量清零
TH = TH0;//定時(shí)器0賦初值高8位
TL = TL0;//定時(shí)器0賦初值低8位
TH0 = TL0 = 0;//定時(shí)器初值清零
L = TH;//高8位賦值給L
L = ((L << 8) + TL); //將計(jì)時(shí)器的高低8位合并
/*以下語(yǔ)句即判斷是窄電平是否合格(4.7M的振蕩電阻時(shí)窄電平時(shí)長(zhǎng)為492uS即4a) */
if(((L > (M - M / 4)) && (L < (M + M / 4))))//如果此時(shí)為4a則本位為0? 短492uS
{? //窄電平的誤差范圍為正(M+M/4)負(fù)(M-M/4)一個(gè)振蕩周期a=M/4;
I++; //記錄位變量自增
MA1 <<= 1;//本位置0
}
/*以下語(yǔ)句即判斷寬電平是否合格(4.7M的振蕩電阻時(shí)寬電平時(shí)長(zhǎng)為1488uS即12a)? ? */
else if(((L > (M * 3 - M / 2)) && (L < (M * 3 + M / 2)))) //如果此時(shí)為12a則本位為1 長(zhǎng)1488uS
{? //寬電平的誤差范圍為正(M * 3 + M / 2)負(fù)(M * 3 - M / 2) 兩個(gè)振蕩周期2a=M/2;
I++;//記錄位變量自增
MA1 <<= 1;//
MA1++; //本位置1
}
else //已不是4a也不是12a則不符合規(guī)表示出錯(cuò)
{
I = 0;//對(duì)I進(jìn)行清零
TR0 = TH0 = TL0 = 0;//關(guān)閉定時(shí)器T0,初始值清零
err = 1;//把1賦值給錯(cuò)誤標(biāo)志
break;
}
if(I == 8) //? MA3、MA2、MA1是用來(lái)記錄地址碼(占16位)和鍵碼(占8位)(MA1、MA2、MA3各8個(gè)bit位)
{??
MA3 = MA1;?
//P1 = MA3;? //送P1口顯示方便調(diào)試,P1中間變量
}
if(I == 16)
{
MA2 = MA1;??
//P0 = MA2;? //送P1口顯示方便調(diào)試
}
if(I == 24) //24位已收完則解碼結(jié)束
{
if(TimeCount == 0)? //超時(shí)為0表示是新的一次按下對(duì)其進(jìn)行處理,如果該值大于0表示已經(jīng)按下不再處理
{??
? ? // Uart1Send(MA1);
// Uart1Send(MA2);
// Uart1Send(MA3);
? if(WirelessButtonValue[da_index-1]==MA1)Flag_ok=1;? //Flag_ok是到位標(biāo)志位
if(MA1==WirelessButtonValue_EV1527[da_index-1])Flag_ok=1;//WirelessButtonValue_EV1527是無(wú)線遙控器碼值1-12,
// Time_an=0;
// switch(MA1)
// {
// case 0xC0:??
// Uart1Send(10);
// break;
// case 0x30:? ?
// Uart1Send(11);
// break;
// case 0x0C:? ??
// Uart1Send(12);
// break;
// case 0x03:? ?
// Uart1Send(13);
// break;
//
// }
}
// OK_LED = !OK_LED;? ? //解碼正確后取反一次
// ? Time_an++;
if(Flag_SW==1)? //開(kāi)關(guān)標(biāo)志等于1
{
Flag_SW=0;//開(kāi)關(guān)標(biāo)志清零
switch(MA1)//用來(lái)記錄地址碼(占16位)和鍵碼(占8位)(MA1、MA2、MA3各8個(gè)bit位)
{
//若MA1等于0x03,則對(duì)MA1清零;da_index賦值1;P1等于取商,P2取余;調(diào)用E2prom寫(xiě)入;
case? 0x03:MA1=0;da_index=1;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0x0C:MA1=0;da_index=2;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0x0F:MA1=0;da_index=3;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0x30:MA1=0;da_index=4;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0x33:MA1=0;da_index=5;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0x3C:MA1=0;da_index=6;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0x3F:MA1=0;da_index=7;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xC0:MA1=0;da_index=8;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xC3:MA1=0;da_index=9;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xCC:MA1=0;da_index=10;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xCF:MA1=0;da_index=11;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xF0:MA1=0;da_index=12;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xB1:MA1=0;da_index=1;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xBC:MA1=0;da_index=2;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xB5:MA1=0;da_index=3;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xB2:MA1=0;da_index=4;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xBA:MA1=0;da_index=5;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xB3:MA1=0;da_index=6;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xB4:MA1=0;da_index=7;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xB9:MA1=0;da_index=8;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xBB:MA1=0;da_index=9;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xB8:MA1=0;da_index=10;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xB6:MA1=0;da_index=11;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
case? 0xBE:MA1=0;da_index=12;P1=num[da_index/10];P2=num[da_index%10];EEprom_Write();break;
}//SWitch判定結(jié)束
}//開(kāi)關(guān)標(biāo)志置1處理函數(shù) ?
TimeCount =4;
}//24位接受完畢花
}//判定接受位while結(jié)束
TR0 = TH0 = TL0 = 0;? //關(guān)閉定時(shí)器T0,并重置TH0、TL0
EX0 = 1; //開(kāi)啟外部中斷0
}//解碼函數(shù)花