这一章在干嘛?

DS18B20 实验:单总线协议、ROM 搜索、温度转换与读取。学会后所有单总线传感器(DHT11/DS18B20/MAX31820)都懂。

32.1 DS18B20 及其时序简介

32.2 硬件设计

32.3 程序设计

32.4 下载验证

32.1 DS18B20 及其时序简介

DS18B20 = 1-Wire 数字温度传感器:

  • 单总线协议(一根数据线);
  • 测温范围 -55℃ ~ +125℃(精度 ±0.5℃);
  • 12 位分辨率(0.0625℃);
  • 多传感器并存:64 bit 唯一 ROM ID。

原书图 32.1.1:DS18B20 实物与引脚原书图 32.1.1:DS18B20 实物与引脚

关键时序:

信号主机拉低主机释放
复位480~960 µs等待 15~60 µs 后读从机响应
存在脉冲从机拉低 60~240 µs
写 0拉低 60~120 µs
写 1拉低 1~15 µs释放 45 µs
拉低 1~15 µs15 µs 内采样

时序要求严格:DS18B20 用 us 级延时,对晶振精度要求高(建议 72 MHz 主频的整数倍)。

32.2 硬件设计

PG11 接 DQ 线,外接 4.7kΩ 上拉电阻。

原书图 32.2.1:DS18B20 接线图原书图 32.2.1:DS18B20 接线图

32.3 程序设计

32.3.1 关键函数

uint8_t ds18b20_init(void);       // 复位 + 存在脉冲
void ds18b20_write_byte(uint8_t); // 写一字节
uint8_t ds18b20_read_byte(void);  // 读一字节

float ds18b20_read_temp(void) {
    ds18b20_init();
    ds18b20_write_byte(0xCC);     // Skip ROM
    ds18b20_write_byte(0x44);     // 转换温度
    delay_ms(750);                // 等待转换
    ds18b20_init();
    ds18b20_write_byte(0xCC);
    ds18b20_write_byte(0xBE);     // 读暂存
    uint8_t lo = ds18b20_read_byte();
    uint8_t hi = ds18b20_read_byte();
    int16_t raw = (hi << 8) | lo;
    return raw * 0.0625;          // 12 位分辨率
}

原书图 32.3.1.1:DS18B20 复位与存在脉冲时序原书图 32.3.1.1:DS18B20 复位与存在脉冲时序

32.4 下载验证

串口每秒打印当前温度,用手捂热看变化。

原书图 32.4.1:串口显示温度原书图 32.4.1:串口显示温度