
简介这是一套基于51单片机的铂电阻温度计完整设计方案以PT100为测温传感器配合TLC1543模数转换器实现-200℃850℃宽范围温度测量并在LCD屏上实时显示。资源面向单片机课程设计、毕业设计及Proteus仿真入门者适合需要完整工程参考的电子类专业学生和开发者可解决PT100信号调理、ADC采集、液晶显示等关键设计问题。压缩包共含46个文件涵盖C语言源代码、Keil工程、Proteus仿真工程、Altium原理图、功能介绍文档与元件清单表整体约905KB目录结构清晰便于按模块对照学习。仿真与原理图完整呈现硬件连接和程序逻辑功能介绍与元件清单可辅助快速搭建实物、验证电路或撰写设计报告。目前已有346人学习下载作为涵盖软硬件与仿真的温控实例具备较高的借鉴价值。1. 基于51单片机的温度测量PT100TLC1543 这套 1 路测温要解决什么问题把一颗 PT100 贴在设备外壳上用三根线引回控制板由 TLC1543 完成 10 位模数转换51 单片机读回 ADC 码再按分度表换算成温度这是工业现场和单片机课程设计里出现频率很高的一套组合。它看起来零件不多真动手时会卡在三个环节PT100 输出的是电阻而不是电压不能直接进 ADCTLC1543 的串行时序是双缓冲结构读错一拍数据就是乱的ADC 码不等于温度中间还隔着放大倍数、基准电压和非线性修正。市面上挂着“原理图源代码proteus”的资源很多核心链路基本都是 PT100 → 电桥/恒流源 → 运放 → TLC1543 → 51 → 显示或串口。这篇文章不评价某个压缩包而是把这套链路的参数选型和驱动代码讲透拿到任何一份原理图都能自己调通或者完全靠 Proteus 仿真把它复现出来。适合正在做 51 单片机课程设计、需要交原理图与源代码的学生也适合想用 51 低成本做单点温度采集的嵌入式工程师。读完你可以回答电桥电阻怎么选、TLC1543 怎么读、温度怎么算、仿真里最容易错在哪。2. PT100 的信号调理电桥、三线制与运放增益是精度的前提2.1 0.385Ω/℃ 和分度表PT100 的电特性不复杂PT100 铂电阻在 0℃ 时是 100Ω0~150℃ 区间每升高 1℃ 约增加 0.385Ω。按 IEC 607510~850℃ 的阻温关系可以用 R(t)100×(1A·tB·t²) 表示A3.9083×10⁻³B-5.775×10⁻⁷负温区间还要再乘一项 C·(t-100)·t³。工程上如果只做 0~150℃直接用 R≈1000.385t 做粗算也够最大偏差在半摄氏度左右但真要显示到 0.1℃ 就必须查分度表。下面这张表同时给出电桥输出和放大后的 ADC 码后面几章反复用到它。电桥参数是我按 1kΩ 桥臂、固定臂 R3100Ω、增益 20 倍、基准 5V 计算的Proteus 里可以直接复现。温度(℃)PT100 阻值(Ω)电桥差分电压(mV)放大 20 倍后(V)TLC1543 码值(REF5V)-2092.16-32.6-0.65不可用0100.0000020107.7932.00.6413150119.4078.81.58323100138.51153.73.07630150157.33225.24.50922注意 -20℃ 那行输出是负压说明单电源运放处理不了负温差。如果测量范围包含零下要么给运放加负电源要么把电桥人为偏置到 2.5V 附近。1 路常温或高温测量按 0~150℃ 设计最干净这也是大多数课设原理图的做法。2.2 三线制 vs 两线制引线电阻怎么压铜导线电阻大约每米 0.02~0.05Ω而 PT100 每 1Ω 对应约 2.6℃一米导线就能带来 0.1℃ 以上的误差长线更是不能接受。三线制是 PT100 工程接法的底线三根线等长、同材质一根接电桥的固定臂一根接 PT100 的串联臂第三根接电桥激励点。当两条测量臂的引线电阻相等时电桥两端各自抵消一份线阻误差。四线制开尔文接法精度最高用恒流源激励、差分测电压但 TLC1543 是单端输入 ADC四线制的差分信号要么用差分运放转成单端要么换带差分输入的 ADC。这套 1 路测温系统用三线制最合适。如果拿到的原理图只画了两根线接 PT100要意识到零点会被线阻拉偏尤其在 Proteus 仿真里导线电阻为零这个误差是看不到的实物才会暴露出来。接线端子上的标记也要认一下很多模块把 PT100 端子标成 RTD、RTD- 或者 TC、TC-RTD 是热电阻TC 是热电偶。上电前用万用表量两两之间的电阻确认哪两根是 PT100 本体哪一根是补偿线接反了电桥平衡点直接乱掉。2.3 电桥、运放和增益把 100157Ω 映射到 05VTLC1543 的输入范围是 0~REFREF 接 5V 时最大只能吃 5V。PT100 从 100Ω 变到 157.33Ω电桥输出的差分电压只有 0~225mV直接用 ADC 测10 位分辨率下每 LSB 对应 4.88mV算下来每码将近 3℃完全不可用所以中间必须加一级放大。常见做法是 R1R21kΩR3100Ω电桥激励 5V。PT100 上的电流约 4.5mA自身功耗约 2mW自热在可接受范围运放增益取 20 倍理想输出 0~4.5V给单电源运放的输出摆幅留出 0.5V 余量。普通课设用 LM324 里的两个运放一个做电压跟随一个做差动放大如果追求低失调和共模抑制直接换 INA128 仪表放大器增益公式是 G150kΩ/Rg取 Rg2.61kΩ 就得到约 20 倍。软件侧需要把放大后的电压反推成电阻公式是电桥分压比的反解float rtd_resist(float vout, float gain, float vsup, float r1, float r3) { float dv vout / gain; /* 扣除运放增益得到电桥差分电压 */ float k r3 / (r1 r3); /* 固定臂分压比 */ float ratio dv / vsup k; /* 动态臂实际分压比 R t /(R1R t) */ if ((ratio 0.0f) || (ratio 1.0f)) /* 防止除零 */ return 0.0f; return ratio * r1 / (1.0f - ratio); }vout 是 TLC1543 码值换算出的运放输出电压gain 是放大倍数vsup 是电桥激励电压r1 和 r3 是桥臂电阻。这个函数把所有硬件参数集中在一个地方后面第 4 章的温度换算就是先调它再对电阻查表。2.4 不能把 ADC 码直接当温度的原因PT100 阻温曲线本身带二次项电桥输出又是分压比而不是线性电阻放大后的电压与温度并不是严格直线。0~150℃ 全量程如果硬拉一条直线最大误差大约 2~3℃。能做到 ±0.5℃ 的做法是ADC 码 → 电压 → 电阻 → 分度表插值。只在 20~100℃ 小范围使用时用一次式 ya·tb 拟合也能压住误差但换一个传感器、换一套电阻就要重新标定不如查分度表通用。3. TLC1543 串行驱动4 根 IO 读回 10 位 ADC 值3.1 为什么选 TLC154351 单片机没有内置 ADC常见搭配里 ADC0832 和 PCF8591 都是 8 位输入 0~5V 时每 LSB 约 20mV。前面算过放大后的信号灵敏度约 30mV/℃8 位 ADC 只能分辨到 0.6℃ 量级对 PT100 来说不够。TLC1543 是 10 位逐次逼近型 ADC配合这个增益档位每码约 0.16℃满足 0.2℃ 级别的显示需求。更实用的是它有 11 个模拟输入通道这套设计只用到 AIN0后续要多路测温时改通道号即可电路和驱动都不用重写。串行接口只需要 4 根 IO数据输出是三态CS 拉低时才输出可以直接接 51 的准双向 IO 口。TLC1543 信号方向连接到 51AIN0模拟输入OP07/LM324 运放输出REF基准正5VREF-基准负GNDDATA OUT数据输出P1.3DATA IN地址输入P1.2I/O CLOCK移位时钟P1.1/CS片选P1.0EOC状态输出可选P1.4REF 接 VCC 时电源纹波会直接进测量结果。更好的做法是把 REF 和电桥激励接同一个 5V让 ADC 码变成电压比值电源缓慢漂移被抵消这就是后面会展开的比率测量。3.2 sbit 定义与初始化sbit ADC_CS P1^0; sbit ADC_CLK P1^1; sbit ADC_DIN P1^2; sbit ADC_DOUT P1^3; sbit ADC_EOC P1^4; void adc_init(void) { ADC_CS 1; /* 片选高电平让 DOUT 处于高阻不影响总线 */ ADC_CLK 0; /* 时钟默认低电平 */ }初始化只做两件事CS 拉高、时钟拉低。51 的准双向 IO 在读取外部信号前要先写 1所以 ADC_DOUT 不需要额外配置但不要在 ADC_CS 为低时去操作同一组端口的其他外设避免电平竞争。EOC 如果不用可以不接后面用固定延时也能读。3.3 读一个通道两个 10 拍窗口网上流传最广的 C51 驱动是把一次访问拆成两个 10 拍窗口前 10 个时钟写通道控制字后 10 个时钟读转换结果unsigned int tlc1543_read(unsigned char channel) { unsigned char i; unsigned int dat 0; channel 0x0F; channel 4; /* 通道号移到高 4 位低 6 位填 0 */ ADC_CS 0; /* 片选拉低开始一次串行访问 */ for (i 0; i 10; i) /* 前 10 拍把控制字移入 */ { ADC_CLK 0; ADC_DIN (channel 0x80) ? 1 : 0; channel 1; ADC_CLK 1; } for (i 0; i 10; i) /* 后 10 拍把结果移出 */ { ADC_CLK 0; /* 下降沿后数据稳定先拉低再读 */ dat 1; if (ADC_DOUT) dat | 0x01; ADC_CLK 1; } ADC_CS 1; /* 片选恢复高电平 */ return dat 0x03FF; /* 保留低 10 位有效数据 */ }TLC1543 的 10 位控制字是 MSB-first前 4 位是通道地址后 6 位写 0。channel 4把 AIN0~AIN10 的编号移到高 4 位循环左移 10 次正好把 4 位地址先发出去。读取循环里每次先把 CLK 拉低再读 DOUT 并左移进 dat这是因为 TLC1543 在 I/O 时钟的下降沿之后更新输出低电平期间读最稳。实际使用时要记住它是双缓冲结构地址写入后启动的是下一次转换后 10 拍读出来的数据对应的是上一次转换的结果。所以上电或切换通道后第一次读取应当丢弃unsigned int raw; raw tlc1543_read(0); /* 第一次读丢弃旧通道结果 */ raw tlc1543_read(0); /* 这次才是当前 AIN0 的有效值 */如果不想在代码里书写两次调用也可以把读函数内部改成“写地址后空读一次再返回”代价是每次采样时间翻倍。1 路温度测量采样率本来就只有几赫兹性能完全够。3.4 EOC 轮询与定时采样地址锁存后 TLC1543 自动启动转换转换结束引脚 EOC 会拉低。EOC 不是必须接很多 Proteus 例程不接 EOC靠固定延时也能工作。如果原理图里画了 EOC可以这样用ADC_CS 0; /* 前 10 拍写地址同 3.3 节 */ while (ADC_EOC 1); /* 等待转换结束EOC 低电平有效 */ /* 后 10 拍读数据 */温度是慢物理量不要在 while 循环里不停读 ADC51 还要处理显示和通信。常见做法是定时器每 50ms 或 100ms 置一个标志位主循环只在该标志置位时启动一次转换。注意中断服务函数里不要直接调tlc1543_read它带有十几个时钟的时序操作放在中断里容易和主循环的读取打架置标志位就足够。4. 温度换算与标定从 ADC 码到 0.1℃ 的完整链路4.1 从码值到电阻参考电压很关键TLC1543 单端输入的电压和码值关系是 Vin ADC × REF / 1024。REF 直接接 5V 时5V 电源的纹波会原样出现在结果里。一个被很多人忽略的技巧是比率测量电桥激励也用同一个 5VADC 的 REF 和信号源同源码值实际代表的是输入电压与基准电压的比值电源整体漂移会被自动抵消。这也是 REF 接 VCC 的电路仍然能稳定工作的原因。对应到代码float adc_to_rtd(unsigned int adc) { float vout; vout (float)adc * 5.0f / 1024.0f; /* 运放输出电压 */ return rtd_resist(vout, 20.0f, 5.0f, 1000.0f, 100.0f); }参数和 2.3 节的电路一一对应增益 20、激励 5V、桥臂 1kΩ。如果焊好的板子实际增益不是 20零点也不是 0在标定环节修正这两个数不要在函数里一个个猜。Proteus 仿真里运放是理想模型这个函数算出来的电阻会非常接近设定值实物则需要在软件里加零点偏移。4.2 查分度表做线性插值电阻到温度的换算推荐用分度表加线性插值。51 上跑 float 比较慢但温度采样率只有几赫兹CPU 时间完全够。为了演示原理先用浮点表code const unsigned char t_tab[9] {200, 0, 20, 40, 60, 80, 100, 120, 150}; code const float r_tab[9] {92.16, 100.00, 107.79, 115.54, 123.24, 130.90, 138.51, 146.07, 157.33};t_tab 里 200 是为了用 unsigned char 表示 -20℃ 而做的偏移处理实际使用时转成 signed char 更直接。插值函数在电阻值之间做线性逼近signed char temp_from_rtd(float r) { unsigned char i; if (r r_tab[0]) return -20; if (r r_tab[8]) return 150; for (i 0; i 8; i) if (r r_tab[i 1]) break; return (signed char)(t_tab[i] - 200 (r - r_tab[i]) * (signed char)(t_tab[i 1] - t_tab[i]) / (r_tab[i 1] - r_tab[i])); }插值前先判断边界超出量程直接钳位避免探头脱落时显示乱码。表点之间的阻值差大约 7~8Ω线性插值引入的误差远小于 PT100 本身非线性不需要用二次插值。如果想让返回值带一位小数就把 t_tab 放大 10 倍插值函数返回 intLCD 显示时除以 10 取整数、模 10 取小数位。4.3 滤波与采样率温度值不能拿单次读数直接显示单次 ADC 读数里有量化噪声和电源毛刺温度变化又慢直接显示会看到末位跳动。常见做法是先把采样率定在 5~10Hz再做一阶低通#define LPF_SHIFT 3 int adc_filter 0; int lpf(int raw) { if (adc_filter 0) adc_filter raw; adc_filter (raw - adc_filter) LPF_SHIFT; return adc_filter; }3相当于 1/8 的平滑系数新值只占 1/8 权重对突变有抑制作用。注意raw - adc_filter可能是负数C 语言对有符号数右移是算术右移结果依然正确如果不放心可以先判断正负再处理。比一阶低通更稳的是滑动中值滤波连续采 5 个点取中间值再把中值做平均能同时抑制尖峰和随机噪声。温度传感器不需要高响应速度多花几十毫秒换稳定显示是值得的。滤波会带来滞后标定时要让输入稳定后再读数不要一边升温一边记录。4.4 两点标定与四个常见误差源电阻精度、运放增益、基准电压偏差叠加在一起实际零点不可能正好是 0。现场标定用精密电阻箱最方便把电阻箱调到 100Ω模拟 0℃和 138.51Ω模拟 100℃分别记录 ADC 读数然后做两点线性校正#define CAL_RAW_0 12 #define CAL_RAW_100 630 float cal_temp(float raw) { return (raw - CAL_RAW_0) * 100.0f / (CAL_RAW_100 - CAL_RAW_0); }两点标定只修正零点和增益修正不了非线性跨度超过 100℃ 还是建议配合分度表分段插值。四个最常见的误差源一是 REF 接开关电源的 5V纹波直接进入 ADC二是电桥激励偏高导致 PT100 自热标准上激励电流最好控制在 1mA 以内三是运放输出在 0V 附近饱和0℃ 附近读数会压住不动四是地线回路数字电路和模拟电路共地要单点连接不要在 ADC 附近走继电器控制线。5. Proteus 仿真与联调用电阻箱思维验证整条链路5.1 元件选型PT100 用可调电阻模拟在 Proteus 8 Professional 里画这套电路时TLC1543 在元件库直接搜“TLC1543”就能找到。PT100 不一定有现成模型更可控的做法是用一个可调电阻串固定电阻来模拟固定电阻取 91Ω可调电阻调 0~70Ω整个支路就能覆盖 91~161Ω对应 -23℃ 到 158℃。仿真时 PT100 没有真实温度概念把阻值拨到 100.00、119.40、138.51、157.33Ω就相当于在给系统做干体炉标定。接好电桥和运放后51 加载 Keil 编译出的 HEX 文件。如果加了 LCD直接看温度显示如果只写了串口输出用虚拟终端观察原始 ADC 码建议输出格式为rawxxx, rxx.x ohm, txx.x C这样能确认每一级换算是否正常。5.2 三组验证数据与常见异常设定电阻(Ω)理论温度(℃)理论 ADC 码仿真应显示100.00000.0℃119.405032350.0℃138.51100630100.0℃如果 ADC 码明显偏小先查运放增益是否按 20 倍配置再查 TLC1543 的 REF 是否接到了 5V。如果电阻变化但码值不动重点检查 DOUT 与 51 的连线以及读循环里是不是在 CLK 高电平期间采样。如果第一次读到 0、第二次才正常说明双缓冲首读丢弃不够彻底调用tlc1543_read前先空读一次。5.3 Keil 联调断点不命中的处理用 Keil 和 Proteus 联调时“当前不会命中断点”是最常见的提问。绝大多数原因是加载的文件不对只加载 HEX 只能全速运行没有调试信息断点自然无效。Keil 侧要在 Output 选项卡里勾选生成调试信息并输出 OMF 文件Proteus 单片机属性里加载对应的调试文件同时启用联调模式。如果只是验证功能、不需要单步跟踪加载 HEX 能跑通就够了断点不可用是正常现象。最后一个实用技巧把标定系数从硬编码改成可配置参数。我在这类项目里习惯写一组 EEPROM 参数上电时先读读不到再用默认值。现场标定完把CAL_RAW_0和CAL_RAW_100的实测值写进去之后每次开机自动加载不用为一次标定反复改源码重新编译。测完记得做一次 0℃ 和 100℃ 回读确认插值和标定的交接点没有跳变。本文还有配套的精品资源点击获取