📖 第 32 章:DS18B20数字温度传感器实验(DS18B20)

🔧 正点原子《DMF407 开发指南》V1.0 · Chapter 32
🗨️ 「单总线协议:一根线也能读温度。」
这一章在干嘛? DS18B20 实验:单总线协议、ROM 搜索、温度转换与读取。学会后所有单总线传感器(DHT11/DS18B20/MAX31820)都懂。
32.1 DS18B20 及其时序简介32.2 硬件设计32.3 程序设计32.4 下载验证

32.1 DS18B20 及其时序简介

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

原书图 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:串口显示温度

🧠 小测验
DS18B20 用什么协议?
1-Wire(单总线)。
DS18B20 默认分辨率多少?
12 位。
温度转换需要等待多久?
750 ms(12 位)。
← 上一篇🏠 顶层目录下一篇 →