找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3|回复: 1
打印 上一主题 下一主题
收起左侧

红外解码程序会导致红外接收错码

[复制链接]
跳转到指定楼层
楼主
ID:921822 发表于 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++ ; //记录低电平时间               
     }
   }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:921822 发表于 2025-8-6 09:01 | 只看该作者
FT60F121
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表