单总线协议与DS18B20温度传感器应用指南
2026/7/27 9:09:53 网站建设 项目流程

1. 单总线协议与DS18B20概述

单总线协议(1-Wire)是Maxim(现为ADI)开发的一种独特通信协议,仅需一根数据线即可实现双向通信。这种设计在引脚资源有限的嵌入式系统中具有显著优势,特别适合温度监测、身份识别等应用场景。DS18B20作为单总线协议的代表性器件,集成了温度传感、模数转换和协议接口于一体,输出直接为数字信号,省去了传统模拟温度传感器所需的外部ADC电路。

在实际项目中,我经常遇到需要多点温度监测但GPIO资源紧张的情况。比如在农业大棚监控系统中,使用DS18B20可以轻松实现数十个测温点的布线,而传统I2C或SPI接口的传感器则需要更多连线。DS18B20的典型测温范围为-55°C至+125°C,精度可达±0.5°C(-10°C至+85°C范围内),完全满足大多数工业级应用需求。

2. 单总线协议工作原理详解

2.1 物理层特性

单总线系统采用开漏结构,必须外接4.7kΩ上拉电阻。总线空闲时保持高电平,通信时通过主机主动拉低实现信号传输。这种设计允许多个设备并联在同一总线上,通过独特的64位ROM地址实现设备寻址。

我在实际调试中发现,上拉电阻的阻值选择很关键:

  • 阻值过小会导致功耗增加
  • 阻值过大会影响信号上升沿速度
  • 长距离传输时(超过30米)建议降低阻值至2.2kΩ

2.2 通信时序解析

单总线协议的核心在于精确的时序控制。每个bit的传输都通过特定时间长度的低电平脉冲来实现:

  1. 写时序:

    • 写"0":拉低总线60μs以上
    • 写"1":拉低总线1-15μs后释放
  2. 读时序:

    • 主机拉低总线1μs后释放
    • 从机在15μs窗口期内拉低总线表示"0"
    • 总线保持高电平表示"1"

注意:时序精度要求严格,在STM32等平台建议使用硬件定时器实现,避免软件延时带来的误差。

3. DS18B20内部结构与功能

3.1 ROM地址结构

每个DS18B20都有全球唯一的64位地址,格式如下:

| 8位CRC | 48位序列号 | 8位家族码(0x28) |

在多点测温系统中,我通常先用搜索算法获取所有传感器的ROM地址,然后建立地址映射表,方便后续按需读取。

3.2 温度寄存器解析

温度值以16位补码形式存储,格式如下:

Bit15 Bit14 Bit13 Bit12 Bit11 Bit10 Bit9 Bit8 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 S S S S S 2^6 2^5 2^4 2^3 2^2 2^1 2^0 2^-1 2^-2 2^-3 2^-4

温度转换公式:

温度值 = (高字节 << 8 | 低字节) × 0.0625

4. DS18B20操作流程实战

4.1 单设备基本操作

对于单设备系统,典型操作流程如下:

  1. 初始化序列(复位+存在脉冲检测)
  2. 发送跳过ROM命令(0xCC)
  3. 发送温度转换命令(0x44)
  4. 等待转换完成(750ms@12位精度)
  5. 再次初始化
  6. 发送跳过ROM命令
  7. 发送读取暂存器命令(0xBE)
  8. 读取温度值(2字节)
// 示例:STM32读取温度函数 float DS18B20_ReadTemp(void) { uint8_t tempL, tempH; uint16_t temp; DS18B20_Reset(); DS18B20_WriteByte(0xCC); // Skip ROM DS18B20_WriteByte(0x44); // Convert T Delay_ms(750); // 等待转换 DS18B20_Reset(); DS18B20_WriteByte(0xCC); DS18B20_WriteByte(0xBE); // Read Scratchpad tempL = DS18B20_ReadByte(); tempH = DS18B20_ReadByte(); temp = (tempH << 8) | tempL; return temp * 0.0625f; }

4.2 多设备系统实现

对于多设备系统,关键点在于:

  1. 使用搜索算法发现所有设备ROM
  2. 通过匹配ROM命令(0x55)选择特定设备
  3. 建立轮询机制定期读取各节点温度
// 多设备读取示例 void ReadAllTemperatures(void) { uint8_t rom[8]; // 先搜索获取所有ROM DS18B20_SearchRom(rom); // 逐个读取 for(int i=0; i<device_count; i++) { DS18B20_Reset(); DS18B20_WriteByte(0x55); // Match ROM for(int j=0; j<8; j++) { DS18B20_WriteByte(rom[i][j]); } DS18B20_WriteByte(0x44); // Convert T Delay_ms(750); // ...读取温度流程同上... } }

5. 工程实践中的关键问题

5.1 寄生供电注意事项

当使用寄生供电模式时(VDD接地),需要特别注意:

  1. 温度转换期间必须保持总线高电平
  2. 建议使用MOS管进行强上拉
  3. 转换时间可能延长,建议增加等待时间

我在一个工业项目中曾遇到转换不稳定的问题,最终发现是寄生供电时总线负载过重。解决方案是:

  • 减少单总线上的设备数量(不超过5个)
  • 改用独立供电模式
  • 增加强上拉电路

5.2 抗干扰设计

长距离传输时建议:

  1. 使用双绞线或屏蔽线
  2. 总线两端加TVS二极管防静电
  3. 每隔20米增加一个中继节点

5.3 精度与分辨率设置

DS18B20支持9-12位分辨率,通过配置寄存器设置:

9位:93.75ms转换时间,0.5°C分辨率 12位:750ms转换时间,0.0625°C分辨率

设置命令:

DS18B20_WriteByte(0x4E); // Write Scratchpad DS18B20_WriteByte(TH); // 报警上限 DS18B20_WriteByte(TL); // 报警下限 DS18B20_WriteByte(0x7F); // 配置字:高5位保留,低3位为分辨率 // R1R0=11表示12位(默认)

6. 典型应用电路设计

6.1 独立供电模式电路

DS18B20引脚: 1(GND) -- 地 2(DQ) -- MCU_GPIO │ 4.7kΩ上拉至VCC 3(VDD) -- 3.3V/5V

6.2 寄生供电模式电路

DS18B20引脚: 1(GND) -- 地 2(DQ) -- MCU_GPIO │ 4.7kΩ上拉至VCC 3(VDD) -- 地

重要提示:寄生供电时,建议在DQ线上增加一个N-MOS管,在温度转换期间将总线强制上拉至VCC。

7. 软件优化技巧

7.1 非阻塞式读取

为避免主程序长时间等待温度转换,可采用状态机实现异步读取:

enum {INIT, START_CONV, WAIT_CONV, READ_TEMP} state; void DS18B20_StateMachine(void) { static uint32_t timer; switch(state) { case INIT: DS18B20_Reset(); DS18B20_WriteByte(0xCC); DS18B20_WriteByte(0x44); timer = GetTick(); state = WAIT_CONV; break; case WAIT_CONV: if(GetTick() - timer > 750) { state = READ_TEMP; } break; case READ_TEMP: // ...读取温度流程... state = INIT; break; } }

7.2 CRC校验实现

DS18B20的ROM和暂存器数据都带有8位CRC校验。以下是高效的CRC计算函数:

uint8_t DS18B20_CRC8(uint8_t *data, uint8_t len) { uint8_t crc = 0, i, j; for(i=0; i<len; i++) { crc ^= data[i]; for(j=0; j<8; j++) { if(crc & 0x01) crc = (crc >> 1) ^ 0x8C; else crc >>= 1; } } return crc; }

8. 常见问题排查指南

8.1 无法检测到存在脉冲

可能原因及解决方案:

  1. 上拉电阻未接或阻值不当 → 检查硬件连接
  2. 时序不符合规范 → 用逻辑分析仪抓取波形
  3. 总线负载过重 → 减少设备数量或缩短总线长度

8.2 温度读数异常

典型表现及处理方法:

  1. 读数固定为85°C → 检查初始化序列是否正确
  2. 读数随机跳变 → 检查电源稳定性,增加去耦电容
  3. 负温度显示错误 → 检查补码转换逻辑

8.3 多设备系统不稳定

优化建议:

  1. 降低通信速率
  2. 增加设备间通信间隔
  3. 采用更可靠的ROM搜索算法

9. 进阶应用:构建分布式测温网络

基于DS18B20可以构建经济高效的测温网络,典型架构包括:

  1. 主控制器(STM32/ESP32等)
  2. 多个温度采集节点(每组总线挂接5-10个DS18B20)
  3. 通信中继器(用于长距离传输)
  4. 上位机监控软件

我在一个冷库监控项目中采用这种架构,实现了200多个测温点的实时监测,成本仅为传统方案的1/3。关键点在于:

  • 分区管理,每个区域独立总线
  • 采用RS-485转换器延长通信距离
  • 开发专用配置工具管理ROM地址

10. 其他单总线器件简介

除了DS18B20,单总线家族还包括:

  1. DS2431 - 1Kb EEPROM
  2. DS2413 - 双通道IO扩展器
  3. DS2408 - 8通道IO扩展器
  4. DS28E05 - 安全认证芯片

这些器件可以混合挂接在同一总线上,通过家族码(0x28/0x3B等)区分,构建功能丰富的传感控制系统。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询