
简介基于51单片机的胎压监测资源面向电子类本科毕业设计及课程设计人群系统展示了压力、温度实时采集与超限报警功能从原理、硬件搭建到软件仿真的完整设计流程。资料以51单片机为控制核心详细说明压力传感器、温度传感器的选型与接口电路按键阈值设定、LCD实时显示和蜂鸣器报警的硬件设计C语言固件程序分模块编写涵盖初始化、数据采集、A/D转换、数据处理、显示刷新与控制输出层次清晰。压缩包共82个文件整体约30MB资料类型以PDF/DOC技术手册、C源文件和头文件、Proteus仿真工程、原理图及BOM清单为主同时包含焊接技巧、常见问题解决、烧录方法、答辩建议等实践文档覆盖面广。已有218人学习下载。借助仿真文件能在制作硬件前验证报警逻辑和阈值判断配合器件清单可高效完成采购与焊接流程图则帮助快速理解系统工作过程整套资料适合作为毕设/课设的完整参考。1. 胎压监测为何用51单片机方案换一套成品TPMS传感器单颗芯片就几十上百块而拿51单片机配一颗几十块的压力传感器、一颗DS18B20和一块1602液晶就能把“采集、显示、报警”整条链路跑通。这套《基于51单片机的胎压监测》压缩包就是干这个的Keil的C源码、Proteus仿真工程、原理图、元件清单、答辩技巧一应俱全压力走ADC0832采集温度走单总线DS18B20超限蜂鸣器报警按键还能改阈值。给51单片机毕业设计、课程设计想动手又不想瞎抄的人很值得把工程拆开看一遍。先仿真把逻辑跑通再决定要不要动烙铁这是这套资源最实用的用法。2. 51单片机硬件设计压力、温度、显示与报警的引脚分配2.1 主控选型STC89C52 与 AT89S52 怎么选资料包里同时给了两份主控文档AT89S52中文资料和STC89C52中文介绍。两颗芯片在Proteus里都有仿真模型引脚和8051指令集完全兼容因此仿真阶段不需要纠结选型。做实物时建议优先STC89C52它支持ISP串口下载用CH340转串口线配合STC-ISP软件就能烧录不需要额外买编程器AT89S52虽然也能用但下载方式更挑工具。晶振用12MHz配合51的12T架构一条机器周期正好1μs后面写延时函数和DS18B20时序时好算时间参数。2.2 压力采集链路LM358 放大 ADC0832 采样胎压传感器最常用的是压阻式压力传感器满量程输出只有几十到一百多毫伏不能直接进51的IO口。资料包里出现LM358中文资料就是拿它做同相放大把传感器微弱信号放大到0~5V后再送ADC0832。ADC0832是8位串行ADC分辨率255级按2.5bar满量程算每级约0.0098bar对教学场景够用。如果以后要更细的分辨率需要换成10位或12位芯片这是这个设计的精度边界。放大增益按下式估算设传感器满量程输出为Vsens(mV)目标输出范围是0.5~4.5V增益G ≈ 4000 / Vsens。LM358供电和ADC基准都用5V运放的零点漂移通过调零电位器修正仿真阶段也可以直接在Proteus里用虚拟电压表检查放大器的输出是否落在0~5V内。增益不够压力上限对应ADC值可能提前饱和增益太大则低压段分辨率变差。2.3 温度采集DS18B20 单总线接法DS18B20是数字传感器一条数据线完成双向通信。资料包里的DS18B20使用手册明确写了寄生供电限制做实物我建议用外部供电方式VDD接5VDQ引脚串联4.7kΩ上拉电阻到VCCGND共地DQ接P3.7。外部供电下温度读数稳定不会出现上电就读回85℃的经典故障。仿真图里即使不加这个上拉也能跑但实物长线环境不加会翻车原理图里这个4.7k必须画上。2.4 显示、按键与报警的外设连接1602字符液晶的D0~D7接P0口P0是开漏输出必须外接8位上拉排阻否则液晶显示乱码或黑块。控制线RS、RW、E分别接P2.6、P2.5、P2.7按键接P3.2、P3.3、P3.4这三个引脚同时也是INT0、INT1和T0后续想改成中断方式唤醒系统时电路不用重画蜂鸣器接P1.7经过8050三极管驱动IO输出高电平鸣响。全部引脚关系整理如下功能模块引脚说明ADC0832 片选P1.0CS低电平有效启动转换ADC0832 时钟P1.1CLK串行时钟ADC0832 数据P1.2DI/DO复用线DS18B20P3.7单总线数据线标配4.7k上拉LCD1602 数据P0.0~P0.78位并口需接上拉排阻LCD1602 RSP2.60命令/1数据LCD1602 RWP2.5接地常写LCD1602 EP2.7高电平使能按键P3.2/P3.3/P3.4设置/加/减蜂鸣器P1.7三极管驱动完整原理图在压缩包的“2.原理图”目录下文件是Sheet1.SchDoc元件清单对应“5.器件清单/元件清单.xlsx”。把这张表和PCB封装对照着看一遍再去仿真硬件的坑会少很多。3. 压力采集与温度读数C语言实现ADC0832和DS18B20驱动3.1 程序骨架初始化、循环、显示整个工程用C语言写入口在main.c。主循环的逻辑是读ADC压力值、读DS18B20温度、与阈值比较、刷新LCD、控制蜂鸣器。精简后的框架如下#include reg52.h #include lcd1602.h #include ds18b20.h #include adc0832.h sbit BEEP P1^7; unsigned char highPress 250; // 压力上限对应ADC采样值 unsigned char lowPress 100; // 压力下限 unsigned int maxTemp 850; // 温度上限85.0℃扩大10倍存储 void main(void) { unsigned char adcVal; unsigned int temp; LCD_Init(); LCD_WriteString(0, 0, TPMS P:___ T:___); while (1) { adcVal ReadADC0832(0); // CH0读取压力电压 temp ReadDs18b20Temp(); // 读取原始16位温度 temp (temp * 10) / 16; // DS18B20精度0.0625℃保留一位小数 if (adcVal highPress) // 压力超高 BEEP 1; else if (adcVal lowPress) // 压力过低 BEEP 1; else if (temp maxTemp) // 温度过高 BEEP 1; else BEEP 0; LCD_ShowValue(adcVal, temp); DelayMs(200); // 采样周期200ms } }逻辑说明ReadADC0832返回0~255的电压采样值ReadDs18b20Temp返回DS18B20的16位原始温度编码原始值×0.0625才是摄氏度。为了在LCD上显示一位小数代码里用(temp * 10) / 16代替浮点运算避免51单片机算浮点拖慢循环。三个阈值条件只要满足一个蜂鸣器就响复位条件是全部恢复到安全范围。200ms的采样周期兼顾了DS18B20的转换时间和LCD刷新体验改得太短只会看到数字跳动不会提升响应速度。3.2 ADC0832的串行时序ADC0832的数据线DI和DO复用在同一引脚上主机先通过DI写配置位再在CLK上升沿从DO读数据。驱动函数如下sbit ADC_CS P1^0; sbit ADC_CLK P1^1; sbit ADC_DAT P1^2; // DI/DO共用线 unsigned char ReadADC0832(unsigned char ch) { unsigned char i, dat 0; ADC_CS 0; // 片选拉低启动一次转换 ADC_CLK 0; ADC_DAT 1; ADC_CLK 1; // Start bit ADC_CLK 0; ADC_DAT ch 0x01; ADC_CLK 1; // SGL/DIF1单通道模式 ADC_CLK 0; ADC_DAT (ch 1); ADC_CLK 1; // ODD/SIGN选择CH0或CH1 ADC_CLK 0; ADC_DAT 1; ADC_CLK 1; // 空闲位 for (i 0; i 8; i) // CLK上升沿从DO读取数据 { ADC_CLK 1; _nop_(); dat 1; dat | ADC_DAT; ADC_CLK 0; } ADC_CS 1; // 片选拉高结束 return dat; }参数说明ch的取值为0或1。ch0时SGL/DIF位为1、ODD/SIGN位为0表示单通道CH0ch1时选中CH1本工程CH1留作备用模拟输入。这里最容易被忽略的是Start bit之后的三位配置顺序Proteus模型和实物芯片都会严格检查时钟边沿顺序写反读回来的数据要么恒为0xFF要么数值乱跳。8位数刚好对应0~5V电压换算关系是Vin ADC值/255×5V调试时用这个公式反推传感器输出电压是否正确。3.3 DS18B20的复位、命令与温度读取DS18B20单总线协议有严格时序复位脉冲、存在脉冲、写命令、读数据每一步都有时间窗口。核心代码如下sbit DQ P3^7; bit Ds18b20_Reset(void) { bit presence; DQ 0; DelayUs(480); // 主机拉低480us产生复位脉冲 DQ 1; DelayUs(60); // 释放总线等待从机应答 presence DQ; // 从机拉低总线表示存在 DelayUs(420); return presence; // 返回1表示器件在线 } unsigned int ReadDs18b20Temp(void) { unsigned char low 0, high 0; Ds18b20_Reset(); Ds18b20_WriteByte(0xCC); // 跳过ROM本系统只挂一颗 Ds18b20_WriteByte(0x44); // 启动温度转换 while (!DQ); // 转换期间DQ被器件拉低 Ds18b20_Reset(); Ds18b20_WriteByte(0xCC); Ds18b20_WriteByte(0xBE); // 读暂存器先低字节后高字节 low Ds18b20_ReadByte(); high Ds18b20_ReadByte(); return ((unsigned int)high 8) | low; }说明0xCC是跳过ROM命令适合单点测温0x44启动转换后器件在转换期间把DQ拉低while(!DQ)就是在等转换结束0xBE是读暂存器命令低字节在前。返回值是16位有符号数低4位是小数位每个最小位0.0625℃。轮胎工作温度在-40℃到125℃都有可能出现负温度在51上用补码表示判断if(value 0x8000)后对原码取反加一即可转成带符号数。DelayUs函数参数在480、60、420附近都算宽范围但前提是主频12MHz换成11.0592MHz晶振时这几个时间参数依然适用因为两个频率机器周期只差约8%。3.4 按键设置阈值阈值不能写死在程序里否则实物应用时每次改报警点都要重新烧录。按键扫描用查询方式sbit KEY_SET P3^2; sbit KEY_ADD P3^3; sbit KEY_SUB P3^4; unsigned char setMode 0; void KeyScan(void) { if (!KEY_SET) // 检测按下 { DelayMs(10); // 消抖 if (!KEY_SET) { setMode (setMode 1) % 3; // 运行/设压力/设温度 } while (!KEY_SET); // 等待松手避免一次按下多次触发 } if (setMode 1) // 压力阈值调节 { if (!KEY_ADD) { DelayMs(10); highPress; while(!KEY_ADD); } if (!KEY_SUB) { DelayMs(10); highPress--; while(!KEY_SUB); } } }这里setMode在0、1、2三个状态间循环对应正常运行、设置压力上限、设置温度上限。把HIGH_PRESS限定在 80~250 范围内防止误操作把阈值设成极端值。阈值建议默认低压报警2.0bar、高压3.0bar、温度上限85℃对应ADC值需要根据传感器量程换算后填入。4. Proteus仿真联调hex加载、电位器模拟与故障排查4.1 打开仿真工程并加载hex压缩包的“3.仿真”目录下有仿真.DSN和main.hex。打开方式先装Proteus 8.x再直接双击仿真.DSN。需要重新关联hex文件时双击原理图上的单片机芯片在Program File里选择工程编译出的main.hex。注意Proteus里选用AT89C52模型而不是STC系列Proteus对STC模型的兼容性一般AT89C52和STC89C52引脚兼容仿真行为完全一致。晶振按12MHz设置必须与Keil工程保持一致否则后面DS18B20的延时参数全部错位典型的proteus仿真51单片机坑就在这一步。Keil工程文件是main.uvproj用Keil uVision5直接打开这个文件编译前在Options for Target里勾选Create HEX File编译通过后到Output目录找到main.hex。工程源码里的lcd1602.c、ds18b20.c、adc0832.c是分模块编写的改任何一个文件后重新编译hex会同步更新。4.2 用电位器模拟气压变化仿真的关键技巧用POT-HG电位器替代压力传感器接ADC0832的CH0输入端。运行后拖拽电位器滑片输入电压从0V到5V变化相当于胎压从0到满量程变化。观察LCD上的P值电压升高P值变大超过highPress时蜂鸣器响低于lowPress时也会响在两者之间则静音。电位器从0%拖到100%ADC读值应线性覆盖0~255如果不是线性检查ADC0832的三个引脚是不是接反了。用这个电位器还能顺便标定显示量程固定电压VinADC值Vin/5×255记下对应的胎压显示值就得到了电压-胎压线性关系。答辩时直接讲“输出电压经8位ADC转换后按比例映射到0~2.5bar”比你只说“采集到压力值”有说服力得多。注意拖拽电位器速度太快时仿真器对串行采样的模拟会有瞬时毛刺这是仿真采样时长差异造成的不是算法问题。4.3 温度报警的验证方法Proteus的DS18B20模型支持直接修改环境温度参数。双击仿真图上的DS18B20元件在属性面板里把温度值从27改成90运行程序LCD温度区应显示90.0℃左右同时蜂鸣器触发再改回25报警解除。由于DS18B20转换需要时间UI上的温度刷新会滞后最多750ms这是正常现象。如果改温度值后读数仍是85℃优先检查DQ引脚的上拉电阻和延时参数85℃是DS18B20复位失败时的典型返回值在仿真和实物里都适用。4.4 常见仿真故障对照故障现象可能原因处理方法LCD黑块或无显示P0口没加上拉排阻放置RESPACK-8到P0口并接VCC温度恒为85℃DS18B20上拉缺失或复位延时不对加4.7k上拉核对12MHz晶振设置蜂鸣器上电就叫阈值初值过低或越界进入设置模式调整阈值后复位ADC读值恒0xFF片选或CLK接反配置位顺序错按3.2节时序代码逐行比对加载hex后无反应未生成hex文件或芯片型号选错勾选Create HEX File换AT89C52模型仿真通过之后再做实物焊接顺序是电源→最小系统→传感器→显示和报警。先把晶振和复位电路调试好再上传感器避免电源不稳烧掉传感器。这套顺序也是课程设计答辩时老师问实物制作流程的标准回答。5. 实车化改造阈值标定、看门狗与L298N补气扩展5.1 压力零点和温度补偿仿真里电压和压力是理想线性关系实物则要标定。做法是把轮胎完全放气记录ADC值adcMin用标准胎压表打到2.5bar记录adcMax。换算式为press (unsigned int)((adcVal - adcMin) * 25 / (adcMax - adcMin)); // 结果单位0.1bar25代表2.5bar这段代码把减法、乘法和除法全部用整数完成51跑起来比浮点快得多。如果运放存在零点偏移adcMin不为0直接按上式抵消掉。冬天胎压会随气温下降按经验每降10℃胎压约降0.1bar可加温度补偿pressComp press (25 - temp) * 0.1 / 10系数0.1在实车上微调。把原来的固定阈值判断改成if (press highPress * 10)即可。5.2 看门狗和阈值存储车载电源波动大单片机跑飞后要能自己恢复。STC89C52内部看门狗初始化只要一行void WDT_Init(void) { WDT_CONTR 0x37; // 使能看门狗预分频最大 } void FeedDog(void) { WDT_CONTR 0x37; // 主循环中重新装载防止溢出复位 }0x37的高4位0x3使能看门狗低4位0x7是预分频系数12MHz下最长溢出约2.3秒而主循环200ms就能跑完一圈不会误复位。加上看门狗后程序跑飞时能在2秒内自动恢复这是成品仪表的基本要求。用户设置好的阈值需要断电保留写到STC片内EEPROM地址从0x2000开始设置完成时写一次不要每次循环都写10万次擦写寿命能撑住正常使用。5.3 用L298N做主动补气扩展资料包里给了L298N资料这套硬件实际可以扩展成“监测补气”系统。压力低于下限时除了蜂鸣器报警用L298N驱动一个12V小气泵给轮胎补气L298N的IN1、IN2接P1.5、P1.6ENA接P1.4用PWM调速比直接继电器通断更平顺。单纯监测报警不需要接L298N但做成“智能胎压管理系统”参加课设评比这个扩展点比单纯报警高一个级别。真实车规TPMS的传感器是专用SOC芯片内部集成压力、温度、加速度检测和433MHz射频发射这套51方案的价值在于把采集、换算、阈值判断、报警、掉电存储这套应用逻辑完整跑通后续对接TPMS接收显示端时这些逻辑代码可以直接平移过去。标定时把5.1的线性公式换成多点插值实测偏差能压到±3kPa以内。本文还有配套的精品资源点击获取