
简介本资源为基于单片机的粮库温湿监控系统设计答辩PPT课件面向电子信息、自动化、电气工程等专业的课程设计、毕业设计学生及答辩准备者可用于梳理选题背景、系统结构与答辩讲述思路。包内共1个pptx文件压缩包约570KB以幻灯片形式呈现目录、总体设计、硬件设计、软件设计与总结等模块。课件从粮食储藏防霉变的意义切入以STC89C52为核心介绍了DHT11温湿度一体传感器、1602液晶显示、蜂鸣器报警、按键设置与继电器控制等硬件电路并给出系统结构框图与原理图软件部分涵盖总体程序流程图、液晶初始化、报警值设定、看门狗清零、DHT11数据读取及超限报警处理逻辑。已有266人学习或下载适合需要参照答辩排版、快速搭建方案框架或对照检查设计完整性的读者参考。1. 从粮堆里一根探头说起这套系统到底要交付什么夏天的粮仓最怕两件事表层粮温随外温起落结露中层粮堆内部自热发霉。人工拿杆式测温仪一周巡一次等数据异常霉变往往已经成片。基于单片机的粮库温湿监控系统要解决的就是连续、多点、自动判断、现场联动这四件事前端探头按粮堆分层布点主控按固定节拍采集超限时本地声光报警并驱动排风机或通风窗同时把数据帧往上一级送。交付物通常包括原理图与 PCB、下位机采集程序、显示与报警逻辑、上位机或数据看板以及一套能讲清为什么这么选、指标怎么算、现场怎么调的答辩材料 PPT 课件。适合做课程设计、毕业设计的电子与物联网方向学生也适合粮库信息化改造里负责选型和落地的工程人员。2. 粮库场景下温湿度传感器怎么选、信号链怎么搭探头选错后面所有算法都在给错误数据打补丁。粮库和普通室内环境的最大差别是粉尘、腐蚀性气体、探头要长期埋入粮堆、走线动辄十几米所以选型要同时看接口形式、防护能力、线缆成本和标定难度而不是只看精度数字。2.1 DS18B20、DHT22、SHT30 在粮库里的取舍型号接口温度指标湿度指标粮库场景适配DS18B20单总线 1-Wire±0.5℃-10~85℃无粮堆内多点测温首选可灌封成不锈钢探杆一根线挂多只DHT22/AM2302单总线自定义时序±0.5℃0~100%RH±2%RH测仓内空气温湿度合适不宜长期埋在粮堆高湿区SHT30/SHT31I2C±0.3℃±2%RH精度好、体积小需要防尘透气罩I2C 线长受限热敏电阻ADC模拟需逐点标定无成本最低标定与线性化工作量大常见做法是混合布置粮堆内部用 DS18B20 探杆做温度阵列仓内空气用一只 DHT22 或 SHT30 测湿热两者数据一起进控制逻辑。这样既拿到了粮堆内温度梯度又拿到了仓内露点判据——表面粮温低于仓内空气露点结露风险就直接报警。2.2 DS18B20 单总线多点测温的时序与接线要点DS18B20 的三根线里VDD 和 GND 之外DQ 数据线必须接一只 4.7kΩ 上拉到 VCC。总线挂多只时全部并联在同一根 DQ 上靠 ROM 序列号区分测量前用 0xCC 跳过 ROM 做广播转换再逐个匹配 ROM 读回。复位脉冲、写时隙、读时隙都是微秒级51 单片机下必须用_nop_()精确控制。#include reg52.h #include intrins.h sbit DQ P2^1; // DS18B20 数据线 void delay_us(unsigned int n) { // 11.0592MHz 下约 n 微秒 while (n--) { _nop_(); _nop_(); _nop_(); _nop_(); } } void ow_reset(void) { DQ 0; delay_us(500); // 复位脉冲需大于 480us DQ 1; delay_us(70); // 等待 15~60us 后从机拉低应答 delay_us(400); } void ow_write_byte(unsigned char b) { unsigned char i; for (i 0; i 8; i) { DQ 0; _nop_(); _nop_(); DQ b 0x01; // 写 1 在 15us 内释放写 0 拉低约 60us delay_us(60); DQ 1; b 1; } } void ds18b20_start(void) { // 广播启动一次温度转换 ow_reset(); ow_write_byte(0xCC); // 跳过 ROM ow_write_byte(0x44); // 启动转换12 位需约 750ms }代码里ow_reset的 500us 低电平是协议硬要求短了从机不应答ow_write_byte的 60us 是给写 0 留的保持窗口写 1 则要在 15us 内把线释放。读回温度时先发 0xCC 再发 0xBE连续读两个字节拼成 16 位有符号数低 4 位是小数位12 位分辨率下 1 LSB 等于 0.0625℃。长线场景要用屏蔽双绞线屏蔽层单端接地并在探头端加 100nF 去耦否则粮仓内的变频风机一启动读数就会跳。2.3 DHT22 的微秒级时序与 51 上的延时坑DHT22 的协议更挑延时。主机拉低至少 1ms 再释放从机拉低 80us、再拉高 80us 作为应答随后每一位用 50us 低电平起始高电平持续 26~28us 表示 070us 表示 1。判定 0 和 1 靠的就是采样点位置采样点偏了就整帧错。sbit DHT P2^0; unsigned char dht_read_bit(void) { unsigned char t 0; while (DHT 0 t 120); // 等 50us 起始低电平结束 delay_us(35); // 35us 后采样 unsigned char v DHT; // 仍为高则是 1已被拉低则是 0 t 0; while (DHT 1 t 120); // 等本高电平结束 return v; } unsigned char dht_read_byte(void) { unsigned char i, v 0; for (i 0; i 8; i) { v 1; v | dht_read_bit(); // 高位在前 } return v; }读取的五个字节依次是湿度高、湿度低、温度高、温度低、校验和校验方式为前四字节求和取低八位。这段代码执行期间必须关总中断否则定时器中断插进来会打乱微秒延时。另一个高频坑是主频Keil 里如果按 12MHz 编译却在 11.0592MHz 的板子上跑延时整体偏差约 8%边界位就会被误判表现为湿度偶发跳成 0 或者 6553.5。2.4 标定与粮堆布点出厂探头也有偏差粮库验收常要求两点或三点校准。做法是把探头和标准温度计一起放进冰水混合物0℃和恒温水浴如 40℃记录原始码值拟合成T a*raw b写回程序。湿度可用饱和盐溶液法氯化钠饱和溶液在密闭容器内稳定后约 75%RH氯化镁约 33%RH。布点决定了系统有没有意义。常见做法是每仓按三层表层下 30cm、中层、底层靠通风道口各布 2~4 点靠墙和靠门窗位置额外加一点因为那里最容易结露。点位不是越多越好超过 16 点以后走线成本和采集轮询周期都会明显上升答辩时也要能说清为什么是这几个点。3. 主控选型与采集程序的定时框架选主控要看点数、是否需要 ADC、要不要跑 Modbus、有没有上位机。粮库监控的实时性要求不高秒级采集足够但对长期稳定运行要求高所以程序结构比主频更重要不能有阻塞式长延时采样、判断、上报、显示各自分时执行。3.1 STC89C52RC、STC12、STM32F103 三种主控怎么选主控内核/主频关键资源适配规模STC89C52RC51 内核12MHz8KB Flash、512B RAM、1 个 UART4~8 点 DS18B20 1 路 DHT22STC12C5A60S21T 5111.0592MHz60KB Flash、1280B RAM、2 路 UART、8 路 10 位 ADC16 点测温 继电器联动 串口屏STM32F103C8T6Cortex-M372MHz64KB Flash、20KB RAM、3 路 USART、2 路 12 位 ADC32 点以上、Modbus RTU、上位机轮询课程设计和毕业设计里 STC89C52RC 和 STC12 出镜率最高原因是教程多、下载器便宜、Keil C51 上手快。要跑模糊 PID 或多路轮询RAM 是瓶颈512B 的 89C52 里放 16 个点的浮点数组就吃紧了用 STC12 会宽裕得多。3.2 用定时器 T0 搭一个 1 秒采样节拍不要用delay_ms(1000)做节拍那样串口接收和按键全部停摆。正确做法是让 T0 每 50ms 中断一次主循环累加计数到点再进采集状态。#include reg52.h void timer0_init(void) { TMOD 0xF0; TMOD | 0x01; // T0 模式 116 位定时 TH0 0x4C; // 11.0592MHz 下 50ms 初值 TL0 0x00; ET0 1; EA 1; TR0 1; } unsigned int tick50ms 0; void timer0_isr(void) interrupt 1 { TH0 0x4C; // 中断内必须重装 TL0 0x00; tick50ms; }11.0592MHz 的一个机器周期约 1.085us50ms 对应约 46080 个机器周期65536 减去它得到 19456即 0x4C00这就是 TH0/TL0 的初值来源。改成 12MHz 晶振时初值要重算成 0x3CB0否则节拍会偏到 48ms 左右长时间累积后上报时间戳会漂移。3.3 主循环状态机采集、换算、判警、上报把流程拆成状态每个状态只做一件事任何一个环节超时都能被主循环观测到。#define ST_IDLE 0 #define ST_START 1 #define ST_WAIT 2 #define ST_JUDGE 3 #define ST_UPLOAD 4 unsigned char state ST_IDLE; int temp_raw, humi_raw; void main_loop(void) { switch (state) { case ST_IDLE: if (tick50ms 20) { // 1s 到 tick50ms 0; state ST_START; } break; case ST_START: ds18b20_start(); // 广播启动转换 dht_read_all(temp_raw, humi_raw); state ST_WAIT; break; case ST_WAIT: if (tick50ms 15) { // 等约 750ms 转换完成 tick50ms 0; read_all_points(); // 逐个匹配 ROM 读回温度 state ST_JUDGE; } break; case ST_JUDGE: check_alarm(); // 阈值滞环判断 state ST_UPLOAD; break; case ST_UPLOAD: send_frame(); // 组帧上报 state ST_IDLE; break; } }状态机的价值在于可观测演示时如果数据一直不刷新看一眼state停在哪一步就能立刻判断是传感器没应答还是串口发不出去比在长函数里打断点快得多。3.4 串口上报与上位机帧格式多个探头时要带上点位地址帧里加校验上位机才能定位是哪一层出的问题。一个够用的帧是帧头 0xAA、地址、温度高字节、温度低字节、湿度高字节、湿度低字节、校验和、帧尾 0x55。波特率 9600、8 位数据、无校验、1 位停止位配 11.0592MHz 晶振误差为 0。import serial ser serial.Serial(COM3, 9600, timeout1) def parse(frame: bytes): # 帧长 8AA addr T_H T_L H_H H_L CHK 55 if len(frame) ! 8 or frame[0] ! 0xAA or frame[7] ! 0x55: return None chk sum(frame[1:6]) 0xFF # 前五字节累加取低八位 if chk ! frame[6]: return None # 校验失败直接丢弃不猜数据 addr frame[1] temp ((frame[2] 8) | frame[3]) / 10.0 humi ((frame[4] 8) | frame[5]) / 10.0 return addr, temp, humi while True: raw ser.read(8) # 定长读取配合协议里的帧头同步 print(parse(raw))温度放大 10 倍用整数传输是为了避免在 51 上做浮点组帧浮点运算会吃掉大量 Flash。上位机解析失败直接丢弃当前帧靠下一帧的 0xAA 重新同步不要在接收端做复杂的重传逻辑。4. 显示、报警与通风执行的联动参数采集做得再好没有合理的阈值和可靠的执行回路系统依然只是块电子表。这一层要处理三个问题界面刷新不能拖慢主循环阈值判断要能压住误报警继电器驱动要和强电彻底隔离。4.1 LCD1602 与 OLED 的分屏显示与刷新节流LCD1602 每帧写一个字节要几十微秒整屏刷新接近毫秒级如果放在 1 秒节拍里全刷会挤占串口接收窗口。常见做法是两行分屏第一行轮播各点温度每 2 秒换一个点位第二行固定显示当前最大温湿度和报警状态。只在数据变化时才写屏用一个last_display缓存比对相同就跳过。void lcd_update(int t_max, int h_now, unsigned char alarm) { static int last_t -9999, last_h -9999; if (t_max ! last_t) { // 只在变化时写减少总线占用 lcd_set_cursor(0, 5); lcd_show_num(t_max / 10, t_max % 10); last_t t_max; } if (h_now ! last_h) { lcd_set_cursor(1, 5); lcd_show_num(h_now / 10, h_now % 10); last_h h_now; } lcd_show_str(1, 12, alarm ? ALM : OK ); }4.2 阈值、回差与延时确认把误报警压下去单阈值最容易出的问题是继电器在临界点附近来回吸合接触器咔咔响寿命锐减。解法是加回差滞环和确认时间。参数建议取值作用温度上限25.0℃触发排风温度下限23.0℃低于此值才停风机湿度上限75%RH高湿启动通风除湿确认时间30s连续超限 30s 才判警滤掉瞬时扰动上报周期5s上位机侧不刷爆#define T_HIGH 250 // 25.0℃单位 0.1℃ #define T_LOW 230 // 23.0℃2℃ 回差 #define H_HIGH 750 // 75%RH void control_fan(int temp, int humi) { if (temp T_HIGH || humi H_HIGH) { FAN 1; // 超限启动排风 } else if (temp T_LOW humi H_HIGH) { FAN 0; // 两项都回落才停 } // 处于回差区间时保持原状态避免继电器抖动 }回差取 2℃ 是常见做法粮仓热惯性大设小了没意义设大了又容易让温度冲得太高。确认时间用计数器实现超过阈值时over_cnt回到正常区间清零只有over_cnt * 50ms 30000才置报警位。4.3 继电器驱动风机与通风窗的电气隔离单片机 IO 拉不动继电器线圈中间要有驱动级。小功率用 ULN2003 达林顿阵列感性负载端必须并一只 1N4148 续流二极管否则线圈断电瞬间的反向电动势会把 IO 打坏。要求更高时用光耦如 PC817加三极管或者直接上固态继电器把 220V 回路与弱电彻底分开。PCB 上强电和弱电分区走线间距留足地线单点汇接。另一个实用细节是上电初始化时把 FAN、WINDOW 全部置为关闭状态防止复位瞬间风机乱转。4.4 从开关量控制到增量式 PID 与模糊 PID如果粮库要求温度稳定在某个区间而不是简单排风可以引入闭环。基于单片机的模糊 PID 温度控制系统设计里常见的简化方案是增量式 PID 加一组模糊修正表误差大时放大比例项误差小时抑制积分防超调。// 增量式 PID输出为风机档位或风窗开度的增量 int pid_inc(int err, int err1, int err2) { int dk KP * (err - err1) KI * err KD * (err - 2 * err1 err2); return dk / 100; // 三个系数按 100 倍放大后存整型 }KP、KI、KD 放大 100 倍存成整数是为了绕开浮点。整定时先只留 KP从小往大加看到温度开始等幅振荡后取该值的六成再加 KI 消除静差最后加少量 KD 抑制超调。粮仓对象时间常数以小时计采样周期取 30~60 秒比取 1 秒更合理取太密只会让积分项反复累积。5. 答辩材料 PPT 课件怎么组织、现场演示怎么不翻车答辩材料 PPT 课件的评价标准和论文不一样评委在十几分钟里要看的是你到底做没做、指标从哪来、现场能不能跑。所以页序要按问题—方案—证据—数据—局限排而不是按论文目录抄。5.1 12~15 页的页序与每页信息密度页码内容建议停留1题目、姓名、指导教师、日期20s2粮库结露与霉变的实际损失场景40s3系统总体框图传感层、主控层、执行层、上位机60s4传感器选型对比表与最终选型理由50s5主控选型与资源占用Flash/RAM 实际使用量40s6硬件原理图重点区域单总线、驱动、电源70s7~8程序流程图与状态机、关键代码片段80s9阈值参数表与回差设计说明50s10实测数据曲线与报警响应时间80s11现场照片或演示视频截图40s12不足与改进方向30s每页只放一个观点框图配三到五个文字标签。第 6 页讲原理图时不要全图铺满用红框圈出单总线上拉电阻、继电器驱动和电源去耦三处讲清这三处是稳定性关键。5.2 原理图、时序图和代码片段怎么讲才不冷场讲原理图最有说服力的方式是从信号走一遍探头采集电压/数字信号 → 主控处理 → 驱动级隔离 → 继电器动作。讲时序图时直接指 DS18B20 的复位脉冲和存在脉冲位置说明 480us 和 60us 这两个数字是怎么来的。代码片段只贴 10 行以内重点标出中断重装初值和关中断保护采集这两个细节这比贴一大段主函数更能体现动手程度。5.3 演示环节的 6 个高频故障与现场处置现象常见原因现场处置温度读数一直是 85℃转换未完成就读回检查是否等了 750ms湿度偶尔为 0采样点偏移或中断打断关中断再读核对晶振频率串口上位机全是乱码波特率或晶振不匹配确认 11.0592MHz 与 9600 对应继电器吸合后主控复位电源被拉低、无续流回路换独立电源加续流二极管报警不停但数据正常回差设得太小把回差调到 2℃ 以上长时间运行后死机看门狗未启用或指针越界开 WDT检查数组边界5.4 评委常问的问题与回答角度为什么不用 WiFi 模块直接上云——回答粮库现场金属结构遮挡严重、供电和布线条件有限先用有线串口保证可靠无线只是后续扩展。精度怎么保证——拿出两点标定的原始记录和标定后偏差曲线。多探头怎么区分——讲 ROM 搜索和匹配 ROM 的流程说明序列号是固化的、不会冲突。如果探头坏了——讲读回全 1 或者 CRC 失败时的判丢逻辑以及上位机侧对超时未上报的点位打标。回答时把参数和实测数据带出来比讲架构更让人信服。演示前把探头插进温水里做一次阶跃响应看着曲线抬起来比任何一页 PPT 都管用。本文还有配套的精品资源点击获取