目录
3.调试模式选择为串口、选择高速时钟选择为外部晶振、配置时钟
1、所需模块
- 振动传感器
- 433M无线接收模块
- 继电器
2、模块使用介绍
1.震动传感器
单片机供电
VCC GND
接单片机,产品不震动,输出高电平,模块上的AO
口。产品震动,输出低电平,绿色指示灯亮 AO口不用
2.433M无线接收模块
单片机供电
VCC GND
接单片机,接收到信号,接收模块对应针脚输出高电平,有D0 D1 D2 D3
,对应遥控器的
ABCD
3.继电器
单片机供电
VCC GND
接单片机 最大负载电路交流250V/10A,
直流
30V/10A 模块可以通过跳线设置高电平触发或者低电平触发(默认)
4.喇叭有两根线通过继电器来控制
3、使用STM32CubeMX创建项目
1.模块的接线
继电器的口接PA7口,433M无线接收模块分别接PA5、PA6口,振动传感器接PA4口
2.根据需求创建项目
1.访问MCU选择器
2. 选择自己对应的单片机型号,然后双击它
3.调试模式选择为串口、选择高速时钟选择为外部晶振、配置时钟
4. 直接在图上点击对应的引脚选择你需要的模式
433M无线接收模PA5、PA6口:因为接收模块接收到信息时会向对应针脚输出高电平,所以中断触发模式选择上沿触发
振动传感器PA4口:当发送震动时输出低电平,所以中断触发模式我们选择下沿
PB8、PB9选择默认高电平不亮
5.打开对应的中断
6.创建工程
4、根据需求编写代码
#define BJ_ON 1
#define BJ_OFF 0
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//重写中断函数
{
//设置一个控制位
static int control = BJ_OFF;
switch(GPIO_Pin)
{
case GPIO_PIN_4:
//震动传感器,发生震动时传出低电平(下降沿)。继电器,当接收到低电平时,开关打开5s,报警器响5s
//我这里因为在寝室所以选择用PB8的led1来实验,喇叭太吵了
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == GPIO_PIN_RESET && control == BJ_ON)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
HAL_Delay(10000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}
break;
case GPIO_PIN_5:
//433M无线接收模块,A被按下点位被拉高,开启警报模式报警器响2s
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5) == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
HAL_Delay(5000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
control = BJ_ON;//打开报警模式,震动传感器震动就报警5s
}
break;
case GPIO_PIN_6:
//433M无线接收模块,A被按下点位被拉高,开启警报模式报警器响1s
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6) == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
control = BJ_OFF;//关闭报警模式,震动传感器震动也不会报警
}
break;
}
}
这里注意:
如果直接在中断服务函数里调用
HAL_Delay
函数,则会造成系统卡死。
原因:程序初始化时
默认把滴答定时器的中断优先级设为最低
,其它中断源很容易打断它导致卡死。
解决:在
main
函数里使用以下函数提高滴答定时器的中断优先级(提升至
0
):
HAL_NVIC_SetPriority(SysTick_IRQn,0,0);