433MHz无线通信--模块RXB90

1、接收模块RXB90简介

两个数据输出是联通的。
在这里插入图片描述

2、自定义一个编码解码规则

组数据为“0x88 0x03 0xBD 0xB6”。
在这里插入图片描述

3、发射模块

如何使用示波器得到捕捉一个周期的图像?
通过date引脚连接示波器CH1,以及示波器探针的接地端接芯片的GND,分别一直长按1~4,得到每个按键的波形。
在这里插入图片描述
4个波形的整体特征
在这里插入图片描述
四个波形的各自特征

在这里插入图片描述
将方波缩短后如下图:
在这里插入图片描述

可以发现4个按钮发射出的信号分别为
11000010010100110010 00010
11000010010100110010 00100
11000010010100110010 01000
11000010010100110010 10000

4、编程

1)鉴别出同步码Td:

2)提取数据:

3)代码示例

/**
 * @brief 433解码函数 
 *   每50us执行一次。
 */
void RX_DATA1(void)
{   
    /* 查看接收到的电平 */
	if (HAL_GPIO_ReadPin(RF_GPIO_PORT,RF_PIN) == RESET) 
	{   // 检测到低电平
		ll_w++;   // 检测到低电平 低电平时间加1,记录本次电平状态old_rc5为0
		old_rc5 =0; 		
	} 
	else         
	{   // 检测到高电平
		hh_w++;
		if (!old_rc5)  					
		{   // 检测到从低到高的跳变	
			if( (tb_ok == 0)  && (ll_w>=160)) 
			{   // 最长12ms的同步码Td被检测到8ms
				lead_L = ll_w/31;

				lead_H = lead_L*3 ;
				tb_ok = 1 ;                     // 接收到同步码
				ma_x = 0;                       // 编码位号清零
				
				bma1=0; bma2=0; bma3=0; bma4=0; // 清零临时寄存器bma
				ll_w = 0;hh_w=0; 
			}
			else if ((tb_ok==1)&&((ll_w>=(lead_H-6))&&(ll_w<=(lead_H+6)))) 
			{   // 检测到从低到高的跳变,已经接收到同步码,数据部分的低电平时间大概在474~1074us,即电平低小于高,码元是值是0 ————接收到一个码元值为0的码元   
				if(ma_x>22)
				{   // 接收到24位编码
					if(rf_ok1==0) 
					{   // 数据a临时接收成功
						mma1=bma1;         // 将接收到的编码复制到解码寄存器mma中 
					    mma2=bma2;
						mma3=bma3;
						mma4=bma4;                                                       
						rf_ok1=1;          // 通知解码子程序数据a可以解码了            
						tb_ok=0;           // 没有接收到同步码
						time1=1500;    	   // 定时75ms					                       
					}
					else
					{   // 数据b临时接收成功
						mmb1=bma1;         // 将接收到的编码复制到解码寄存器mmb中  
						mmb2=bma2;
						mmb3=bma3;
						mmb4=bma4;  						                                             
						rf_ok2=1;          // 通知解码子程序数据b可以解码了          
						tb_ok=0;           // 没有接收到同步码                                                            
					}
					
					tb_ok=0;       // 没有接收到同步码
				}
				// 码元值为0的编码位不需要置1,直接前进一格编码位号
				ma_x++;      // 前进一格编码位号
			}  
			else if ((tb_ok==1)&&((ll_w>=(lead_L-6))&&(ll_w<(lead_L+6) )))   
			{ 	// 检测到从低到高的跳变,已经接收到同步码,数据部分的低电平时间大概在0~558us,即低大于高,码元是值是1 ————接收到一个码元值为1的码元		
				switch (ma_x)
				{   // 对接收到的码元值为1的编码位置1
					case 0 : { bma1=bma1 | 0x80; 
											break; }   //遥控编码第1位
					case 1 : { bma1=bma1 | 0x40;  
											break; }
					case 2 : { bma1=bma1 | 0x20; 
											break; }
					case 3 : { bma1=bma1 | 0x10; 
											break; }
					case 4 : { bma1=bma1 | 0x08; 
											break; }
					case 5 : { bma1=bma1 | 0x04; 
											break; }
					case 6 : { bma1=bma1 | 0x02;
											break; }
					case 7 : { bma1=bma1 | 0x01; 
											break; }
					
					case 8 : { bma2=bma2 | 0x80;  
											break; }
					case 9 : { bma2=bma2 | 0x40; 
											break; }
					case 10: { bma2=bma2 | 0x20; 
											break; }
					case 11: { bma2=bma2 | 0x10; 
											break; }
					case 12: { bma2=bma2 | 0x08; 
											break; }
					case 13: { bma2=bma2 | 0x04;
											break; }
					case 14: { bma2=bma2 | 0x02; 
											break; }
					case 15: { bma2=bma2 | 0x01; 
											break; }
					
					case 16: { bma3=bma3 | 0x80; 
											break; }
					case 17: { bma3=bma3 | 0x40; 
											break; }
					case 18: { bma3=bma3 | 0x20; 
											break; }
					case 19: { bma3=bma3 | 0x10; 
											break; }
					case 20: { bma3=bma3 | 0x08; 
											break; }// 按键状态第1位
					case 21: { bma3=bma3 | 0x04; 
											break; }
					case 22: { bma3=bma3 | 0x02; 
											break; }
					case 23:  bma3=bma3 | 0x01; 
						if(!rf_ok1)
						{   // 数据a临时接收成功
							mma1=bma1;
							mma2=bma2;
							mma3=bma3;         // 将接收到的编码复制到解码寄存器mma1~3中             		 
							rf_ok1=1;          // 通知解码子程序数据a可以解码了
							time1=1500;        //设置计时器,计时时间75ms                     
						}
						else
						{   // 数据b临时接收成功
							mmb1=bma1;
							mmb2=bma2;
							mmb3=bma3;         // 将再次接收到的编码复制到解码寄存器mmb1~3中,                             
							rf_ok2=1;          // 通知解码子程序数据b可以解码了	                                                                         
						} 
						tb_ok=0;      // 没有接收到同步码
						
					
					break; 														
					
					default:
					break;
				} 
				ma_x++;   // 前进一格编码位号
				
			}
			else
			{ //接收到不符合的高-低电平序列,不0值码元,也不符合1值码元
				ma_x=0; tb_ok=0;bma1=0;bma2=0; bma3=0; hh_w=1;ll_w=0;
			}                                      
			ll_w=0;hh_w=0; 
		}        
		old_rc5=1;      // 记录本次电平状态
	}
	
	
	
	
	/* 判断是否接收连续的数据a,数据b成功 */ 
	if(rf_ok1)  
	{   
		time1--;
		if(!time1) 
			rf_ok1=0;
		if(rf_ok2) 
		{   // 数据b临时接收成功,并且数据a在75ms内成功接收过
			if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3))
			{
				rf_ok=1;     //接收连续的数据a,数据b成功            
			}
			else
			{
				rf_ok=0;     //接收连续的数据a,数据b失败
			} 
			rf_ok1=0;   // 数据a临时接收失败
			rf_ok2=0;   // 数据b临时接收失败						
		}                   
	}
	
	
	
	/* 如果接收到了连续的数据a,数据b,处理它 */
	if((rf_ok))             
	{   
        rf_ok=0;            // 成功接收的连续的数据a,数据b,标记为已经使用
        RF_ADDRESS[0]=mma1;
        RF_ADDRESS[1]=mma2;
        RF_ADDRESS[2]=mma3;
        time2 = 4000;       // 设置计时器,计时时间200ms,如果计时遥控按键不松开,计时时间200ms内会一直成功接收的连续的数据a,数据b,计时器会在从4000减少到零前重置为4000
        RF_OK = 1;          // 开启定时器time2  
        Rf_Control_Data=RF_ADDRESS[2]&0x0F;  // 接收到没有处理的连续的数据a,数据b成功,更新按下的遥控按键的按键值
	}
	if( RF_OK==1)
	{
		time2--;
		if(!time2)          // 定时器time2时间到。  
		{
			RF_OK = 0;      // 关闭定时器time2  
			decode_ok=1;    // 解码成功标志,即有新增数据
		}
	}
}

4)对上述代码针对空间进行优化

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值