拓冰建站拓冰建站
首页 / 资讯中心 / 正文

基于51单片机的高压锅压力温度水位检测报警系统设计与仿真

简介基于51单片机的高压锅检测系统仿真与源码包面向电子竞赛、课程设计及单片机入门进阶人群解决高压锅温度、压力、水位多参数检测与控制问题。系统涵盖压力过限报警、水位过低停机、阈值可调、锅盖闭合检测及排气阀自动泄压等逻辑适合作为综合实训参考方案。资源共49个文件压缩后639KB核心包含Proteus仿真工程、C语言源代码、原理图、流程图及元件清单可直接用于仿真验证与实物制作参考。其中源代码工程清晰划分LCD1602显示、ADC0832采集、DS18B20测温等模块配套PDF说明和BMP界面图便于快速理解工作流程。目前已有258人学习下载适合需要完整设计思路与排错参考的开发者。1. 高压锅检测为什么要把压力、温度、水位交给51单片机高压锅检测系统的核心不是高压锅本身而是一块同时盯着三路信号的单片机控制板压力、温度、水位任意一路越界都要在几百毫秒内切断加热并报警。这类项目常出现在单片机课程设计和电子竞赛练习里因为51单片机虽然老但它的IO、定时器、外部中断配合ADC和单总线芯片恰好能把模拟采集、数字温控、继电器输出和LCD显示串成一条完整的学习链路。很多人以为难点在51单片机编程真正卡壳的是“传感器信号怎么进单片机”。压力和水位在这里是模拟量51没有片内ADC温度要么走模拟通道要么用数字单总线Proteus仿真中还要找到一种可手动调节的替身信号。下面从信号链、原理图、源代码到验证顺序一层一层拆做完这套你手里留下的不是一份现成工程而是一套能改边界条件的检测框架。2. 压力、温度、水位三路信号怎么接下51单片机2.1 压力和水位是模拟量先想清楚谁给51供电AT89C51没有片内ADC压力和水位这类模拟量必须外接ADC。常见做法是加一片ADC0832双通道8位一路给压力一路给水位接口只有CS、CLK、DIO三线占P1口的三个引脚比ADC0809那种并行接口省IO得多。压力传感器输出一般是0.5V到4.5VProteus里没有现成的高压锅压力传感器模型我一般直接用10k电位器中间抽头接到ADC0832的CH0两端分别接VCC和GND电位器旋到哪个比例CH0电压就是哪个值效果等同于压力传感器输出的电压信号。水位这路也可以进ADC的第二通道CH1。如果只做“有无水”判断浮球开关输出的数字量可以直接进IO口但检测系统里更常见的是连续液位采集静压式液位变送器输出0到5V或者电流型变送器通过250Ω电阻转成1到5V最终都落到0到5V区间。仿真中同样用一个电位器表示“当前水位”代码根据电压判断水位是否低于下限。这里有一处容易踩的坑ADC0832的输入阻抗不是无穷大电位器阻值选10k左右比较稳选100k时抽头电压容易受采样电容影响读数会漂选1k又对电源负载大低功耗场景不划算。三路信号都是慢变化量采样周期不用做小。我一般让单片机每100ms采一轮先读压力通道再读水位通道再读DS18B20整个循环开销极小。ADC0832是8位分辨率参考电压5V时最低有效位约20mV如果压力传感器满量程0.6MPa对应5V每位大约对应0.00235MPa。这个精度对“超压报警”足够真要做高精度检测可以换12位ADC或者直接用带ADC的STC15系列程序里的换算公式换一下即可。2.2 温度信号选数字量还是模拟量Proteus里DS18B20更好用温度这一路理论上可以用热敏电阻分压后进ADC但热敏电阻非线性强还要做查表标定Proteus里每次改温度都要手动调阻值很别扭。更常见的方案是DS18B20数字单总线一个IO口搞定测量。Proteus自带DS18B20模型运行时双击元件可以直接改温度从25℃改成120℃系统立刻进入超温报警调试效率很高。代价是单总线时序敏感读写字节需要微秒级延时12MHz晶振下通常用_nop_()微调。DS18B20的测量范围是-55℃到125℃高压锅检测的温度段0到130℃其实贴着上限不过做报警显示够用。如果你做实物时要求测更高温度比如200℃以上就别用DS18B20改用PT100加变送器输出4到20mA再进ADC那样温度和水位一样都走模拟通道。但在Proteus里做课程设计DS18B20的排错路径简单得多初始化失败时DQ引脚电平不对或者读回0x85基本能定位到上拉电阻和时序两个方向。单总线的几个关键点在代码段里再展开现在先记住一件事DQ引脚需要一颗4.7kΩ上拉电阻漏接的话读温度会一直显示85℃。2.3 先于代码存在的是阈值和保护优先级写程序之前先把控制逻辑做成一张表高压锅检测的本质不是“测得多准”而是“在边界条件下做出正确动作”。以下是一套常见的阈值逻辑状态触发条件继电器蜂鸣器显示正常压力 0.4MPa 且温度 115℃ 且水位 20%吸合继续加热不响显示三项实时值超压压力 ≥ 0.4MPa断开停止加热响显示E1超温压力正常但温度 ≥ 115℃断开停止加热响显示E2缺水水位 20%断开停止加热连续响显示E3优先级上缺水必须最高其次超压最后超温。顺序不是随便排的高压锅一旦缺水锅体温度上升极快超温和超压报警很可能来不及覆盖整个故障过程所以先查水位。超压次之压力超标会威胁锅盖密封动作要快。超温放最后因为很多情况下超温是超压的前置信号但保护链路已经多了一级。把这张表画成流程图时主程序就是“初始化 - 读三路传感器 - 按优先级判断状态 - 控制继电器和显示 - 循环”每个判断框只有两个出口不会产生歧义。3. 用Proteus画高压锅检测系统原理图物料、连线和仿真图调试3.1 先列物料清单仿真和实物差异单独标注在Proteus建工程之前先把物料清单列出来仿真端只要型号对实物端还要考虑封装和额定值。下表按AT89C51 ADC0832 DS18B20 LCD1602的常见方案整理类别元件数量参数/说明主控AT89C511DIP40Proteus中选AT89C51晶振CRYSTAL112MHz复位电阻RES110kΩ电阻上电复位复位电容CAP-ELEC110uF电解电容晶振负载电容CAP230pF陶瓷电容上拉排阻RESPACK-8110kΩ公共脚接VCC接P0口ADCADC08321双通道8位串行ADC模拟压力POT-LIN110kΩ电位器模拟水位POT-LIN110kΩ电位器温度传感器DS18B201数字单总线需4.7kΩ上拉显示屏LM016L1对应LCD160216x2字符继电器RELAY15V继电器模型驱动三极管NPN12N2222或BC547基极串1kΩ续流二极管1N40071并联在继电器线圈两端蜂鸣器BUZZER15V有源蜂鸣器三极管驱动指示灯LED-RED1加热指示串330Ω电阻注意Proteus里的RELAY模型引脚定义和实物继电器不一样连线前先看模型引脚。蜂鸣器直接接到51引脚上驱动能力不足需要NPN三极管做开关基极接单片机引脚集电极接蜂鸣器负极。3.2 按顺序连线不容易漏先最小系统再外设我习惯先画最小系统再接ADC和传感器再接LCD最后接继电器和蜂鸣器。这样做的原因是Proteus画图最怕飞线按顺序连能减少回头改线的次数。最小系统部分AT89C51的XTAL1和XTAL2之间接12MHz晶振两端各接30pF电容到GNDRST引脚接10kΩ电阻到GND、10uF电容到VCCEA引脚必须接VCC否则单片机只执行外部程序存储器仿真时会“空跑”。复位电路很多人会漏掉漏掉后Keil里程序编译正常Proteus里就是不动。ADC部分ADC0832的CS接P1.0CLK接P1.1DIO接P1.2VCC接5VGND接地CH0接压力电位器抽头CH1接水位电位器抽头。两个电位器两端分别接VCC和GND抽头电压范围就是0到5V。DIO在配置阶段是输入读取阶段是输出Proteus不需要额外上下拉实物板如果DIO数据乱跳可以对这个引脚对地加10pF小电容。DS18B20放在P3.7口DQ引脚接4.7kΩ上拉电阻到VCC。LCD1602的D0到D7接P0口P0是开漏输出必须接上拉排阻到VCC否则LCD不是乱码就是空白。RS、RW、E依次接P2.0、P2.1、P2.2VL对比度引脚用一个5kΩ电位器分压到GND显示效果更清楚。继电器驱动这路要重点看P1.3输出高电平时通过1kΩ电阻给NPN三极管基极三极管导通继电器线圈吸合P1.3输出低电平时三极管截止继电器断开。线圈两端并联一个1N4007负极接VCC、正极接集电极否则断电瞬间反峰电压可能击穿IO口。蜂鸣器用P1.4控制驱动方式和继电器相同。整套原理图最容易被Proteus新手漏掉的就是复位电路和EA引脚这两处错了之后仿真图不报错但程序就是不跑。3.3 仿真图上怎么模拟“超压”“超温”“缺水”仿真图和原理图物理连接一致区别在于传感器信号是用可调元件模拟的。模拟超压时右键点击压力电位器在属性框里把Position从30%调到80%CH0电压从1.5V升到4V压力换算值超过阈值继电器断开。这里有个很常见的操作误区很多人双击电位器后直接改Resistance以为改总阻值就能改变抽头电压实际上应该改的是Position也就是抽头百分比Resistance只决定总阻。模拟超温更直观双击DS18B20在Current Temp里输入120点OK程序下一次采样就会进入超温报警。注意DS18B20的温度值不是“一点就变”它要等主机按单总线时序读取后才会更新到LCD上所以运行中修改温度后通常要等一个主循环周期大约200ms。模拟缺水和模拟超压相同把水位电位器的Position调到15%以下CH1电压低于1V系统进入缺水保护。还有一个调试技巧如果想让LCD显示压力跟随连续变化不需要手动微调电位器可以在ADC通道输入端挂Proteus的DC Generator Tool给它一个斜坡电压这样能看到ADC码值在0到255之间连续变化。大多数课程设计只要手动模拟三个边界就够了。运行前确认Keil编译生成了HEX文件并加载进AT89C51加载成功后点左下角运行LED灯亮、LCD有文字说明最小系统通了。程序能编译但仿真不跑时先用单步执行看程序停在哪。4. 源代码实现ADC0832、DS18B20和三层保护逻辑怎么写4.1 工程结构和主循环的文字流程图代码用Keil C51写文件按功能拆分main.c放主循环和状态判断adc0832.c放ADC驱动ds18b20.c放温度驱动lcd1602.c放显示驱动。多文件结构的意义不是规范而是把“传感器读取”和“保护逻辑”分开驱动只负责拿数值主循环只负责拿数值做判断。这样调阈值时不用翻驱动换传感器时也不用改主循环。主流程用一段话就能说清初始化LCD、ADC和DS18B20主循环先读ADC0得到压力码值再读ADC1得到水位码值然后读DS18B20得到温度换算成物理量后依次判断缺水、超压、超温最后刷新LCD并控制继电器和蜂鸣器。循环间隔200ms对高压锅这种惯性大的被控对象完全足够。下面把三个关键驱动逐一展开。4.2 ADC0832驱动三线接口按位组装结果ADC0832的串行时序不算复杂CS拉低使能CLK上升沿移入配置位配置完成后CLK继续产生上升沿DIO输出转换结果。驱动可以这样写// adc0832.c #include reg52.h #include intrins.h sbit CS P1^0; sbit CLK P1^1; sbit DIO P1^2; // ch0 读CH0ch1 读CH1 unsigned char adc0832(unsigned char ch) { unsigned char i, dat 0; CS 0; // 片选拉低启动一次转换 CLK 0; DIO 1; _nop_(); // 起始位 CLK 1; _nop_(); CLK 0; DIO 1; _nop_(); // SGL/DIF1单端模式 CLK 1; _nop_(); CLK 0; DIO ch; _nop_(); // ODD/SIGN选择通道0CH01CH1 CLK 1; _nop_(); CLK 0; _nop_(); // 等待DO从高阻切换到输出 for (i 0; i 8; i) { CLK 1; _nop_(); dat (dat 1) | (unsigned char)DIO; CLK 0; _nop_(); } CS 1; return dat; }这段代码的要点在配置阶段第一个上升沿送起始位第二个上升沿拉高SGL/DIF表示单端输入第三个上升沿送通道号之后的8个时钟边沿从DIO线上读出8位结果。DIO在配置阶段由单片机输出读取阶段切换为输入Proteus的IO模型会自动处理换到实物时需要在读取前显式执行DIO 1否则准双向口读不到外部信号。读到的dat范围是0到255换算电压的公式是电压(mV) dat * 5000 / 255。这个换算放在主循环里做不要在驱动层做方便以后改ADC位数。8位ADC每档约20mVProteus里表现为显示值偶尔跳1到2个LSB正常现象不必额外做滤波。4.3 DS18B20驱动复位、跳过ROM、读暂存器三步DS18B20的驱动代码比ADC长但读出整数温度只需要“初始化、跳过ROM、读暂存器”三个动作。初始化函数负责检测总线上是否存在从机读到的第一个字节是温度低字节第二个是符号和整数位。压缩版如下// ds18b20.c 关键片段延时按12MHz晶振调整 sbit DQ P3^7; void ds18b20_reset(void) { DQ 0; DelayUs(480); // 主机拉低480us复位脉冲 DQ 1; DelayUs(80); // 释放总线并等待从机应答 } void write_byte(unsigned char dat) { unsigned char i; for (i 0; i 8; i) { DQ 0; _nop_(); if (dat 0x01) DQ 1; // 写1则拉高 DelayUs(60); DQ 1; dat 1; } } unsigned char read_byte(void) { unsigned char i, dat 0; for (i 0; i 8; i) { dat 1; DQ 0; _nop_(); // 产生读时隙 DQ 1; _nop_(); _nop_(); // 采样窗口内读电平 if (DQ) dat | 0x80; DelayUs(60); } return dat; } unsigned int ds18b20_read_temp(void) { unsigned char low, high; ds18b20_reset(); write_byte(0xCC); // 跳过ROM匹配 write_byte(0x44); // 启动温度转换 while (DQ 0); // 等待转换完成DS18B20自动拉高 ds18b20_reset(); write_byte(0xCC); write_byte(0xBE); // 读暂存器 low read_byte(); high read_byte(); return ((unsigned int)high 8) | low; }read_byte里先dat 1再判断DQ是因为单总线每个读时隙至少要持续60us采样点发生在主机拉低后的15us附近。如果读回来是0x85先检查DQ上拉电阻是否漏接再看复位时序的480us和80us是否偏了。正温度换算很简单温度 temp 412位分辨率下除以16即可负温度在高压锅场景不会出现所以不做补码处理。4.4 主循环缺水、超压、超温的组合顺序主循环体现的是2.3里的优先级表。阈值建议做成宏定义集中在main.c开头方便按传感器量程临时改参数。// main.c #define PRESSURE_HIGH_V 3200 // 压力超过3.2V视为超压约0.384MPa #define TEMP_HIGH_C 115 // 温度超过115℃报警 #define WATER_LOW_V 1000 // 水位电压低于1.0V视为缺水 void main(void) { unsigned int pressure_mv, water_mv; unsigned int temp; lcd_init(); while (1) { pressure_mv (unsigned int)adc0832(0) * 5000UL / 255; water_mv (unsigned int)adc0832(1) * 5000UL / 255; temp ds18b20_read_temp() 4; if (water_mv WATER_LOW_V) // 缺水优先级最高 { RELAY 0; BEEP 1; lcd_show_alarm(3); } else if (pressure_mv PRESSURE_HIGH_V) { RELAY 0; BEEP 1; lcd_show_alarm(1); } else if (temp TEMP_HIGH_C) { RELAY 0; BEEP 1; lcd_show_alarm(2); } else { RELAY 1; BEEP 0; // 正常加热 lcd_show_values(pressure_mv, temp, water_mv); } DelayMs(200); } }这个循环里adc0832(0)读的是压力adc0832(1)读的是水位阈值按电压写成了3200mV和1000mV。RELAY 1表示吸合这是按照前面三极管驱动电路约定的如果你用的是低电平触发的继电器模块赋值要反过来。ds18b20_read_temp() 4把12位温度码值转成整数度比如0x0640右移4位等于100对应100℃。缺口判断放在最前面是因为高压锅空烧时温度传感器可能还没到阈值锅壁温度已经快速上升水位是最早变化的信号。另一个值得加的小处理是如果水位电压读到满量程5V不一定是“有水”也可能是传感器断线课程设计里可以先忽略实物中最好加一个断线判断。5. 按验证清单跑仿真图阈值换算、HEX加载和三个常见坑5.1 上电后先验证“正常加热”再逐一触发报警验证顺序我一般是这样先把两个电位器调到中间位置DS18B20设为80℃运行后LCD显示三个量继电器吸合加热指示灯亮。这一步证明数据通路是通的原理图和HEX都没问题。如果LCD乱码先查P0上拉排阻和RS、RW、E三条控制线如果继电器不吸合直接看P1.3引脚有没有电平变化。然后做三个破坏性测试调高压力电位器抽头电压观察超过3200mV后继电器断开DS18B20设为120℃触发超温报警水位电位器降到15%触发E3。每个测试开始前要把上一个报警源恢复否则高优先级报警会一直压住后面的状态。5.2 阈值按传感器量程重新算不要照抄模板宏定义里的3200mV和1000mV是按0到5V参考电压、8位ADC推的。压力传感器如果满量程0.6MPa输出4.5V偏置0.5V那么0.4MPa对应电压为3.17V即压力阈值约3170mV所以代码里写成3200mV。水位20%对应1V所以1000mV。换算关系集中在这张表里物理量满量程阈值对应电压ADC码值压力0~0.6MPa / 0.5~4.5V0.4MPa约3.2V约163水位0~100% / 0~5V20%1V约51温度DS18B20直接读115℃-温度码值0x0730左右ADC码值按码值 电压 / 5000 × 255计算。Proteus里可以在ADC输出端挂一个电压表验证换算是否正确。实物中传感器响应有滞后不像仿真里“电压一改立刻变化”可以在主循环里加连续三次阈值判断再触发报警避免毛刺误报。5.3 Proteus运行时的三个常见坑漏接EA或者P0上拉是第一个坑症状是HEX烧进去但程序不跑、LCD乱码。DS18B20不加上拉电阻是第二个坑读温度永远是85℃。第三个坑是ADC0832的DIO在配置阶段和读取阶段需要时间稳定Proteus模型对时序不敏感实物板如果CLK过快读到的数据会从高位开始错位所以驱动里CLK翻转之间至少留两个_nop_()延时也就是约2us。电位器Position和Resistance分不清、DS18B20温度改了不刷新、HEX文件路径没更新这三样算日常状况逐个排除都不难。把ADC0832的CLK频率控制在500kHz以下Proteus和实物两边都好受。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门