STM32实现电动车报警器

目录

1、所需模块

2、模块使用介绍

1.震动传感器

2.433M无线接收模块

3.继电器

4.喇叭有两根线通过继电器来控制 

3、使用STM32CubeMX创建项目

1.模块的接线

2.根据需求创建项目

1.访问MCU选择器

2. 选择自己对应的单片机型号,然后双击它

3.调试模式选择为串口、选择高速时钟选择为外部晶振、配置时钟

 4. 直接在图上点击对应的引脚选择你需要的模式

5.打开对应的中断

​编辑 6.创建工程

4、根据需求编写代码

这里注意: 

1、所需模块

  1. 振动传感器
  2. 433M无线接收模块
  3. 继电器

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值