OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 51|回复: 0

通用红外程序 单片机为FT60F121 SOP8

[复制链接]

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2021-7-31
在线时间
36 小时
发表于 前天 09:15 | 显示全部楼层 |阅读模式
本帖最后由 vdasvahv 于 2025-8-7 09:15 编辑

错误的红外程序
不解红外原始码时,程序无异常,当加入解码程序时,会导致接收到的红外原始数据前几次为正常值后面为错码。
HWV2.0有该问题
HWV2.0的无线解码程序

  1. /*无线解码程序*/

  2. #include "Main.h"
  3. #include "Definition.h"
  4. #include "menu.h"
  5. #include "receive.h"
  6. #include "Buzzer.h"
  7. extern void TIMER2_INITIAL (void);

  8. //#define _rlcar_(RX)  CY=RX&0X80          //RX带进位左移1位,数据放入ACC
  9. void decode(void);//无线接收码解码
  10. void HW_ceshi(void);
  11. volatile INT8U  ReceiveThirdData;
  12. volatile INT8U  ReceiveBuffer[3]; // 接收到的遥控器数据,临时存在这个buffer
  13. volatile INT8U  WriteBuffer[FLASH_BLOCK_SIZE];   // 这个buffer里面的数据用来写进eeprom的
  14. //volatile INT8U  ReadBuffer[FLASH_BLOCK_SIZE];    //从EEPROM里面读出来的数据,存在这个buffer

  15. volatile INT8U  wx_bit;                        //无线码位数
  16. volatile INT32U Signal_DataTemp;

  17. volatile bit tb_flag = 0;          //同步码接收成功标志
  18. volatile bit wx_ok = 0;            //无线码接收成功标志
  19. volatile bit wx_sta = 0;           //无线信号输入脚的高低电平状态
  20. volatile bit wx_wait_cal = 0;            //无线码接收成功未写入buf

  21. volatile INT8U SignalCnt;
  22. volatile INT8U Signal_H;
  23. volatile INT8U Signal_L;
  24. volatile INT8U Codecnt;

  25. volatile INT8U  HW_ReceiveBuffer[4];

  26. volatile INT8U High_low=0;//下降沿标志
  27. volatile INT8U Low_high=0;//上升沿标志

  28. void decode(void) //无线接收码解码一百微秒进入一次
  29. {   
  30.     if(RFIN)   
  31.       {
  32.        if(High_low)      //处理下降沿触发
  33.        {
  34.          Signal_L = SignalCnt; //保存低电平的时间
  35.          SignalCnt=0;//把同周期低电平记录时间清零
  36.           High_low=0;//清除下降沿触发标志
  37.           Low_high=1;  //上升沿触发标志  
  38.        }
  39.        if( Low_high)
  40.          {
  41.             SignalCnt++ ; //记录同周期高电平时间  
  42.          }
  43.       }
  44.     else  //引脚为低电平时
  45.       {
  46.           if(Low_high)  //处理上升沿触发
  47.           {
  48.             Signal_H = SignalCnt; //记录高电平的时间
  49.             SignalCnt=0;//把同周期高电平记录时间清零
  50.             Low_high=0;//清除上升沿触发标志
  51.       if((80<=Signal_L)&& (Signal_L <=100))  //  判断是否为引导码  
  52.             {
  53.             if((40<= Signal_H) && (Signal_H <= 50))
  54.               {
  55.                 tb_flag=1;   //  进入红外遥控
  56.               }
  57.              else
  58.                {
  59.                 goto loop2;    //错码清除
  60.                }
  61.           //    CleanTime = 0;  
  62.              }
  63.          //   调教最优解               
  64.    
  65. else if((3<=Signal_L)&& (Signal_L <= 8))//判断是否为高低电平
  66.             {
  67.               if((3<= Signal_H) && (Signal_H <= 8)) //低电平
  68.               {
  69.     //          Signal_DataTemp  >>= 1;            /* 右移一位 */
  70. //               Signal_DataTemp  &= ~(0x80000000); /* 接收到0 */
  71.                Signal_DataTemp = Signal_DataTemp << 1;  
  72.                           Signal_DataTemp = Signal_DataTemp + 0;
  73.                  wx_bit++;           
  74.               }
  75.               else if((14<= Signal_H) && (Signal_H <= 19))//高电平
  76.                {
  77. //               Signal_DataTemp >>= 1;            /* 右移一位 */
  78. //               Signal_DataTemp |= 0x80000000;    /* 接收到1 */
  79.                   Signal_DataTemp = Signal_DataTemp << 1;  
  80.                                     Signal_DataTemp = Signal_DataTemp + 1;
  81.                wx_bit++;
  82.               }               
  83.               else {
  84.                  goto loop2;  //错码清除
  85.               }
  86.        //      CleanTime = 0;
  87.            }
  88.            else
  89.              {  //错码+长按的重复码在此清零
  90.                            loop2:
  91.                            Low_high=0;
  92.                High_low=0;
  93.                            tb_flag=0;
  94.                            SignalCnt = 0;
  95.                Signal_DataTemp=0;
  96.                        return ;
  97.              }  
  98.             if (wx_bit ==32)
  99.                                 {           
  100.                                   tb_flag=0;
  101.                                   wx_bit=0;
  102.                                   wx_ok=1;
  103.                   Timer_100ms =0;
  104.                   wx_wait_cal = 1;
  105.                   
  106.                            }
  107.           }
  108.           High_low=1;     //下降沿触发  
  109.           SignalCnt++ ; //记录低电平时间               
  110.      }
  111. }

  112. void cal_rev_code(void)  //解码
  113. {  
  114.     //存32位无线数据
  115.    //用户码   //用户码反码  //按键码   //按键码反码
  116.    if (wx_wait_cal)      //无线码接收成功未写入buf  
  117.     {  
  118.    
  119.        HW_ReceiveBuffer[0] = Signal_DataTemp ;   /* 得到地址码 */
  120.        HW_ReceiveBuffer[1] = (Signal_DataTemp  >> 8) & 0xff;    /* 得到地址反码 */
  121.        HW_ReceiveBuffer[2] = (Signal_DataTemp  >> 16) & 0xff;  /* 得到按键码 */
  122.        HW_ReceiveBuffer[3] = (Signal_DataTemp >> 24) & 0xff;  /* 得到按键反码*/
  123.       if (Timer_100ms >=  0&&Timer_100ms <=  6)//前六百毫秒无动作
  124.        {
  125.        wx_wait_cal = 0;  
  126. //      Signal_DataTemp=0;
  127.        }
  128.       
  129.     }
  130. }   
  131. void HW_ceshi(void)
  132. {
  133. // if((HW_ReceiveBuffer[0]==0x80)&&(HW_ReceiveBuffer[1]==0x7F))//地址码
  134. //   {
  135. //     if((HW_ReceiveBuffer[2]==0x01)&&(HW_ReceiveBuffer[3]==0xFE))//ON|OFF
  136. //     {
  137. //           Buzzer_Bz();  
  138. //      }  
  139. //      if((HW_ReceiveBuffer[2]==0x1A)&&(HW_ReceiveBuffer[3]==0xE5))//按键1
  140. //       {
  141. //           Buzzer_Bz();  
  142. //       }
  143. //      if((HW_ReceiveBuffer[2]==0x02)&&(HW_ReceiveBuffer[3]==0xFD))//按键2
  144. //       {
  145. //           Buzzer_Bz();   
  146. //       }
  147. //   if((HW_ReceiveBuffer[2]==0x03)&&(HW_ReceiveBuffer[3]==0xFC))//按键3
  148. //      {
  149. //           Buzzer_Bz();   
  150. //      }
  151. //   if((HW_ReceiveBuffer[2]==0x06)&&(HW_ReceiveBuffer[3]==0xF9))//按键4
  152. //       {
  153. //           Buzzer_Bz();  
  154. //     }
  155. //   if((HW_ReceiveBuffer[2]==0x05)&&(HW_ReceiveBuffer[3]==0xFA))//按键5
  156. //     {
  157. //           Buzzer_Bz();  
  158. //     }
  159. //     HW_ReceiveBuffer[0]=0;
  160. //     HW_ReceiveBuffer[1]=0;
  161. //     HW_ReceiveBuffer[2]=0;
  162. //     HW_ReceiveBuffer[3]=0;
  163. //   }
  164. if(Signal_DataTemp==0x01FE807F)//ON|OFF
  165.      {
  166.            Buzzer_Bz();
  167.                Signal_DataTemp=0;
  168.       }  
  169.       if(Signal_DataTemp==0x01FE58A7)//按键1
  170.        {
  171.            Buzzer_Bz();  
  172.                Signal_DataTemp=0;
  173.        }
  174.       if(Signal_DataTemp==0x01FE40BF)//按键2
  175.        {
  176.            Buzzer_Bz();
  177.                Signal_DataTemp=0;  
  178.        }
  179.    if(Signal_DataTemp==0x01FEC03F)//按键3
  180.       {
  181.            Buzzer_Bz();
  182.                Signal_DataTemp=0;  
  183.       }
  184.    if(Signal_DataTemp==0x01FE609F)//按键4
  185.        {
  186.            Buzzer_Bz();  
  187.                Signal_DataTemp=0;
  188.      }
  189.    if(Signal_DataTemp==0x01FEA05F)//按键5
  190.      {
  191.            Buzzer_Bz();  
  192.                Signal_DataTemp=0;
  193.      }

  194. }  
复制代码
HWV3.0的无线解码程序
红外接收器的数据发送端默认为高
判断两次下将沿记录一位数据的一个周期时间




HWV3.0.zip

997.32 KB, 下载次数: 0

无错误

HWV2.0.zip

993.31 KB, 下载次数: 0

有错误

HWV2.0.zip

993.31 KB, 下载次数: 0

有错误

HWV3.0.zip

997.32 KB, 下载次数: 0

无错误

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-9 14:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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