微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请高手帮忙一下不能接收遥控信号,是不是程序错了?

请高手帮忙一下不能接收遥控信号,是不是程序错了?

时间: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;
        }
    }
    }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top