标题: 红外解码程序会导致红外接收错码 [打印本页]

作者: fuxinyu    时间: 2025-8-6 09:00
标题: 红外解码程序会导致红外接收错码


void cal_rev_code(void)  //解码
{  
    //存32位无线数据
   //用户码   //用户码反码  //按键码   //按键码反码
   if (wx_wait_cal)      //无线码接收成功未写入buf  
    {  
//        Codecnt++;   
//        if(Codecnt >= 3)
//        {
     Signal_DataTemp_1=Signal_DataTemp;
      HW_ReceiveBuffer[0] = Signal_DataTemp_1 ;   /* 得到地址码 */
      HW_ReceiveBuffer[1] = (Signal_DataTemp_1  >> 8) & 0xff;    /* 得到地址反码 */
      HW_ReceiveBuffer[2] = (Signal_DataTemp_1  >> 16) & 0xff;  /* 得到按键码 */
      HW_ReceiveBuffer[3] = (Signal_DataTemp_1 >> 24) & 0xff;  /* 得到按键反码*/
    //  Signal_DataTemp_1=Signal_DataTemp;
//      HW_ReceiveBuffer[0] = Signal_DataTemp_1 ;   /* 得到地址码 */
//      HW_ReceiveBuffer[1] = Signal_DataTemp_1  >> 8;    /* 得到地址反码 */
//      if(cal_rev_code_cnt==1){
//      HW_ReceiveBuffer[2] = Signal_DataTemp_1  >> 16;  /* 得到按键码 */
//      HW_ReceiveBuffer[3] = Signal_DataTemp_1 >> 24;  /* 得到按键反码*/
//      }
//     if(cal_rev_code_cnt==2){
//      wx_wait_cal = 0;  
//      Signal_DataTemp_1=0;  
//      Signal_DataTemp=0;
//      Signal_DataTempl_1=0;
//      Signal_DataTempl_2=0;
//      Signal_DataTempl_3=0;
//      Signal_DataTempl_4=0;
//      cal_rev_code_cnt=0;
//          }
//   //   }   
    }
}

    //定时器0的中断处理**********************
    if(T0IE && T0IF)                //  100us
    {
            TMR0 = 208;               //注意:对TMR0重新赋值TMR0在两个周期内不变化
            T0IF = 0;           



            us100_flg = 1;   
        decode();
        if(wx_wait_cal==1)
       cal_rev_code_cnt++;
    }

void decode(void) //无线接收码解码
{   
if(wx_wait_cal==0)
{
    if(RFIN)   
      {
       if(High_low)      //处理下降沿触发
       {
         Signal_L = SignalCnt; //保存低电平的时间
         SignalCnt=0;//把同周期低电平记录时间清零
          High_low=0;//清除下降沿触发标志
          Low_high=1;  //上升沿触发标志  
       }
       if( Low_high)
         {
            SignalCnt++ ; //记录同周期高电平时间  
         }
      }
    else  //引脚为低电平时
      {
          if(Low_high)  //处理上升沿触发
          {
            Signal_H = SignalCnt; //记录高电平的时间
            SignalCnt=0;//把同周期高电平记录时间清零
            Low_high=0;//清除上升沿触发标志
      if((80<=Signal_L)&& (Signal_L <=100))  //  判断是否为引导码  
            {
            if((40<= Signal_H) && (Signal_H <= 50))
              {
                tb_flag=1;   //  进入红外遥控
              }
             else
               {
                goto loop2;    //错码清除
               }
          //    CleanTime = 0;  
             }
         //   调教最优解               

else if((3<=Signal_L)&& (Signal_L <= 8))//判断是否为高低电平
            {
              if((3<= Signal_H) && (Signal_H <= 8)) //低电平
              {
              //第一种
              Signal_DataTemp  >>= 1;            /* 右移一位 */
               Signal_DataTemp  &= ~(0x80000000); /* 接收到0 */
               //第二种
//               Signal_DataTemp = Signal_DataTemp << 1;  
//                          Signal_DataTemp = Signal_DataTemp + 0;
             //第三种
//            HW_ReceiveBuffer[wx_bit/8] >>=1;
//             HW_ReceiveBuffer[wx_bit/8] &= ~(0x80);
            //第四种
//              if((wx_bit/8)==0){ Signal_DataTempl_1>> =1;Signal_DataTempl_1&= ~(0x80); }
//                if((wx_bit/8)==1){ Signal_DataTempl_2>> =1;Signal_DataTempl_2&= ~(0x80); }
//                if((wx_bit/8)==2) { Signal_DataTempl_3>> =1;Signal_DataTempl_3&= ~(0x80); }
//                if((wx_bit/8)==3){ Signal_DataTempl_4>> =1;Signal_DataTempl_4&= ~(0x80); }
                 wx_bit++;           
              }
              else if((14<= Signal_H) && (Signal_H <= 19))//高电平
               {
                 //第一种
               Signal_DataTemp >>= 1;            /* 右移一位 */
               Signal_DataTemp |= 0x80000000;    /* 接收到1 */
                 //第二种
                //Signal_DataTemp = Signal_DataTemp << 1;  
               //Signal_DataTemp = Signal_DataTemp + 1;
           //第三种
//             HW_ReceiveBuffer[wx_bit/8]  >> =1;
//             HW_ReceiveBuffer[wx_bit/8] |= 0x80;
             //第四种
             //   if((wx_bit/8)==0){ Signal_DataTempl_1>> =1;Signal_DataTempl_1|= 0x80; }
//                if((wx_bit/8)==1){ Signal_DataTempl_2>> =1;Signal_DataTempl_2|= 0x80;}
//                if((wx_bit/8)==2){ Signal_DataTempl_3>> =1;Signal_DataTempl_3|= 0x80; }
//                if((wx_bit/8)==3) {Signal_DataTempl_4>> =1; Signal_DataTempl_4|= 0x80;}
               wx_bit++;
              }               
              else {
                 goto loop2;  //错码清除
              }
       //      CleanTime = 0;
           }
           else
             {  //错码+长按的重复码在此清零
                           loop2:
                           Low_high=0;
               High_low=0;
                           tb_flag=0;
                           SignalCnt = 0;
               Codecnt = 0;
           Signal_DataTemp=0;
           Signal_DataTempl_1=0;
           Signal_DataTempl_2=0;
           Signal_DataTempl_3=0;
           Signal_DataTempl_4=0;

                       return ;
             }  
            if (wx_bit ==32)
                                {           
                                  tb_flag=0;
                                  wx_bit=0;
                                  wx_ok=1;
                  Timer_100ms =0;
                  wx_wait_cal = 1;
                                             Low_high=0;
               High_low=0;
                           tb_flag=0;
                           SignalCnt = 0;
          cal_rev_code_cnt=0;
               //      cal_rev_code();
                           }
          }
          High_low=1;     //下降沿触发  
          SignalCnt++ ; //记录低电平时间               
     }
   }
}



作者: fuxinyu    时间: 2025-8-6 09:01
FT60F121




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1