蓝桥杯嵌入式第七届省赛:模拟液位检测告警系统全模块解析

发布时间:2026/7/16 7:49:50

蓝桥杯嵌入式第七届省赛:模拟液位检测告警系统全模块解析
1. 项目背景与需求解析第七届蓝桥杯嵌入式省赛的模拟液位检测告警系统是一个典型的工业控制场景应用。这个项目要求选手通过STM32开发板实现一个完整的液位监控系统涉及模拟信号采集、数据处理、人机交互和通信协议等多个嵌入式开发核心技能点。系统核心需求可以拆解为五个关键模块模拟量采集通过电位器R37模拟液位传感器输出需要完成ADC采集和软件滤波阈值管理支持三级阈值设置默认30/50/70cm参数需存储到EEPROM状态判断根据当前液位高度自动划分四个等级0-3级通信接口通过USART2实现与PC的数据交互查询自动上报状态指示三路LED分别表示运行状态、液位变化和通信事件在实际工业场景中类似的液位检测系统广泛应用于储罐监控、化工生产等领域。比赛中将工业场景简化为开发板上的电位器模拟但完整保留了真实系统中的技术要点。2. 硬件架构设计2.1 核心硬件配置系统基于蓝桥杯官方CT117E开发板主控采用STM32F103RBT6主要外设包括ADC通道PA1连接电位器R37模拟液位信号EEPROMAT24C02芯片存储阈值参数显示模块LCD12864液晶屏输入设备四个独立按键K1-K4指示设备三个LED灯LD1-LD3通信接口USART2PA2/PA3硬件连接示意图[电位器R37] -- [PA1(ADC1)] [按键K1-K4] -- [PE2-PE5] [LCD12864] -- [FSMC接口] [USART2] -- [CH340G USB转串口]2.2 关键电路设计要点ADC前端处理电位器输出接入RC低通滤波R10kΩ, C0.1μF参考电压使用板载3.3V稳压源采样周期设置为239.5周期对应约1ms采样时间EEPROM电路I2C总线需配置4.7kΩ上拉电阻地址引脚全部接地设备地址0xA0写入周期需延时5ms以上抗干扰设计所有数字信号线串联22Ω电阻模拟地与数字地单点连接电源入口处增加100μF0.1μF去耦电容3. 软件架构实现3.1 主程序流程图void main() { HAL_Init(); SystemClock_Config(); Peripheral_Init(); Level_Init(); // 初始化液位等级 Init_Data(); // 从EEPROM加载阈值 while(1) { Setting(); // 按键处理与界面管理 Level_Control(); // 液位状态判断 Usart_Control(); // 串口通信处理 Led_Control(); // LED状态更新 } }3.2 模块化设计要点ADC采集与滤波采用递推平均滤波算法窗口大小10电压转高度公式Height ADC_Value * 3300 / 4096 * 100 / 3300关键代码#define FILTER_N 10 uint16_t filter_buf[FILTER_N]; uint16_t Get_Filtered_ADC() { static uint8_t index 0; filter_buf[index] HAL_ADC_GetValue(hadc1); if(index FILTER_N) index 0; uint32_t sum 0; for(uint8_t i0; iFILTER_N; i) { sum filter_buf[i]; } return sum / FILTER_N; }EEPROM存储管理使用页写入模式每页8字节存储结构地址内容长度0x00阈值1302字节0x02阈值2502字节0x04阈值3702字节状态机设计系统存在两个主要状态graph LR A[监测模式] --|K1按下| B[设置模式] B --|K1按下| A设置模式下有三个子状态对应三个阈值设置4. 关键难点解决方案4.1 液位等级变化检测这是本项目的核心难点需要准确捕捉液位跨越阈值时刻。解决方案采用新旧值对比法在全局变量区定义int Liquid_Level; // 当前等级 int Old_Level; // 上次等级初始化时通过Level_Init()函数获取初始等级在主循环中实时比较void Level_Control() { // 获取当前液位高度 Liquid_Height Get_Current_Height(); // 判断等级变化 if(Liquid_Height Threshold1) { Liquid_Level 0; } else if(Liquid_Height Threshold2) { Liquid_Level 1; } // 其他等级判断... // 检测变化 if(Liquid_Level ! Old_Level) { Send_Report(Liquid_Height, Liquid_Level); // 发送上报 Trigger_LED2(); // 触发指示灯 Old_Level Liquid_Level; // 更新旧值 } }4.2 串口协议解析采用状态机实现协议解析支持两种查询指令和自动上报接收状态机设计typedef enum { WAIT_START, RECEIVING, PARSE_COMPLETE } UART_State; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { static UART_State state WAIT_START; static uint8_t index 0; switch(state) { case WAIT_START: if(rx_buf[0] C || rx_buf[0] S) { state RECEIVING; index 1; } break; case RECEIVING: if(rx_buf[index] \n) { state PARSE_COMPLETE; } break; } }数据打包示例void Send_Threshold_Response() { char buffer[32]; sprintf(buffer, S:TL%dTM%dTH%d\r\n, Threshold1, Threshold2, Threshold3); HAL_UART_Transmit(huart2, (uint8_t*)buffer, strlen(buffer), 100); }5. 调试技巧与常见问题5.1 典型问题排查表现象可能原因解决方案ADC读数不稳定未做滤波/采样时间不足增加软件滤波调整采样周期EEPROM写入失败未满足写入时序要求添加5ms延时检查I2C上拉串口数据乱码波特率不匹配核对双方波特率9600-8-N-1液位变化误报Old_Level初始化错误上电后立即读取初始液位等级LCD显示异常未及时清屏切换界面时调用LCD_Clear()5.2 实时调试建议利用SWD接口在Keil中设置实时变量监控Watch窗口重点监测Liquid_Height, Liquid_Level, Threshold1-3串口打印调试printf(ADC%.2fV H%dcm\r\n, ADC_Voltage, Liquid_Height);LED辅助调试临时修改LED闪烁模式指示不同状态例如快速闪烁表示进入异常分支6. 工程优化建议6.1 代码结构优化使用模块化头文件组织/Inc ├── adc.h ├── eeprom.h ├── lcd.h ├── uart.h └── main.h采用面向对象思想封装typedef struct { uint16_t raw_adc; float voltage; int height; void (*update)(void); } LiquidSensor_TypeDef; void LiquidSensor_Update() { // 实现采集逻辑 }6.2 性能提升方向ADC采样优化启用DMA连续采样模式采用硬件过采样16倍通信协议增强添加CRC校验字段实现超时重传机制低功耗设计void Enter_LowPower() { HAL_ADC_Stop(hadc1); HAL_UART_DeInit(huart2); HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); }7. 备赛训练建议模块化训练路线第一阶段独立模块练习ADC、EEPROM、USART第二阶段功能组合实现ADCLCD显示第三阶段完整系统集成真题训练顺序第十一届省赛基础外设第十届省赛状态机设计第八届省赛复杂通信协议第九届省赛多任务调度调试能力培养熟练使用逻辑分析仪抓取时序掌握Keil在线调试技巧断点、变量监控建立系统化调试日志记录习惯在实际开发中我建议先使用STM32CubeMX生成基础外设配置然后重点编写业务逻辑代码。比赛中要注意合理分配时间先实现核心功能再完善细节。这个项目的完整代码已经过实际验证在蓝桥杯官方开发板上运行稳定可以作为可靠的参考实现。

相关新闻

51单片机驱动无源蜂鸣器演奏《小星星》

51单片机驱动无源蜂鸣器演奏《小星星》

2026/7/16 7:49:50

1. 项目背景与硬件准备第一次用51单片机驱动无源蜂鸣器播放音乐时,我盯着电路板上的小喇叭发愣——这玩意儿真能唱出《小星星》?后来才发现,只要掌握频率控制和定时器中断这两个关键点,单片机播放音乐比想象中简单得多。无源蜂鸣器…

基于51单片机的DAC信号发生器:4种波形生成与频率调节的软硬件实现

基于51单片机的DAC信号发生器:4种波形生成与频率调节的软硬件实现

2026/7/16 7:49:50

1. 系统整体设计思路第一次用51单片机做信号发生器时,我对着示波器上扭曲的波形发愁了一整晚。后来才发现,DAC0832的基准电压没调准,导致输出波形幅度漂移。这个经历让我明白,硬件电路每个细节都关乎最终效果。本设计采用模块化架…

C++实现布尔表达式真值表:从词法分析到AST求值全解析

C++实现布尔表达式真值表:从词法分析到AST求值全解析

2026/7/16 7:39:49

1. 项目概述最近在整理一些数字电路和逻辑设计的资料,发现手动推导复杂布尔表达式的真值表不仅耗时,还容易出错。作为一个有十多年经验的C开发者,我习惯性地想:能不能写个程序来自动化这个过程?于是,就有了…

Greenfield vs Brownfield:软件开发中的“绿地”与“棕地”项目全解析

Greenfield vs Brownfield:软件开发中的“绿地”与“棕地”项目全解析

2026/7/16 9:09:59

引言:从建筑术语到软件工程在建筑领域,“绿地”(Greenfield)指从未开发过的原始土地,而“棕地”(Brownfield)则指曾经被开发、利用过,如今需要改造或重建的场地。这两个概念被引入软…

网络协议深度解析——用Wireshark实战TCP/IP与HTTP

网络协议深度解析——用Wireshark实战TCP/IP与HTTP

2026/7/16 9:09:59

1. Wireshark:网络协议的"显微镜"第一次接触Wireshark时,我被它强大的抓包能力震撼到了——就像突然获得了透视网络流量的超能力。这个开源工具能让我们亲眼看到数据如何在网络中流动,把抽象的TCP/IP协议变成可视化的数据包。还记得…

最优化方法核心算法实战:从线性规划到罚函数法的计算精解

最优化方法核心算法实战:从线性规划到罚函数法的计算精解

2026/7/16 9:09:59

1. 最优化方法入门:从实际问题到数学模型 最优化方法就像一位隐形的"生活规划师",每天帮我们做各种决策——从导航软件选择最短路径,到投资组合优化收益风险比。想象一下周末超市采购的场景:如何在预算内买到最多商品&a…

硬件工程师面试全攻略:从电路分析到PCB设计

硬件工程师面试全攻略:从电路分析到PCB设计

2026/7/16 9:09:59

1. 硬件工程师面试题解析:从基础到实战最近在技术群里看到一份流传的硬件工程师面试题合集,发现不少题目确实能考察出工程师的真实水平。作为从业十年的硬件老兵,我决定拆解其中几道典型题目,分享解题思路和背后的知识体系。硬件工…

计算机毕业设计之基于jsp师资管理系统

计算机毕业设计之基于jsp师资管理系统

2026/7/16 9:09:58

本论文主要论述了如何使用JSP技术开发的一个师资管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。作者将论述师资管理系统的当前背景以及系统开发的目的,后续章节将严格按照…

推理加速-Speculative-PrefixCache与Chunked-Prefill

推理加速-Speculative-PrefixCache与Chunked-Prefill

2026/7/16 8:59:58

推理加速 Speculative Decoding / Prefix Cache / Chunked Prefill / Eagle / Medusa 定位:03-部署-模型Serving 的算法纵深专章。03 讲了 Serving 栈四层 KV Cache 量化 FinOps(工程口径),本篇只挖**「让单次推理更快」的算法…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/16 0:35:09

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/13 20:43:19

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/15 0:26:43

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

Python实现跨境电商商品图批量翻译教程

Python实现跨境电商商品图批量翻译教程

2026/7/16 0:09:31

一、问题引入做跨境电商的卖家朋友,你是否遇到过这样的困扰?每次上架新品到亚马逊、Shopee或Lazada等平台,都需要处理大量商品图片的多语言版本。比如上架200款衣服,每款需要翻译成英语、日语、韩语等5种语言,这意味着…

跨境电商多语言商品图翻译方案实现

跨境电商多语言商品图翻译方案实现

2026/7/16 0:09:31

一、问题引入对于做跨境电商的卖家来说,多语言商品图的制作一直是令人头疼的环节。当你准备在亚马逊、Shopee、Lazada等多个平台同步上架新品时,首先遇到的就是图片翻译问题。以一位做家居用品的卖家为例,他需要将200张商品图片中的英文文案全…

Windows系统文件d3dx9_36.dll丢失找不到问题解决

Windows系统文件d3dx9_36.dll丢失找不到问题解决

2026/7/16 0:09:31

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…