基于51单片机的四轮胎压监测报警系统设计
简介围绕51单片机实现的汽车胎压监测报警系统这份资料包将程序、仿真、原理图与元件清单打包在一起面向电子信息、汽车电子方向的课程设计者与单片机初学者用于解决从电路搭建到程序调试缺少完整参考方案的问题。内容按压力传感器采集、信号处理、液晶显示、声光报警与电源五部分展开配套程序涵盖端口与定时器初始化、数据采集滤波、胎压换算、阈值比较报警与显示刷新等环节原理图部分给出传感器连接方式与单片机外围接口设计元件清单便于按型号规格采购仿真文件可在软件环境中先行验证时序与逻辑并提前暴露设计问题。压缩包约9.87MB文件总数与类型明细以平台记录为准、暂未列出可按标题所述的程序、仿真、原理图、清单四类内容查收。已有319人学习适合需要一套可跑通、可对照修改的胎压监测入门与课设参考。1. 需求切入为什么胎压监测这类题目最好别一上来就选专用芯片带过几届毕业设计之后我发现选「基于51单片机汽车胎压监测报警系统」这类题目的人最常见的翻车点在于一开始被专用 TPMS 芯片的完整功能吸引整套方案做到一半才发现通信协议调不通、样片买不到、仿真里根本没有对应模型。胎压监测报警系统的本质其实很清楚把轮胎里的压力变成电压把电压变成数字把数字与门限比较超了就响。51 单片机做这件事完全够用它的价值不在算力而在于整条链路每一环都看得见、改得动、测得出。这套方案要解决的就是「四轮压力实时采集 分级报警 阈值可设可存 能仿真能实物」这一组需求适合要交一份完整毕设或课程设计、并且希望答辩时能对着原理图讲清每个元件作用的人。2. 总体方案设计四路采集、一路 ADC 与三级报警的职责划分2.1 系统总体结构与信号链路整套系统按信号流向来拆可以分成五个部分传感层、切换层、转换层、控制层、人机层。传感层是四个安装在轮胎气门嘴位置的压阻式压力传感器输出与压力成正比的模拟电压切换层用一片八选一模拟开关把四路信号轮流送到同一根线上转换层是一颗 8 位串行 ADC把模拟电压变成 0255 的数字量控制层是 51 单片机最小系统负责轮询、换算、比较、判断人机层是 LCD1602 显示、三个设置按键、蜂鸣器与四颗状态指示灯。这条链路里最关键的设计决策是「四路传感器共用一路 ADC」。如果四个轮子各配一颗 ADC硬件上要多三颗芯片、多三组 IO程序里要维护四套读取时序出错面成倍放大而共用一路 ADC 的代价只是在切换通道后加一段稳定延时通常 100200 微秒就够。我一般会把这个取舍直接写进答辩 PPT 的第一页架构图因为它是整个方案里最能体现「你想过成本」的地方。轮流采集的节奏也要定下来。四个轮子不需要同时读轮胎压力的变化时间尺度是秒级甚至分钟级单片机每 20 毫秒读一个轮子、80 毫秒轮完一圈完全够用。这样安排还有一个隐性好处单次采集占用的 CPU 时间很短主循环里可以塞进按键扫描、显示刷新、蜂鸣器节奏控制这些事不会互相卡住。从设计完整性看还要预留两个扩展位。一个是温度补偿轮胎跑热之后压力会上升温差大的地区这个偏差能有十几 kPa加一颗 DS18B20 做环境温度采集报警判断时按温度修正门限是很自然的加分项另一个是数据记录用 AT24C02 存最近若干次报警的压力值和时间答辩时能拿出「历史记录」这种可展示的东西。这两项不是必须但方案里留了接口说明你想过系统的边界在哪。2.2 传感器与 ADC 的选型账压力传感器是这套方案里最容易选错的器件选错的核心原因往往是量程而不是精度。很多资料里出现的 MPX4115 系列量程是 15115 kPa它的典型用途是气压计、海拔计、真空度检测拿来测轿车轮胎 220250 kPa 的压力直接就饱和了输出顶在电源轨上不动。这个坑非常隐蔽仿真的激励源是你自己手动设的电压你怎么设它都「正常」只有换成实物才发现读数永远是一个常数。按量程分档比较合理的选择是这样的器件型号量程灵敏度适用场景备注MPX4115AP15115 kPa45 mV/kPa气压、海拔、真空不适合胎压容易满量程饱和MPX4250AP15250 kPa20 mV/kPa轿车、SUV 轮胎量程刚好覆盖常用区间MPX5700AP0700 kPa6.4 mV/kPa货车、高压胎分辨率偏粗约 3 kPa/LSB选 MPX4250AP 的理由是量程和分辨率的平衡。它输出与压力的关系是 Vout Vs × (0.004 × P − 0.04)Vs 取 5VP 单位 kPa。也就是说 220 kPa 时输出约 4.24V250 kPa 时约 4.8V没有顶到电源轨同时每 kPa 对应 20 mV配 8 位 ADC、5V 基准一个 ADC 码约 19.6 mV折算下来分辨率接近 1 kPa对胎压判断来说绰绰有余。ADC 方面8 位、串行、两通道的 ADC0832 是这类课设里最稳的选择。它只需要三根 IO 线时序简单Proteus 元件库里有现成模型价格也便宜。有人会问为什么不直接用 51 内部没有的 ADC——因为经典 51 确实没有片上 ADCSTC 系列部分型号有但仿真模型支持不好答辩现场打不开就是事故。8 位精度对胎压够不够按上面的账算1 kPa 的分辨率对应轮胎压力 2% 左右的精度而胎压报警的门限带宽通常给到 ±10 kPa精度富余量很大。这里还有一个跟仿真有关的务实处理。有些仿真元件库里没有 MPX4250 的模型只有 MPX4115那就在仿真里用 MPX4115 顶替程序里把换算系数改回 4115 的公式把「仿真验证逻辑、实物验证精度」这两件事分开。程序里我通常把传感器系数写成宏换器件只改一行不动机器。2.3 报警分级策略三级门限与回差设计胎压报警最忌讳的是「一门限打天下」。设一个 200 kPa 的下限压力在 199 和 201 之间来回抖蜂鸣器就会哒哒哒响个不停这是最典型的翻车现场。解决办法是三级门限加回差。第一级是欠压报警。轿车冷态标准胎压一般在 220250 kPa低于 180 kPa 就该提示低于 160 kPa 属于危险需要更急促的声光提示。第二级是过压报警高于 280 kPa 提示高于 300 kPa 危险。第三级是慢漏气判断这一级不靠绝对门限靠变化率如果某个轮子在 5 分钟内压力下降超过 15 kPa即使还在正常区间内也要报警因为这说明它在漏。回差的实现方式很简单进入报警用一组门限解除报警用另一组两组之间留 10 kPa 的带宽。压力从 185 掉到 179触发欠压要等它回到 190 以上才解除。这 10 kPa 就是防抖带能把测量噪声完全吃掉。提示回差带宽不要设得太小。8 位 ADC 加传感器自身误差单次读数波动几个 kPa 是常态回差小于 5 kPa 基本等于没加。四个轮子的状态要分开维护不能用一个全局标志。左前轮欠压和右后轮过压是两回事显示上要能定位到具体轮位指示灯也要一一对应。程序里我用一个四元素的数组存每个轮子的状态显示时遍历这个数组哪个不等于 0 就在对应位置打标记。3. 硬件设计与原理图落地电源、通道切换与报警驱动的关键细节3.1 最小系统与电源分区51 最小系统包含单片机、晶振电路、复位电路三块。晶振取 11.0592 MHz 还是 12 MHz取决于你要不要用串口。这套系统不需要串口通信12 MHz 更省事定时器初值算出来是整数1 毫秒定时不用补偿。复位电路用经典的 10 微法电容加 10k 电阻上拉加一个手动复位按键方便调试时随时重启。电源部分是这个方案里最容易被做糙的地方。整车环境是 12V但做课设通常是 5V 适配器或者 USB 供电所以板上要有一片 7805 做稳压输入端加一个二极管做反接保护输入输出各挂 100 微法和 0.1 微法电容。0.1 微法那几颗陶瓷电容不是可选项——传感器输出是毫伏级变化的模拟量单片机每到时钟边沿都会往电源上打一个尖峰去耦没做好采回来的数据就是玄学动一下杜邦线数值就变。模拟部分和数字部分的供电我一般分开走线7805 出来的 5V 先给模拟侧再经一个磁珠或者 10 欧电阻给数字侧两边的地在电源入口处单点汇合。如果板子做得很小、走线很短这一条可以简化但至少要在传感器供电脚旁边放一颗 0.1 微法电容这是底线。3.2 传感器接口与 CD4051 通道切换电路四路传感器的接法是这样的每个传感器的信号输出各串一个 1k 电阻再并一个 0.1 微法电容到地组成一个简单的 RC 低通截止频率约 1.6 kHz把开关电源的高频噪声挡在外面然后接到 CD4051 的 X0X3 四个输入通道。CD4051 的 A、B、C 三个地址脚分别接单片机 P1.5、P1.6、P1.7X 公共端接 ADC0832 的 CH0。这里有几个必须写进原理图注释的点。第一CD4051 的 INH 脚必须接地悬空会让它处于不确定状态读出来的值随机跳。第二CD4051 的 VEE 脚在单电源供电时要接地VSS 也接地VDD 接 5V这三个脚的接法错了芯片根本不工作。第三模拟开关有导通电阻典型值一两百欧配合后级 ADC 的输入阻抗一般没问题但如果你的 RC 滤波电阻取到 10k 以上分压误差就会显现读数系统性偏低。通道切换的时序也要在硬件上留出余地。CD4051 从地址变化到输出稳定典型时间是几十纳秒但考虑到布线电容和传感器输出阻抗程序里切换地址后我会延时 200 微秒再启动 ADC 转换。这个延时看着浪费实际上是把「偶发的第一个数偏大」这种诡异现象彻底掐掉。传感器本身的供电要单独考虑。MPX4250 是比例式输出它的读数和供电电压直接相关供电从 5.00V 掉到 4.90V读数就偏低 2%相当于 45 kPa。所以传感器的 5V 一定要从稳压后的同一路取不能从单片机的 IO 口或者 USB 的 5V 直接引。3.3 显示、按键与声光报警驱动显示用 LCD1602四线或八线都行。八线占用 IO 多但时序简单四线省 IO 但初始化要发两次。这套系统 IO 还够用我倾向八线D0D7 接 P0 口P0 口必须外接 10k 排阻上拉因为 51 的 P0 是开漏结构不加上拉送不出高电平屏幕会一片空白——这是新手最常见的第一道坎。LCD1602 的三个控制脚 RS、RW、E 分别接 P2.0、P2.1、P2.2。RW 接地只写不读也行但那样就得靠延时等待内部忙状态写指令后延时 2 毫秒、写数据后延时 1 毫秒程序会变慢但不会错。接上 RW 做忙检测刷新速度能快不少代价是多一根线和一个读函数。按键三个设置、加、减。接 P3.2、P3.3、P3.4配上拉电阻按下接地程序里做 20 毫秒消抖。三个键够用了短按设置键在「上限设置、下限设置、返回显示」之间循环加减键调整数值。报警输出分两路。一路是蜂鸣器不能直接用 IO 口驱动51 的 IO 灌电流能力有限要经一个 S8550 三极管放大蜂鸣器接在集电极上基极串 1k 电阻到 IO 口。有源蜂鸣器直接给电平就响无源的要给 24 kHz 方波我用无源的因为能用不同频率区分欠压和过压——欠压是慢速断续过压是快速连续。另一路是四颗 LED对应四个轮位各串 1k 限流电阻接 IO 口正常时全灭异常的那颗常亮或闪烁。注意蜂鸣器如果是电磁式带线圈的那种三极管集电极到电源之间必须反并一个续流二极管否则断电瞬间的反峰电压会顺着电源打到单片机上表现为「一报警就复位」。这个现象极像程序跑飞实际是硬件问题。3.4 元件清单的使用方式与替代料元件清单在这套方案里的作用不止是采购它其实是硬件设计的索引。看清单的时候要盯三列位号、参数、封装。位号决定它在原理图的哪个位置参数决定它能不能换封装决定 PCB 焊盘和实物能不能对上。几个常被忽略的替代关系值得提前说清。传感器如果买不到 MPX4250AP可以换成同量程段的其它比例输出型压力传感器只要满足「5V 供电、输出 0.24.8V、线性度尚可」三条程序里改一个换算系数就能跑。晶振 12 MHz 换成 11.0592 MHz定时器初值要重算串口相关代码不用改因为本来就没用。LCD1602 换成 1602A 带背光的版本接线完全一致只是多两个背光引脚。蜂鸣器有源换无源软件上要把「置高电平」改成「定时器翻转 IO」。电阻电容这类无源件误差等级比数值更重要。RC 滤波里的电容用 10% 精度的瓷片电容就够但 ADC 基准脚旁边的滤波电容、复位电路的电解电容容量偏差太大会影响上电时序。我一般会在清单上给这几颗标「精度优先」采购时不要用随手抓的散料顶替。4. 软件实现从 ADC 采样到迟滞判断的完整链路4.1 主循环的时间片划分软件结构不用上 RTOS51 的 RAM 也扛不住。用一个定时器做 1 毫秒基准主循环里按计数分频出几个时间片20 毫秒做一次 ADC 采样每次采一个轮子四轮轮询100 毫秒刷新一次显示10 毫秒扫一次按键报警输出由判断结果直接控制。/* 定时器0 初始化12MHz 晶振1ms 中断 */ void timer0_init(void) { TMOD 0xF0; TMOD | 0x01; // 定时器0 工作在模式116位 TH0 0xFC; // 12MHz 下 1ms 初值65536-1000 TL0 0x18; ET0 1; // 允许定时器0 中断 EA 1; // 开总中断 TR0 1; // 启动定时器 } volatile unsigned int tick_1ms 0; void timer0_isr(void) interrupt 1 { TH0 0xFC; // 重装初值模式1 不会自动重装 TL0 0x18; tick_1ms; }这段代码的关键在最后两行模式 1 是 16 位定时器溢出后不会自动重装初值所以中断服务函数里必须手动重装漏了这一步定时周期会变成 65.5 毫秒整个时间片全乱。主循环用tick_1ms的差值做非阻塞判断而不是用delay()死等这样按键响应不会被采样流程卡住。四轮轮询用一个 03 的索引每次采样完索引加一取模回零。每个轮子的采样结果存进pressure[4]数组同时记录采样时刻给后面的漏气速率计算用。4.2 ADC0832 驱动与中位值平均滤波ADC0832 是串行时序器件CS 拉低开始一次转换前三个时钟周期送起始位、单端模式位、通道选择位然后读 8 位数据高位在前。下面这个函数是单通道读取/* ADC0832 引脚定义CSP1.2, CLKP1.3, DI/DOP1.4DI、DO 并接一根线 */ sbit ADC_CS P1^2; sbit ADC_CLK P1^3; sbit ADC_DIO P1^4; unsigned char adc0832_read(unsigned char ch) { unsigned char i, dat 0; ADC_CS 0; // 片选有效开始一次转换 ADC_CLK 0; ADC_DIO 1; // 起始位 ADC_CLK 1; ADC_CLK 0; ADC_DIO 1; // SGL/DIF 1单端输入模式 ADC_CLK 1; ADC_CLK 0; ADC_DIO ch 0x01; // ODD/SIGN 位0 选 CH01 选 CH1 ADC_CLK 1; ADC_CLK 0; ADC_DIO 1; // 释放数据线之后该引脚转为输入 for (i 0; i 8; i) { // 高位在前逐位读取 ADC_CLK 1; ADC_CLK 0; dat (dat 1) | (unsigned char)ADC_DIO; } ADC_CS 1; // 结束本次转换 return dat; }三个参数点需要说明ch只能是 0 或 1因为 ADC0832 只有两个通道四路传感器是靠前面的 CD4051 切换到 CH0 的所以这个函数实际调用时ch恒为 0ADC_DIO在送完地址位后必须置 1 再读因为 51 的 IO 口做输入前要先写 1 释放否则读回来永远是 0时钟频率不用担心函数里的空操作已经让 CLK 周期落在微秒级远低于芯片 400 kHz 的上限。单次读数的噪声能有好几个码直接用会让显示数字一直跳。滤波用中位值平均法连续采 8 次排序后去掉最大最小各一个剩下 6 个求平均。#define SAMPLE_N 8 unsigned int pressure_sample(void) { unsigned char i, j; unsigned int buf[SAMPLE_N], tmp; unsigned int sum 0; for (i 0; i SAMPLE_N; i) { buf[i] adc0832_read(0); } for (i 0; i SAMPLE_N - 1; i) { // 样本少冒泡足够 for (j 0; j SAMPLE_N - 1 - i; j) { if (buf[j] buf[j 1]) { tmp buf[j]; buf[j] buf[j 1]; buf[j 1] tmp; } } } for (i 1; i SAMPLE_N - 1; i) { // 掐头去尾去掉极端值 sum buf[i]; } return sum / (SAMPLE_N - 2); // 6 次求平均 }把SAMPLE_N改成 4 或者 16 都行改 4 时平均的是 2 个数抑制噪声能力弱一些但采样快改 16 时程序里那个buf数组会占 32 字节 RAM51 的 128 字节片内 RAM 要开始算计了所以 8 是比较合适的折中。排序用冒泡因为只有 8 个元素换成快排反而增加代码量和栈开销。4.3 从 ADC 码到 kPa换算与标定拿到 0255 的码值之后要换算成压力值。按 MPX4250AP 的传输特性 Vout Vs × (0.004 × P − 0.04)反解出 P (Vout / Vs 0.04) / 0.004。ADC 是 8 位、5V 基准所以 Vout / Vs code / 255。合并后 P (code / 255 0.04) × 250。/* MPX4250AP 换算输入 8 位 ADC 码输出压力值 kPa整数 推导P (code/255 0.04) / 0.004 (code/255 0.04) * 250 为避免浮点先放大到千分比再算 */ unsigned int adc_to_kpa(unsigned char code) { unsigned long v; v (unsigned long)code * 1000UL / 255UL; // code/255 的千分比表示 return (unsigned int)(((v 40UL) * 250UL) / 1000UL); }用整数运算是刻意的51 做一次浮点除法要几千个机器周期主循环里四个轮子轮一遍就明显卡顿而整数乘除用unsigned long也就几十个周期。v用unsigned long是因为code × 1000最大 255000超过 16 位无符号整数的 65535 上限用unsigned int会溢出读数直接错得离谱——这个溢出问题在实际项目里非常常见编译器不报警只能靠人盯。换器件时只改这个函数。比如仿真里换 MPX4115公式变成 Vout Vs × (0.009 × P − 0.095)对应 P (code/255 0.095) / 0.009把40UL改95UL、250UL改111UL就行。整个工程里只有这一处涉及传感器特性这就是把系数集中管理的好处。标定环节不能省。实物装好之后用标准压力表或者已知气压源在 100 kPa、200 kPa、250 kPa 三个点各读一次显示值算出偏差。如果三个点偏差接近一个常数说明是零点偏移在换算函数里加一个修正量如果偏差随压力线性增大说明是斜率误差改乘数系数。这一步做好了整机的绝对精度能进到 ±5 kPa 以内。4.4 迟滞判断、漏气速率与阈值掉电保存报警判断写成独立函数输入当前压力和上下限输出状态码。状态机里保留上一次的状态是回差能工作的前提。#define HYST 10 // 回差带宽单位 kPa /* 返回 0正常 1欠压 2过压state 必须是静态变量跨调用保持 */ unsigned char judge_pressure(unsigned int p, unsigned int hi, unsigned int lo) { static unsigned char state 0; if (state 0) { if (p hi) state 2; else if (p lo) state 1; } else if (state 2) { if (p hi - HYST) state 0; // 必须回落 10kPa 才解除 } else { if (p lo HYST) state 0; // 必须回升 10kPa 才解除 } return state; }static这个关键字在这里不能省。如果写成普通局部变量每次进函数都清零回差就退化成单门限比较效果跟没写一样。HYST的值可以按实测噪声调噪声大就加大到 15响应要求高就减到 6。漏气速率判断要两个数据上次的压力值和上次的时间戳。每次采样后算差值折算成「每分钟下降多少 kPa」超过门限就置慢漏气标志。/* 每个轮子维护一份历史值间隔超过 60s 才更新一次基准避免频繁刷新 */ unsigned int last_p[4]; unsigned int last_tick[4]; unsigned char slow_leak[4]; void check_leak_rate(unsigned char wheel, unsigned int p, unsigned int now) { unsigned int dt, dp; if (last_tick[wheel] 0) { // 首次采样只记基准 last_p[wheel] p; last_tick[wheel] now; return; } dt now - last_tick[wheel]; // 单位100ms 时间片数 if (dt 600) return; // 不满 60s 不判断 if (p last_p[wheel]) { dp last_p[wheel] - p; if ((unsigned long)dp * 600UL / dt 3UL) { // 折合每分钟下降 3kPa slow_leak[wheel] 1; } } last_p[wheel] p; last_tick[wheel] now; }这里用乘除而不是直接比差值是因为采样间隔不是严格恒定的直接用差值比会随调度抖动误判。折算成「每分钟下降速率」之后门限就有一个物理意义明确的数值调起来有依据。3 kPa/min 这个门限相当于慢漏气真正的爆胎是秒级压降会被正常门限先抓到。阈值本身要存在 AT24C02 里。写入时注意两点一是写操作后芯片内部有 5 毫秒的写周期这段时间它不响应任何指令程序里必须延时否则连续的写会丢数据二是存的时候除了阈值本身再存一个校验字节读出来校验不符就回退到默认值避免存储区被干扰后系统用一个乱数当门限运行。5. 避坑与排查仿真跑通实物翻车的五个典型现场5.1 现象仿真里数据完美实物读数恒定不变这是最高频的一类问题表现是 LCD 上四个轮子的压力值一模一样或者压根不随气压变化。原因基本锁定在传感器这一环要么量程选错比如用了 15115 kPa 的器件去测 220 kPa输出早已饱和在电源轨要么传感器供电没接对比例式输出器件少一路供电就是死值要么 CD4051 的地址脚接错四个通道实际都指向同一个输入。解决方法是分段量电压。先万用表直接量传感器信号脚对地电压在已知气压下应该在 0.54.5V 之间再量 CD4051 的公共输出脚切换地址时这个电压应该跟着变最后量 ADC 输入脚与单片机读回的码值是否对得上。三级量下来问题一定暴露在某一段。原理图上把每一级的预期电压标出来排查时就不需要猜。5.2 现象压力值来回跳动静置时能差十几 kPa显示数字像抽奖一样跳这是噪声和滤波没做好。原因有三层电源去耦不足数字开关噪声串进模拟通道RC 滤波参数不合理截止频率太高等于没滤程序里没做数字滤波单次采样值直接用。三层叠加起来读数自然没有参考价值。处理顺序是从硬件到软件。先在传感器供电脚并 0.1 微法电容在 ADC 基准脚并 10 微法加 0.1 微法这一条能解决大半问题再把 RC 滤波的电阻电容配到截止频率 12 kHz最后软件上加中位值平均滤波。三层做完还有一种情况会跳就是 CD4051 切换通道后没等稳定就读加 200 微秒延时即可。做完这些如果还跳就要怀疑地线布局了模拟地和数字地没有单点汇合这个只能改板。5.3 现象蜂鸣器一响单片机就复位或者程序跑飞报警触发瞬间系统重启日志里看不出任何线索像一个黑匣子。原因是蜂鸣器作为感性负载断电瞬间产生反向电动势顺着电源线打到单片机电压跌破复位门限。用 IO 口直接驱动蜂鸣器时这个问题尤其严重因为 IO 的驱动能力本来就弱电流全从单片机内部走。解决分三步蜂鸣器改成三极管驱动IO 只负责基极电流电磁式蜂鸣器两端反并续流二极管蜂鸣器电源和单片机电源之间串一个 10 欧电阻加 100 微法电容做隔离。改完之后再测复位现象会彻底消失。这条血泪经验我每次画板都会在蜂鸣器旁边留一个二极管位号哪怕这版不用位置先占着。5.4 现象LCD1602 上电后一片空白或者显示乱码屏幕不亮先查背光和对比度V0 脚上的电位器没调好屏幕就是全黑或者全白看着像坏了。背光正常但没字符查 P0 口上拉排阻51 的 P0 是开漏输出不加上拉写不进数据。字符有但位置乱查初始化序列1602 上电后要按手册顺序发 0x38、0x0C、0x06、0x01 四条指令顺序错了内部状态机就乱。还有一种乱码是时序问题。用忙检测的话读状态时 RW 要拉高、RS 拉低读完必须把 RW 拉回低漏了这一步后续的写操作全部无效。用固定延时的方案则要保证延时足够长写指令后 2 毫秒、清屏后 5 毫秒宁可慢一点也别抢那几百微秒。5.5 现象改过的阈值重新上电就变回默认值按键设置能改显示也对一断电就恢复出厂值。原因是阈值只存在 RAM 里没写 EEPROM或者写了但没等写周期数据实际没落盘或者读回来没做校验读到的 0xFF 被当成合法值使用。排查时先确认写函数里有没有 5 毫秒延时再确认读函数有没有校验。我的习惯是存三个字节上限、下限、校验和上下限异或取反读出来先算校验对不上就加载默认值并把标志位置起来显示上给个提示。这样即使存储区被干扰系统也不会用乱数当门限跑这是给自己留的后悔药。6. 验收与答辩用三张表证明这套系统真的能用验收这件事最怕的是演示完一圈说不出「好在哪」。我的做法是准备三张表边演示边填讲完整个过程不超过八分钟。第一张是功能验收表逐项对照需求。每一行都是「测什么、怎么测、合格标准、实测结果」现场演示时按顺序走一遍把结果填进去。表格的用处是把「能跑」变成「可验证」评委看到你自己定义了合格标准印象分立刻不一样。验收项测试方法合格标准记录方式四轮压力采集逐路加不同气压观察对应轮位显示四路读数独立误差 ≤ ±5 kPa记录四点实测值欠压报警把某一路气压降到 170 kPa3 秒内蜂鸣器断续、对应 LED 亮计时器记录响应时间过压报警升到 290 kPa3 秒内快速报警、对应 LED 亮同上回差防抖在门限附近小幅来回加压不出现连续通断抖动连续观察 1 分钟阈值设置保存改门限后断电 10 秒再上电读回值等于修改值拍两次屏幕对比慢漏气判断60 秒内匀速泄压 5 kPa触发慢漏气提示秒表计时第二张是仿真与实物的对照表。仿真在 Proteus 里跑激励源可以精确设成任意电压实物受传感器误差和电源波动影响。把同一工况下两边读数的差值列出来说明差在哪、为什么、怎么补偿的。这张表最能体现你理解了仿真和实物的差别而不是拿仿真截图交差。第三张是资源与实现的对应表把每个功能模块对应到原理图的哪一部分、程序里的哪个函数、仿真里的哪个元件。被问到「这个功能在哪实现的」时直接指过去不用现场翻文件。答辩时间有限能快速定位就是一种能力。答辩时我最常被问到的三个问题是为什么不用专用芯片、精度怎么保证、抗干扰做了什么。前两个前面已经说清了第三个就讲电源分区、RC 滤波、数字滤波、回差这四层。回答的时候别背指着板子上的元件说评委看得见实物说服力完全不一样。最后提醒一句关于仿真演示的风险控制把仿真工程、编译好的 hex、原理图 PDF 三份东西放在同一个文件夹里提前在那台答辩电脑上跑一遍。我吃过一次亏现场电脑没装对应版本的仿真软件打开工程提示元件库缺失整场演示只能靠视频。从那以后我每次验收前都会在目标机器上完整走一遍流程这个习惯帮我把所有「意外」提前变成了「已知」。希望帮到你。本文还有配套的精品资源点击获取