深夜,智能温室控制系统遭遇异常。传统模拟传感器布线复杂,故障点排查犹如大海捞针。工程师将探头浸入营养液槽,仅凭一根数据线,Arduino Uno实时显示25.37℃——精度高达0.0625℃。正是DS18B20的革新性设计,让分布式温度监测变得高效且可靠。
单总线协议(1-Wire) 是DS18B20的革命性设计:
温度转换引擎核心包括:
关键过程:启动转换后,温度值存入暂存器;主机发出读指令,DS18B20通过单总线传输包含CRC校验的完整数据帧。
// 典型三线制连接 (推荐)
VDD → 3.3V/5V
DQ → 单片机GPIO (需4.7KΩ上拉)
GND → 地
// 寄生供电模式
DQ → 单片机GPIO (强上拉电阻需10KΩ)
GND → 地
底层驱动需包含关键时序控制:
bool onewire_reset() {
set_low(); delay_us(480);
set_high(); delay_us(70);
bool presence = !read_pin();
delay_us(410);
return presence; // true表示设备存在
}
void onewire_write_bit(bool bit) {
set_low();
delay_us(bit ? 5 : 60);
set_high();
delay_us(bit ? 55 : 5);
}
onewire_reset()0x55 + 64位ROM编码0x44 - 启动温度转换 (启动后需等待转换完成)0xBE - 读取暂存器数据 (9字节)float DS18B20_read_temp() {
onewire_reset();
onewire_write_byte(0xCC); // 跳过ROM
onewire_write_byte(0x44); // 启动转换
delay_ms(750); // 等待12位转换完成
onewire_reset();
onewire_write_byte(0xCC);
onewire_write_byte(0xBE); // 读暂存器
uint8_t data[9];
for(uint8_t i=0; i<9; i++)
data[i] = onewire_read_byte();
// 校验CRC
if (crc8(data, 8) != data[8]) return NAN;
int16_t temp_raw = (data[1] << 8) | data[0];
return temp_raw * 0.0625; // 12位精度计算
}
0xF0指令搜索总线设备,动态构建地址列表if (temp_raw & 0x8000) {
temp_raw = -(temp_raw ^ 0xFFFF) + 1); // 取反加1得原码
temperature = -temp_raw * 0.0625;
}
0x1F),转换仅94ms,显著提升轮询效率。DS18B20在工业现场最长通信距离可达300米(规范线缆),但电磁干扰环境需增加屏蔽或降低波特率。当读取值恒为85℃(芯片上电值)时,重点检查电源稳定性与信号时序误差——这些工程细节往往决定长期运行的可靠性。
Copyright © 南京凯基特电气有限公司 版权所有
苏ICP备12080292号-5
全国服务电话:025-66098387传真:025-87168200
公司地址:江苏省南京市江宁区科宁路777号申智滙谷9栋101