无线遥控EV1527解码源码分享
U8 code WirelessButtonValue[12]={0x03,0x0C,0x0F,0x30,0x33,0x3C,0x3F,0xC0,0xC3,0xCC,0xCF,0xF0};//无线遥控器码值1-12,
U8 code WirelessButtonValue_EV1527[12]={0xB1,0xBC,0xB5,0xB2,0xBA,0xB3,0xB4,0xB9,0xBB,0xB8,0xB6,0xBE};//无线遥控器码值1-12,
void Decode() //Decode是无线解码函数
{
I=0;//用来记录位数,正常会收到24位。见78行定义
if(TimeCount > 0) //当按键按下释放后该值不再赋值,就通过递减直到该值等于0
{
TimeCount--; //超时变量自减,等于0后表示按键释放
}
while(WuXian_IN == 0)//如果无线输入信号为0一直等待,等待高电平出现
{
Time_out++;//超时变量自增
if(Time_out>=25000)//超时退出
{ //Uart1Send(1);
Time_out=0;//超时变量清零
TR0 = TH0 = TL0 = 0;//关闭定时器T0,并重置TH0、TL0
EX0 = 1; //开启外部中断0
return;
}
}//无线输入的while结束
Time_out=0;//超时变量清零
while(I < 24) //共接收24位,大于等于24位跳出while循环
{
while(WuXian_IN == 0) //无线输入信号等于0,等待高电平到来
{
Time_out++; //超时变量自增
if(Time_out>=25000) //超时退出
{//Uart1Send(2);
Time_out=0;//超时变量清零
TR0 = TH0 = TL0 = 0; //关闭定时器T0,并重置TH0、TL0
EX0 = 1; //开启外部中断0
return;//返回值,??
}//while无线信号输入判断结束
} //while位判定结束
Time_out=0;//超时变量清零
TL = TL0;//定时器低8位清零
TH = TH0;//定时器高8位清零
TH0 = TL0 = 0; //记录低电平长度
L = TH;//高8位赋值给L
L = ((L << 8) + TL); //将计时器的高低8位合并
if(I == 0) //处理同步位
{
if(L > 1400) //确认是引导头(判断同步位低电平时长31a)2360
{
M = L / 31;//M即4a亦即是窄电平的时长 M=4CLK
}
else //不符合规则(出错)
{
I = TR0 = TH0 = TL0 = 0;//记录位、定制器控制位、定时器初始值等清零
err = 1;//报错
break;
}//不合规报错花
}//同步处理if花
else
{
//短555 长1666
//4.7M的振荡电阻时同步位的低电平时长为L=15378uS;即31a
//4.7M的振荡电阻时窄电平时长为M=492uS;即4a
//4.7M的振荡电阻时宽电平时长为1488uS即12a
//以下语句即判断窄电平与宽电平的宽度是否合格
/*
窄电平时长为M即 M=4a;a为一个振荡频率, fosc=(2x1000x16/Rosc(KΩ))KHz,
fosc单位为KHz, (Rosc为振荡电阻,单位为KΩ),则一个振荡周期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)负(M-M/4)一个振荡周期a=M/4;
程序中宽电平的误差范围为正(M * 3 + M / 2)负(M * 3 - M / 2) 两个振荡周期2a=M/2;
*/
//如果窄电平小于4a与大于4a或宽电平小于12a与大于12a则表示出错
if(((L < M - M / 4) && (L > M + M / 4)) || ((L < M * 3 - M / 2) && (L > M * 3 + M / 2)))
{ //窄电平的误差范围为正(M+M/4)负(M-M/4)一个振荡周期a=M/4;
I = TR0 = TH0 = TL0 = 0; //宽电平的误差范围为正(M * 3 + M / 2)负(M * 3 - M / 2) 两个振荡周期2a=M/2;
err = 1;//报错
break;//跳出
}//报错判断
}//处理同步位if 记录位不等于0花
while(WuXian_IN == 1) //若是无线输入等于1,等待低电平到来
{
Time_out++;//超时变量自增
if(Time_out>=25000) //超时退出
{//Uart1Send(3);
Time_out=0;//超时变量清零
TR0 = TH0 = TL0 = 0; //关闭定时器T0,并重置TH0、TL0
EX0 = 1;//开启外部中断0
return;//返回值
}
}//判定无线信号不等于1结束
Time_out=0;//超时变量清零
TH = TH0;//定时器0赋初值高8位
TL = TL0;//定时器0赋初值低8位
TH0 = TL0 = 0;//定时器初值清零
L = TH;//高8位赋值给L
L = ((L << 8) + TL); //将计时器的高低8位合并
/*以下语句即判断是窄电平是否合格(4.7M的振荡电阻时窄电平时长为492uS即4a) */
if(((L > (M - M / 4)) && (L < (M + M / 4))))//如果此时为4a则本位为0 短492uS
{ //窄电平的误差范围为正(M+M/4)负(M-M/4)一个振荡周期a=M/4;
I++; //记录位变量自增
MA1 <<= 1;//本位置0
}
/*以下语句即判断宽电平是否合格(4.7M的振荡电阻时宽电平时长为1488uS即12a) */
else if(((L > (M * 3 - M / 2)) && (L < (M * 3 + M / 2)))) //如果此时为12a则本位为1 长1488uS
{ //宽电平的误差范围为正(M * 3 + M / 2)负(M * 3 - M / 2) 两个振荡周期2a=M/2;
I++;//记录位变量自增
MA1 <<= 1;//
MA1++; //本位置1
}
else //已不是4a也不是12a则不符合规表示出错
{
I = 0;//对I进行清零
TR0 = TH0 = TL0 = 0;//关闭定时器T0,初始值清零
err = 1;//把1赋值给错误标志
break;
}
if(I == 8) // MA3、MA2、MA1是用来记录地址码(占16位)和键码(占8位)(MA1、MA2、MA3各8个bit位)
{
MA3 = MA1;
//P1 = MA3; //送P1口显示方便调试,P1中间变量
}
if(I == 16)
{
MA2 = MA1;
//P0 = MA2; //送P1口显示方便调试
}
if(I == 24) //24位已收完则解码结束
{
if(TimeCount == 0) //超时为0表示是新的一次按下对其进行处理,如果该值大于0表示已经按下不再处理
{
// Uart1Send(MA1);
// Uart1Send(MA2);
// Uart1Send(MA3);
if(WirelessButtonValue[da_index-1]==MA1)Flag_ok=1; //Flag_ok是到位标志位
if(MA1==WirelessButtonValue_EV1527[da_index-1])Flag_ok=1;//WirelessButtonValue_EV1527是无线遥控器码值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) //开关标志等于1
{
Flag_SW=0;//开关标志清零
switch(MA1)//用来记录地址码(占16位)和键码(占8位)(MA1、MA2、MA3各8个bit位)
{
//若MA1等于0x03,则对MA1清零;da_index赋值1;P1等于取商,P2取余;调用E2prom写入;
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判定结束
}//开关标志置1处理函数
TimeCount =4;
}//24位接受完毕花
}//判定接受位while结束
TR0 = TH0 = TL0 = 0; //关闭定时器T0,并重置TH0、TL0
EX0 = 1; //开启外部中断0
}//解码函数花