• 基本概念

工作频率:433.92MHz

调制方式:ASK/OOK,FSK,GFSK

现有遥控与接收器方案中,多数使用ASK/OOK调试方式。ASK即“幅移键控”又称为“振幅键控”,也有称为“开关键控”(通断键控)的,所以又记作OOK(On-Off keyed)信号。ASK是一种相对简单的调制方式。幅移键控(ASK)相当于模拟信号中的调幅,不同的是与载频信号相乘的是二进制数码。幅移就是把频率、相位作为常量,而把振幅作为变量,信息比特是通过载波的幅度来传递的。如下图所示,ASK调制方式的典型时域波形,虚线部分表示二进制的0和1,红色实线部分表示调制信号。

  • 国家标准

标准可参考“信部无[2005]423号 关于发布《微功率(短距离)无线电设备的技术要求》的通知”,要求如下:

(十一)各类民用设备的无线控制装置

不得用于无线控制玩具、模型等。

1.使用频率:314-316MHz,430-432MHz,433.00-434.79MHz

发射功率限值:10mW(e.r.p)

占用带宽:不大于400kHz

  • 编码与解码

以遥控器为例,在明确调制方式后,需要为遥控器编码方式进行约定。一组遥控编码通常需要包含“引导码/起始码”、“用户码”、“数据码”、“结束码”、“重复码”,格式如下:

确定编码组成后需要明确“逻辑0”、“逻辑1”的表示方法,可以遵循标准的编码方案,也可以进行自定义。标准编码方案可以使用“曼彻斯特编码”等方案,在自定义编码方案时可以参考下图所示的编码规则,主要是电平顺序与电平长度的组合。

以遥控的编码为例进行分析,得到如下编码波形:

假设:

高电平长码 + 低电平短码表示逻辑1

高电平短码 + 低电平长码表示逻辑0

可以得到该组数据为“0x88 0x03 0xBD 0xB6”。

解码过程是对编码过程的逆向,解码程序需要根据编码方案进行设计。遥控器的解码方案请参考“参考示例”。

  • 参考示例

根据测得的遥控器编码波形可知,433MHz接收端输出的信号中,电平维持时间有20ms、9ms、1.6ms、700us这几种。使用1.6ms高电平 + 700us低电平表示逻辑1,700us高电平 + 1.6ms低电平表示逻辑0,9ms高电平表示引导/起始码,700us高电平 + 20ms低电平表示结束码,同时也表示“重复码“”的起始。

程序设计中,对700us的电平进行检测并计数,要保证做够的容错能力,需要将定时器中断做到100us以下,甚至更小,显然使用定时器中断处理时不合理的。在本示例中,采用外部中断 + 定时器计数的方式进行电平长度采样。外部中断采用上升沿和下降沿触发,在中断中根据当前电平切换边沿触发方式。定时器使用系统时钟(16.6MHz)的64分频作为时钟源,具有足够的分辨率,可提高接收机的容错能力。

数据采样逻辑中,下降沿时判断当前高电平表示的逻辑值,上升沿是对上一步中产生的逻辑值进行确认,若逻辑值合法则对该逻辑值进行记录,若不合法,这舍弃该逻辑值,并初始化接收机,等待下一次数据。程序流程图如下:

示例代码:

代码基于中颖电子SH79F3212书写。

外部中断初始化为上升沿触发,当前电平INT45Level默认为低。

使用定时器3作为计数器

/*---------------定时器时钟使用系统频率64分频------------------*/
//1ms计数260
//实测引导码高电平长度为9.7ms,低电平长度为2ms
#define HeadCont_H 2540      //9.7ms
#define HeadCont_L 500       //2ms//实测逻辑1为高电平1.7ms+低电平0.6ms
#define OneCode_H 450        //1.7ms
#define OneCode_L 160        //0.6ms//假设0码为高电平0.6ms+低电平1.7ms
#define Zero_H 160
#define Zero_L 450  //容错范围
#define FaultTolerant 50寄存器定义
uint16 T3Counter;
bit INT45Level = 0;bit ZeroCode;           //接收到逻辑0
bit OneCode;            //接收到逻辑1
bit MaybeRemoteStart;   //疑似接收到起始码
bit RemoteStart;        //开始接收遥控数据
bit ReadOver;           //接收完成#define DefRemoteDataBufLen 10  //默认遥控数据长度
idata uint8 RemoteDataBuffer[DefRemoteDataBufLen];  //接收缓冲区
idata uint8 ReadTab[DefRemoteDataBufLen];   //已接收,待处理数据
idata uint8 ReadBitCont;  //读取Bit计数
idata uint8 ReadBuffer;   //数据缓存区
idata uint8 ReadByteCont; //读取字节计数外部中断服务程序
void INT45_interrupt() interrupt 9
{u8 backtemp;backtemp = INSCON;INSCON = 0x00;if((EXF1&0x20) == 0x20){//读取T3计数器INSCON |= 0x40;T3CON = 0x00;T3Counter = 0x0000|(TH3 << 8);T3Counter |= TL3;TL3 = 0x00;TH3 = 0x00;T3CON = 0x24;           //系统分频1/64,启动定时器INSCON &= ~0x40;if(INT45Level)      //处理下降沿{if((T3Counter > (HeadCont_H - FaultTolerant))&&(T3Counter < (HeadCont_H + FaultTolerant))){MaybeRemoteStart = 1;       //疑似遥控数据头}else{if((T3Counter> (OneCode_H - FaultTolerant))&&(T3Counter < (OneCode_H + FaultTolerant))){OneCode = 1;ZeroCode = 0;}else{if((T3Counter > (Zero_H - FaultTolerant))&&(T3Counter < (Zero_H + FaultTolerant))){ZeroCode = 1;OneCode = 0;}else{ZeroCode = 0;OneCode = 0;}}}INT45Level = 0;     //当前电平为低EXF0 = 0x80;        //设置为上升沿触发}else        //处理上升沿{if(RemoteStart){if((T3Counter >(OneCode_L - FaultTolerant))&&(T3Counter < (OneCode_L + FaultTolerant))){if(OneCode){//接收到一个bit 为1GetOneByte();}else{//数据出错,丢弃RemoteStart = 0;OneCode = 0;ZeroCode = 0;ReadOver = 0;}}else{if((T3Counter > (Zero_L - FaultTolerant))&&(T3Counter < (Zero_L + FaultTolerant))){if(ZeroCode){//接收到一个bit 为0GetOneByte();}else{//数据出错,丢弃RemoteStart = 0;OneCode = 0;ZeroCode = 0;ReadOver = 0;}}else{if(ZeroCode && (T3Counter > 4000)) //结束码,同时也是重复码的起始{ReadOver = 1;OneCode = 0;ZeroCode = 0;RemoteStart = 0;GetOneByte();}else{//干扰数据,接收器初始化RemoteStart = 0;OneCode = 0;ZeroCode = 0;ReadOver = 0;}}}}else{if(MaybeRemoteStart){if((T3Counter > (HeadCont_L - 20))&&(T3Counter < (HeadCont_L + 20))){RemoteStart = 1;  //遥控数据开始发送ReadBitCont = 0;  //读取Bit计数ReadBuffer = 0;   //数据缓存区ReadByteCont = 0; //读取字节计数ReadOver = 0;MaybeRemoteStart = 0;}}}INT45Level = 1;     //当前电平为高EXF0 = 0x40;        //设置为下降沿触发}}EXF1 = 0x00;INSCON = backtemp;
}GetOneByte()子函数,接收完整字节并处理
void GetOneByte()
{int i;if(ReadBitCont<=7){ReadBuffer <<= 1;if(OneCode){ReadBuffer |= 0x01;}}ReadBitCont ++;if(ReadBitCont >= 8){RemoteDataBuffer[ReadByteCont++] = ReadBuffer;     //每接收1byte,写入缓存ReadBuffer = 0;ReadBitCont = 0;}if(ReadOver)                            //全部接收完后{for(i=0;i<ReadByteCont;i++){ReadTab[i]=RemoteDataBuffer[i]; }ReadByteCont = 0;}
}

433MHz无线通信相关推荐

  1. 433MHz无线通信--模块RXB90

    1.接收模块RXB90简介 两个数据输出是联通的. 2.自定义一个编码解码规则 组数据为"0x88 0x03 0xBD 0xB6". 3.发射模块 如何使用示波器得到捕捉一个周期的 ...

  2. 调试SI4432要点

    #include "led.h" #include "delay.h" #include "sys.h" #include "us ...

  3. 分享调试SI4432的一些小经验

    转自--玻璃之城(http://www.amobbs.com/thread-5525592-1-1.html) 最近想做无线遥控,选用SI4432这个模块,因为这个芯片需要配置的寄存器比较多,调试的时 ...

  4. 消防栓信息计算机管理系统,智能消防栓监控系统

    原标题:智能消防栓监控系统 近年来,随着社会经济的快速发展,城市建设的步伐不断加快,消防工作也凸显重要,然而消防设施的信息化建设却趋于落后:传统的管理方式无法及时了解现场信息,比如消防设施被破坏.救火 ...

  5. 无线433发送接收数据测试程序原理,有杂波解决方案

    无线433发送接收测试程序 433Mhz无线通信相关知识不做介绍,网上很多避坑:MCU的接收引脚Data脚,是否配置上拉要参考MCU内部上拉电阻的大小,使用时最好拿示波器测量高低电平对应的电压. 此测 ...

  6. 关于RF433无线模块及应用领域分析之433胎压模块

    RF无线模块 一.什么是433m无线模块 433MHz无线收发模组,采用高频射频技术,因此也叫RF433射频小模块.其由全数字科技生产的单IC射频前端与ATMEL的AVR单片机组成,可高速传输数据信号 ...

  7. 陶瓷天线AN1603-433

    AN1603-433应用于433MHz无线通信.433MHz无线模组,应用尺寸16.0*3.1*1.45mm.中心频率为433MHz,峰值增益为0.5dBi,带宽10MHz,功率3W,VSWR值为2. ...

  8. 【技术探讨】用户使用其他厂家433MHz无线模块时,购买样品OK,小批量100个就会出现偶尔无法收发数据的原因?

    许多用户使用其他厂家的433M透传无线模块反馈这样的问题:前期购买几个样品测试,在无线信号覆盖半径内,收发包测试都很稳定,但是小批量购买100个模块收发就会出现无法收发的情况.这是什么原因呢? 首先科 ...

  9. 无线通信中LoRa技术特点

    相信对于很多朋友来说LORA通讯协议还是比较陌生的,因为LORA模块这种通讯技术是在2016年开始才正式传入中国的.现在阿里.Google.腾讯等互联网巨头都已经加入了LORA联盟,最有意思的是亚马逊 ...

  10. 433MHz(CC1101)与zigbee (CC2530)对比测试

    以下是433Mhz和zigbee的测试情况,购买的模块都是TI公司的市场上较为主流,出货最多的模块. 1.1   CC1101: CC1101的通讯频率为433MHz,优点在于传输距离远,传输数据率低 ...

最新文章

  1. Docker核心技术
  2. swift开发之--UISearchBar的使用/UISearchController的使用
  3. [caffe解读] caffe从数学公式到代码实现4-认识caffe自带的7大loss
  4. HeartBeat Install
  5. PHP下载CSS文件中的图片
  6. nginx反向代理模块配置详解_nginx反向代理配置详解
  7. axure 发布 主页_车队如何在黑鸟APP发布同城活动?教程来了!
  8. luogu P2783 有机化学之神偶尔会做作弊
  9. Java Web——基于Servlet、JSP(无框架版)电影网站项目总结(一)
  10. c语言常用函数大全超详细
  11. Python下的中文分词实现
  12. 流程图绘制和符号含义
  13. 马云周星驰天马行空对话:梦想需要新鲜感
  14. java基于springboot+vue的旅游心得分享攻略系统 elementui
  15. Could not set property ‘ sname‘ of ‘class com.cxy.mybatis.pojo.Student‘ with value ‘赵六‘这种报错原因及解决办法
  16. thinkphp6项目的支付宝手机网页支付接入
  17. 美国芯片陆续转向,或许为当初的做法后悔不迭,芯片补贴也难改局面
  18. HBase-11-HBase Coprocessor HBase协处理器
  19. jQuery事件使用
  20. 【日常积累】实验室作业Socket实现多个客户端相互通信。

热门文章

  1. 艾里斑大小与像元尺寸的匹配问题
  2. 前端JS xxxx年xx月xx日转换成页面时间组件xxxx-xx-xx格式
  3. html在线排版编辑工具,html+css+js开发文本编辑器,有各种排版功能!
  4. ubuntu或者Ubuntu Kylin下安装Visual Studio Code
  5. tk域名管理后台_TK域名解析教程,dns设置教程
  6. JAVA中无法加载主类什么意思_找不到或无法加载主类什么意思?
  7. AIC(最小信息化准则)
  8. java 把客户信息录入数组,需求说明 java-实现添加客户信息 客户信息包括:姓名、年龄、是否有会员卡...
  9. numpy抽样函数 np.random.choice用法详解
  10. 2018百分点认知智能新产品暨E轮融资即将发布