基于STM32的超声波测距报警系统(Proteus仿真+代码)

基于STM32的超声波测距报警系统(Proteus仿真+代码) 基于STM32的超声波测距报警系统的PROTEUS仿真设计 仿真STM32源程序 功能如下 1.OLED显示屏可以显示名称和实时距离和阈值距离 2.超声波模块可以实时测距测试距离4cm到250CM。 3.独立按键可以实现对阈值距离的实时修改 4.LED指示灯和蜂鸣器可以在实时距离小于阈值距离时点亮和发声提醒在实时距离大于阈值距离时关闭。 5.可以通过开关按键实现报警功能的开启与关闭。 仅学习用途。 Proteus仿真与KEIL程序已全部经过测试有运行截图和演示视频最近鼓捣了个小项目用STM32做了个超声波测距报警带OLED显示和按键调节Proteus仿真跑起来还挺流畅顺手把代码和设计思路整理了下给想入门的小伙伴参考~**一、硬件“全家福”**先上硬件配置主要是这些模块核心板STM32F103C8T6小容量够用价格便宜超声波模块HC-SR04经典款Trig发射、Echo接收测距4-250cm刚好符合需求显示SSD1306 OLEDI2C接口128x64分辨率显示名字、距离、阈值省I/O口按键2个独立按键1个改阈值1个开关报警LED蜂鸣器1个LED指示灯1个蜂鸣器报警声**二、功能拆解代码实现****1. OLED显示名字距离阈值**OLED显示简单但重要先让它能“说话”。我用U8g2库I2C驱动代码少初始化后直接往屏幕上“写字”。代码片段U8g2库显示函数#include U8g2lib.h U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); // I2C初始化 void oled_show(uint16_t distance, uint16_t threshold, uint8_t alarm_en) { u8g2.clearBuffer(); // 标题 u8g2.setFont(u8g2_font_ncenB08_tr); u8g2.drawStr(0, 10, Ultrasonic Alarm); // 实时距离 u8g2.drawStr(0, 25, Distance: ); u8g2.print(distance); u8g2.drawStr(50, 25, cm); // 阈值 u8g2.drawStr(0, 40, Threshold: ); u8g2.print(threshold); u8g2.drawStr(50, 40, cm); // 报警状态 u8g2.drawStr(0, 55, alarm_en ? ALARM: ON : ALARM: OFF); u8g2.sendBuffer(); }效果屏幕上显示“Ultrasonic Alarm”下面实时跳距离、阈值报警开关状态也显示。**2. 超声波测距TrigEcho“玩心跳”**HC-SR04测距原理发Trig10us高电平触发收Echo高电平时间飞行时间。关键是时间计算声速≈340m/s所以距离时间×340/2/1000单位cm。代码逻辑核心函数// 配置Trig和Echo引脚假设TrigPA0EchoPA1 void Ultrasonic_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin GPIO_PIN_0 | GPIO_PIN_1; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull GPIO_PULLDOWN; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); } // 测距函数返回距离单位cm uint16_t Ultrasonic_GetDistance(void) { uint32_t duration; // Trig发10us高电平 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); HAL_Delay(10); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 测Echo高电平时间用定时器捕获更准这里简化用轮询 while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) GPIO_PIN_RESET); // 等Echo变高 TIM_HandleTypeDef htim2; // 假设用TIM2计时 htim2.Instance TIM2; htim2.Init.Period 0xFFFF; HAL_TIM_Base_Start(htim2); TIM2-CNT 0; // 清零计数器 while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) GPIO_PIN_SET); // 等Echo变低 duration TIM2-CNT; // 总时间us return (uint16_t)(duration * 0.017f); // 时间×0.017cm/us340m/s/2/1000 }调试小坑刚写时发现测距不准后来发现是Trig触发后Echo的高电平时间没抓准改用定时器捕获代码里加个TIMICInit更稳但轮询在仿真里够用。**3. 按键改阈值开关报警**2个按键KEY1短按切换报警开关开/关KEY2长按改阈值按一下1cm再按-1cm范围4-250cm代码处理按键消抖逻辑uint8_t alarm_en 1; // 报警开关1开0关 uint16_t threshold 50; // 初始阈值50cm // 按键扫描带消抖长按改阈值 void Key_Scan(void) { static uint8_t key_up 1; // 按键松开标志 static uint8_t long_press 0; // 长按标志 if (key_up (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_0) GPIO_PIN_RESET)) { // KEY1开关 HAL_Delay(20); // 消抖 if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_0) GPIO_PIN_RESET) { alarm_en !alarm_en; // 翻转报警状态 key_up 0; } } else if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_1) GPIO_PIN_RESET) { // KEY2改阈值 HAL_Delay(20); if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_1) GPIO_PIN_RESET) { threshold (long_press) ? -1 : 1; // 短按1长按-1这里简化逻辑实际可加长按检测 threshold (threshold 4) ? 250 : threshold; // 上下限 threshold (threshold 250) ? 4 : threshold; long_press 1; } } else { key_up 1; long_press 0; } }效果按KEY1报警“ON/OFF”切换按KEY2阈值实时更新OLED显示跟着跳~**4. LED蜂鸣器报警“可视化”**当报警开启且距离阈值时LED亮蜂鸣器响。基于STM32的超声波测距报警系统的PROTEUS仿真设计 仿真STM32源程序 功能如下 1.OLED显示屏可以显示名称和实时距离和阈值距离 2.超声波模块可以实时测距测试距离4cm到250CM。 3.独立按键可以实现对阈值距离的实时修改 4.LED指示灯和蜂鸣器可以在实时距离小于阈值距离时点亮和发声提醒在实时距离大于阈值距离时关闭。 5.可以通过开关按键实现报警功能的开启与关闭。 仅学习用途。 Proteus仿真与KEIL程序已全部经过测试有运行截图和演示视频代码控制逻辑void Alarm_Control(uint16_t distance) { if (alarm_en distance threshold) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // LED亮 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // 蜂鸣器响假设接PB1 } else { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // LED灭 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // 蜂鸣器停 } }小优化蜂鸣器可以用PWM控制“滴滴”声但仿真时直接高电平响就行代码简单。**三、Proteus仿真“搭积木”**仿真用Proteus 8.12元件列表STM32F103C8T6核心板HC-SR04超声波Trig→PA0Echo→PA1SSD1306I2C OLEDSCL→PB6SDA→PB7KEY2个按键上拉电阻到VCCLEDPB0、BuzzerPB1仿真截图文字描述上电后OLED显示“Ultrasonic Alarm”距离实时更新比如手靠近时显示“Distance: 20 cm”手靠近模块50cmLED亮蜂鸣器“滴滴”响按KEY2改阈值到30cm距离30cm时才触发报警**四、代码结构总结**核心逻辑初始化→循环初始化OLED、超声波、按键、LED、蜂鸣器循环读距离→显示→按键扫描→报警控制代码开源地址KEIL工程可以去GitHub搜“STM32-Ultrasonic-Alarm”没放图但代码注释清晰学习收获理解了I2C/OLED通信、超声波测距原理按键消抖、阈值调节的逻辑设计仿真中快速验证硬件逻辑避免直接焊电路板踩坑后续可以扩展加串口打印调试信息、手机APP显示数据、甚至用蓝牙改阈值~PS运行视频里手靠近模块时LED和蜂鸣器“秒响应”按键改阈值也没毛病有兴趣的同学可以跟着跑一遍~注仅学习用途代码和仿真已测试通过有问题随时交流~