新人求助,如何用51单片机做EV1527 433Mhz解码??
[复制链接]
#define RF P00
unsigned char RF_code[3]; //遥控码值
bit RF_SyncFlag; //同步信号标志,为1表示已接受到同步信号
//unsigned char RF;
unsigned char decode_ok; //解码成功
unsigned char hh_w;ll_w; //高低电平宽度
unsigned char ma_x; //接收到第几位编码
unsigned char bma1,bma2,bma3,bma4; //接收编码
unsigned char mma1,mma2,mma3,mma4; //用于接收过程存放遥控编码,编码比较两次,这是第一次
unsigned char mmb1,mmb2,mmb3,mmb4; //用于接收过程存放遥控编码,这是第二次
unsigned char rf_ok1,rf_ok2,rf_ok; //解码过程中的临时接收成功编码标志,接收到一个完整的遥控命令后置1,通知解码程序可以解码了
unsigned char last_state; //保存上一个查询到的电平状态
unsigned char RF_JudgeValidPulseTimer;
unsigned int LastTimVal;
//void ExInt2_init(void)
//{
// EP0CON = EPIE(1) | EPPL(1) | P00_INDEX;
// GPIO_Init(P00F,INPUT);
// INT2EN = 1; //INT2中断使能
// PS0 = 1;
//}
void Timer1_init(void)
{
TMOD=(TMOD&0xCF)|0x10; //初始化TIMER1, 使用TIMER1来计数遥控脉宽
TR1 = 1;
TH1=0xFF;
TL1=0x88;
ET1=1;
}
void Timer1_ISR (void) interrupt 3
{
// EPIF = BIT0;
if(!RF)
{
ll_w++; //检测到低电平,低电平时间加1
last_state=0; //记录本次电平状态
}
else //检测到高电平
{
hh_w++;
if(!last_state) //检测到从低到高的跳变
{
if(((hh_w>=2)&&(hh_w<=5))&&((ll_w>=100)&&(ll_w<=130))) //判断同步码 2/5 100/130
{
RF_SyncFlag=1; //同步码接收成功标志,置1
ma_x=0;
bma1=0;bma2=0;bma3=0;bma4=0;
}
else if((RF_SyncFlag)&&((ll_w>=8)&&(ll_w<=14))) //8/14
{
ma_x++;
if(ma_x==24)
{
if(!rf_ok1) // 第一次临时编码
{
mma1=bma1;
mma2=bma2;
mma3=bma3;
mma4=bma4;
rf_ok1=1; //第一次临时编码接收成功,置1
RF_SyncFlag=0; //同步码接收标志,置0
}
else
{
mmb1=bma1;
mmb2=bma2;
mmb3=bma3;
mmb4=bma4;
rf_ok2=1; //第二次临时编码接收成功,置1
RF_SyncFlag=0; //同步码接收标志,置0
}
}
}
else if((RF_SyncFlag)&&((ll_w>=2)&&(ll_w<=7)))
{
switch(ma_x)
{
case 0 : { bma1=bma1 | 0x80;
break; } //遥控编码第1位
case 1 : { bma1=bma1 | 0x40;
break; }
case 2 : { bma1=bma1 | 0x20;
break; }
case 3 : { bma1=bma1 | 0x10;
break; }
case 4 : { bma1=bma1 | 0x08;
break; }
case 5 : { bma1=bma1 | 0x04;
break; }
case 6 : { bma1=bma1 | 0x02;
break; }
case 7 : { bma1=bma1 | 0x01;
break; }
case 8 : { bma2=bma2 | 0x80;
break; }
case 9 : { bma2=bma2 | 0x40;
break; }
case 10: { bma2=bma2 | 0x20;
break; }
case 11: { bma2=bma2 | 0x10;
break; }
case 12: { bma2=bma2 | 0x08;
break; }
case 13: { bma2=bma2 | 0x04;
break; }
case 14: { bma2=bma2 | 0x02;
break; }
case 15: { bma2=bma2 | 0x01;
break; }
case 16: { bma3=bma3 | 0x80;
break; }
case 17: { bma3=bma3 | 0x40;
break; }
case 18: { bma3=bma3 | 0x20;
break; }
case 19: { bma3=bma3 | 0x10;
break; }
case 20: { bma3=bma3 | 0x08;
break; }// 按键状态第1位
case 21: { bma3=bma3 | 0x04;
break; }
case 22: { bma3=bma3 | 0x02;
break; }
case 23: { bma3=bma3 | 0x01;
if(!rf_ok1)
{
mma1=bma1;
mma2=bma2;
mma3=bma3;
// mma4=bma4; // 将接收到的编码复制到解码寄存器中
rf_ok1=1; // 通知解码子程序可以解码了
RF_SyncFlag=0;
break;
}
else
{
mmb1=bma1;
mmb2=bma2;
mmb3=bma3;
// mmb4=bma4; // 将接收到的编码复制到解码寄存器中
rf_ok2=1; // 通知解码子程序可以解码了
RF_SyncFlag=0;
break;
}
}
}
ma_x++;
}
else
{
ma_x=0;RF_SyncFlag=0;bma1=0;bma2=0;bma3=0;hh_w=0;ll_w=0;
}
ll_w=0;ll_w=1;
last_state=1; //记录本次电平状态
}
if((mma1=mmb1)&&(mma2=mmb2)&&(mma3=mmb3))
{
rf_ok=1;
rf_ok1=0;
rf_ok2=0;
}
else
{
rf_ok=0;
rf_ok1=0;
rf_ok2=0;
}
}
if(rf_ok) //判断是否接收成功
{
rf_ok=0;
RF_code[0]=mma1;
RF_code[1]=mma2;
RF_code[2]=mma3;
decode_ok=1;
}
}
void RF_MainLoop(void)
{
// ExInt2_init();
Timer1_init();
if(decode_ok==1)
{
switch(RF_code[2])
{
case 0xc8: slow_flash1();
case 0xc4: slow_flash2();
case 0xc2: quick_flash1();
case 0xc1: quick_flash2();
}
}
}
|