1.433M无线模块工作原理
数据发射模块的工作频率为315M,采用声表谐振器SAW稳频,频率稳定度极高,当环境温度在-25~+85度之间变化时,频飘仅为3ppm.接收到信号,接收模块对应针脚输出高电平,有DO D1 D2 D3,可能对应遥控器的A/B/C/D。
2.引脚接线
1.供电正极,连接此引脚到电源5V,以提供433M无线模块所需的电流
2.GND():地,连接此引脚到电源的负极或者地。
3.DO-D4:连接控制输入信号通常用于连接控制信号,当按键变换控制外设信号
3.433M控制灯软件开发流程
· 初始化系统
。 初始化433M DO-D1引脚对应的GPIO外设时钟
。 初始化433M DO-D1 引脚配置
•433M按键控制外设
1:wireless.c工程
#include "wireless.h"
#include "stm32f10x.h"
void Wireless_Init(void)//433无线遥控灯的初始化函数
{
//有两个步骤 :1:初始化433无线遥控D0和D1的外设 2:初始化433无线遥控灯时钟
GPIO_InitTypeDef Wireless_Initstruct;//初始化433无线遥控灯结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );//打开APB2总线下GPIOA的时钟
Wireless_Initstruct.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_2;//配置A0和A2引脚
Wireless_Initstruct.GPIO_Mode= GPIO_Mode_IPD;//配置引脚输入模式为下拉输入
GPIO_Init(GPIOA, &Wireless_Initstruct);//初始化GPIOA的结构体
}
2:wireless.h工程
#ifndef WIRELESS_H_
#define WIRELESS_H_
void Wireless_Init(void);//声明函数
#endif
3:main.c工程
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "Bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"
#include "wireless.h"
void delay(uint16_t time)//延时1ms 软件延时粗延时
{
uint16_t i=0;
while(time --)
{
i=12000;
while(i --);
}
}
int main()
{
Wireless_Init();//调用函数,初始化433无线模块的时钟和引脚配置
LED_Init();//初始化灯的时钟和引脚配置
GPIO_SetBits(GPIOA, GPIO_Pin_1);//初始化灯灭
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1)//因为接收模块对应针脚输出高电平,当按键A按下;A0输入高电平。
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);//灯亮
}
else if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==1)//因为接收模块对应针脚输出高电平,当按键B按下;A2输入高电平。
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);//灯灭
}
}
}
4:代码心得补充
函数声明问题: void Wireless_Init();
和 void LED_Init();这里只是简单的函数声明,而不是函数调用。正确的函数调用应该去掉 void 关键字,例如
Wireless_Init();和 LED_Init();。这两个函数可能分别用于初始化无线通信模块和LED相关的GPIO引脚。
GPIO引脚状态判断问题:
if(GPIO_Pin_0 ==1)和
else if(GPIO_Pin_2 ==1) 这种写法是错误的。GPIO_Pin_o 和 GPIO_Pin_2是GPIO引脚的宏定义,代表引脚编号,不能直接和 1进行比较。应该使用GPIO_ReadInputDataBit 函数来读取引脚的电平状态
补充:
1. **模拟输入模式** `GPIO_Mode_AIN`
- **功能**:信号直接进入ADC/DAC模块,**不经过**施密特触发器或上下拉电阻[3]][4]]。
- **应用场景**:
- 用于ADC采集模拟信号(如温度传感器、电压检测)。
- 低功耗场景下关闭数字电路以省电。
---
### 2. **浮空输入模式** `GPIO_Mode_IN_FLOATING`
- **功能**:引脚电平完全由外部输入决定,内部无上下拉电阻,处于高阻态[3]][4]]。
- **应用场景**:
- 需要检测外部信号电平变化的场景(如按键检测)。
- **注意**:引脚悬空时易受干扰,需外部电路保证稳定电平。
---
### 3. **下拉输入模式** `GPIO_Mode_IPD`
- **功能**:内部启用约30-50kΩ下拉电阻,默认电平为低,仅当外部输入高电平时才会拉高[3]][4]]。
- **应用场景**:
- 检测高电平触发信号(如高有效传感器输出)。
- 避免悬空引脚因干扰产生误触发。
---
### 4. **上拉输入模式** `GPIO_Mode_IPU`
- **功能**:内部启用约30-50kΩ上拉电阻,默认电平为高,仅当外部输入低电平时才会拉低[3]][4]]。
- **应用场景**:
- 检测低电平触发信号(如按键接地触发)。
- 常用作总线信号的默认保持状态(如I2C的SDA、SCL)。
---
### 5. **开漏输出模式** `GPIO_Mode_Out_OD`
- **功能**:仅能输出低电平或高阻态,需外接上拉电阻实现高电平输出[3]][5]]。
- **应用场景**:
- 支持“线与”逻辑的总线(如I2C)。
- 驱动不同电压电平的外设(如5V器件与3.3V MCU通信)。
---
### 6. **推挽输出模式** `GPIO_Mode_Out_PP`
- **功能**:可主动输出高/低电平,驱动能力强,无需外接上拉电阻[3]][5]]。
- **应用场景**:
- 控制LED、继电器等需直接驱动能力的设备。
- 高速信号传输(如SPI、PWM输出)。
---
### 7. **复用开漏输出模式** `GPIO_Mode_AF_OD`
- **功能**:复用外设控制开漏输出,需外接上拉电阻[3]][6]]。
- **应用场景**:
- 外设总线通信(如I2C的SCL、SDA引脚)。
- 复用功能下的电平兼容性需求场景。
---
### 8. **复用推挽输出模式** `GPIO_Mode_AF_PP`
- **功能**:复用外设控制推挽输出,直接输出高/低电平[3]][6]]。
- **应用场景**:
- 高速外设信号(如USART_TX、SPI_MOSI)。
- 需要强驱动能力的复用功能(如定时器PWM输出)。
---
### **模式选择建议**
1. **输入模式**:
- 优先选上拉/下拉输入,避免浮空输入的不确定性[4]]。
2. **输出模式**:
- 常规控制选推挽输出,总线通信选开漏输出[5]]。
3. **复用模式**:
- 需与外设功能匹配(如I2C必须用复用开漏)[6]]。