为了账号安全,请及时绑定邮箱和手机立即绑定

433M无线收发模块详解

标签:
Html5 AngularJS

本文所涉及的源码及安装包如下(由于平台限制,请点击以下链接阅读原文下载):
HAL_NVIC_EnableIRQ(EXTI1_IRQn);

HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);

HAL_NVIC_SetPriority(EXTI3_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
}


### 5.5 中断服务函数

设计中断服务函数,调用中断处理公用函数。EXTI1、EXTI2、EXTI3 分别设计到 GPIO_PIN_1、GPIO_PIN_2、GPIO_PIN_3。

```c
void EXTI1_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);         /* 调用中断处理公用函数 清除中断线 的中断标志位 */
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);         /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */
}

void EXTI2_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);         /* 调用中断处理公用函数 清除中断线 的中断标志位 */
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2);         /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */
}
void EXTI3_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);         /* 调用中断处理公用函数 清除中断线 的中断标志位 */
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);         /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */
}

5.6 LED控制

复写「HAL_GPIO_EXTI_Callback」函数,检测到中断上升沿,则表示按键被按下,翻转对应的 LED。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    switch(GPIO_Pin)
    {
        case GPIO_PIN_1:
        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) ==  GPIO_PIN_SET)
        {
            LED1_TOGGLE();
        }
        break;
        
        case GPIO_PIN_2:
        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) ==  GPIO_PIN_SET)
        {
            LED2_TOGGLE();
        }
        break;
        
        case GPIO_PIN_3:
        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) ==  GPIO_PIN_SET)
        {
            LED3_TOGGLE();
        }
        break;
    }
}

5.7 效果展示

遥控器按下A,红灯状态反转;按下B,黄灯状态反转;按下C,绿灯状态反转。

下图是按下A、B、C,三灯齐亮的效果。

6. 总结

随着物联网的快速发展和智能化需求的增加,无线通信技术将扮演越来越重要的角色。433M 模块作为一种低功耗、长距离传输的技术,具有广泛的应用前景。从遥控门禁到智能家居自动化,从环境监测到安防系统,433M 模块为各种应用场景带来了便捷和创新。希望本文能够给您带来小小的启发,并激发您在无线通信领域进一步探索和创造的热情。感谢各位看官, peace and love!
无线通信技术在现代社会中扮演着至关重要的角色,它让我们能够实现便捷的远程控制、智能家居、自动化以及各种物联网应用。无线通信技术包括 WiFi、蓝牙、NFC、Zigbee、5G 等等。

本次我要给大家介绍无线通信技术之一的 433M,从基本概念到工作原理再到实际应用。我们将逐步剖析 433M 模块背后的技术细节。无论您是初学者还是有一定经验的开发者,这篇文章都将为您提供全面的指导和启发,帮助您更好地了解和应用 433M 模块。

  1. 源码下载及前置阅读
    本文首发 良许嵌入式网 :https://www.lxlinux.net/e/ ,欢迎关注!

本文所涉及的源码及安装包如下(由于平台限制,请点击以下链接阅读原文下载):

超全的嵌入式入门教程,欢迎小白。

手把手让你掌握MDK的使用方式和技巧,助你更高效地进行开发:【一文教你使用MDK开发工具:https://www.lxlinux.net/e/stm32/mdk-development-tool-tutorial.html】
使用接收中断+超时判断完成不定长数据的接收:【STM32串口接收不定长数据(空闲中断+DMA):https://www.lxlinux.net/e/stm32/stm32-usart-receive-data-using-idle-dma.html】
通俗易懂的 GPIO 介绍与实践:【如何快速成为点灯大师?:https://www.lxlinux.net/e/stm32/stm32-gpio-hal.html】
往期精彩教程,有兴趣的小伙伴可以看看。

ESP8266详解,助你成为物联网应用的专家:【手把手教你玩转ESP8266(原理+驱动):https://www.lxlinux.net/e/stm32/esp8266-tutorial.html】

简单好用,为你的智能语音项目提供核心支持:【SU-03T语音控制模块详解:https://www.lxlinux.net/e/stm32/SU-03T-tutorial.html】

如果想知道自己对嵌入式知识掌握程度:【嵌入式自测题:https://www.lxlinux.net/e/stm32/embedded-self-test.html】

作者简介
大家好,我是良许,博客里所有的文章皆为我的原创。
下面是我的一些个人介绍,欢迎交个朋友:
· 211工科硕士,国家奖学金获得者;
· 深耕嵌入式11年,前世界500强外企高级嵌入式工程师;
· 书籍《速学Linux作者》,机械工业出版社专家委员会成员;
· 全网60W粉丝,博客分享大量原创成体系文章,全网阅读量累计超4000万;
· 靠自媒体连续年入百万,靠自己买房买车。
我本科及硕士都是学机械,通过自学成功进入世界500强外企。我已经将自己的学习经验写成了一本电子书,超千人通过此书学习并转行成功。现在将这本电子书免费分享给大家,希望对你们有帮助:

674d90ffd0e0a243d4dc0bd7.png
  1. 433M无线收发模块介绍
    无线收发模块 433MHz(或称RF433射频小模块)采用高频射频技术,并结合了全数字技术和 AVR 单片机,成为一种微型收发器。它能够实现高速数据信号传输,并具备打包、检错和纠错处理的功能。

433M 模块采用工业级标准的部件,工作稳定可靠,体积小巧,安装方便。它在各个领域都有广泛的应用,包括安全报警系统、家庭生活、工业自动化、远程遥控以及无线数据传输等。其可靠性和稳定性使得它成为许多无线通信需求下的理想选择。

  1. 型号介绍
    首先我们知道遥控器上有四个按键,分别对应 433M 模块的四个数据位输出脚 D0、D1、D2、D3。按下按键发射信号,对应的引脚就会输出高电平。

那么,433M 模块一般按照工作模式分类,有三种工作模式:

M 点动:瞬态输出,相当于自复位开关的状态收到信息输出高电平,无信号时为低电平。
T 锁存:上电时为低,收到信号输出高电平并锁定高,再次收到信号输出低并锁定低。
L 自锁:上电时为低,收到信号输出高电平并锁定高,同时将其他输出置低。
比如我的模块是 M4 点动,「4」表示有4个按键,按一下按键 A,D0 将输出一个高电平。

大家购买的时候要看清楚啦,选择合适的工作模式的 433M 模块哦,它们长的都一样,但是工作模式是不能改的。

温馨小贴士:

天线对模块的接收效果影响很大,最好接 1/4 波长的天线,一般采用 50 欧姆单芯导线,433M 的天线的长度约为 17 cm
天线位置对模块接收效果有影响,安装时,天线尽可能伸直,远离屏蔽体、高压及干扰源的地方。
4. 工作参数及引脚介绍
433M 模块工作参数:

工作电压:DC 5V
工作电流:4.5mA
工作温度:-10 ~ +70℃
工作频率:433MHz
遥控器工作参数:

工作电压:DC 12V
工作电流:10mA
发射频率:433MHz
调制方式:ASK
工作频率:433MHz
接线参考如下:

433M 模块 STM32 说明
GND G 接地
5V 5V 电源正极
D0 任意一个GPIO口 对应遥控器的A
D1 任意一个GPIO口 对应遥控器的B
D2 任意一个GPIO口 对应遥控器的C
D3 任意一个GPIO口 对应遥控器的D
VT 任意一个GPIO口 输出状态提示,收到有效信号输出高电平
5. 编程实战
5.1 通信示意图
我们的实现目标是:遥控器按下A,红灯状态反转;按下B,黄灯状态反转;按下C,绿灯状态反转。

5.2 硬件连接
本教程使用的硬件如下:

单片机:STM32F103C8T6
433M 模块
小灯:三色 LED 灯模块
烧录器:ST-LINK V2
433M模块 STM32 LED
GND G
5V 5V
D0 A1
D1 A2
D2 A3
A5 R
A6 Y
A7 G
G GND
烧录的时候接线如下表,如果不会烧录的话可以看我之前的文章【STM32下载程序的五种方法:https://www.lxlinux.net/e/stm32/five-ways-to-flash-program-to-stm32.html】。

ST-Link V2 STM32
SWCLK SWCLK
SWDIO SWDIO
GND GND
3.3V 3V3
接好如下图:

开发板使用的是我们自绘的板子。大家也可以用自己的板子,只要是 STM32F103C8T6 主控芯片就行。

5.3 LED初始化
LED 灯的代码简简单单,只要进行一下三个灯的初始化就行。

void led_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
LED1_GPIO_CLK_ENABLE(); /* LED1时钟使能 /
LED2_GPIO_CLK_ENABLE(); /
LED2时钟使能 /
LED3_GPIO_CLK_ENABLE(); /
LED3时钟使能 */

gpio_init_struct.Pin = LED1_GPIO_PIN;                   /* LED1引脚 */
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */
gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */
HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct);       /* 初始化LED1引脚 */

gpio_init_struct.Pin = LED2_GPIO_PIN;                   /* LED2引脚 */
HAL_GPIO_Init(LED2_GPIO_PORT, &gpio_init_struct);       /* 初始化LED2引脚 */

gpio_init_struct.Pin = LED3_GPIO_PIN;                   /* LED3引脚 */
HAL_GPIO_Init(LED3_GPIO_PORT, &gpio_init_struct);       /* 初始化LED3引脚 */

LED1(0);                                                /* 关闭 LED1 */
LED2(0);                                                /* 关闭 LED2 */
LED3(0);                                                /* 关闭 LED3 */

}
LED 的 .h文件:

#ifndef _LED_H
#define _LED_H
#include “sys.h”

/*****************************************************************************************/
/
引脚 定义 */

#define LED1_GPIO_PORT GPIOA
#define LED1_GPIO_PIN GPIO_PIN_5
#define LED1_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */

#define LED2_GPIO_PORT GPIOA
#define LED2_GPIO_PIN GPIO_PIN_6
#define LED2_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */

#define LED3_GPIO_PORT GPIOA
#define LED3_GPIO_PIN GPIO_PIN_7
#define LED3_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */

/*****************************************************************************************/
/
LED端口定义 */
#define LED1(x) do{ x ?
HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET) :
HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET);
}while(0)

#define LED2(x) do{ x ?
HAL_GPIO_WritePin(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_PIN_SET) :
HAL_GPIO_WritePin(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_PIN_RESET);
}while(0)

#define LED3(x) do{ x ?
HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_SET) :
HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_RESET);
}while(0)

/* LED取反定义 /
#define LED1_TOGGLE() do{ HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_GPIO_PIN); }while(0) /
翻转LED1 /
#define LED2_TOGGLE() do{ HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_GPIO_PIN); }while(0) /
翻转LED2 /
#define LED3_TOGGLE() do{ HAL_GPIO_TogglePin(LED3_GPIO_PORT, LED3_GPIO_PIN); }while(0) /
翻转LED3 */

/***************************************************************************************/
/
外部接口函数
/
void led_init(void); /
LED初始化 */

#endif
5.4 433M模块代码
代码很简单,就是初始化三个引脚,PA1、PA2、PA3 分别对应 D0、D1、D2。

这次我们采用中断的方式,需要初始化和使能一下 EXTI。

void _433M_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};

/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();

/*Configure GPIO pins : PA1 PA2 PA3 */
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; //中断上升沿
GPIO_InitStruct.Pull = GPIO_NOPULL; //无电阻
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0); /* 抢占2,子优先级0 */
HAL_NVIC_EnableIRQ(EXTI1_IRQn);

HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);

HAL_NVIC_SetPriority(EXTI3_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
}

5.5 中断服务函数
设计中断服务函数,调用中断处理公用函数。EXTI1、EXTI2、EXTI3 分别设计到 GPIO_PIN_1、GPIO_PIN_2、GPIO_PIN_3。

void EXTI1_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1); /* 调用中断处理公用函数 清除中断线 的中断标志位 /
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1); /
HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */
}

void EXTI2_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); /* 调用中断处理公用函数 清除中断线 的中断标志位 /
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2); /
HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 /
}
void EXTI3_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); /
调用中断处理公用函数 清除中断线 的中断标志位 /
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3); /
HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */
}
5.6 LED控制
复写「HAL_GPIO_EXTI_Callback」函数,检测到中断上升沿,则表示按键被按下,翻转对应的 LED。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch(GPIO_Pin)
{
case GPIO_PIN_1:
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET)
{
LED1_TOGGLE();
}
break;

    case GPIO_PIN_2:
    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) ==  GPIO_PIN_SET)
    {
        LED2_TOGGLE();
    }
    break;
    
    case GPIO_PIN_3:
    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) ==  GPIO_PIN_SET)
    {
        LED3_TOGGLE();
    }
    break;
}

}
5.7 效果展示
遥控器按下A,红灯状态反转;按下B,黄灯状态反转;按下C,绿灯状态反转。

下图是按下A、B、C,三灯齐亮的效果。

  1. 总结
    随着物联网的快速发展和智能化需求的增加,无线通信技术将扮演越来越重要的角色。433M 模块作为一种低功耗、长距离传输的技术,具有广泛的应用前景。从遥控门禁到智能家居自动化,从环境监测到安防系统,433M 模块为各种应用场景带来了便捷和创新。希望本文能够给您带来小小的启发,并激发您在无线通信领域进一步探索和创造的热情。感谢各位看官, peace and love!

另外,想进大厂的同学,一定要好好学算法,这是面试必备的。这里准备了一份 BAT 大佬总结的 LeetCode 刷题宝典,很多人靠它们进了大厂。

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

推荐阅读:

欢迎关注我的博客:良许嵌入式教程网,满满都是干货!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Linux系统工程师
手记
粉丝
82
获赞与收藏
268

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消