STM32学习——项目一电动车报警器

发布时间:2026/10/11 1:17:44
STM32学习——项目一电动车报警器
项目需求点击遥控器A按键系统进入警戒模式一旦检测到震动小偷偷车则喇叭发出声响报警吓退小偷。点击遥控器B按键系统退出警戒模式再怎么摇晃系统都不会报警否则系统一直发出尖叫让车主尴尬。项目框图硬件清单振动传感器继电器高功率喇叭433M无线接收发射模块杜邦线各个硬件的介绍和实战a.振动传感器介绍单片机供电VCC GND接单片机产品不震动输出高电平模块上的DO口产品震动输出低电平绿色指示灯亮AO口不用在STM32CubeMX建立项目在SYS里Debug设置为串口Serial WriteRCC配置HSE振荡器时钟配置Clock Configuration遵循一条主线和72Mhz打开PA4的GPIO_EXTI4打开PB8的GPIO_OUTPUT将PB8起始位调为高电平不亮将PA4选择下降沿触发中断将中断EXTI4打开编程实现需求当振动传感器接收到振动信号时使用中断方式点亮LED1。void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { //一根中断线上接有多个中断源判断中断请求是否来自PA4 if(GPIO_Pin GPIO_PIN_4) { //如果检测到PA4被拉低 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) GPIO_PIN_RESET) { //则点亮LED1 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET); //延时1秒 HAL_Delay(1000); //关闭LED1 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); } else { //未检测到PA4被拉低则关闭LED1 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); } } }如果直接在中断服务函数里调用HAL_Delay函数则会造成系统卡死。原因程序初始化时默认把滴答定时器的中断优先级设为最低其它中断源很容易打断它导致卡死。解决在main函数里使用以下函数提高滴答定时器的中断优先级提升至0HAL_NVIC_SetPriority(SysTick_IRQn,0,0);并且将EXTI4的中断优先级设置比滴答定时器的中断优先级高比如2。b.继电器工作原理单片机供电VCC GND接单片机VCC需要接3.3V5V不行最大负载电路交流250V/10A直流30V/10A引脚IN接收到低电平时开关闭合。c. 433M无线发射接收模块介绍单片机供电VCC GND接单片机接收到信号接收模块对应针脚输出高电平有D0 D1 D2 D3对应遥控器的ABCD编程实现需求按下遥控器A按键LED1亮1秒按下遥控器B按键LED2亮1秒。D0 -- PA5D1 -- PA6void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { switch(GPIO_Pin) { //如果检测到PA5拉高按键A被按下 case GPIO_PIN_5: if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5) GPIO_PIN_SET) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET); HAL_Delay(1000); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); }else { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); } //将PB8拉低LED1亮1秒 break; //如果检测到PA6拉高按键B被按下 case GPIO_PIN_6: if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6) GPIO_PIN_SET) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET); HAL_Delay(1000); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET); }else { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET); } //将PB9拉低LED2亮1秒 break; } }项目设计及实现项目设计需求如果检测到PA4被拉低小偷偷车并且警报模式打开则将PB7拉低继电器通电喇叭一直响按下A按键启动警报模式启动时PA5拉高同时PB7拉低响2秒后电平恢复进入警报模式标志位为ONON时当有小偷偷车PA4拉低触发PB7拉低继电器通电报警器一直响按下B按键解除警报模式启动时PA6拉高同时PB7拉低响1秒后电平恢复解除警报模式标志位为OFFOFF时再怎么抖动小车都不会响编程实现#define ON 1 #define OFF 0 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { static int mark OFF; switch(GPIO_Pin) { case GPIO_PIN_4: if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) GPIO_PIN_RESET mark ON) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);//拉低继电器警报器响 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);//LED1亮 HAL_Delay(2000); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//LED2亮 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);//LED1灭 HAL_Delay(2000); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_-SET);//LED2灭 } break; //如果检测到PA5拉高按键A被按下 case GPIO_PIN_5: 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);//LED1亮 HAL_Delay(2000); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);//拉高继电器警报器不响 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);//LED1灭 mark ON; } break; //如果检测到PA6拉高按键B被按下 case GPIO_PIN_6: 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_9,GPIO_PIN_RESET);//LED2亮 HAL_Delay(1000); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);//拉高继电器警报器不响 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//LED2灭 mark OFF; } break; } }