MM32射频解码

  本人曾负责开发风扇灯产品,故将射频解码的算法和程序进行总结,以便日后学习完善,也与大家分享。射频模块与MM32的通信协议为类似于EV1527的协议,每帧发送32位数据,前20位为地址码,接着4位为相应的操作码,最后一个字节的高4位为动作码,协议最后1位为同步位,为0。下图为1527协议的编码方式。
  下表为定义的产品遥控码格式。产品具备冷暖灯及调光功能,风扇的正反转,以及APP的Wifi控制。

  射频解码程序如下,经过检验,稳定可靠,完成产品级别的交付。

// MM32射频解码
uint8_t RF;
uint8_t HW,LW;                                      //高低电平宽度
uint8_t Code_x;                                     //接受到第几位编码
uint8_t FRemote1,FRemote2,FRemote3,FRemote4;        //第一次接收到遥控编码,这四个依次从高到低存放遥控码的32位
uint8_t Encode1,Encode2,Encode3,Encode4;            //解码寄存器
uint8_t SRemote1,SRemote2,SRemote3,SRemote4;        //第二次接收到遥控编码
uint8_t rf_ok1,rf_ok2,rf_ok;                        //解码过程中的临时接收成功标志,接收到一个完整的遥控命令后置1,通知解码程序可以解码了
uint8_t old_level;                                  //保存上一次查询到的电平状态
uint8_t Syn;                                        //接收到同步码时置1
uint8_t Decode_ok;                                  //判断按键结束,规定时间内未接收到同步码时置1
uint16_t s;                                         //二次接收的规定时间
uint16_t time;
uint8_t rf_data[4];                                 //接受码存放
uint8_t Code_check=1;                              //对码标志
uint8_t num_y=0;                                   //长按YELLOW计数
uint8_t num_w=0;                                   //长按WHITE计数
uint8_t num_o=0;                                   //长按OFF计数void TIM2_IRQHandler(void)
{if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM2, TIM_IT_Update); RF = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5); if (!RF) { LW++;   old_level=0; }               else         { HW++;if (!old_level)        //检测电平从低到高的跳变,已检测到一个(高-低)完整电平周期{   if (((HW>=3)&&(HW<=5))&&((LW>=120)&&(LW<=130)))     //同步码{ Syn = 1 ;time=640;Decode_ok=0;Code_x = 0;FRemote1=0; FRemote2=0; FRemote3=0; FRemote4=0;    }else if((Syn)&&((LW>=10)&&(LW<=14)))                //判0{   Code_x++; if(Code_x>31){if(!rf_ok1)                            //rf_ok1临时接收成功{                                     //将接收到的编码复制到解码寄存器中Encode1=FRemote1;Encode2=FRemote2;Encode3=FRemote3;Encode4=FRemote4; rf_ok1=1;                           //通知解码子程序可以解码       Syn=0;s=1000;   }else{                                    //将接收到的编码复制到解码寄存器中SRemote1=FRemote1;SRemote2=FRemote2;SRemote3=FRemote3;SRemote4=FRemote4;  rf_ok2=1;                          //通知解码子程序可以解码      Syn=0;                                                                        }}}  else if ((Syn)&&((LW>=2)&&(LW<=6)))          //判1 { switch (Code_x){ case 0 : { FRemote1=FRemote1 | 0x80; break; }   case 1 : { FRemote1=FRemote1 | 0x40; break; }case 2 : { FRemote1=FRemote1 | 0x20; break; }case 3 : { FRemote1=FRemote1 | 0x10; break; }case 4 : { FRemote1=FRemote1 | 0x08; break; }case 5 : { FRemote1=FRemote1 | 0x04; break; }case 6 : { FRemote1=FRemote1 | 0x02; break; }case 7 : { FRemote1=FRemote1 | 0x01; break; }case 8 : { FRemote2=FRemote2 | 0x80; break; }case 9 : { FRemote2=FRemote2 | 0x40; break; }case 10: { FRemote2=FRemote2 | 0x20; break; }case 11: { FRemote2=FRemote2 | 0x10; break; }case 12: { FRemote2=FRemote2 | 0x08; break; }case 13: { FRemote2=FRemote2 | 0x04; break; }case 14: { FRemote2=FRemote2 | 0x02; break; }case 15: { FRemote2=FRemote2 | 0x01; break; }case 16: { FRemote3=FRemote3 | 0x80; break; }case 17: { FRemote3=FRemote3 | 0x40; break; }case 18: { FRemote3=FRemote3 | 0x20; break; }case 19: { FRemote3=FRemote3 | 0x10; break; }case 20: { FRemote3=FRemote3 | 0x08; break; }case 21: { FRemote3=FRemote3 | 0x04; break; }case 22: { FRemote3=FRemote3 | 0x02; break; }case 23: { FRemote3=FRemote3 | 0x01; break; }       case 24: { FRemote4=FRemote4 | 0x80; break; }case 25: { FRemote4=FRemote4 | 0x40; break; }case 26: { FRemote4=FRemote4 | 0x20; break; }case 27: { FRemote4=FRemote4 | 0x10; break; }case 28: { FRemote4=FRemote4 | 0x08; break; }case 29: { FRemote4=FRemote4 | 0x04; break; }case 30: { FRemote4=FRemote4 | 0x02; break; }case 31: { FRemote4=FRemote4 | 0x01;                                                if(!rf_ok1){Encode1=FRemote1;Encode2=FRemote2;Encode3=FRemote3;Encode4=FRemote4;rf_ok1=1;         Syn=0;break;                                 }else{SRemote1=FRemote1;SRemote2=FRemote2;SRemote3=FRemote3;SRemote4=FRemote4;rf_ok2=1;                                      Syn=0;break;                                                                          }                                    }} Code_x++; }else{Code_x=0; Syn=0;FRemote1=0;FRemote2=0; FRemote3=0; HW=1;LW=0;Decode_ok=1;}                                     LW=0;HW=1; }          old_level=1;      }if(Decode_ok){if(rf_ok1)                        //规定时间内接收到两帧相同的数据才有效{s--;if(!s) rf_ok1=0;if(rf_ok2) {if((Encode1==SRemote1)&&(Encode2==SRemote2)&&(Encode3==SRemote3)){rf_ok=1;rf_ok1=0;rf_ok2=0; time=200;                          }else{rf_ok=0;rf_ok1=0;rf_ok2=0;}          }                   }if(rf_ok)                            //判断是否接收成功{TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);rf_ok=0; rf_data[0]=Encode1;rf_data[1]=Encode2;rf_data[2]=Encode3;rf_data[3]=Encode4;/*YELLOW 接收*/if((rf_data[2]&0x05)==0x05){num_y++;num_w=0;num_o=0;}/*OFF 接收*/else if((rf_data[2]&0x01)==0x01){num_o++;num_y=0;num_w=0;}/*WHITE 接收*/else if((rf_data[2]&0x06)==0x06){num_w++;num_o=0;num_y=0;}/*其余键接收*/else{num_y=0;num_w=0;num_o=0;}/*产测*/if(((rf_data[2]&0x01)==0x01)&&(num_o>=20)&&(Code_check==0))                                                       {mcu_start_wifitest();}/*配网*/if(((rf_data[2]&0x06)==0x06)&&(num_w>=20)&&(Code_check==0))                                                        {//mcu_set_wifi_mode(SMART_CONFIG);mcu_reset_wifi();}/*对码*/if(((rf_data[2]&0x05)==0x05)&&(num_y>=5)&&(Code_check==1))           {REMOTE_ID1 = rf_data[0];REMOTE_ID2 = rf_data[1];REMOTE_ID3 = rf_data[2]&0xf0;Code_check = 0;Buzz_Ring(500);}       else                                    //正常遥控过程{   Remote_Scan();                      //接收码校验OperationCode_Send();}TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);}}}
}

MM32射频解码(产品检验,可靠稳定)相关推荐

  1. 315Mhz RF射频解码 串口输出方案(支持2262/1527多种编码方式)

    315Mhz RF射频解码 串口输出方案 一.简介 二.使用前准备 三.测试方法 四.测试现象 总结 原文链接:https://www.yourcee.com/newsinfo/2929023.htm ...

  2. 产品检验的数字化转型应用

    中国船检杂志社2021-03-14 21:31:02 当前,数字技术的应用正在各行各业广泛展开,已广泛用于工业.安防.医疗.交通.金融.物流.教育.能源等领域,随着5G技术的应用及物联网(IOT)技术 ...

  3. 昆仑通态MCGS与3台西门子V20变频器通讯程序 3台变频器通讯,可靠稳定

    昆仑通态MCGS与3台西门子V20变频器通讯程序 3台变频器通讯,可靠稳定,同时解决西门子变频器断电重启后,自准备工作,无需人为准备. 器件:昆仑通态触摸屏,3台西门子V20系列变频器,附送接线说明和 ...

  4. 高可靠稳定获利的外汇交易系统

    最近,在高可靠性外汇交易系统.目前,进入实际测试阶段.效果还不错. 进一步完善后,就发布. 我的联系方法. http://alantop.5166.info

  5. MM32LED调光(PWM)与芯片间指令下发

    前景介绍   本人曾独立开发风扇灯产品,故在此将相关程序进行总结与分享,与大家一起学习交流.   这里大致介绍下风扇灯这款产品,风扇灯即在传统吊扇上集成了灯光照明的功能,可以通过射频遥控以及APP的W ...

  6. 离线高清卫星地图SDK及解决方案

     Bigemap GIS大数据 数据处理与开发应用一站式解决方案 技术服务:数据中心 + 桌面端 + 移动端(APP) + WEB端 关 键 词:地图  导航  定位  编辑  开发  分析  智慧 ...

  7. 搭建全球地图数据服务中心

     Bigemap GIS大数据 数据处理与开发应用一站式解决方案 技术服务:数据中心 + 桌面端 + 移动端(APP) + WEB端 关 键 词:地图  导航  定位  编辑  开发  分析  智慧  ...

  8. 谷歌卫星影像存储方案

    Bigemap GIS大数据 数据处理与开发应用一站式解决方案 技术服务:数据中心 + 桌面端 + 移动端(APP) + WEB端 关 键 词:地图  导航  定位  编辑  开发  分析  智慧   ...

  9. 离线三维地球安卓解决方案

     Bigemap GIS大数据 数据处理与开发应用一站式解决方案 技术服务:数据中心 + 桌面端 + 移动端(APP) + WEB端 关 键 词:地图  导航  定位  编辑  开发  分析  智慧 ...

最新文章

  1. python基本语法语句-python 语法基础篇 一
  2. 等待时间clientNYOJ 179 LK's problem
  3. 水晶报表钻取(深化)之分组法
  4. elasticsearch分析系列
  5. 3399 mysql_MySQL索引
  6. 【Swift】在Swift中获取当前的wifi SSID
  7. 2021河北省高考成绩查询步骤,河北省2021年普通高校招生考试和录取工作实施方案解读...
  8. 封装 oschina.net 表情选择
  9. mybatis BindingException: Invalid bound statement (not found)
  10. 在Ubuntu 18.04上安装PostgreSQL 11和PgAdmin4
  11. express 设置header解决跨域问题
  12. JAVA透视相机安卓_透视相机下载安卓版
  13. javax.mail.MessagingException: Unknown SMTP host: smtp.163.com;
  14. messagebox 确认 取消
  15. STM32的ETR引脚计数功能
  16. openwrt编译ifb.ko模块问题
  17. 【POJ 3311】Hie with the Pie(状压DP)
  18. 用计算机里可以加50度电,一台电脑一天用多少度电?多少瓦?高配电脑一小时几度电?...
  19. 手把手教你搭建一个【文件共享平台】系列教程第一话——你想知道的,这里都有
  20. 勘探重力实验matlab,MATLAB在重力图制作中的应用

热门文章

  1. 喜大普奔!工信部数据管理人才证书!!!
  2. XAML 界面原理与语法
  3. 快解析结合华途文档加密软件
  4. 用批处理程序进行本地网速测试
  5. python中随机种子_Pytorch随机种子
  6. 用于不同功率的模块式TEC半导体致冷器超高精度温度控制装置
  7. flyme禁止系统更新_Flyme系统更新最新版本
  8. 简便的Excel导出功能
  9. python表格单元格批注批量插图xlwings\os\pillow教程,手把手代码讲解
  10. python--读取TRMM-3B43月平均降水绘制气候态空间分布图(陆地区域做掩膜)