在电子设备的世界里,温度的精确测量是众多应用场景的基础需求。无论是智能家居中的恒温控制,还是工业自动化里的设备运行监测,都离不开可靠的温度传感器。而 DS18B20 数字温度传感器,凭借其独特的优势,成为了众多开发者和工程师的得力助手。今天,就让我们一起来深入了解这款神奇的传感器。
ds18b20是什么
DS18B20 是一款由 DALLAS 公司推出的 1-Wire 总线数字温度传感器。它的出现,简化了温度测量系统的设计,降低了成本。传统的模拟温度传感器需要额外的 A/D 转换电路才能将模拟信号转换为数字信号供微控制器处理,而 DS18B20 直接输出数字量,大大减少了硬件设计的复杂度。
硬件特性
- 单总线接口:仅需一根数据线和一根地线,就能与微控制器进行通信。这使得在一个微控制器的引脚上可以轻松连接多个 DS18B20 传感器,实现多点温度测量。
- 宽电压范围:可在 3.0V 至 5.5V 的电压范围内工作,既可以直接与 3.3V 的微控制器系统兼容,也能在 5V 的常规系统中稳定运行。
- 高精度测量:能够提供 9 - 12 位的温度分辨率,对应的温度测量精度分别为 0.5℃、0.25℃、0.125℃和 0.0625℃。用户可以根据实际需求通过编程设置分辨率。
- 独特的 ROM 编码:每个 DS18B20 都有唯一的 64 位 ROM 编码,就像每个人的身份证一样,这使得在同一总线上连接多个传感器时,能够准确区分不同的传感器。
工作原理
DS18B20 内部主要由温度传感器、64 位光刻 ROM、高速暂存器、配置寄存器等部分组成。
- 温度测量:温度传感器将环境温度转换为数字信号,存储在高速暂存器中。这个转换过程是基于 DS18B20 内部的热敏电阻,热敏电阻的阻值会随着温度的变化而变化,通过一系列的电路转换和计算,最终得到对应的数字温度值。
- 通信过程:微控制器通过单总线与 DS18B20 进行通信。首先,微控制器会发送复位脉冲,DS18B20 接收到复位脉冲后会发送应答信号,表明自己在线。然后,微控制器可以发送 ROM 操作指令,选择特定的 DS18B20(当总线上有多个传感器时),接着发送功能指令,如启动温度转换、读取温度数据等。DS18B20 根据接收到的指令进行相应操作,并将结果返回给微控制器。
使用方法
以我的在STC15F2K60S2中的底层代码为例
#include "onewire.h"
sbit DQ = P1^4; //将 DS18B20 的数据线(DQ)连接到单片机的 P1.4 引脚,用于与 DS18B20 进行数据传输。
//单总线内部延时函数
void Delay_OneWire(unsigned int t)
{
t *= 12;
while(t--);
}
//one wire 协议要有严格的时序限制,保证数据正常传输
//单总线写操作
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//该函数用于向 DS18B20 写入一个字节的数据。在单总线协议中,写操作时,主机先将数据线拉低,然后根据要写入的数据位(0 或 1)设置数据线的电平,保持一段时间后再将数据线拉高。通过循环 8 次,依次写入一个字节的 8 位数据
//单总线读操作
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
//该函数用于向 DS18B20 写入一个字节的数据。在单总线协议中,写操作时,主机先将数据线拉低,然后根据要写入的数据位(0 或 1)设置数据线的电平,保持一段时间后再将数据线拉高。通过循环 8 次,依次写入一个字节的 8 位数据
//DS18B20初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
//该函数用于初始化 DS18B20。在单总线协议中,每次通信前都需要进行初始化操作。主机先将数据线拉高,然后拉低一段时间,再释放数据线,等待 DS18B20 响应。如果 DS18B20 正常响应,数据线会被拉低,通过读取数据线的电平来判断初始化是否成功。
float read_t()
{
unsigned char low,high;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low = Read_DS18B20();
high = Read_DS18B20();
return ((high << 8) | low) / 16.0;
}
//实时读取温度值
在上面的底层代码配置过后,创建.h文件声明函数名,在主函数中调用read_t()函数即可实时读取温度值,下面介绍一下one wire协议
one wire协议
One Wire 协议,正如其名,是一种仅需一根数据线和一根地线就能实现通信的串行协议。这种极简的设计理念,极大地简化了硬件电路,降低了成本,尤其适合在资源受限的嵌入式系统中使用。与传统的通信协议(如 SPI、I2C)相比,One Wire 协议虽然通信速度相对较慢,但在对引脚数量有严格要求的场景下,它的优势便凸显无疑。
特点
- 单数据线通信:所有的数据传输都通过这一根数据线完成,主设备(通常是微控制器)和从设备(如 DS18B20)在这根线上分时进行数据的发送和接收。
- 寄生电源模式:DS18B20 可以通过数据线从主设备获取电源,无需额外的电源线,进一步简化了硬件设计。不过,在一些对功率要求较高的场景下,也可以使用外部电源供电。
- 独特的 ROM 编码:每个支持 One Wire 协议的设备都有一个唯一的 64 位 ROM 编码,这使得多个设备可以并联在同一总线上,主设备能够通过 ROM 编码准确地识别和访问每个设备。
与ds18b20的关系
初始化是每次通信的第一步,主设备需要通过一个复位脉冲来唤醒 DS18B20。具体步骤如下:
- 主设备将数据线拉低至少 480μs,然后释放数据线(拉高)。
- DS18B20 在检测到上升沿后,会在 15 - 60μs 内将数据线拉低,表示应答信号。
- 主设备在释放数据线后,会等待一段时间(通常为 60 - 240μs)来检测 DS18B20 的应答信号。如果检测到低电平,则表示初始化成功;否则,初始化失败。
在初始化成功后,主设备需要进行 ROM 操作,以确定要与哪个 DS18B20 进行通信。常见的 ROM 操作命令有:
- 搜索 ROM(0xF0):当总线上连接了多个 DS18B20 时,主设备使用该命令来搜索所有设备的 64 位 ROM 编码。
- 读取 ROM(0x33):如果总线上只有一个 DS18B20,可以使用该命令直接读取其 ROM 编码。
- 匹配 ROM(0x55):主设备通过该命令指定要与哪个特定的 DS18B20 进行通信,需要发送该设备的 64 位 ROM 编码。
- 跳过 ROM(0xCC):当总线上只有一个 DS18B20 时,可以使用该命令跳过 ROM 编码的检查,直接进行功能操作。
在完成 ROM 操作后,主设备就可以对 DS18B20 进行功能操作,如启动温度转换、读取温度数据等。常见的功能操作命令有:
- 启动温度转换(0x44):主设备发送该命令后,DS18B20 开始进行温度转换,转换时间取决于所选的分辨率,最高分辨率(12 位)下大约需要 750ms。
- 读取温度寄存器(0xBE):主设备发送该命令后,可以从 DS18B20 读取温度数据,温度数据以 16 位的形式存储,其中高字节的高 5 位为符号位,低字节的低 4 位为小数部分。
ds18b20的应用
- 智能家居:在智能空调、智能热水器等设备中,用于实时监测环境温度或水温,实现精准的温度控制,提升用户的舒适度。
- 工业自动化:对工业设备的运行温度进行监测,及时发现设备过热等异常情况,保障设备的安全稳定运行,提高生产效率。
- 气象监测:在小型气象站中,测量大气温度,为气象数据的收集和分析提供基础数据。
原理图与实物图
如下


结言
博主说ds18b20真是个人物
Comments NOTHING