
简介这份资源面向电子信息、自动化及计算机相关专业的毕业设计与课程设计学生提供一套基于单片机的智能厨房环境控制系统完整方案涵盖温度控制、湿度调节、有害气体检测、自动照明与火灾报警等功能帮助读者解决从硬件选型到软件调试的全流程设计难题。压缩包共20个文件约288KB包含C语言源码与头文件、Keil工程文件、Protues仿真工程、原理图与PCB文档、器件清单表格、程序流程图及仿真效果图等软硬件资料齐备。已有65人学习下载适合需要快速搭建仿真环境、理解模块化编程思路的读者参考。方案中主程序、传感器采集与执行器控制模块划分清晰配合仿真图与流程图可直观掌握系统工作逻辑与信号流向为撰写论文、完成答辩或二次开发提供可复用的工程模板与排错依据。1. 从厨房里的三件小事说起这套系统到底在控什么做饭时最让人分心的往往不是火候而是那些反复确认的小事燃气有没有漏、油烟是不是该开大、灶台边温度是不是已经烫手。基于单片机的智能厨房环境控制系统本质上就是把这些确认动作交给一块主控板加几个传感器去自动完成。它监测的核心量通常有三类可燃气体浓度、环境温湿度、烟雾或油烟颗粒物浓度再根据阈值去驱动排风扇、蜂鸣器、电磁阀或继电器切断气源。这套方案适合谁适合正在做单片机毕业设计、课程设计或者想给自家厨房加一层低成本安全兜底的人。它不追求工业级冗余追求的是用几十块钱的元器件把漏气能报警、超温能排风这条链路跑通。下面从选型、接线、代码到调试按能复现的顺序讲清楚。2. 选型与硬件搭建主控、传感器、执行器怎么配2.1 主控为什么优先选 51 或 STC 而不是一上来就 STM32标题里写的是基于单片机没有限定型号但从热搜词看51 单片机、STC 单片机、江科大 51 单片机笔记这些词出现频率极高说明大部分做这类厨房环境控制系统的人起点就是 51 架构。原因很实际厨房环境控制系统的逻辑并不复杂——定时采样、比较阈值、开关 IO8 位机完全够用而且 51 的引脚定义、最小系统、下载方式资料最全翻车了也容易搜到答案。我一般会推荐 STC8G1K17 或 STC89C52RC 这两类。STC8G 系列自带 ADC省掉外挂 ADC0832 的麻烦STC89C52 便宜、教程多但做模拟量采集要额外加 ADC。如果你只是做气体报警加继电器控制STC89C52 足够如果要把温湿度、气体、光照都接进来做多路采集STC8G 更省事。选型时要注意一个容易被忽略的点厨房环境温度高、油烟重主控板最好远离灶台正上方或者加个简单的亚克力罩。这不是玄学油烟附着在 PCB 上会导致引脚间漏电尤其是高阻值的传感器分压电路读数会慢慢漂移。2.2 传感器清单与关键参数监测对象常用型号输出形式关键参数注意事项可燃气体MQ-2 / MQ-5模拟电压加热电压 5V预热 20s 以上需要分压后接 ADC直接接 IO 读不到温湿度DHT11 / DHT22单总线数字DHT11 精度 ±2℃采样间隔≥1s时序敏感中断里别读烟雾/油烟MQ-2 兼测 / GP2Y1010模拟电压需 5V 供电输出随浓度变化和燃气传感器别共用一路 ADC执行器继电器模块 / 排风扇高低电平触发继电器线圈电流约 70mAIO 直接驱动会烧必须加三极管或光耦MQ-2 是最常见的选择它能同时响应液化气、丙烷、烟雾缺点是选择性差做不了只测燃气不测油烟。如果设计要求区分就得再加一路 MQ-5 或 MQ-7用两路 ADC 做差值判断。DHT11 便宜但精度一般做厨房环境监测够用要更准就上 DHT22 或 SHT30。执行器这边排风扇和电磁阀通常走 220V必须用继电器隔离。继电器模块选光耦隔离型触发电流小51 的 IO 拉低就能触发。千万别用 IO 直接驱动继电器线圈51 单个 IO 灌电流上限约 20mA继电器线圈动辄 70mA长期跑必烧口。2.3 最小系统接线与供电接线顺序建议按先供电、再传感器、最后执行器来避免上电瞬间继电器误动作。典型接法主控 VCC 接 5VGND 共地MQ-2 的 AO 接 ADC 输入如 STC8G 的 P1.0DO 可以不接DHT11 数据脚接一个普通 IO加上拉电阻继电器 IN 接 IOVCC/GND 接 5V蜂鸣器用有源蜂鸣器接 IO 加三极管驱动。供电上有个血泪经验MQ-2 加热丝电流约 150mADHT11 和继电器也有几十毫安如果用 USB 口直接供电压会掉到 4.5V 以下导致传感器读数不准、继电器吸合无力。建议用 5V/2A 的独立电源或者 7805 加散热片。这一点在 proteus 仿真里看不出来实物上很容易翻车。3. 软件实现采样、判断、执行三段式怎么写3.1 主循环结构为什么用状态机而不是 delay 堆叠很多入门代码是这么写的读传感器、delay 1s、判断、开风扇、再 delay。这种写法在单任务里能跑但一旦要同时处理 DHT11 时序、按键、显示就会互相卡。51 单片机状态机是热搜里反复出现的词这里正好用得上。我一般把主循环拆成三个状态采样态、判断态、执行态用一个定时器每 100ms 触发一次采样标志主循环根据标志切换。这样 DHT11 的 1s 间隔、MQ-2 的预热时间、继电器的动作延时都能独立控制不会互相阻塞。// 51 单片机主循环状态机骨架 #include reg52.h #define SAMPLE_INTERVAL 10 // 100ms * 10 1s 采样一次 #define GAS_THRESHOLD 300 // ADC 阈值按实测调整 #define TEMP_THRESHOLD 45 // 温度阈值单位 ℃ unsigned char state 0; // 0 采样 1 判断 2 执行 unsigned int tick 0; unsigned int gas_val 0; unsigned char temp_val 0; void timer0_init() { TMOD 0xF0; TMOD | 0x01; // 定时器0 模式116位 TH0 0xFC; // 1ms 12MHz TL0 0x18; ET0 1; EA 1; TR0 1; } void timer0_isr() interrupt 1 { TH0 0xFC; TL0 0x18; tick; } void main() { timer0_init(); while (1) { switch (state) { case 0: // 采样态 if (tick SAMPLE_INTERVAL) { tick 0; gas_val adc_read(0); // 读 MQ-2 temp_val dht11_read(); // 读 DHT11 state 1; } break; case 1: // 判断态 if (gas_val GAS_THRESHOLD || temp_val TEMP_THRESHOLD) { state 2; } else { state 0; } break; case 2: // 执行态 fan_on(); buzzer_on(); delay_ms(500); // 执行动作保持再回采样 state 0; break; } } }这段代码的关键点定时器只负责产生 tick不负责业务逻辑状态机把采样、判断、执行分开任何一步耗时长了也不会把整个系统卡死。SAMPLE_INTERVAL设成 10 表示 1 秒采一次DHT11 要求采样间隔不小于 1s正好满足。GAS_THRESHOLD和TEMP_THRESHOLD是经验值必须按实际传感器实测调整不能照抄。3.2 ADC 采样与阈值标定为什么不能直接抄别人的阈值MQ-2 的输出电压随浓度变化但不同批次、不同供电电压、不同预热时间下同一浓度的 ADC 读数能差出 100 以上。直接抄别人的阈值要么误报要么不报。正确做法是标定上电预热 20 秒以上让加热丝稳定在洁净空气里读 10 次 ADC取平均作为基线base用打火机不点火只放气靠近传感器读稳定后的值作为报警点alarm阈值取base (alarm - base) * 0.6左右留一点余量。// MQ-2 基线标定与阈值计算 unsigned int base 0, alarm 0, threshold 0; unsigned int adc_avg(unsigned char ch, unsigned char n) { unsigned long sum 0; unsigned char i; for (i 0; i n; i) { sum adc_read(ch); delay_ms(10); } return (unsigned int)(sum / n); } void calibrate() { base adc_avg(0, 10); // 洁净空气基线 // 此时人为通入少量气体读 alarm alarm adc_avg(0, 10); threshold base (unsigned int)((alarm - base) * 0.6); }adc_avg里每次采样间隔 10ms是为了让 ADC 输入电容充分充电读数更稳。0.6这个系数是经验值太接近 alarm 会误报太接近 base 会漏报。标定完把threshold写进代码或存 EEPROM下次上电直接用。3.3 执行器驱动与去抖继电器为什么偶尔会抽风继电器在吸合和释放瞬间会产生反向电动势如果和主控共用一组电源可能把单片机复位。常见现象是风扇一转显示屏花屏或者程序跑飞。解决办法有三个继电器线圈两端并一个续流二极管1N4148 或 1N4007继电器电源和主控电源分开走线最后单点共地软件上在继电器动作后加 10ms 空操作避开电源波动窗口。void fan_on() { FAN_PIN 0; // 低电平触发 delay_ms(10); // 等待电源稳定 } void fan_off() { FAN_PIN 1; delay_ms(10); }delay_ms(10)不是随便加的它给电源一个恢复时间。如果继电器模块自带光耦和续流二极管这 10ms 可以省但实物上建议保留成本几乎为零。4. 避坑与排查调试时最容易翻车的五个点4.1 现象MQ-2 上电后读数一直往下掉原因MQ-2 内部加热丝需要预热冷态电阻和热态电阻差别很大前 20 秒读数不可信。另外如果供电不足加热丝温度上不去读数也会持续漂移。解决上电后先 delay 20~30 秒再开始采样或者在代码里加一个预热标志预热期间不判断报警。供电用独立 5V/2A别用 USB 口。4.2 现象DHT11 读出来全是 0 或 255原因DHT11 是单总线时序器件对延时精度要求高。如果主循环里有中断频繁打断或者用了delay_ms但实际晶振不是 12MHz时序就对不上。解决读 DHT11 时关总中断EA 0读完再开确认晶振频率和延时函数匹配DHT11 数据脚加上拉电阻4.7k~10k。如果还不行换 DHT22时序容错更好。4.3 现象proteus 仿真 51 单片机串口能跑实物不行原因仿真里串口波特率是理想值实物上如果晶振偏差大、或者用了 11.0592MHz 以外的晶振波特率误差会超过 3%通信失败。解决串口通信优先用 11.0592MHz 晶振波特率 9600 时误差为 0。如果必须用 12MHz波特率选 4800 或 2400误差小一些。另外检查 CH340 驱动和下载软件设置单片机下载失败很多时候是串口被占用或波特率不匹配。4.4 现象继电器一吸合LCD1602 就白屏原因继电器动作瞬间电流突变5V 电源被拉低LCD 复位。本质是电源内阻大或走线太细。解决继电器电源单独走一路或者加 1000uF 电解电容在 5V 和 GND 之间做储能。LCD 的 VCC 和 GND 尽量靠近主控走线短而粗。4.5 现象系统跑几个小时后死机原因51 单片机没有看门狗时如果程序里某个循环等不到标志位就会卡死。厨房环境里电磁干扰排风扇电机、继电器也会导致程序跑飞。解决开看门狗STC 系列有 WDT在主循环里定时喂狗所有while等待都加超时计数超时后强制退出电源入口加 TVS 管或压敏电阻抑制电机反电动势。5. 进阶技巧把报警阈值做成可调以及一个验证方法做到这里系统已经能跑但阈值写死在代码里换个厨房就得重新烧录不实用。进阶做法是用两个按键加 EEPROM 做阈值在线调整一个按键进入设置模式另外两个加减阈值掉电存进 STC 的 EEPROM。// 阈值在线调整与 EEPROM 保存STC8G 示例 #include stc8g.h #include eeprom.h #define KEY_SET P3_2 #define KEY_UP P3_3 #define KEY_DOWN P3_4 unsigned int threshold 300; void threshold_adjust() { if (KEY_SET 0) { delay_ms(20); // 消抖 if (KEY_SET 0) { while (KEY_SET 0); // 等待释放 // 进入调整模式UP/DOWN 改 threshold if (KEY_UP 0) threshold 10; if (KEY_DOWN 0) threshold - 10; eeprom_write(0x00, threshold 8); eeprom_write(0x01, threshold 0xFF); } } }eeprom_write的地址 0x00 和 0x01 存阈值高低字节上电时读回来赋给threshold。注意 STC 的 EEPROM 擦写次数约 10 万次别在循环里频繁写只在按键确认后写一次。验证方法上我习惯用三步验证第一步用打火机放气不点火测报警响应时间应该在 3 秒内第二步用吹风机热风档对着 DHT11 吹看温度到阈值后排风扇是否启动第三步拔掉传感器模拟故障看系统是否进入安全状态风扇常开、蜂鸣器响。这三步能覆盖大部分实际场景比只看串口打印靠谱。最后说个我自己的习惯每次改完阈值或接线先不接 220V 负载用 LED 代替继电器跑一遍逻辑确认无误再上强电。这个习惯帮我省过至少两次烧板子的后悔药。希望帮到你。本文还有配套的精品资源点击获取