这一章在干嘛?
DS18B20 实验:单总线协议、ROM 搜索、温度转换与读取。学会后所有单总线传感器(DHT11/DS18B20/MAX31820)都懂。
32.1 DS18B20 及其时序简介
DS18B20 = 1-Wire 数字温度传感器:
- 单总线协议(一根数据线);
- 测温范围 -55℃ ~ +125℃(精度 ±0.5℃);
- 12 位分辨率(0.0625℃);
- 多传感器并存:64 bit 唯一 ROM ID。
原书图 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 µs | 15 µs 内采样 |
时序要求严格:DS18B20 用 us 级延时,对晶振精度要求高(建议 72 MHz 主频的整数倍)。
32.2 硬件设计
PG11 接 DQ 线,外接 4.7kΩ 上拉电阻。
原书图 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.4 下载验证
串口每秒打印当前温度,用手捂热看变化。
原书图 32.4.1:串口显示温度
DS18B20 用什么协议?
1-Wire(单总线)。
DS18B20 默认分辨率多少?
12 位。
温度转换需要等待多久?
750 ms(12 位)。