欢迎光临散文网 会员登陆 & 注册

无线遥控EV1527解码源码分享

2023-05-13 21:25 作者:若水鱼阁  | 我要投稿

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

}//解码函数花


无线遥控EV1527解码源码分享的评论 (共 条)

分享到微博请遵守国家法律