请高手帮忙一下不能接收遥控信号,是不是程序错了?
时间:10-02
整理:3721RD
点击:
/*
* EV1527解码程序:单片机PIC12F675,内部4MHz,EV1527发射频率315MHz,振荡电阻430K,遥控器供电电压DC12V,周期为1.99ms。
*/
#include <pic.h>
__CONFIG(0x14);
__EEPROM_DATA(0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
#define uchar unsigned char
#define uint unsigned int
#define rfin GPIO0 //RF输入
#define KEY GPIO3 //按键
#define JMP GPIO4 //跳线
#define LED GPIO5 //LED
//标志位声明
bit learnf;
bit fun_out;
bit fun_ok;
bit relay_out;
//记时间变量
uint temp0=0;
uint temp1=0;
//RF接收变量
uchar rec_count;
uchar lo_buf;
uchar hi_buf;
uchar cs2;
uchar cs1;
uchar cs0;
//RF接收标志
bit rfstart1;
bit rfstart;
bit rfok;//接收成功
bit rf_er;//接收失败
//---------------------------------延时----------------------------//
void delay(uchar ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<130;j++); //延时1ms
}
//--------------------------------- LED闪烁----------------------------//
void LED_LONG(uchar time) //闪烁和周期1s
{
uchar j;
for(j=0;j<time;j++)
{
LED=1;
delay(1000);
LED=0;
delay(500);
}
}
//--------------------------------- LED闪烁----------------------------//
void LED_FLASH(uchar time) //闪烁和周期1s
{
uchar j;
for(j=0;j<time;j++)
{
LED=1;
delay(200);
LED=0;
delay(200);
}
}
//--------------------------------- LED快闪烁----------------------------//
void LED_QFLASH(uchar time) //闪烁和周期1s
{
uchar j;
for(j=0;j<time;j++)
{
LED=1;
delay(50);
LED=0;
delay(50);
}
}
//--------------------------------- 擦除EEPROM---------------------------//
C_EEPROM(void)
{
uchar i,b=0xff;
for(i=0;i<=127;i++){EEPROM_WRITE(i=i,b);}
EEPROM_WRITE(0,2);
}
//--------------------------------- 保存用户码----------------------------//
void save_learn(void)
{
uchar i,j;
TMR1IE=0;
i=EEPROM_READ(0);
EEPROM_WRITE(i,cs2);
i++;
EEPROM_WRITE(i,cs1);
i++;
j=(cs0&0xf0);
EEPROM_WRITE(i,j);
if(i==127) i=1;
i++;
EEPROM_WRITE(0,i);
delay(2);
TMR1IE=1;
}
//--------------------------------- 外部中断服务----------------------------//
void interrupt all(void)
{
GIE=0;
temp0++;
if(TMR1IF==1)
{
TMR1IF=0;//清中断标志位
TMR1H=0xff;
TMR1L=0xaa;
//RF接受程序
if(rfin==1)
{
if(rfstart1==1)//是否找到同步头?如果找到同步头就由低到高开始接收
{
if(lo_buf>hi_buf)//判断是否低电平
{
if(lo_buf>=8&&lo_buf<=12&&hi_buf>=3&&hi_buf<=4)
{
rec_count++;//是低电平
cs0<<=1;//左移动一位
}
else rf_er=1;//接收失败
}
else if(lo_buf<hi_buf)//判断是否高电平
{
if(lo_buf>=3&&lo_buf<=4&&hi_buf>=8&&hi_buf<=12)//判断高电平是否大于900us和低电平大于200us
{
rec_count++;//是高电平
cs0<<=1;//移动一位
cs0++;
}
else rf_er=1;
}
else if(lo_buf==hi_buf)
rf_er=1; //高低电平周期相等,接收错误
if(rf_er==1)
{
rfstart=0;//接收失败
rec_count=0;
rfok=0;
}
else
{
if(rec_count==8){cs2=cs0;}
else if(rec_count==16){cs1=cs0;}
}
if(rec_count==24)
rfok=1;//接收成功了
hi_buf=0;
} //if(rfstart1==1)函数结尾
else if(lo_buf>=30&&lo_buf<=120)//判断同步头
{
rfstart=1;//检测到正确的同步头
rec_count=0;//接收位数,清除0
}
hi_buf++;
lo_buf=0;
rfstart1=0;
rf_er=0;//接收失败标志
}
else
{
lo_buf++; //输入端口为低电
if(rfstart==1)
rfstart1=1; //开始接收标志
else
hi_buf=0;
}
}
GIE=1;
}
void scan()
{
if(KEY==0)
{
delay(10);
if(KEY==0)
{
while(!KEY)
{
LED_LONG(15);
if(rfok==1)
{
LED_QFLASH(3);
GIE=1;
if(cs0&0x01)
{
save_learn();
LED_FLASH(3);
GIE=1;
//return;
}
}
}
}
end:;
}
}
//--------------------------------- 初始化函数----------------------------//
void init()
{
CMCON=0X07;
ANSEL=0x00;
TRISIO=0x19;
GIE=0;
TMR1IF=0;
PEIE=1;
TMR1IE=1;
TMR1ON=1;
TMR1H=0xff;
TMR1L=0xaa;
GIE=1;
GPPU=0;
WPU=0xff;
LED=0;
}
//--------------------------------- 主函数----------------------------//
void main()
{
init();
while(temp0<20000) //学习或擦除
{
if(rfok)
{
if(cs0&0x01) //学习
{
save_learn();
LED_QFLASH(3);
break;
}
else if(cs0&0x02)//擦除
{
C_EEPROM();
LED_FLASH(5);
}
}
}
while(1)
{
scan();
uchar sw;
if(rfok==1) //接收完成,开始将接收到的用户码同学习到储存在EEPROM中的用户码对比
{
uchar i=2,j,k,l,m;
for(m=0;m<16;m++) //循环对比42次
{
j=EEPROM_READ(i);
i++;
k=EEPROM_READ(i);
i++;
l=EEPROM_READ(i);
i++;
if(j==cs2&&k==cs1&&(l==(cs0&0xf0))) {sw=1;break;} //对比结果相同
else sw=0; //对比结果不相同
}
if(sw==1)
{
if(cs0&0x04)
LED=1;
}
}
}
}
* EV1527解码程序:单片机PIC12F675,内部4MHz,EV1527发射频率315MHz,振荡电阻430K,遥控器供电电压DC12V,周期为1.99ms。
*/
#include <pic.h>
__CONFIG(0x14);
__EEPROM_DATA(0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
#define uchar unsigned char
#define uint unsigned int
#define rfin GPIO0 //RF输入
#define KEY GPIO3 //按键
#define JMP GPIO4 //跳线
#define LED GPIO5 //LED
//标志位声明
bit learnf;
bit fun_out;
bit fun_ok;
bit relay_out;
//记时间变量
uint temp0=0;
uint temp1=0;
//RF接收变量
uchar rec_count;
uchar lo_buf;
uchar hi_buf;
uchar cs2;
uchar cs1;
uchar cs0;
//RF接收标志
bit rfstart1;
bit rfstart;
bit rfok;//接收成功
bit rf_er;//接收失败
//---------------------------------延时----------------------------//
void delay(uchar ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<130;j++); //延时1ms
}
//--------------------------------- LED闪烁----------------------------//
void LED_LONG(uchar time) //闪烁和周期1s
{
uchar j;
for(j=0;j<time;j++)
{
LED=1;
delay(1000);
LED=0;
delay(500);
}
}
//--------------------------------- LED闪烁----------------------------//
void LED_FLASH(uchar time) //闪烁和周期1s
{
uchar j;
for(j=0;j<time;j++)
{
LED=1;
delay(200);
LED=0;
delay(200);
}
}
//--------------------------------- LED快闪烁----------------------------//
void LED_QFLASH(uchar time) //闪烁和周期1s
{
uchar j;
for(j=0;j<time;j++)
{
LED=1;
delay(50);
LED=0;
delay(50);
}
}
//--------------------------------- 擦除EEPROM---------------------------//
C_EEPROM(void)
{
uchar i,b=0xff;
for(i=0;i<=127;i++){EEPROM_WRITE(i=i,b);}
EEPROM_WRITE(0,2);
}
//--------------------------------- 保存用户码----------------------------//
void save_learn(void)
{
uchar i,j;
TMR1IE=0;
i=EEPROM_READ(0);
EEPROM_WRITE(i,cs2);
i++;
EEPROM_WRITE(i,cs1);
i++;
j=(cs0&0xf0);
EEPROM_WRITE(i,j);
if(i==127) i=1;
i++;
EEPROM_WRITE(0,i);
delay(2);
TMR1IE=1;
}
//--------------------------------- 外部中断服务----------------------------//
void interrupt all(void)
{
GIE=0;
temp0++;
if(TMR1IF==1)
{
TMR1IF=0;//清中断标志位
TMR1H=0xff;
TMR1L=0xaa;
//RF接受程序
if(rfin==1)
{
if(rfstart1==1)//是否找到同步头?如果找到同步头就由低到高开始接收
{
if(lo_buf>hi_buf)//判断是否低电平
{
if(lo_buf>=8&&lo_buf<=12&&hi_buf>=3&&hi_buf<=4)
{
rec_count++;//是低电平
cs0<<=1;//左移动一位
}
else rf_er=1;//接收失败
}
else if(lo_buf<hi_buf)//判断是否高电平
{
if(lo_buf>=3&&lo_buf<=4&&hi_buf>=8&&hi_buf<=12)//判断高电平是否大于900us和低电平大于200us
{
rec_count++;//是高电平
cs0<<=1;//移动一位
cs0++;
}
else rf_er=1;
}
else if(lo_buf==hi_buf)
rf_er=1; //高低电平周期相等,接收错误
if(rf_er==1)
{
rfstart=0;//接收失败
rec_count=0;
rfok=0;
}
else
{
if(rec_count==8){cs2=cs0;}
else if(rec_count==16){cs1=cs0;}
}
if(rec_count==24)
rfok=1;//接收成功了
hi_buf=0;
} //if(rfstart1==1)函数结尾
else if(lo_buf>=30&&lo_buf<=120)//判断同步头
{
rfstart=1;//检测到正确的同步头
rec_count=0;//接收位数,清除0
}
hi_buf++;
lo_buf=0;
rfstart1=0;
rf_er=0;//接收失败标志
}
else
{
lo_buf++; //输入端口为低电
if(rfstart==1)
rfstart1=1; //开始接收标志
else
hi_buf=0;
}
}
GIE=1;
}
void scan()
{
if(KEY==0)
{
delay(10);
if(KEY==0)
{
while(!KEY)
{
LED_LONG(15);
if(rfok==1)
{
LED_QFLASH(3);
GIE=1;
if(cs0&0x01)
{
save_learn();
LED_FLASH(3);
GIE=1;
//return;
}
}
}
}
end:;
}
}
//--------------------------------- 初始化函数----------------------------//
void init()
{
CMCON=0X07;
ANSEL=0x00;
TRISIO=0x19;
GIE=0;
TMR1IF=0;
PEIE=1;
TMR1IE=1;
TMR1ON=1;
TMR1H=0xff;
TMR1L=0xaa;
GIE=1;
GPPU=0;
WPU=0xff;
LED=0;
}
//--------------------------------- 主函数----------------------------//
void main()
{
init();
while(temp0<20000) //学习或擦除
{
if(rfok)
{
if(cs0&0x01) //学习
{
save_learn();
LED_QFLASH(3);
break;
}
else if(cs0&0x02)//擦除
{
C_EEPROM();
LED_FLASH(5);
}
}
}
while(1)
{
scan();
uchar sw;
if(rfok==1) //接收完成,开始将接收到的用户码同学习到储存在EEPROM中的用户码对比
{
uchar i=2,j,k,l,m;
for(m=0;m<16;m++) //循环对比42次
{
j=EEPROM_READ(i);
i++;
k=EEPROM_READ(i);
i++;
l=EEPROM_READ(i);
i++;
if(j==cs2&&k==cs1&&(l==(cs0&0xf0))) {sw=1;break;} //对比结果相同
else sw=0; //对比结果不相同
}
if(sw==1)
{
if(cs0&0x04)
LED=1;
}
}
}
}