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; // 解码成功标志,即有新增数据
}
}
}