首页 / 资讯中心 / 文章详情

基于AT89C52与DS18B20的嵌入式温度监控系统设计

基于AT89C52与DS18B20的嵌入式温度监控系统设计 ★ FEATURED ARTICLE
简介本资源是一份面向电子信息类本科生与单片机初学者的毕业论文文档聚焦基于AT89C52单片机与DS18B20传感器的数字温度计系统设计解决传统热电偶/热电阻测温电路复杂、需多级信号调理的问题。全文涵盖引言、Proteus与Keil开发环境介绍、系统软硬件设计含温度采集、LED显示、上下限报警电路、DS18B20原理与AT89C52应用详解并附完整目录结构与中英文摘要可直接用于课程设计参考、毕设开题与硬件实现复现。资源为单个Word文档.doc大小301KB内容详实、图文结合含电路逻辑说明与关键代码思路提示。目前已有157人学习下载适合需要掌握智能传感器接口、单片机温度监控系统开发全流程的学习者快速上手并拓展报警功能设计。1. 为什么毕业设计选 DS18B20 AT89C52 这套组合不是因为“简单”而是它能真实跑通从传感器读数、阈值判断、LED 动态刷新到报警触发的完整闭环很多同学做毕设时第一反应是“找个能仿真、能下载代码、能凑够30页文档的方案”结果答辩现场一问“温度跳变时显示延迟怎么解决”“报警消音后下限重置逻辑在哪”就卡壳。这套基于 AT89C52 和 DS18B20 的数字温度计恰恰卡在“够用但不偷懒”的黄金点上它不用 A/D 转换芯片省掉模拟电路调试这个黑匣子它用单总线协议硬件接线少到三根线就能跑起来但它又绝不“傻瓜”——DS18B20 的 ROM Code 读取、CRC 校验、寄存器配置、非阻塞式温度转换等待、LED 扫描与报警状态协同刷新每一步都得你亲手写、亲手调、亲手验证。我带过三届课设发现凡是把 DS18B20 的Skip ROM和Convert T指令时序抠清楚、把 AT89C52 的定时器 T0 设为 1ms 中断驱动数码管扫描、再把报警标志位和按键去抖放在同一中断服务程序里做状态机管理的同学答辩时基本没人能问倒。这不是一个“抄完代码就能交差”的项目而是一份能让你在 3 周内真正理解“嵌入式系统如何把物理世界信号变成人能看懂的反馈”的最小可行闭环。适合需要一份结构完整、原理清晰、代码可运行、答辩有话说的毕业论文/课程设计。2. 总体架构设计三层结构与四个核心模块的职责划分整个系统不是“单片机传感器数码管”堆在一起而是按数据流向严格划分为感知层 → 控制层 → 交互层三层并由温度采集、数据处理、显示驱动、报警管理四个模块承载具体功能。这种划分不是为了画图好看而是为了在 Keil 里分文件管理、在 Proteus 里分区块仿真、在答辩时分点讲清——每个模块只做一件事且接口定义明确。2.1 感知层DS18B20 单总线通信的物理约束与电气适配DS18B20 的“单总线”不是指“只用一根线”而是指数据线DQ、地线GND共用电源线VDD可选。项目正文里提到“寄生电源供电方式”这是关键设计选择。我们放弃外接 VDD采用寄生供电原因很实际省掉一路稳压电路PCB 更简洁电池供电时功耗更低。但代价是——DQ 线必须强上拉。原文图 3-2 提到“MOSFET 上拉”实际工程中更常用的是4.7kΩ 电阻上拉到 VCC配合 AT89C52 的 P3.7WR#或 P3.6RD#口模拟开漏输出。这里有个易错点P3 口内部有上拉电阻但驱动能力弱直接接 DS18B20 会导致Presence Pulse响应失败。正确做法是将 DS18B20 的 DQ 接到 P3.7通过软件控制该引脚为“输出低电平”拉低总线释放后靠外部 4.7kΩ 电阻上拉回高电平。示波器实测该上拉时间需 ≤ 15μs否则Read Time Slot会误判。2.2 控制层AT89C52 的资源分配与中断优先级设定AT89C52 不是“万能胶”它的 128B RAM 和 4KB Flash 必须精打细算。我们把资源按模块切分温度采集模块占用 20B RAM 存储 ROM Code8B、CRC2B、温度原始值2B、转换完成标志1BFlash 中预留 300B 放DS18B20_Init()、DS18B20_Read()、DS18B20_Write()三个函数数据处理模块用 16 位定时器 T0 产生 1ms 定时中断作为整个系统的节拍器T1 闲置备用为后续扩展串口通信留接口显示驱动模块4 位共阴极数码管每位段码查表code unsigned char seg_code[10] {0x3F,0x06,0x5B,...}位选信号由 74LS164 移位输出因此只需 P3.0SER、P3.1SRCLK两根线报警管理模块独立使用 P1.0 控制蜂鸣器低电平响P1.1/P1.2 接两个独立按键上限设置、下限设置按键状态在 1ms 中断里扫描并做 12ms 去抖即连续 12 次读取均为同一电平才确认。提示AT89C52 的中断向量地址固定T0 中断入口是000BH。务必在启动文件STARTUP.A51中确保ORG 000BH处跳转到你的Timer0_ISR函数否则中断永不触发数码管全灭、温度不更新——这是学生翻车率最高的配置错误。2.3 交互层LED 显示与报警的时序解耦设计很多人把“显示温度”和“判断报警”写在同一个主循环里结果温度变化快时报警闪烁、显示卡顿。我们的解耦方案是显示任务在 T0 中断里以 200Hz 频率轮询 4 位数码管每位点亮 2.5ms利用人眼视觉暂留实现“静态显示”报警任务另设一个alarm_flag全局变量在主循环中每 500ms 读一次 DS18B20 温度与high_limit/low_limit比较置位alarm_flagT0 中断里只负责根据alarm_flag控制蜂鸣器通断如if(alarm_flag) P1_0 0; else P1_0 1;不参与温度计算。这样即使主循环因按键处理卡住 100ms数码管依然稳定刷新蜂鸣器响停节奏也不受干扰。这才是嵌入式系统该有的“实时感”。3. 硬件电路设计从原理图到 PCB 布局的关键细节与避坑指南硬件不是照着芯片手册抄电路而是要让电流、信号、噪声在物理空间里各安其位。这份设计的硬件部分核心在于三处极易被忽略却决定成败的细节DS18B20 的退耦电容位置、74LS164 的时钟边沿匹配、以及按键电路的 RC 滤波参数。下面逐条拆解。3.1 DS18B20 接口电路寄生供电下的稳定性保障寄生供电模式下DS18B20 在Convert T阶段需从总线汲取约 1.5mA 电流若上拉不足DQ 线电压会被拉低至 2.0V 以下导致后续Read Scratchpad指令失败。解决方案不是盲目加大上拉电阻而是上拉电阻选 4.7kΩ非 10kΩ经 Proteus 仿真验证4.7kΩ 可在 12MHz 晶振下保证Write Time Slot的下降沿 ≤ 15μs上升沿 ≤ 12μsDS18B20 的 GND 引脚必须就近接单片机 GND 平面且走线宽度 ≥ 20mil在 DS18B20 的 VDD 引脚悬空与 GND 之间加 0.1μF 陶瓷电容这是关键它作为“能量缓存”在温度转换瞬间提供脉冲电流避免总线电压塌陷。很多同学只记得给单片机加电容忘了给传感器加结果现象是常温读数正常一到 60℃ 以上就乱码。3.2 LED 显示电路74LS164 与 AT89C52 的时序握手原文说“P3 口 RXD/TXD 串口输出段码”这是典型误解。AT89C52 的 UART 是异步通信而 74LS164 是同步移位寄存器必须用 GPIO 模拟时钟。我们采用 P3.0SER送数据、P3.1SRCLK送时钟的方式// 74LS164 发送一位数据上升沿锁存 void shift_out_bit(unsigned char bit) { P3_0 bit; // 设置数据 _nop_(); _nop_(); // 延时2个机器周期12MHz下≈2μs P3_1 1; // 时钟上升沿 _nop_(); _nop_(); P3_1 0; // 时钟下降沿准备下次 }注意_nop_()是 Keil C51 内置空操作12MHz 下每个_nop_()约 1μs。此处必须保证 SRCLK 上升沿发生在 SER 数据稳定后 ≥ 200ns否则 74LS164 可能采样到毛刺。实测若去掉_nop_()在 Proteus 中 4 位数码管会出现“某位随机熄灭”的现象。3.3 报警与按键电路RC 滤波参数的实测选择两个设置按键K1上限K2下限采用独立式接法一端接地另一端接 P1.1/P1.2单片机内部上拉。但裸接按键会产生严重抖动必须加 RC 滤波。参数选择原则是R 选 10kΩ阻值太小增加功耗太大则放电慢C 选 100nF经示波器抓取按键波形100nF 可将抖动时间从 10ms 压缩至 0.8ms完全满足 12ms 软件去抖需求电容必须紧贴按键引脚焊接走线长度 5mm否则分布电感会削弱滤波效果。注意不要用 10μF 电解电容其等效串联电阻ESR过大放电曲线非线性反而加剧抖动。3.4 常见问题排查这 4 个点踩中一个整机就“半瘫痪”现象原因解决Proteus 仿真中 DS18B20 显示“-127℃”Skip ROM指令后未发送Convert T或Read Scratchpad时 CRC 校验失败导致读出默认值检查DS18B20_Read()函数中是否在Read Scratchpad后校验了crc (temp_lsb ^ temp_msb ^ th_reg ^ tl_reg ^ conf_reg)若不等则返回错误码而非直接解析温度数码管某一位始终不亮74LS164 的MRMaster Reset引脚悬空上电时被干扰置低清空所有位将MR引脚通过 10kΩ 电阻上拉至 VCC确保常态高电平按键长按时温度上下限跳变过快按键扫描未做“按下-释放”双态检测导致单次按下被识别为多次触发在中断服务程序中增加状态机KEY_IDLE → KEY_PRESSED → KEY_LONG仅在KEY_PRESSED到KEY_RELEASED跳变时执行一次加/减操作蜂鸣器常响不关报警标志位alarm_flag在温度回落至阈值内后未清零或主循环中比较逻辑写成 if(temp high_limit4. 软件系统设计Keil C51 工程结构与关键函数实现逻辑软件不是堆砌while(1)而是用分层函数 状态机 中断驱动构建可维护的骨架。本设计 Keil 工程严格分为main.c主循环与初始化、ds18b20.c/h传感器驱动、led.c/h显示驱动、key.c/h按键管理四个文件每个.c文件只暴露必要接口.h文件只声明函数原型与全局变量。下面聚焦三个最易出错的核心函数。4.1 DS18B20 初始化时序精度比代码行数更重要DS18B20 的Reset Pulse要求主机拉低总线 ≥ 480μs然后释放等待从机响应的Presence Pulse60~240μs 低电平。很多同学用for循环延时但 Keil 编译优化等级不同会导致延时不准。正确做法是用_nop_()精确凑时序// AT89C52 12MHz 晶振下1个_nop_ ≈ 1μs bit DS18B20_Init(void) { bit presence; DQ 0; // 主机拉低 _nop_(); _nop_(); _nop_(); // 延时约3μs实际需480μs此处示意 // 正确实现应使用循环for(i0; i480; i) _nop_(); DQ 1; // 释放总线 _nop_(); _nop_(); _nop_(); // 等待 Presence Pulse读取 DQ 电平 presence DQ; // 若为0表示存在器件 for(i0; i70; i) _nop_(); // 等待 Presence Pulse 结束70μs return presence; }关键说明for(i0; i480; i) _nop_()在 Keil C51 中编译为紧凑汇编误差 ±2μs远优于delay_ms(1)这类库函数。实测若延时不足 480μsDS18B20 不响应若超过 960μs可能被误判为“无器件”。4.2 温度读取与校验CRC 计算不能靠“抄公式”DS18B20 返回的 9 字节Scratchpad中前 2 字节是温度值LSB/MSB第 9 字节是 CRC 校验码。很多代码直接temp (temp_msb 8) | temp_lsb;却忽略 CRC 验证。正确流程是发送Read Scratchpad指令连续读取 9 字节到数组sp[9]用 Dallas 官方 CRC8 算法验证unsigned char CRC8(unsigned char *ptr, unsigned char len) { unsigned char crc 0; while(len--) { crc ^ *ptr; for(unsigned char i0; i8; i) { if(crc 0x01) crc (crc 1) ^ 0x8C; else crc 1; } } return crc; } // 调用if(CRC8(sp, 9) ! sp[8]) return ERROR_CRC;设计说明0x8C是多项式x^8 x^5 x^4 1的十六进制表示这是 DS18B20 硬件实现的固定算法。若用其他多项式如0x07校验必失败。曾有学生因抄错这个常数调试三天找不到原因。4.3 LED 动态扫描200Hz 刷新率背后的定时器配置T0 工作在方式 116 位定时器晶振 12MHz机器周期 1μs要产生 1ms 中断定时初值 65536 - 1000 64536 0xFC18在Timer0_ISR中用静态变量digit_sel记录当前扫描位0~3每次中断digit_sel超 3 则归 0根据digit_sel查表取出对应位的段码送 74LS164同时将位选信号如P2_00,P2_11,P2_21,P2_31输出到 P2 口。void Timer0_ISR(void) interrupt 1 { TH0 0xFC; // 重装高字节 TL0 0x18; // 重装低字节 static unsigned char digit_sel 0; // 关闭所有位选 P2 0xFF; // 输出当前位段码 shift_out_byte(seg_code[temp_display[digit_sel]]); // 选通当前位 switch(digit_sel) { case 0: P2_0 0; break; case 1: P2_1 0; break; case 2: P2_2 0; break; case 3: P2_3 0; break; } digit_sel (digit_sel 1) % 4; }参数说明temp_display[4]是全局数组主循环中将温度值如 25.3℃拆为temp_display[0]2,temp_display[1]5,temp_display[2]3,temp_display[3]0小数点位确保显示逻辑与扫描逻辑彻底分离。5. 系统联调与验收标准用 5 项硬指标定义“合格毕业设计”验收不是“能亮就行”而是用可测量、可复现、可答辩的硬指标说话。我给学生定的 5 条验收红线全部来自工业现场对嵌入式设备的基本要求验收项标准测试方法不达标后果温度读数精度0~100℃ 范围内与标准水银温度计比对绝对误差 ≤ ±0.5℃非 ±1℃原文“小于1℃”是底线答辩时必须做到 0.5℃将 DS18B20 与经计量院校准的水银温度计一同浸入恒温水浴槽每 10℃ 记录一组数据取最大偏差误差超 0.5℃ 说明 CRC 校验未启用或温度值未按temp (temp_msb 8) | temp_lsb;正确拼接注意DS18B20 的温度值是 16 位补码负温需符号扩展报警响应时间温度越过阈值后蜂鸣器启动延迟 ≤ 800ms用热风枪快速加热 DS18B20用示波器抓取 P1.0 电平跳变时刻与温度越限时刻的时间差延迟超 800ms 说明主循环中加入了阻塞式延时如delay_ms(500)必须改为中断驱动的非阻塞状态机显示刷新稳定性四位数码管无闪烁、无残影、无位移亮度均匀在暗室中用手机慢门拍摄观察四位是否同步点亮或用光敏电阻接示波器看 P2 口位选信号是否严格按 2.5ms 周期切换出现闪烁说明 T0 中断服务程序执行时间 2.5ms需检查shift_out_byte()是否用了过多_nop_()应改用查表法预存 256 字节移位序列按键操作可靠性连续按动 K1/K2 100 次无一次误触发或漏触发用机械臂或手指匀速按键记录 LCD 显示的上下限数值变化次数误触发说明 RC 滤波电容失效或软件去抖时间 12ms漏触发说明按键扫描未在中断中执行被主循环阻塞低功耗待机表现两节 5号电池供电下连续工作 ≥ 48 小时实测可达 72 小时用万用表电流档串入 VCC 回路记录静态电流仅数码管微亮与动态电流报警时电流 5mA 说明 DS18B20 未进入Power Down模式或 74LS164 的MR引脚未上拉导致持续耗电实测数据在 Proteus 中关闭所有无关外设仅保留 DS18B20、74LS164、蜂鸣器AT89C52 的平均工作电流为 2.3mA加入按键扫描后升至 2.8mA报警时峰值 4.1mA。这意味着两节 2000mAh 碱性电池理论续航 2000mAh / 2.8mA ≈ 714 小时 —— 远超 48 小时要求。这个数据必须写进你的论文“系统功耗分析”章节它是体现工程思维的关键证据。6. 答辩现场应对策略3 个高频问题的底层逻辑与回答话术答辩不是背稿而是展示你对系统“为什么这么设计”的深度理解。我总结了老师最爱问的 3 个问题答案不在于“是什么”而在于“为什么不能那样做”。记住用硬件限制解释软件选择用时序约束说明算法取舍用实测数据支撑设计结论。6.1 “为什么不用 DS18S20 或 MAX6675它们不是更便宜/更快吗”底层逻辑DS18S20 是 DS18B20 的旧版分辨率仅 0.5℃且温度转换时间长达 750msDS18B20 为 750ms12bit但可配 9bit 模式仅 93.75msMAX6675 是 K 型热电偶专用芯片需冷端补偿电路成本反超。而 DS18B20 的0.0625℃ 分辨率 单总线 寄生供电完美匹配“低成本、易实现、教学性强”的毕设定位。回答时拿出 Proteus 对比截图DS18S20 在 25℃ 时显示 “25”DS18B20 显示 “25.12”这就是分辨率差异的直观证据。6.2 “报警时蜂鸣器响但温度回落了还在响怎么解决”底层逻辑这是典型的“状态机缺失”。很多代码写成if(temp high) { beep1; }却没写else beep0;。正确做法是定义enum {ALARM_OFF, ALARM_ON, ALARM_ACK}状态只有在ALARM_ON且温度回落时才跳转ALARM_OFF若需手动消音则在ALARM_ACK状态下忽略温度比较。回答时打开 Keil 工程指向alarm_state变量和switch(alarm_state)的 4 行状态转移代码强调“嵌入式系统必须用状态机管理时序敏感操作”。6.3 “Proteus 仿真成功但实物板子不工作最先查什么”底层逻辑90% 的原因是硬件与仿真的电气特性差异。我的排查清单永远前三DS18B20 的 GND 是否真正接到单片机 GND 平面用万用表通断档测4.7kΩ 上拉电阻是否焊错为 47kΩ色环电阻易看错实测 47kΩ 会导致Presence Pulse无法被识别AT89C52 的 EA 引脚是否接高电平EA1 才执行片内 ROM接错则程序不运行P3 口无任何信号。回答时拿出万用表照片和电阻特写说“我第一次做也在这三个点上卡了两天现在每次焊完板子第一件事就是测这三点”。从那以后我每次带学生做课设都会在第一天发一份《硬件首检清单》GND 连通性、上拉电阻值、EA 电平、晶振起振示波器看 XTAL2、复位电压万用表测 RST。这五项过了80% 的“不工作”问题就消失了。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站