找回密码
 立即注册

QQ登录

只需一步,快速开始

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

红外解码通用,解决了可以正常解几次码值后原始码值出错问题

[复制链接]
跳转到指定楼层
楼主
ID:921822 发表于 2025-8-6 17:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原始解码程序
  1. void decode(void) //无线接收码解码
  2. {   
  3.     if(RFIN)   
  4.       {
  5.        if(High_low)      //处理下降沿触发
  6.        {
  7.          Signal_L = SignalCnt; //保存低电平的时间
  8.          SignalCnt=0;//把同周期低电平记录时间清零
  9.           High_low=0;//清除下降沿触发标志
  10.           Low_high=1;  //上升沿触发标志  
  11.        }
  12.        if( Low_high)
  13.          {
  14.             SignalCnt++ ; //记录同周期高电平时间  
  15.          }
  16.       }
  17.     else  //引脚为低电平时
  18.       {
  19.           if(Low_high)  //处理上升沿触发
  20.           {
  21.             Signal_H = SignalCnt; //记录高电平的时间
  22.             SignalCnt=0;//把同周期高电平记录时间清零
  23.             Low_high=0;//清除上升沿触发标志
  24.       if((80<=Signal_L)&& (Signal_L <=100))  //  判断是否为引导码  
  25.             {
  26.             if((40<= Signal_H) && (Signal_H <= 50))
  27.               {
  28.                 tb_flag=1;   //  进入红外遥控
  29.               }
  30.              else
  31.                {
  32.                 goto loop2;    //错码清除
  33.                }
  34.           //    CleanTime = 0;  
  35.              }
  36.          //   调教最优解               
  37.    
  38. else if((3<=Signal_L)&& (Signal_L <= 8))//判断是否为高低电平
  39.             {
  40.               if((3<= Signal_H) && (Signal_H <= 8)) //低电平
  41.               {
  42.     //          Signal_DataTemp  >>= 1;            /* 右移一位 */
  43. //               Signal_DataTemp  &= ~(0x80000000); /* 接收到0 */
  44.                Signal_DataTemp = Signal_DataTemp << 1;  
  45.                           Signal_DataTemp = Signal_DataTemp + 0;
  46.                  wx_bit++;           
  47.               }
  48.               else if((14<= Signal_H) && (Signal_H <= 19))//高电平
  49.                {
  50. //               Signal_DataTemp >>= 1;            /* 右移一位 */
  51. //               Signal_DataTemp |= 0x80000000;    /* 接收到1 */
  52.                   Signal_DataTemp = Signal_DataTemp << 1;  
  53.                                     Signal_DataTemp = Signal_DataTemp + 1;
  54.                wx_bit++;
  55.               }               
  56.               else {
  57.                  goto loop2;  //错码清除
  58.               }
  59.        //      CleanTime = 0;
  60.            }
  61.            else
  62.              {  //错码+长按的重复码在此清零
  63.                            loop2:
  64.                            Low_high=0;
  65.                High_low=0;
  66.                            tb_flag=0;
  67.                            SignalCnt = 0;
  68.                Signal_DataTemp=0;
  69.                        return ;
  70.              }  
  71.             if (wx_bit ==32)
  72.                                 {           
  73.                                   tb_flag=0;
  74.                                   wx_bit=0;
  75.                                   wx_ok=1;
  76.                   Timer_100ms =0;
  77.                   wx_wait_cal = 1;
  78.                   
  79.                            }
  80.           }
  81.           High_low=1;     //下降沿触发  
  82.           SignalCnt++ ; //记录低电平时间               
  83.      }
  84. }
复制代码

原始解码值程序
  1. void cal_rev_code(void)  //解码
  2. {  
  3.     //存32位无线数据
  4.    //用户码   //用户码反码  //按键码   //按键码反码
  5.    if (wx_wait_cal)      //无线码接收成功未写入buf  
  6.     {  
  7.    
  8.        HW_ReceiveBuffer[0] = Signal_DataTemp ;   /* 得到地址码 */
  9.        HW_ReceiveBuffer[1] = (Signal_DataTemp  >> 8) & 0xff;    /* 得到地址反码 */
  10.        HW_ReceiveBuffer[2] = (Signal_DataTemp  >> 16) & 0xff;  /* 得到按键码 */
  11.        HW_ReceiveBuffer[3] = (Signal_DataTemp >> 24) & 0xff;  /* 得到按键反码*/
  12.       if (Timer_100ms >=  0&&Timer_100ms <=  6)//前六百毫秒无动作
  13.        {
  14.        wx_wait_cal = 0;  
  15. //      Signal_DataTemp=0;
  16.        }
  17.       
  18.     }
  19. }   
复制代码
通用解码程序
  1. void decode(void) //无线接收码解码
  2. {
  3. if(wx_wait_cal==0)
  4. {
  5.    SignalCnt++ ; //记录一位数据周期时间  
  6.     if(RFIN)   
  7.       {
  8.        Low_high=1;//上升沿触发
  9.   
  10.       }
  11.     else  //引脚为低电平时
  12.       {  
  13.        if(High_low==0)
  14.         {
  15.          SignalCnt=0;  
  16.           High_low=1;//下降沿第一次触发  
  17.         }
  18.          if((High_low==1) &&( Low_high==1)==1) //下降沿第二次触发 一个数据周期
  19.         {
  20.             if((SignalCnt<=150)&&(SignalCnt>=120)==1)  //9+4.5=13.5ms属于引导码  9+2.25=11.25ms属于重复码
  21.             {
  22.                wx_bit =0;
  23.                Low_high=0;
  24.                High_low=0;
  25.                SignalCnt=0;  
  26.             }
  27.          else if((SignalCnt<=25)&&(SignalCnt>=20)==1)   // 高电平 2.25ms=22.5
  28.             {
  29.                Signal_DataTemp >>= 1;            /* 右移一位 */
  30.                Signal_DataTemp |= 0x80000000;    /* 接收到1 */
  31.                wx_bit ++;
  32.                Low_high=0;
  33.                High_low=0;
  34.                SignalCnt=0;  
  35.             }
  36.         else  if((SignalCnt<=14)&&(SignalCnt>=7)==1) // 低电平1.12ms=11.2
  37.             {
  38.                Signal_DataTemp  >>= 1;            /* 右移一位 */
  39.                Signal_DataTemp  &= ~(0x80000000); /* 接收到0 */
  40.                wx_bit ++;
  41.                Low_high=0;
  42.                High_low=0;
  43.                SignalCnt=0;  
  44.             }
  45.          else  
  46.           {
  47.           Low_high=0;
  48.           High_low=0;
  49.           wx_bit=0;
  50.           Signal_DataTemp=0;
  51.           wx_wait_cal=0;
  52.           }
  53.           if(wx_bit==32)
  54.            {
  55.              wx_wait_cal=1;
  56.              Low_high=0;
  57.              High_low=0;
  58.              wx_bit=0;
  59.             }
  60.         }
  61.      }
  62.    }
  63. }
复制代码

通用解码值程序
  1. void cal_rev_code(void)  //解码
  2. {  
  3.     //存32位无线数据
  4.    //用户码   //用户码反码  //按键码   //按键码反码
  5.    if (wx_wait_cal==1)      //无线码接收成功未写入buf  
  6.     {  
  7.        Signal_DataTemp_1=Signal_DataTemp;
  8.        HW_ReceiveBuffer[0] = Signal_DataTemp_1 ;   /* 得到地址码 */
  9.        HW_ReceiveBuffer[1] = (Signal_DataTemp_1  >> 8) & 0xff;    /* 得到地址反码 */
  10.        HW_ReceiveBuffer[2] = (Signal_DataTemp_1  >> 16) & 0xff;  /* 得到按键码 */
  11.        HW_ReceiveBuffer[3] = (Signal_DataTemp_1 >> 24) & 0xff;  /* 得到按键反码*/
  12.        if(HW_ReceiveBuffer[0] == 0X80 && HW_ReceiveBuffer[1] == 0X7F)
  13.        {
  14.             code_Buffer1= ~(HW_ReceiveBuffer[1]);
  15.                     code_Buffer2= ~(HW_ReceiveBuffer[3]);
  16.                         if(HW_ReceiveBuffer[0] == code_Buffer1&&HW_ReceiveBuffer[2] == code_Buffer2)
  17.             {
  18.                                 KeyCode_num=HW_ReceiveBuffer[2];
  19.             }
  20.         }
  21.       wx_wait_cal = 0;  
  22.       Signal_DataTemp_1=0;  
  23.       Signal_DataTemp=0;
  24.     }
  25. }   
复制代码



HWV2.0.zip (993.31 KB, 下载次数: 0)
HWV3.0.zip (997.32 KB, 下载次数: 0)

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

使用道具 举报

无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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