当需要同时读取多个点的温度数据时,DS18B20就是一个很好的选择,不仅精度高,而且还可以单总线挂载多个传感器以节省IO口的使用;
初始化函数
DS18B20的通信协议为单总线通信协议;
![]() |
|---|
首先由主机发送一个复位脉冲约480-960us;然后总线被拉高;在15-60us之后传感器向单片机发送一个约60-240us的存在脉冲,然后总线被拉高。
1 | /** |
配置写函数
当主机将数据线从高逻辑级别拉到低逻辑级别时,将启动写入时隙。有两种类型的写时槽:写1时槽和写0时槽。所有写入时隙的持续时间必须至少为60µs,且每个写入周期之间的恢复时间至少为1µs以上。在DQ线下降后,DS18B20在15µs到60µs的窗口中对DQ线进行采样。
如果DQ为高,则会出现Write1。如果DQ为低低,则会出现Write0。
要使主机生成写1时隙,必须将数据线拉到逻辑低级别,然后释放,允许数据线在写时隙开始后的15µs内拉到高级别。
要使主机生成写0时隙,必须将数据线拉到逻辑低级别,并在低级别保持60µs。
![]() |
|---|
1 | /** |
配置读函数
当要从DS18B20读取数据时,主机生成读取时隙。当主机将数据线从逻辑高级级别到逻辑低级别时,启动读取时隙。数据线必须保持在低逻辑级别至少1µs;来自DS18B20的输出数据在读取时隙边缘下降后15µs有效。因此,主机必须将DQ引脚拉低,以便从读取槽的开始读取其15µs的状态。在读取时隙结束时,DQ引脚将通过外部上拉电阻重新拉高。所有读取时间槽的持续时间必须至少为60µs,每个读取时间槽之间的恢复时间至少为1-µs。
![]() |
|---|
1 | /** |
供电配置
要搭配硬件电路使用
1 | void Power_Select(uint8_t value) |
读取芯片ID
1 | /** |
跳过匹配ROM
1 | /** |
匹配ROM
1 | /** |
读取温度的两种模式
匹配ROM的情况下
![]() |
|---|
1 | /** |
不匹配ROM的情况下
![]() |
|---|
1 | /** |
配置主函数
1 | uint8_t ROM_ID[8][8] = {{0x28, 0xb0, 0xbb, 0x80, 0xe3, 0xe1, 0x3c, 0x70}, |
其他
提高单总线多个传感器读取速度的方案
在单线总线上可以挂任意多片 DS1820,而且如果它们都使用外部电源的话, 就可以先发一个 Skip ROM 命令, 再接一个 Convert T 命令,让它们同时进行温度转换。注意当加上外部电源时, GND 引脚不能悬空。
总的代码
DS18B20.h
1 |
|
DS18B20.c
1 |
|




