九齐单片机中断解433khz无线通信归零码 (1)

解析:程序最基本功能是计算相邻高电平时间与低电平时间以此来判断是帧头、0位、1位,或者非标准位。

1.检测帧头

2.接收解码29位数据

出现非标准位直接丢弃整个帧就好。

项目合作、吹牛、扯蛋、交朋友,请联系:18665321219

/******************************************************************************

//测试ok

void isr_hw(void) __interrupt(0)
 {  
     static uint8_t pwmduty1s;
     static uint8_t pwmduty2s;
     if(INTFbits.T1IF)
     { 
         if(PORTAbits.PA7 == 1)    //rev接收脚
         {
             if(sstate.rfstart1==1)
             {
                 if(lo_buf>hi_buf)
                 {
                      if(lo_buf>=10&&lo_buf<=13&&hi_buf>=3&&hi_buf<=6)
                     { 
                         rec_count++;
                         remote_rv <<= 1;
                     }
                     else sstate.rf_er = 1;
                 }
                 else if(lo_buf<hi_buf)
                 {
                     if(lo_buf>=3&&lo_buf<=6&&hi_buf>=10&&hi_buf<=13)
                     {
                         rec_count++;
                         remote_rv<<=1;
                         remote_rv++;
                     }
                     else sstate.rf_er = 1;
                 }
                 else 
                 {
                     sstate.rf_er=1;
                 }
         
                 if(sstate.rf_er == 1)
                 {
                     sstate.rfstart=0;
                     rec_count=0;
                     sstate.rfstart1=0;
                     sstate.rfok = 0;
                     sstate.rf_er = 0;
                     remote_rv = 0;
                 }
                 else
                 { 
                     if(rec_count==29) 
                     {
                         sstate.rfok = 1;     //主程序检测到rfok,取值并清零rfok
                         sstate.rfstart=0;
                         sstate.rfstart1=0;
                         rec_count=0;
                         remote_val =  remote_rv & 0x1fffffff;  //完成接收立即取出值,空出_rv
                     }
                            hi_buf =0;    
                 }
                 sstate.rfstart1 = 0;    //计算脉宽高低    
             }
             else //无同步段
             {
                 if(lo_buf>=40&&lo_buf<=56)   //同步头宽度大于3ms小于12ms
                 {
                     sstate.rfstart=1;
                     rec_count=0;
                 }
                 else if(lo_buf >120)
                 {
                     sstate.rfok = 0;
                 }
                 
             }
             //PORTAbits.PA0 ^= 1;       //test 
             hi_buf++;
             lo_buf=0;
         }
         else
         {
             //PORTAbits.PA0 ^= 1;       //test 
             lo_buf++;
             if(sstate.rfstart==1) sstate.rfstart1=1;
             else hi_buf=0;
         }
         INTFbits.T1IF = 0;
     }  

**************************************************************************/
posted @ 2020-06-16 09:54  steven_lg  阅读(1221)  评论(0)    收藏  举报