51单片机Proteus火灾灭火系统:传感器检测与执行控制仿真设计
2026/9/12 10:54:55 网站建设 项目流程

简介:面向51单片机与Proteus仿真学习者,这份资料提供了一套完整的火灾灭火系统设计方案,覆盖烟雾浓度、温度、火光强度监测与阈值判断、报警灭火、串口上传及风机故障停机逻辑,适合课程设计、毕业设计或竞赛备赛参考。资源包共49个文件,以Proteus仿真工程、C语言源代码、AD原理图、流程图为主,包含DSN/DBK仿真文件、c/h/uvproj/hex工程文件、SchDoc/PDF原理图以及PNG截图、元件清单和说明文档,压缩包整体约1.59MB,便于快速下载和按目录查阅。仿真工程基于Proteus 7.8环境,便于直接打开验证。已有61人学习使用。借助仿真图与源码,读者可对照理解传感器采集、控制阀值修改、报警灭火及风机故障处理流程;结合AD原理图可还原硬件电路,利用流程图可以把握程序执行主线,对动手实现或二次开发具有直接参考价值。

1. 基于51单片机proteus的火灾灭火系统,先把“能不能灭火”这件事说清楚

火灾灭火系统在课程设计和电子竞赛里出现频率很高,本质是一个“感知—决策—执行”的闭环:火焰、烟雾、温度三个通道把火情变成电信号,51单片机判完阈值后去驱动继电器、水泵、风扇或蜂鸣器。纯搭硬件板子调起来很慢,所以绝大多数人先做基于51单片机proteus仿真的火灾灭火系统设计,把逻辑跑通后再买器件做实物。这套流程同时输出仿真图、源代码、AD原理图、流程图四件套,构图清晰、代码量小、答辩时拿得出手。我这里按自己习惯的完整方案把电路、代码、仿真和排错讲透,新手照着能复现,做过的人能补上几个容易忽略的边界条件。

2. 火灾检测与灭火执行:从传感器选型到AD原理图

2.1 传感器信号链:火焰、烟雾、温度三个通道怎么搭

火灾系统最怕“单点判定误报”,厨房炒个菜就喷水的不在少数。所以常见的可靠做法是三路并行:火焰、烟雾、温度各占一路,判定时做逻辑“或”外加延时确认。三个通道的信号形式完全不同,正好把单片机三种接口都练到。

2.1.1 火焰检测:红外接收管加LM393比较器

火焰光谱里红外段的能量最强,检测火焰最直接的方式是用一对红外发射管和接收管,或者直接买火焰传感器模块。模块上自带电位器可调阈值,输出端在检测到火焰时拉低,这个数字量直接进单片机外部中断或普通IO口。

自己做分立电路时,典型接法是红外接收管串一个10k电阻分压,把电压信号送LM393的“+”输入端,参考电压由10k电位器调到2V左右,LM393输出端加上拉电阻到VCC。这样有火苗时接收管阻值变化,比较器输出翻转,抗干扰能力比一路ADC裸读好很多。在proteus里可以用一个可变电阻和一个受控开关去模拟火焰信号,验证逻辑时序。

2.1.2 烟雾检测:MQ-2气体传感器与ADC通道

MQ-2对不同浓度的可燃气体和烟雾都有响应,是这类题目用得最多的烟雾传感器。它的输出有两种:一种是模拟量,从传感器A、B端取电压信号,经分压后送51单片机的ADC通道;另一种是经过LM393比较器后的数字量。课程设计里我更建议把模拟量接出来做实时曲线,答辩时能看到“烟雾浓度上升—系统动作”的过程,比只看一个跳变有说服力。

proteus仿真里没有MQ-2的精确模型,通常用一个电位器代替。把电位器滑动端接ADC输入,旋动电位器模拟烟雾浓度变化,这种做法在仿真阶段完全够用。实际做实物时注意MQ-2上电后有个预热过程,大概几十秒到一分钟,这期间输出电压不稳定,代码里要加“开机忽略前2秒数据”的保险。

2.1.3 温度检测:DS18B20与NTC的取舍

温度通道有两种选择。DS18B20是数字单总线器件,精度高、代码经典,能在proteus里完美仿真,缺点是时序要求严格,51单片机用普通IO模拟时序时容易被中断干扰。NTC热敏电阻加ADC的方式电路简单,但需要查表或公式换算温度,误差大。

我一般选DS18B20放在一个独立小板上,远离继电器驱动管,防止MOS管发热影响测温准度。proteus仿真时,DS18B20模型放在图纸中,留意它的上拉电阻必须是4.7k,太小会拉不动总线,太大则上升沿过慢,这两种情况都会让读出的温度是85℃。初学的人在这里卡住的最多,看到85℃不要怀疑代码,先检查上拉。

2.2 灭火执行机构:继电器、电机与ULN2003驱动

灭火动作通常分三档:声光报警、启动风扇排烟、启动水泵喷洒。51单片机IO口驱动能力只有毫安级,直接带继电器会被拉复位,所以中间要加驱动芯片。

ULN2003是最省事的方案,内部是达林顿管阵列,输入直接接51单片机IO口,输出接继电器线圈,每一路都内置了续流二极管,反向电动势不会打坏IO口。接线时注意ULN2003的COM脚接VCC,对应继电器线圈的另一端接VCC,这样IO口输出高电平时线圈得电,动作逻辑直观。

proteus仿真里的继电器要用“Coil + Switch”组合模型,别用那种自带灯光的指示灯代替,否则你看不到常开常闭触点切换的真实行为。水泵用直流电机模型代替,风扇同理。继电器吸合时电流尖峰比较大,仿真里不体现,但AD原理图里必须在继电器线圈两端并联1N4148或1N4007,方向是负极接VCC,实物上忘了这颗二极管,单片机大概率会被复位。

2.3 AD原理图设计:从proteus图纸迁移到AD的注意事项

标题里提到AD原理图,这块很多人直接拿proteus里的连线图照搬,结果一画就乱。proteus允许飞线,AD里最好按网络标号组织,电路才可读。proteus里导线乱飞作演示可以,动手画AD原理图前先画电源树:5V进来,经自恢复保险丝后分三路,一路给单片机最小系统,一路给传感器,一路给继电器驱动,三路之间用0欧电阻或磁珠隔开。

AD原理图里至少要有这几部分:51单片机最小系统(晶振、复位、电源去耦)、按键输入与蜂鸣器输出、传感器接口端子(三针或四针,包含VCC/GND/信号)、ULN2003驱动区、继电器与接线端子区。单片机每个电源引脚旁放一个104去耦电容,晶振两个负载电容用22pF,复位电容用10uF,这些参数写进AD里才算完整。

注意AD里元件封装要提前确认,DIP40的STC89C52和贴片封装的引脚顺序不同,打印出装配图确认再发板。第一次打样建议把继电器和接线端子做成可插拔的2.54mm排针,调试时坏了直接换,比焊死在板上省事得多。

3. 单片机控制核心:状态机、阈值判定与模块化代码

3.1 状态机:把“灭火”描述成四个状态

流程图是这个项目答辩时必问的东西。很多人的流程图是从上到下一条直线:检测、判断、开继电器、结束。这种图看起来完整,实际程序一写就崩,因为系统里同时存在“检测到火情”和“火情解除”两个方向的事件流。

我习惯用状态机来组织逻辑,四个状态分别是:正常监控、预警延时、灭火执行、复位确认。系统上电后处于正常监控,某一路传感器超过阈值不立即灭火,而是进入预警延时状态,连续500ms检测仍超标才切到灭火执行。这样做能滤掉瞬时干扰,比如有人拿着打火机在传感器前晃了一下,或电焊火花闪了一下。

灭火执行后不是永远喷下去,要持续监测传感器是否回落。当火焰、烟雾、温度三路都低于恢复阈值,系统进入复位确认,蜂鸣器短鸣三次提示火情解除,然后回到正常监控。状态转移表描述如下:

当前状态触发条件动作下一状态
正常监控任意一路超阈值启动预警计数预警延时
预警延时500ms内持续超标开风扇、开继电器灭火执行
预警延时500ms内数据回落计数清零正常监控
灭火执行三路都低于恢复阈值关闭执行机构复位确认
复位确认1秒后自动回归蜂鸣器短鸣提示正常监控

状态机把流程图拆成“状态 + 转移条件”之后再画图,评审一眼就能看出系统考虑过误报和复位,而不是只会开和关。代码结构也用switch语句映射这个表,每个case对应一个状态,状态转移只在明确条件满足时发生,不会出现多路if互相覆盖的混乱局面。

3.2 传感器采集代码与阈值参数怎么标定

采集代码的要点是“不同通道不同策略”。数字量的火焰信号走查询加软件消抖,模拟量的烟雾信号走ADC连续采样取均值,温度走DS18B20单总线时序。

ADC部分用STC89C52内部ADC或扩展ADC0809都可以。proteus里最方便的是用ADC0808/0809,但要注意它的时钟信号需要另外给一个500kHz左右的方波,否则转换不工作,这是protues仿真的高频坑。如果用的是自带ADC的STC芯片,proteus里选AT89C52配ADC0809反而更贴近真实硬件电路。

烟雾通道的阈值不要写死在代码里当常量。正确做法是上电时先采集50次烟雾通道数据取平均值作为基准值,报警阈值设为“基准值 + 偏移量”。这是因为MQ-2在干净空气中的输出电压会因供电波动而变化,绝对阈值在3.3V系统上表现正常,换到5V系统就误报。偏移量取多少需要实测,通常烟雾通道ADC值在干净环境下偏低,设标定后加50-100个AD码即可。

核心采样代码示意如下:

// 烟雾通道ADC采样,10次去掉最大最小取平均 uint16_t smoke_adc_read(void) { uint16_t buf[10]; uint16_t i, min_idx, max_idx; uint32_t sum = 0; for (i = 0; i < 10; i++) { buf[i] = adc_get_value(SMOKE_CH); // 读取烟雾通道ADC } min_idx = 0; max_idx = 0; for (i = 1; i < 10; i++) { if (buf[i] < buf[min_idx]) min_idx = i; if (buf[i] > buf[max_idx]) max_idx = i; } for (i = 0; i < 10; i++) { if (i == min_idx || i == max_idx) continue; // 跳过异常值 sum += buf[i]; } return (uint16_t)(sum / 8); // 返回8次平均结果 }

这里为什么要去掉最大最小值再取平均,是因为烟雾传感器的输出偶尔会有毛刺脉冲,单次采样直接参与判断会让系统误入预警状态。取中值平均后,毛刺对结果的影响被限制在单次采样的范围内,配合状态机里的500ms延时确认,误报率会低很多。ADC的参考电压选内部2.5V还是外部VCC,各通道的换算公式不一样,代码里注释要写清楚。

DS18B20的读取函数要严格按时序来,初始化时主机发480us低电平复位脉冲,等待从机应答,然后写ROM命令跳过地址,再发转换命令,最后读9字节CRC校验。Proteus仿真DS18B20时,时序延迟时间太短会经常读到85℃。具体来说,延时函数要用带参数且能被编译器精确计算的for循环,不要用空函数体延时,否则优化等级一开,延时就消失了。可以考虑在Keil里把温度读取函数单独放在一个文件里,禁止该文件优化,实测可靠性提升明显。

3.3 继电器控制与按键、蜂鸣器逻辑

灭火执行机构不要用“持续通电”的方式。真实系统里继电器长时间吸合,线圈发热严重,而且会导致水泵持续喷水把现场淹掉。正确的做法是采用“间歇喷洒”策略:继电器吸合10秒,断开3秒,在灭火执行状态下循环。代码里用定时器中断做一个系统时基,每10ms加一次tick,状态机里的500ms确认、10秒喷洒、1秒复位都从tick换算而来。

消防按钮逻辑也要明确:一个“测试”键,按下后模拟火情发生,所有执行机构动作一次;一个“静音”键,蜂鸣器停止鸣叫但执行机构保持原状态。按键扫描放在定时器中断里做20ms消抖,主循环只查状态位。之所以放在中断里做,是怕主循环在DS18B20转换期间阻塞太久,导致按键失效。

proteus仿真是完全支持这种按键加LED指示的设计。执行机构动作时要对应的LED同步点亮,比如“火警”“排烟”“喷淋”三个灯,评审在看仿真图时能直观看到系统状态,这一点对课程设计的现场演示非常重要。

4. 在proteus里跑通最小火灾灭火系统:元件对照与排错

4.1 元件对照表与proteus里的替代方案

proteus元件库里有些器件搜不到精确型号,所以需要替代方案。常见的元件对照如下:

实际硬件proteus搜索关键字替代方案说明
STC89C52单片机AT89C52引脚兼容,仿真模型稳定
MQ-2烟雾传感器用电位器 POT-HG旋动时模拟浓度变化
火焰传感器模块开关+可变电阻闭合表示火焰出现
5V继电器RELAY选单刀双掷模型
直流水泵MOTOR用电机模型代替
DS18B20DS18B20库里有精确模型,注意上拉
LM393LM393比较器输出要加上拉电阻

proteus里画总线的机会不多,但这里的多个传感器信号线如果走总线会更整洁。选中要合并的引脚后放置BUS,再用BUS Label区分内部网络,比如SMOKE、FIRE、TEMP_OUT。这样可以避免一堆细线挤在单片机引脚附近,读图压力小很多。

4.2 连线与参数设置:电位器、比较器和晶振

proteus仿真里最容易被忽略的是晶振和电源。AT89C52模型默认使用内部振荡,但实际上晶振电路还要放置,一般用12MHz晶振加两个22pF电容。复位电路的RC常数要保证上电后能产生至少2个机器周期的低电平复位信号,参考值是10uF电容加10k电阻。如果仿真时单片机反复复位,先看复位引脚电平,再看看门狗配置。

电位器在proteus里默认旋转角度范围是0-100%,按键调节不方便,建议在仿真图里直接用键盘上的“A”和“S”键微调。具体操作是鼠标选中电位器后按A增大、按S减小,电源电压设置成5V,这样电位器中间抽头的电压就能模拟MQ-2输出的变化曲线。

烟雾通道接ADC0809时,要确认添加CLOCK信号源,用“DCLOCK”器件设置500kHz频率,接到ADC0809的CLOCK引脚。ADC0809的ALE和START引脚要连接在一起,同时给一个高电平脉冲启动转换,这是压缩仿真实时性的常用做法,也可以避免转换结果为零的现象。

4.3 proteus仿真里最常见的5个坑

仿真跑不起来的现象五花八门,但根因集中在下面几种。

第一,单片机型号没选对。STC89C52RC在proteus里的直接对应型号就是AT89C52,如果选了其他系列,引脚定义不同会让程序烧录后完全没反应。多数人卡在这一步还以为是代码问题。

第二,P0口没有接上拉电阻。51单片机的P0口是开漏输出,驱动LED或继电器驱动芯片时会表现成“高低电平都差不多”,仿真图里看电平指示确实在变化,但实际执行机构不动。给P0口加一个10k排阻上拉到VCC,问题立刻消失。

第三,程序没烧录到仿真芯片里。Keil编译生成HEX文件后,要在proteus里双击单片机,在Program File一项手动加载HEX文件的路径。不少同学Keil编译成功后没加载HEX,仿真结果自然不变,这里操作顺序是:编译→加载HEX→运行仿真,缺一不可。

第四,比较器输出端悬空。LM393是开集电极输出,不加上拉就没高电平,只有低电平和悬空。这会导致火焰信号永远“没有火”,看起来传感器坏了一样。解决办法是输出端接一个1k到10k的上拉电阻到VCC。

第五,继电器模型没接电源。proteus的继电器线圈驱动端与触点动作需要共地,很多人在仿真图里只接单片机那路5V,继电器COM端悬空,结果触点永远不切换。按图检查触点连接,把COM接到负载回路的正确电位上即可。

5. 从仿真到实物:验证方法与几个实用技巧

5.1 阈值标定的数据回读法

仿真里可以随意旋电位器看系统反应,实物不行,你不能举着打火机去烧传感器反复测试。常见的做法是做一个“阈值标定程序”:单片机每隔200ms向串口打印一次当前三路传感器的ADC值或温度值,电脑端用串口助手收数据。正常环境下记录一组数值,用打火机靠近火焰探头记录一组数值,取两组中间值的某个比例作为报警阈值,比如正常值的1.5倍,这比拍脑袋设数可靠。

有一组实用的串口输出格式:

printf("SMOKE:%03d TEMP:%02d.%d STATE:%d\r\n", smoke_value, temp_int, temp_frac, sys_state);

串口波特率用9600,每200ms打一行,标定时系统不会误报,因为串口输出本身不参与状态判定。观察日志时若烟雾通道数据长时间恒定,说明MQ-2尚未预热完成或分压电阻阻值不合适,调整分压电阻后再标定一次,不要急着改代码。

5.2 一次完整的灭火时序验证

给系统一个完整的验证场景,而不是简单打火测试。我用三个操作验证整套逻辑:第一步,按下测试键,系统应进入预警状态,状态灯闪烁,蜂鸣器短鸣,此时不启动执行机构;第二步,再次触发测试键拉高烟雾信号,模拟烟雾持续超标,系统在500ms确认后进入灭火执行,风扇和水泵同时动作;第三步,把烟雾信号拉回正常,执行机构应停止喷洒,蜂鸣器三声短响,系统回到正常监控。

这个时序跑通后,可以验证一篇内容不能只靠“能报警”来交付。最后可以给代码里加一个“执行记录”功能,每次进入灭火执行和退出灭火执行时把状态写入内存变量,方便答辩时演示系统确实走过了完整的状态转移路径,而不是靠人为干预跳转。

对于proteus仿真没法覆盖的继电器弹跳和电机惯性,处理方法是在实物程序的灭火执行阶段加入“继电器吸合后延迟150ms再检测传感器”的防抖逻辑。这个技巧可以避免继电器触点吸合瞬间的电弧干扰导致传感器误判。掌握这些细节后,这套系统既能在仿真里答辩,又能在实物平台上完整工作,后续扩展无线模块或LCD显示屏,也只需要在现有状态机上增加节点即可。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询