51单片机空调温度控制器设计:DS18B20采集与回差控温 简介这份资源面向电子信息、自动化等专业的学生及单片机入门学习者提供一套可完整运行的51单片机空调温度控制器设计。系统通过键盘设定目标温度区间借助DS18B20温度传感器实时采集温度当检测值超出设定范围时触发报警并联动升温、降温制冷制热执行环节构成从采集、判断到响应的闭环控制适合作为课程设计、毕业设计或单片机综合实验的参考范例。压缩包共21个文件约1.9MB涵盖C源程序、Keil工程文件uvproj、uvopt、hex等、Proteus仿真工程DSN、pdsprj、原理图PDF以及设计说明书Word与PDF文档编译、仿真、硬件图纸与文字说明相互配套便于对照理解代码逻辑与电路连接。资源已有1413人学习下载读者可据此快速搭建软硬件验证环境理清传感器时序读取、按键设定与阈值比较、报警及温控输出的实现思路并借助仿真图排查电路与程序配合中的常见问题。1. 定题先定边界这台 51 单片机空调温度控制器到底管什么某高校的课程设计题目发下来时多数人第一反应是照着现成的原理图抄一遍焊完能亮灯就算交差。真正卡人的是答辩现场——导师问一句「设定 26℃、实测 27.5℃继电器该不该吸合」答不上来就露馅了。这台基于 51 单片机的空调温度控制器要解决的核心问题不是「能不能测温度」而是把采集、判断、执行、显示串成一条能自洽的闭环并且在断电、干扰、频繁起停这些真实条件下依然不失控。它适合三类人正在做单片机课程设计、需要一份完整原理图和说明书的同学想把继电器控制接进自己小系统的开发者以及需要一个讲得清控制逻辑的演示样机的场景。源代码、原理图、说明书三件套的价值不在于「有」而在于三者的引脚、时序、阈值能互相对上。2. 系统方案一颗 51 撑起采集、显示、执行、按键四条线2.1 把需求拆成四条可测的硬性约束空调温控看起来功能多剥掉装饰之后其实只有四条硬指标我在动手画图之前一定会先把它们写成可测的句子否则后面选型和写代码全是拍脑袋。第一条是测温范围与分辨率室内场景只需要覆盖 050℃但要求分辨到 0.1℃因为回差只有 1℃ 左右时0.5℃ 的跳变会让继电器频繁动作。第二条是控制精度设定值与实测值的稳态偏差控制在 ±1℃ 以内这个指标决定了后面用位式控制还是 PID。第三条是执行器保护压缩机类负载断电后不能立刻重启必须留足停机间隔这条是很多人做课设时完全想不到的。第四条是人机交互至少要有设定、加、减三个按键和一块能同时显示设定值与实测值的屏幕。把这四条写下来之后技术选型基本就没有悬念了。注意第三条它是区分「能演示」和「讲得通」的分水岭答辩时提到压缩机最小停机间隔导师一般会多问两句而这恰恰是加分项。2.2 选型对比为什么是 STC89C52 DS18B20 LCD1602 继电器主控这一层没什么可纠结的。51 系列里 STC89C52RC 有 8KB Flash、512B RAM、内部 EEPROM价格低、资料多、烧写只需要串口课设场景下几乎是最优解。相比之下用 STM32 会把工作量集中在库函数配置上反而弱化了「控制逻辑」这个真正该被考察的点用纯模拟电路搭比较器则没有掉电保存和显示答辩时说不清楚状态。测温器件的取舍更值得说。热敏电阻加 ADC 的方案成本最低但要额外做分压、查表、非线性校正误差还受电阻精度影响。DS18B20 是单总线数字输出一根线完成供电和数据出厂校准-55125℃ 覆盖室温绰绰有余12 位分辨率对应 0.0625℃。代价是要自己写严格的 1-Wire 时序微秒级的延时不能被打断——这也是后面避坑章节里最容易翻车的地方。| 方案 | 测温精度 | 占用 IO | 软件复杂度 | 适用判断 | | 热敏电阻 ADC0832 | ±1℃需校准 | 3 根CS/CLK/DIO | 中要查表 | 想练 ADC 可以用 | | DS18B20 单总线 | ±0.5℃050℃段 | 1 根 | 高时序敏感 | 本项目首选 | | 集成温度传感器模拟 | ±0.5℃ | 1 根 ADC | 中 | 需要额外 ADC 通道 |显示选 LCD1602两行十六字符第一行放设定值和状态第二行放实测值和故障码信息密度刚好。OLED 更漂亮但要写显存页地址调试期会多花半天。执行器用继电器模块触点容量 10A/250VAC驱动风机、压缩机模型、加热片都够用如果用可控硅还得处理过零检测对课设来说属于过度设计。2.3 模块划分与主循环节拍三个延时敏感任务必须摘出来整个软件我一般拆成五个模块传感器驱动、显示驱动、控制决策、按键扫描、故障处理。它们不是平级关系而是按实时性分成两档。DS18B20 的读写要求微秒级延时不能被打断属于最高优先级继电器动作、按键消抖、屏幕刷新的容忍度在十毫秒量级EEPROM 写入最慢几百毫秒都无所谓但绝对不能放在中断里。主循环的骨架因此长这样定时器 0 每 1ms 进一次中断只做计数和标志位置位不干重活主循环检测到 1s 标志就启动一次温度转换转换完成后再做一次控制决策每 10ms 处理一次按键扫描和显示刷新。这样写的好处是任何一个环节卡住都能从其他环节的节拍上看出异常而不是整机一起死。提示不要在主循环里用while(!flag);死等温度转换完成。DS18B20 的 12 位转换最长 750ms这段时间 CPU 完全被占住按键会失灵屏幕会闪现象看起来像「死机」。模块之间只通过全局变量通信cur_temp当前温度单位 0.01℃、set_temp设定温度、fault_flag故障标志。用整数不用浮点51 上跑一次 float 乘法要几百个机器周期而 0.01℃ 的整数精度已经完全够用这是 C51 开发里省 CPU 最直接的一招。3. 硬件设计最小系统、测温、驱动三块板子怎么接3.1 最小系统与复位电路别小看那两个电容最小系统包含三部分晶振电路、复位电路、电源。晶振我选 12MHz因为它的机器周期正好是 1μs算定时器初值的时候不用反复折算写代码时心里有数11.0592MHz 的优势是串口波特率精确但这个项目不跑串口通信用不上。晶振两端各接一只 30pF 瓷片电容到地电容值不要随手拿 104容值偏差会让起振变得勉强表现为「上电偶尔不启动用手碰一下晶振脚就好了」。复位电路是 10μF 电解电容正极接 VCC、负极接 RST同时 RST 通过 10kΩ 电阻接地再加一个按键并联在电容两端做手动复位。上电瞬间电容相当于短路RST 为高电平完成复位随后电容充电RST 被 10kΩ 拉低进入运行状态。这里最常见的错误是把电容极性接反或者省掉那只 10kΩ 电阻结果就是上电复位不可靠程序偶尔从随机地址开始跑。电源部分要区分两路单片机、LCD1602、DS18B20 走 5V继电器线圈走 12V如果用 5V 继电器则共用 5V。两路共地但走线分开从电源入口单点汇合不要在主芯片脚下打孔回头。这一条是抗干扰的地基后面继电器一吸合就复位的毛病八成能在这里提前掐掉。3.2 DS18B20 单总线接法与上拉电阻取值DS18B20 有三个引脚VDD、GND、DQ。DQ 接单片机 P1.0同时在 DQ 和 5V 之间接一只 4.7kΩ 上拉电阻。这只电阻不能省也不能随便换成 10kΩ——单总线靠开漏结构通信上拉电阻负责把总线拉回高电平阻值太大会让上升沿变缓读时序在临界点上就开始出错阻值太小则器件拉低时灌电流过大。4.7kΩ 是数据手册给的推荐值在几十厘米的走线长度内都稳。如果要在总线末端加保护可以在 DQ 与 GND 之间并一只 5.1V 稳压管做钳位防止长线引入的尖峰打坏 IO。线长超过两米时建议改用屏蔽线并把屏蔽层单端接地同时把上拉电阻降到 3.3kΩ 补偿线缆电容。这些细节在原理图上只是多画两个符号但在实测阶段能省下大量「温度偶尔读成 85℃」的排查时间。| 引脚 | 连接对象 | 备注 | | P1.0 | DS18B20 DQ | 4.7kΩ 上拉至 5V | | P0.0–P0.7 | LCD1602 D0–D7 | P0 为开漏必须加 10kΩ 排阻上拉 | | P2.0 / P2.1 / P2.2 | LCD1602 RS / RW / EN | RW 可接地但保留可读忙标志 | | P1.1 | 继电器驱动输入 | 经 S8050 三极管串 1kΩ 基极电阻 | | P1.2 | 蜂鸣器 | 经三极管驱动串 100Ω | | P3.2 / P3.3 / P3.4 | 按键 SET / / − | 按键另一端接地内部弱上拉 |3.3 继电器驱动三极管、续流二极管和光耦隔离单片机 IO 口的拉电流能力只有几百微安到几毫安直接驱动继电器线圈必然带不动还会把 IO 拉崩。所以中间必须加一级三极管放大继电器线圈一端接 12V另一端接 S8050 的集电极发射极接地基极经 1kΩ 电阻接 P1.1。单片机输出高电平时三极管导通线圈得电触点吸合。S8050 是 NPN 型最大集电极电流 700mA驱动常见的 5V/12V 小型继电器完全够用。真正关键的是并联在线圈两端的那只二极管。继电器线圈是感性负载三极管关断瞬间线圈会产生反向电动势幅值可能达到电源电压的好几倍直接击穿三极管或者顺着地线窜回单片机把 IO 打坏。解决方法是把一只 1N4007 反并联在线圈两端正常工作时二极管反偏不导通关断瞬间线圈电流通过二极管续流泄放尖峰被压到 0.7V 左右。这只二极管的方向绝对不能接反接反了等于把电源直接短路。要求再高一点的做法是加光耦隔离比如 PC817。单片机的 IO 只驱动光耦内部的发光二极管光耦另一侧的三极管去推继电器两边地线完全分开。这样做的好处是继电器侧的干扰彻底传不到主控侧代价是多两只电阻和一点板上面积。如果驱动的是真实压缩机或者大功率风机我一般会坚持加光耦因为一旦主控被干扰复位整机状态就不可控了。3.4 显示与按键接口P0 口的上拉排阻是个必踩的坑LCD1602 的数据口接在 P0 上是因为 P0 有 8 个连续引脚布线整齐。但 P0 口在 51 内部是开漏结构作为通用 IO 使用时必须外接上拉电阻才能输出高电平标准做法是加一只 10kΩ 的 9 脚排阻公共端接 5V其余 8 脚分别接 P0.0P0.7。省掉这只排阻的典型症状是屏幕能亮背光正常但一个字符都不显示或者显示一排方块——因为数据线根本送不出高电平。LCD1602 的对比度引脚 V0 接一只 10kΩ 电位器中间抽头两端分别接 VCC 和 GND用来调对比度。这个电位器调不到合适位置时现象是「有背光但看不清字」或者「全是黑块」很多人误以为是程序问题其实是偏压不对。调的时候上电运行程序一边慢慢旋一边看屏幕直到字符清晰、背景干净为止。按键用四个独立按键接 P3.2、P3.3、P3.4、P3.5另一端统一接地。51 的 P3 口内部有弱上拉按键不按时读到高电平按下时读到低电平可以省掉外部上拉电阻。但内部上拉很弱几十微安级如果按键线超过十几厘米建议还是加 10kΩ 外部上拉否则容易受干扰误触发。按键位置也要考虑面板布局SET 和加减键之间留出足够间距避免一手按下去同时碰到两个键。4. 软件实现从 1-Wire 时序到回差控温的状态机4.1 定时器时基1ms 心跳与任务分频整个系统只有一个硬时基就是定时器 0 的 1ms 中断。其他所有周期性任务都靠软件分频从这个心跳里派生出来这样不需要第二个定时器也不会出现多个时间源互相漂移。/* 定时器0 初始化12MHz 晶振模式11ms 中断一次 */ void Timer0_Init(void) { TMOD 0xF0; /* 清除定时器0 的配置位保留定时器1 */ TMOD | 0x01; /* 定时器0 工作在模式116 位定时 */ TH0 (65536 - 1000) / 256; /* 12MHz 下每机器周期 1us1ms 需 1000 个 */ TL0 (65536 - 1000) % 256; ET0 1; /* 允许定时器0 中断 */ EA 1; /* 打开总中断 */ TR0 1; /* 启动计数 */ } /* 中断服务只做计数和标志不执行耗时操作 */ void Timer0_ISR(void) interrupt 1 { TH0 (65536 - 1000) / 256; /* 必须手动重装模式1 不会自动重载 */ TL0 (65536 - 1000) % 256; tick_1ms; /* 1ms 计数供控制模块计算停机间隔 */ if (cnt_10ms 10) { cnt_10ms 0; flag_10ms 1; } /* 10ms 任务 */ if (cnt_1s 1000) { cnt_1s 0; flag_1s 1; } /* 1s 采样 */ }这段代码有两个参数要按实际硬件改。如果晶振换成 11.0592MHz一个机器周期约 1.085μs1ms 对应约 921 个机器周期重装值要改成65536 - 921否则时基会偏快约 8%累计下来一天差近两小时压缩机保护间隔也跟着失准。另外模式 1 是 16 位定时器溢出后不会自动重载所以中断里必须手动写 TH0/TL0漏写这一句的表现是「程序跑几分钟后彻底卡死」——因为定时器再也不会溢出中断不再进入。中断服务程序里只做计数是想清楚了一件事中断里每多花一微秒主循环就少一微秒。把显示刷新、EEPROM 写入这类耗时操作放进中断短时间看不出问题一旦传感器转换和屏幕刷新撞在一起1-Wire 时序就会被拉长到超出容限读回的温度直接变成乱码。4.2 DS18B20 读写时序微秒级的活必须按手册来单总线协议的本质是「用高低电平的持续时间编码 0 和 1」所以延时函数的精度直接决定通信成败。我一般先用定时器或者空循环标定出一个Delay10us()基准函数再基于它构造所有时序。/* 复位脉冲主机拉低至少 480us释放后 15~60us 内器件回存在脉冲 */ bit DS18B20_Reset(void) { bit presence; DS18B20_DQ 0; Delay10us(48); /* 拉低约 480us */ DS18B20_DQ 1; /* 释放总线由上拉电阻拉高 */ Delay10us(6); /* 等待约 60us 再采样 */ presence DS18B20_DQ; /* 读到 0 表示器件在线应答 */ Delay10us(42); /* 补足 480us 恢复时间让总线回到空闲 */ return presence; } /* 读一次温度返回单位 0.01℃失败返回 0x7FFF 作为错误标志 */ int DS18B20_ReadTemp(void) { unsigned char tl, th; int raw; if (DS18B20_Reset()) return 0x7FFF; /* 无应答直接返回故障码 */ DS18B20_WriteByte(0xCC); /* 跳过 ROM总线上只有一个器件 */ DS18B20_WriteByte(0x44); /* 启动一次温度转换 */ DelayMs(750); /* 12 位分辨率最长需要 750ms */ if (DS18B20_Reset()) return 0x7FFF; DS18B20_WriteByte(0xCC); DS18B20_WriteByte(0xBE); /* 读暂存器前两字节即温度值 */ tl DS18B20_ReadByte(); /* 低字节 */ th DS18B20_ReadByte(); /* 高字节 */ raw (th 8) | tl; return (int)((long)raw * 625 / 100); /* 0.0625℃ 换算为 0.01℃ 单位 */ }几个参数必须说清楚。0xCC是跳过 ROM 命令因为总线上只挂了一个 DS18B20不需要匹配地址如果挂多个必须改成0x55加 8 字节 ROM 码。0x44是启动转换0xBE是读暂存器这两个命令字写错一个就永远读不到正确数据。最后的换算raw * 625 / 100是把 0.0625℃ 的原始单位转成 0.01℃必须先转long再乘否则 125℃ 对应 2000乘 625 直接溢出成负数——这是 C51 里最经典的一类 bug编译器不会报警只会给你一个莫名其妙的值。延时函数DelayMs(750)期间总线是空闲的可以去做别的事但初学者往往直接死等。更规范的做法是用 1ms 心跳计数转换启动后先返回等 750ms 到了再去读这 750ms 里主循环照常刷屏、扫按键交互体验会好很多。4.3 回差控温与压缩机保护整篇方案的核心判断控制策略这一块我最终选的是带死区的位式控制而不是 PID。原因很实在空调压缩机的启停频率本来就该被限制PID 输出连续调节在这里没有对应的执行器除非你上变频模块那成本和复杂度都不是课设该碰的量级。位式控制加回差既能保证温度稳定在设定值附近又能天然限制动作频率用最少的代码换最可靠的现场行为。#define TEMP_SET_DEFAULT 2600 /* 默认设定 26.00℃单位 0.01℃ */ #define HYST 100 /* 回差 ±1.00℃ */ #define COMP_MIN_OFF_MS 180000UL /* 停机后至少 3 分钟才允许再启动 */ static unsigned char comp_on 0; /* 压缩机继电器当前状态 */ static unsigned long last_stop_ms 0; /* 上次停机时刻用于计算保护间隔 */ void Control_Task(unsigned long now_ms) { if (fault_flag) { /* 传感器断路或短路强制停机 */ comp_on 0; RELAY 0; return; } if (!comp_on) { /* 启动条件实测 设定 回差且距上次停机已满 3 分钟 */ if (cur_temp set_temp HYST (unsigned long)(now_ms - last_stop_ms) COMP_MIN_OFF_MS) { comp_on 1; RELAY 1; } } else { /* 停机条件实测 设定 - 回差 */ if (cur_temp set_temp - HYST) { comp_on 0; RELAY 0; last_stop_ms now_ms; } } }回差HYST取 100即 1.00℃是有讲究的。取太小比如 0.2℃温度在阈值附近抖动就会让继电器反复吸合释放触点寿命迅速耗尽现象是「咔哒咔哒响个不停」取太大比如 3℃温度波动肉眼可感控温精度不达标。1℃ 在室内场景是折中值如果被控对象热惯性大比如一个封闭的小箱子可以放大到 1.5℃。COMP_MIN_OFF_MS是压缩机最小停机间隔这条逻辑用now_ms - last_stop_ms的差值判断而不是直接比较两个时间戳是因为tick_1ms是无符号长整型会自然回绕用差值法在回绕时依然正确。这个细节在演示的几分钟里体现不出来但如果设备连续跑几天直接比较时间戳就会在回绕那一刻出现一次误启动。4.4 按键状态机与参数掉电保存按键处理我不用if(key0) delay(20);这种写法因为延时消抖会阻塞主循环屏幕刷新会顿一下长按加减时更明显。改成状态机之后每 10ms 采样一次连续三次一致才认等于 30ms 消抖效果和延时法一样但不占 CPU。#define KEY_NONE 0x00 /* 每 10ms 调用一次返回按下的键值无按键返回 KEY_NONE */ unsigned char Key_Scan(void) { static unsigned char last_raw 0x00, stable 0x00, cnt 0; unsigned char raw (~P3) 0x3C; /* P3.2~P3.5 低有效取反后对应位置 1 */ if (raw ! last_raw) { /* 电平变化重新计数 */ last_raw raw; cnt 0; return KEY_NONE; } if (cnt 3) { /* 连续 3 次一致才认为稳定约 30ms */ cnt; return KEY_NONE; } if (stable ! raw) { /* 只在状态跳变时上报一次避免连击 */ stable raw; return raw; } return KEY_NONE; }(~P3) 0x3C这个掩码要按实际接线改0x3C 对应 P3.2 到 P3.5 四位多一位少一位都会读到无关引脚。返回值只在跳变时上报一次所以长按不会连续触发需要「长按连加」的话得在调用方另做计时这一点在写说明书时要交代清楚否则用户会觉得按键不灵敏。设定温度需要掉电保存STC89C52RC 内部有 EEPROM通过 ISP/IAP 寄存器操作按扇区擦除、按字节写入。关键是写入时机不能在按键每变一次就写一次EEPROM 擦写寿命有限我的做法是按键调整后启动一个 3 秒定时3 秒内没有新按键才真正落盘这等于给用户一个「反悔窗口」也把写入次数压到最低。上电时先读 EEPROM读到的值如果在 1630℃ 之外就判定为未初始化回落到默认的 26℃。5. 避坑清单五个最容易在验收现场翻车的点5.1 读回 85.0℃ 或 -127℃上电默认值与应答丢失现象屏幕第二行固定显示 85.0或者偶尔跳到 -127.0重启后可能恢复正常也可能一直错。原因85.0℃ 是 DS18B20 上电后的暂存器默认值对应原始码 0x0550说明读到的根本不是一次真实转换的结果而是器件刚上电还没转换完就被读取。−127℃ 则是复位后没有检测到存在脉冲程序却继续往下读读回全 1 得到的结果。两者本质上是同一个问题复位检测的返回值被忽略了。解决每次读写前先调DS18B20_Reset()返回值为 1无应答就立刻退出并置fault_flag不要把无效数据送进控制逻辑。另外启动转换后必须等够 750ms不能在 100ms 时就去读。如果时序确认无误仍然读不到用示波器看 DQ 上的复位波形正常应该是「低 480μs → 高 60μs 内出现一个 60240μs 的低脉冲」缺了那个低脉冲就是上拉电阻或接线的问题。5.2 继电器一吸合单片机就复位电源与地线没分开现象单独测试时一切正常一旦继电器动作屏幕闪烁、程序从头开始跑蜂鸣器乱响。原因继电器线圈是大电流感性负载吸合瞬间的浪涌电流会在电源线上产生压降如果单片机和继电器共用一组 5V 且走线细长电压瞬间跌到 4.5V 以下就触发欠压复位。如果续流二极管漏装或方向接反关断时的反峰更会直接窜回主控。解决先查续流二极管有没有、方向对不对再把继电器电源和单片机电源从电源入口分开走各自加 100μF 电解加 0.1μF 瓷片去耦最后检查地线继电器回路的地要单独走回电源负极不要在主芯片脚下和数字地混在一起。要求更高就上光耦物理断开两条地线这一招基本能根治。5.3 LCD1602 有背光但不显字三个高频原因现象上电后屏幕亮着但一个字符都没有或者显示一排黑方块。原因按出现频率排第一P0 口没接上拉排阻数据送不出去高电平第二初始化延时不够1602 上电后内部需要 15ms 以上稳定时间紧接着的第一条指令前还要等 4.1ms程序一上电就发指令必然收不到第三V0 对比度电位器没调偏压不对字符其实写进去了但看不见。解决先确认排阻再在初始化开头加DelayMs(20)最后调电位器一边上电运行一边慢慢旋。如果这三步都做了还是不显示检查 RS/RW/EN 三根线有没有接反以及 RW 如果接地程序里就不能再去读忙标志必须全部用固定延时等待否则会一直卡在等待应答上。5.4 温度在阈值附近反复起停没做回差也没做滤波现象设定 26℃实测在 25.9 和 26.1 之间跳继电器一秒吸合一次声音很吵触点发热。原因单点比较没有死区温度只要跨越阈值就动作而传感器本身的抖动和噪声让它在阈值附近来回穿。这是位式控制最典型的缺陷很多人在仿真里看不出来因为仿真温度是平滑变化的。解决加回差启动阈值设在设定值上方、停止阈值设在下方中间的区间不动作。同时给采样值加一阶滤波filtered (filtered * 3 raw) / 4把单次跳变压掉。两招一起用之后正常工况下继电器动作间隔会拉开到几分钟一次这才是能交付的状态。5.5 仿真通过实物不通过时序假设和驱动能力现象在仿真软件里温度显示、继电器动作全都正常焊到板子上就各种异常。原因仿真软件里的 DS18B20 模型不检查微秒级时序也不模拟总线电容和上拉强度仿真里的 IO 口驱动能力是理想的实物却只有几百微安。也就是说仿真验证的是逻辑实物验证的是电气两者根本不是一回事。解决把仿真当成逻辑自检工具只用来确认状态机和显示格式没问题时序和驱动一律以实物为准。第一次上板时先跑最小测试只烧一个「读温度并通过串口打印」的程序确认传感器通了再接显示显示通了再接继电器一级一级往上搭。这套分段验证的习惯能让你在出问题时立刻知道是哪一层坏了而不是对着一块板子从头查。6. 验收与答辩一张测试表把「能用」变成「可证明」到了验收环节很多人吃亏在只会演示「现在能用」说不出「怎么证明它稳定」。我一般会提前准备一张测试表逐项跑一遍并且把现象记下来答辩时直接把表递过去配合现场演示说服力比口头描述强得多。| 测试项 | 输入条件 | 预期现象 | 判定依据 | | 上电显示 | 常温约 25℃ | 第一行 SET 26.0第二行 25.0 | 无乱码、无黑块 | | 制冷启动 | 设定 26.0实测升至 27.2 | 继电器吸合运行指示灯亮 | 启动阈值 27.0 | | 制冷停止 | 实测降至 24.8 | 继电器释放指示灯灭 | 停止阈值 25.0 | | 回差验证 | 实测稳定在 25.5 | 继电器保持现状不动作 | 无频繁起停 | | 掉电保存 | 改为 24℃断电 10 秒重上 | 显示 SET 24.0 | EEPROM 生效 | | 传感器故障 | 拔掉 DQ 线 | 显示 E1继电器立即释放 | 故障保护生效 | | 停机保护 | 强制停机后立刻升温 | 3 分钟内不再吸合 | 保护逻辑生效 |表里最有价值的是最后两行。前面几项只能说明功能对故障保护和停机保护才能说明你考虑过真实工况。演示时主动引导评委看这两项一般都会被追问设计思路而你前面已经把回差和最小停机间隔讲透了顺着答下去即可。答辩前还有一件事值得做把自己的原理图从头到尾在纸上默画一遍标出每个引脚的作用和每个电阻电容存在的理由。被问到「这个 4.7k 是干什么的」时能立刻答出「单总线上拉保证空闲态高电平」和支支吾吾翻资料是完全两种评价。说明书也不要只贴图和代码把控制逻辑的判断条件写成文字把参数表列出来让不熟悉这个项目的人也能照着复现。这套资料里的源代码、原理图和说明书就是按上面这几个模块组织的代码里的注释和原理图上的网络标号能一一对应上拿去当模板改的时候不容易改错地方。我早年第一次做这类课设图省事把传感器读取放在主循环里死等 750ms演示时倒也没事结果被问「按压按键的响应时间是多少」当场愣住——因为那 750ms 里按键根本不响应。从那以后我每次做带周期采样的系统都强制把耗时操作和交互任务拆成不同节拍先在纸上画出时序图再写代码这个习惯帮我躲掉了后面至少一半的时序类问题。希望帮到你。本文还有配套的精品资源点击获取