4863|1

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

新人求助,如何用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();
            }
            
        }
    
    
    
}
 

此帖出自无线连接论坛
点赞 关注(1)
 

回复
举报

3

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

这个是我按照网上的例程写的解码程序,不知道哪里有问题

此帖出自无线连接论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表