DS18B20温度传感器原理与51单片机应用指南

发布时间:2026/7/18 7:19:20
DS18B20温度传感器原理与51单片机应用指南 1. DS18B20温度传感器概述DS18B20是Dallas Semiconductor现为Maxim Integrated推出的一款数字温度传感器采用单总线1-Wire协议进行通信。作为嵌入式开发中最常用的温度传感器之一它以其简单可靠的特性广泛应用于各种51单片机项目中。与传统的模拟温度传感器相比DS18B20具有以下显著优势数字信号输出抗干扰能力强测量精度高最高可达±0.5℃单总线接口节省I/O资源支持多点组网能力可选寄生供电模式仅需两根线在实际项目中DS18B20常被用于环境温度监测系统工业设备温度监控智能家居温控设备农业大棚温度采集医疗设备温度检测提示DS18B20的测温范围为-55℃到125℃完全满足大多数应用场景需求。但在极端温度环境下使用时需要注意其测量精度会有所下降。2. DS18B20硬件接口设计2.1 引脚功能说明DS18B20采用TO-92封装类似普通三极管三个引脚定义如下引脚名称功能描述VDD电源正极3.0V-5.5VGND电源地DQ数据输入/输出单总线接口2.2 典型电路连接方式标准供电模式推荐VDD -- 4.7KΩ上拉电阻 -- DQ | -- 51单片机I/O口 GND -- 直接接地寄生供电模式节省线材DQ -- 4.7KΩ上拉电阻 -- 51单片机I/O口 GND -- 直接接地 (VDD引脚悬空)注意寄生供电模式下当DS18B20进行温度转换时总线必须保持高电平以提供足够电流。此时单片机不能进行其他总线操作。2.3 上拉电阻选择上拉电阻的典型值为4.7KΩ但在以下情况需要调整总线长度超过10米可减小至2.2KΩ多设备并联时根据设备数量适当减小阻值强干扰环境可并联100nF电容增强抗干扰能力3. DS18B20内部结构与寄存器3.1 内部功能框图DS18B20内部包含以下关键模块64位ROM - 存储唯一序列号温度传感器 - 核心测温元件暂存器(Scratchpad) - 9字节临时存储配置寄存器 - 设置温度分辨率报警寄存器 - 高/低温阈值CRC发生器 - 数据校验3.2 温度数据格式温度值以16位补码形式存储在暂存器的前两个字节位1514131211109876543210值SSSSSSSS2^62^52^42^32^22^12^02^-1其中S为符号位0表示正温度1表示负温度高5位为符号扩展位中间7位为整数部分最低位为小数部分0.5℃温度转换公式温度值 (读取的16位数据) × 0.06253.3 配置寄存器配置寄存器第4字节用于设置温度分辨率位组合分辨率最大转换时间009位93.75ms0110位187.5ms1011位375ms1112位750ms实际项目中12位分辨率下750ms的转换时间往往过长建议根据需求选择10位或11位分辨率。4. 单总线通信协议详解4.1 单总线时序特性DS18B20采用严格的时序进行通信主要包含以下信号复位脉冲Master→Slave存在脉冲Slave→Master写时隙0/1读时隙关键时间参数复位脉冲至少480μs低电平存在脉冲60-240μs低电平写0时隙至少60μs低电平写1时隙1-15μs低电平后释放总线读时隙至少1μs低电平后采样4.2 基本操作流程初始化序列主机拉低总线480μs以上主机释放总线等待15-60μsDS18B20回应存在脉冲拉低60-240μs总线恢复高电平ROM命令阶段搜索ROM0xF0读取ROM0x33匹配ROM0x55跳过ROM0xCC - 单设备时常用报警搜索0xEC功能命令阶段转换温度0x44写暂存器0x4E读暂存器0xBE复制暂存器0x48召回EEPROM0xB8读供电方式0xB44.3 典型通信流程示例读取温度的标准流程初始化发送跳过ROM命令0xCC发送开始转换命令0x44等待转换完成延时或轮询初始化发送跳过ROM命令0xCC发送读取暂存器命令0xBE读取9字节数据前2字节为温度计算CRC校验5. 51单片机驱动实现5.1 硬件连接示例以STC89C52为例典型连接方式sbit DQ P1^0; // 单总线数据引脚5.2 基础驱动函数复位函数bit DS18B20_Reset(void) { bit presence; DQ 0; // 拉低总线 Delay480us(); // 延时480μs以上 DQ 1; // 释放总线 Delay60us(); // 等待15-60μs presence DQ; // 采样存在脉冲 Delay240us(); // 等待存在脉冲结束 return !presence; // 返回1表示设备存在 }写字节函数void DS18B20_WriteByte(unsigned char dat) { unsigned char i; for(i0; i8; i) { DQ 0; // 开始写时隙 _nop_(); _nop_(); // 延时约2μs DQ dat 0x01; // 写入位数据 Delay60us(); // 保持60μs DQ 1; // 释放总线 dat 1; // 准备下一位 } }读字节函数unsigned char DS18B20_ReadByte(void) { unsigned char i, dat 0; for(i0; i8; i) { DQ 0; // 开始读时隙 _nop_(); _nop_(); // 延时约2μs DQ 1; // 释放总线 _nop_(); _nop_(); // 等待4μs后采样 if(DQ) dat | 0x01i; Delay60us(); // 等待时隙结束 } return dat; }5.3 完整温度读取实现float DS18B20_ReadTemp(void) { unsigned char tempL, tempH; int temp; float temperature; DS18B20_Reset(); // 复位 DS18B20_WriteByte(0xCC); // 跳过ROM DS18B20_WriteByte(0x44); // 开始转换 while(!DQ); // 等待转换完成 DS18B20_Reset(); // 复位 DS18B20_WriteByte(0xCC); // 跳过ROM DS18B20_WriteByte(0xBE); // 读暂存器 tempL DS18B20_ReadByte(); // 读低字节 tempH DS18B20_ReadByte(); // 读高字节 temp (tempH 8) | tempL; temperature temp * 0.0625; return temperature; }6. 实际应用中的问题与解决方案6.1 常见问题排查问题1读取温度始终为85℃原因这是DS18B20上电后的默认值说明温度转换未正确执行解决检查开始转换命令(0x44)后是否有足够延时根据分辨率问题2读取数据全为0xFF原因总线通信失败设备未响应解决检查硬件连接和上拉电阻确认复位序列能检测到设备检查时序是否符合要求问题3温度值跳动大原因电源噪声干扰总线接触不良未进行CRC校验解决在VDD和GND间加0.1μF去耦电容检查接线可靠性实现CRC校验功能6.2 提高测量精度的技巧软件滤波算法移动平均滤波连续采样多次取平均中值滤波取多次采样的中间值一阶滞后滤波y(n) α*x(n) (1-α)*y(n-1)校准补偿与标准温度计对比建立误差补偿表在关键温度点进行校准环境适应避免传感器直接暴露在气流中使用导热硅脂改善热接触对快速变化的温度进行平滑处理6.3 多设备组网实现当需要连接多个DS18B20时操作流程如下初始化总线发送搜索ROM命令(0xF0)执行ROM搜索算法获取所有设备ID对每个设备单独操作时使用匹配ROM命令(0x55)多设备系统中必须为每个DS18B20分配独立的ROM地址否则会发生冲突。实际项目中建议使用单设备跳过ROM命令的方式简化设计。7. 进阶应用与优化7.1 低功耗设计在电池供电系统中可采取以下措施降低功耗使用寄生供电模式降低采样频率如每分钟一次温度转换后立即进入休眠模式采用中断唤醒方式替代轮询7.2 温度报警功能实现利用DS18B20内置的报警功能设置TH和TL寄存器告警阈值配置报警搜索命令(0xEC)当温度超限时设备会响应报警搜索7.3 与LCD1602显示模块联调典型温度显示系统硬件连接51单片机DS18B20P1.0LCD1602P0数据口P2控制线软件实现要点初始化LCD1602定期读取DS18B20温度格式化温度字符串如Temp: 25.6℃显示到LCD上我在实际项目中发现DS18B20与LCD1602共用总线时容易产生干扰建议为每个外设使用独立I/O口在总线操作间加入适当延时避免在温度转换期间操作LCD