51单片机PT100测温系统:ADC0808采集与仿真设计

发布时间:2026/9/12 18:53:53
51单片机PT100测温系统:ADC0808采集与仿真设计 简介一套基于51单片机的热电偶测温设计资料包面向电子、自动化、物联网等专业学生及单片机开发者适配课程设计、毕业设计与项目仿真实训。系统以AT89C51/STC89C52为核心使用PT100热电偶传感器、TDA2030信号放大电路、ADC0808模数转换器通过4位数码管显示温度并支持声光报警覆盖硬件电路搭建与软件程序编写两大主线可完整复现温度测量、实时显示与超温报警功能。资源共57个文件、13.66MB包含Keil源程序工程、Proteus仿真工程含操作视频、论文材料及配套技术手册。c/h源文件与hex文件便于直接编译烧录pdsprj/dsn仿真文件可快速查看电路运行效果doc/pdf/ppt文档补充设计思路图片和视频辅助理解操作。已有71人学习/下载五大部分结构清晰源码、仿真、论文、手册一站配齐。读者既可对照文档梳理设计流程也能直接基于工程修改调试在较短时间获得可演示、可扩展的测温方案对完成课设或毕设答辩有较高参考价值。1. 51 单片机热电偶测温设计PT100、ADC0808 与 SEG4 的信号链全貌这个标题把一套测温信号链写全了PT100 把温度变成电阻电桥和运放把它变成电压ADC0808 转成 8 位数字51 单片机换算后送 SEG4 数码管显示超限时 BZ 蜂鸣器报警。动手前必须说破一个点PT100 是铂热电阻不是热电偶。课程设计里这两个词经常混用按字面做真热电偶要处理毫伏放大和冷端补偿按 PT100 走电桥则电路简单一半。下面按 51PT100ADC0808 这条最稳的路从硬件选型、C51 程序、Proteus 仿真讲到两点校准课程设计、单片机入门或毕业设计都能直接照做。2. PT100 信号调理与 ADC0808 接入电桥、运放、通道选通与时钟2.1 为什么 PT100 测温要用电桥而不是直接分压直接用一个固定电阻和 PT100 串联分压理论上也能得到随温度变化的电压但一上板子就吃亏。第一是灵敏度问题分压曲线被固定电阻压低同样 100°C 变化对应的电压摆幅比电桥小第二是导线电阻问题PT100 只有两根引线时线阻直接叠加进测量值0.2Ω 的接触电阻在 0°C 附近就相当于 0.5°C 的偏差。所以常见的 PT100 两线制、三线制测温电路图里核心都是惠斯通电桥加差动放大这也是 51 单片机硬件设计里最典型的模数混合链路。取四个桥臂 R1R2R3100ΩPT100 放最后一个桥臂激励电压 5V。0°C 时四个桥臂都是 100Ω电桥输出 0V100°C 时 PT100 约 138.5Ω电桥输出约 0.40V。这个电压直接进 ADC0808 只有约 20 个 LSB 的变化必须放大。用 LM358 放大 10 倍后100°C 对应约 4.0V8 位分辨率下大约 0.5°C/LSB对课程设计完全够用。放大倍数怎么定LM358 同相放大增益 G1Rf/Rg想要 10 倍就取 Rf9kΩ、Rg1kΩ。注意 LM358 是单电源运放输入共模范围到不了负轨电桥输出端要保证在运放的有效输入范围内不要出现接近 0V 时运放进入非线性区的情况。做实物板子时建议用三线制 PT100两条引线分别进相邻桥臂引线电阻在差分输出里互相抵消四线制是配恒流源做高精度测量的做法这个设计用不上查 pt100 四线制测温电路图时对比理解即可。2.2 真热电偶怎么接毫伏放大与冷端补偿电路如果出题人坚持要的是热电偶那 PT100 在这个设计里的正确身份是冷端补偿电阻。K 型热电偶输出约 41μV/°C0~100°C 温差只有 4.1mV靠 LM358 直接放大不现实LM358 的失调电压就有 2mV。常见做法是换 AD620 这类低失调仪表放大器增益设到 1000 左右把 4.1mV 放大到 4.1V 再进 ADC0808。冷端补偿不能省热电偶测的是热端与冷端的温差电动势冷端放在接线盒里温度随环境变化。用 PT100 贴在冷端通过 ADC0808 的 IN1 通道同步采集冷端温度查 K 型热电偶分度表得到冷端对应的毫伏值加到热端电动势上再反查分度表得到真实温度。这就是经典的热电偶电桥补偿电路思路AD594 这类专用芯片只是把补偿电桥做进了封装原理完全一致。普通课程设计没有恒温槽用 PT100 做冷端测量已经比直接假设冷端 0°C 准确得多。2.3 ADC0808 引脚分配通道地址、时钟上限与参考电压ADC0808 是 8 通道 8 位逐次逼近型 ADCIN0~IN7 由 ADDA/ADDB/ADDC 三个引脚编码选通一次完整转换约 64 个时钟周期。5V 供电时时钟典型值是 640kHz上限 1.28MHz超过会转换不稳。这套设计的引脚分配如下表数据口放 P1显示总线单独走 P0两者不抢线功能ADC0808 引脚51 单片机侧通道地址ADDA/ADDB/ADDCP2.0 / P2.1 / P2.2地址锁存 启动ALE / START 并接P2.3转换结束EOCP3.2查询输出使能OEP2.4数据输出D0~D7P1.0~P1.7时钟输入CLKALE 经 74LS74 二分频时钟这里最容易被忽略12MHz 晶振下标准 51 的 ALE 是 2MHz直接接到 ADC0808 就超了 1.28MHz 上限。我一般用一片 74LS74 做二分频D 接 Q 非CLK 接 ALEQ 输出 1MHz 给 CLK想省这一片芯片也可以用单片机定时器翻转引脚输出时钟但 C51 里中断开销会让频率抖动不如 74LS74 干净。VREF 接 5VVREF- 接地这样 1 LSB 约等于 19.5mV如果 VREF- 悬空仿真和实物都会出现整体偏移这是第四章要排的坑。3. Keil C51 程序骨架ADC0808 采集、SEG4 动态显示与蜂鸣器报警3.1 read_adc 驱动地址锁存、启动脉冲与 EOC 等待Keil C51 写 ADC0808 驱动关键是把数据手册时序拆成三步先锁存通道地址再发启动脉冲最后等 EOC 并打开 OE 读数据。下面这个函数可以直接抄进工程#include reg52.h sbit ADDA P2^0; // 通道地址位 sbit ADDB P2^1; sbit ADDC P2^2; sbit ADC_START P2^3; // ALE 与 START 并接在同一根线 sbit ADC_OE P2^4; // 输出使能 sbit ADC_EOC P3^2; // 转换结束信号 #define ADC_DATA P1 // 8 位数据口 unsigned char read_adc(unsigned char ch) { unsigned int timeout; // 1. 先设置通道地址确保地址比锁存边沿更早稳定 ADDA ch 0x01; ADDB (ch 1) 0x01; ADDC (ch 2) 0x01; // 2. 一个正脉冲同时完成锁存地址和启动转换 ADC_START 0; ADC_OE 0; ADC_START 1; ADC_START 0; // 3. 等 EOC 先变低再变高加超时防止卡死 timeout 0; while (ADC_EOC 1 timeout 60000); timeout 0; while (ADC_EOC 0 timeout 60000); // 4. 打开 OEP1 先写 1 再读 ADC_OE 1; ADC_DATA 0xFF; return ADC_DATA; }步骤 2 里 ALE 和 START 并接地址在整个脉冲期间保持不变所以锁存边沿落在上升还是下降都不影响结果如果分开驱动两个引脚记得保证地址比 ALE 边沿早 200ns 以上稳定。步骤 3 的等待有讲究EOC 空闲时是高电平启动后先变低表示转换进行中完成时再变高所以要先等低再等高。两个超时计数是为了仿真时不接 CLK 也不会永久死循环真机调试时就能看出问题出在时钟。3.2 从 ADC 原始值反推 PT100 电阻与温度read_adc 给的是 0~255 的原始值要还原成温度必须先还原成电压再还原成电阻。前面电桥参数固定后反推公式是 Rpt 100 × (0.5 x) / (0.5 - x)其中 x Vout / (G × Vref)Vout 是 ADC 值除以 255 再乘参考电压。写成 C 代码如下float adc_to_temp(unsigned char raw) { float v, x, r, t; v (float)raw / 255.0f * 5.0f; // Vout参考电压 5V x v / (10.0f * 5.0f); // G10Vref5V if (x 0.5f) return 999.9f; // 越限保护 r 100.0f * (0.5f x) / (0.5f - x); t (r - 100.0f) / 0.385f; // 0~100°C 线性近似 return t; }参数 G 和 Vref 是这套公式里最常改的两个量换了运放放大倍数或参考电压只改 x 那行的两个数即可。如果做的是真热电偶加 AD620直接让 v 除以放大倍数后查 K 型分度表不走电桥公式。还要注意量程G10、Vref5V 时满量程对应 Rpt≈150Ω约 130°C想扩到 150°C 就把放大倍数调小或把桥臂电阻改大把平衡点上移。8 位分辨率下这个线性近似在 0~100°C 误差约 1°C课程设计能接受想压到 0.5°C 以内见第 5 章的 CVD 修正。3.3 SEG4 动态扫描与 BZ 报警回差显示用两片 74HC573 挂在 P0 上一片锁段码、一片锁位选数码管选 Proteus 里的 7SEG-MPX4-CC共阴。动态扫描用定时器 0 做 2ms 中断4 位一轮 8ms刷新率 125Hz肉眼看不到闪烁也不会和主循环抢总线unsigned char code seg_tab[] {0x3F,0x06,0x5B,0x4F,0x66,0x6D, 0x7D,0x07,0x7F,0x6F,0x00}; // 共阴段码最后一位全灭 sbit LATCH_SEG P3^4; sbit LATCH_DIG P3^5; #define DISP_BUS P0 void seg_write(unsigned char d) { DISP_BUS d; LATCH_SEG 1; LATCH_SEG 0; } void dig_write(unsigned char d) { DISP_BUS d; LATCH_DIG 1; LATCH_DIG 0; } void timer0_isr(void) interrupt 1 { static unsigned char pos 0; unsigned char buf[4]; int v (int)(cur_temp * 10.0f); // cur_temp 是全局采样温度 TH0 0xF8; TL0 0x30; // 2ms 12MHz 12T buf[0] 10; // 最高位消隐 buf[1] (v / 100) % 10; // 十位 buf[2] (v / 10) % 10 | 0x80; // 个位最高位置 1 表示带小数点 buf[3] v % 10; // 小数位 dig_write(0x00); // 先关全部位选消隐防拖影 seg_write(seg_tab[buf[pos] 0x7F]); dig_write(0x01 pos); // 只点亮当前位 if (pos 4) pos 0; }buf[2] 的小数点用段码最高位置 1 标记写段码前用 0x7F 去掉既省一个变量又保证消隐位不亮。报警部分要注意回差直接拿 T80°C 开蜂鸣器、T80°C 关闭温度在阈值附近抖动一下就会反复响所以用两个阈值80°C 开、78°C 关sbit BZ P3^7; bit alarm_flag; void alarm_check(float t) { if (t 80.0f !alarm_flag) { alarm_flag 1; BZ 0; } else if (t 78.0f alarm_flag) { alarm_flag 0; BZ 1; } }BZ 写成低电平有效实物板子上蜂鸣器通过 NPN 三极管接到 P3.7仿真里直接接 BUZZER 组件即可。两个阈值建议用宏定义#define ALARM_ON 80.0f和#define ALARM_OFF 78.0f这样调参不用翻代码做低温报警就把开阈值设在下限、关阈值设在略高位置回差方向反过来。4. Proteus 仿真联调51 单片机与 ADC0808 的仿真接法和翻车点4.1 先跑通最小采样回路再挂显示和报警Proteus 仿真 51 单片机时顺序比接线更重要。一上来就把整个系统画全出问题根本分不清是采集、显示还是报警的锅。我通常先画最小回路AT89C51、ADC0808、LM358、电桥电阻、CLK 电路上电后只做一件事把 ADC 原始值送 P1 接的 LED 或者用虚拟终端打印确认 0°C 和 100°C 时读数会变。具体步骤放器件AT89C51、ADC0808、LM358、RESPACK-8、POT-HG 电位器模拟 PT100、74LS74、CRYSTAL 12MHz、7SEG-MPX4-CC、74HC573 两片、BUZZER。电位器调到 100Ω 模拟 0°C拧到 138.5Ω 模拟 100°CProteus 库里如果有 PT100 模型直接拖出来设温度更省事。74LS74 接成二分频D 接 Q 非CLK 接单片机 ALEQ 输出接 ADC0808 的 CLK用仿真频率计确认有 1MHz。运放输出接 IN0冷端补偿通道 IN1 预留VREF 接 5VVREF- 接地。把虚拟电压表挂在 LM358 输出端电位器拧到 138.5Ω 时应看到约 4.0V确认模拟前端没问题再写显示和报警。仿真芯片直接用 AT89C51 或 AT89S52 都可以管脚兼容。调通最小回路后再慢慢把两个 74HC573、数码管和蜂鸣器加进来这样每一步的变量都只有一个。4.2 仿真里最容易翻车的五个位置症状最常见原因排查顺序卡在 EOC 等待程序像跑飞CLK 没接或 ALE 直连超上限先查 CLK 有没有 1MHz再查 EOC 连线读数整体偏移0°C 不为 0VREF- 悬空或参考电压不稳VREF- 接地VREF 对地并 0.1μF数码管缺笔画、数字反显共阳共阴段码取反7SEG-MPX4-CC 是共阴换段码表显示闪烁、刷新不均匀扫描放在主循环延时里改用 51 定时器固定 2ms 中断读 ADC 时数码管乱跳数据口和显示总线共用 P0数据口改 P1P0 只给显示第一个坑最隐蔽ALE 是 2MHz直接接 CLK 超规格仿真里有些版本照样跑但读数时对时错一旦换成 74LS74 二分频就稳定。第二个坑的排查技巧是加超时计数超时跳过后读数是 0xFF 或固定值多半在 OE 或 EOC如果一直死等在 while 里优先怀疑 CLK。第三个坑在 Proteus 里最好验证把 7SEG-MPX4-CC 和 7SEG-MPX4-CA 各放一个对比段码表就明白了。另外这种并口 ADC 的读写时序蓝桥杯单片机国赛客观题里也反复考仿真完整跑一遍基本就能记住启动、等待、读使能三步的顺序。仿真通过后移植到真机先短接输入端测零点再用万用表量运放输出两个基准点对着了再谈精度。5. 把误差压下去PT100 两点定标与 CVD 修正5.1 两点定标的第一步记录 0°C 和 100°C 的 ADC 原始值在冰水混合物和接近沸点的热水中分别放探头各记录 50 次读数取平均得到 raw0 和 raw100再套线性修正t_real t_raw * k b k 100.0f / (t_raw_100 - t_raw_0) b -k * t_raw_0把 k 和 b 写成全局浮点变量显示前对 adc_to_temp 的返回值做一次修正。这一步同时吸收了电桥电阻误差、运放增益误差和 ADC 参考电压误差比逐个换精密电阻快得多。沸水温度受气压影响100°C 是近似值要求严格的场合用标准温度计同时读数但课程设计里直接用这两个点即可。5.2 CVD 修正与查表验证PT100 在 0~150°C 用 CVD 方程 R 100 × (1 3.9083e-3 × T - 5.775e-7 × T²) 描述0°C 附近斜率约 0.385Ω/°C到 100°C 降到约 0.381Ω/°C线性近似在这个区间误差约 0.4°C。三个校验点如下温度PT100 电阻0°C100.00Ω50°C119.40Ω100°C138.51Ω仿真验收时把电位器分别拧到这三档看 SEG4 是否依次显示 0.0、50.0、100.0随后把电位器拧过 80°C 对应的阻值确认 BZ 动作再往回拧 2°C 以内蜂鸣器应保持不抖回差生效。如果 0°C 是准的但 100°C 偏离说明运放增益电阻 Rf 偏差超过 1%优先换电阻而不是改 k这样低温和高温段的修正才不会互相拉扯。本文还有配套的精品资源点击获取