基于DS18B20的单总线数字温度计
1
拍明芯城
基于DS18B20的单总线数字温度计设计详解
在工业自动化、环境监测、智能家居及消费电子等领域,温度测量是核心功能之一。传统温度传感器如热敏电阻需配合外部模数转换器(ADC)实现数字化输出,存在布线复杂、抗干扰能力弱、精度受限等问题。DS18B20作为Maxim Integrated(原DALLAS公司)推出的单总线数字温度传感器,凭借其高精度、低功耗、抗干扰性强及单总线通信协议等特性,成为分布式温度监测系统的理想选择。本文将从元器件选型、核心功能、设计原理及实际应用案例出发,详细阐述基于DS18B20的单总线数字温度计设计方案。

一、核心元器件选型与功能解析
1. DS18B20数字温度传感器
型号与封装:DS18B20提供TO-92、MSOP8、SOP8等多种封装形式,其中TO-92封装(三引脚直插式)因体积小、成本低、适用于狭小空间安装,成为最常用的封装类型。
核心参数:
测温范围:-55℃至+125℃,覆盖绝大多数工业与民用场景需求。
分辨率:支持9-12位可编程设置,默认12位分辨率下精度达±0.0625℃,在-10℃至+85℃范围内精度优化至±0.5℃,满足高精度测温需求。
转换时间:12位分辨率下仅需750ms完成温度转换,9位分辨率下仅需93.75ms,响应速度快。
供电方式:支持寄生电源模式(通过数据线DQ供电)与外部电源模式(VDD引脚供电),寄生电源模式下无需额外电源线,简化布线;外部电源模式下测量稳定性更高,支持更长距离传输。
通信协议:采用单总线协议,仅需一根数据线(DQ)即可完成数据传输与供电,支持多点组网,通过唯一64位ROM地址区分多个传感器,适用于分布式测温系统。
报警功能:内置可编程非易失性温度报警阈值(TH/TL),当温度超限时触发报警信号,便于实时监控异常温度。
选型依据:
DS18B20的测温精度、分辨率及转换速度显著优于传统热敏电阻。例如,在粮仓温度监测系统中,需同时监测多个点的温度,DS18B20的单总线多点组网功能可大幅减少布线成本;在工业设备过热保护场景中,其0.0625℃的分辨率与快速响应能力可精准捕捉温度突变,避免设备损坏。此外,寄生电源模式在电池供电的便携式设备中可延长续航时间,外部电源模式则适用于长距离传输的工业现场。
2. 微控制器(MCU)
型号推荐:STM32F103C8T6(ST公司)、ATmega328P(Microchip公司)、STC89C52RC(宏晶科技)。
核心功能:
单总线协议实现:通过GPIO引脚模拟单总线时序,完成DS18B20的初始化、ROM指令发送、功能指令执行及数据读取。
数据处理:解析DS18B20输出的16位二进制补码温度数据,转换为十进制温度值,并支持温度报警阈值比较。
通信接口扩展:提供UART、I2C、SPI等接口,便于与上位机、显示屏或无线模块(如ESP8266、NRF24L01)连接,实现数据远程传输与显示。
选型依据:
以STM32F103C8T6为例,其主频达72MHz,内置32KB Flash与20KB SRAM,可快速处理多路DS18B20的温度数据;其GPIO引脚支持灵活配置,可模拟单总线时序;丰富的外设接口便于系统扩展。在低成本场景中,STC89C52RC凭借其8位架构与低功耗特性,成为经济型选择。
3. 上拉电阻
型号与参数:4.7kΩ、1/4W、±1%精度、0805封装贴片电阻。
核心功能:
单总线稳定通信:在DQ引脚与VDD之间连接4.7kΩ上拉电阻,确保总线空闲时保持高电平,避免信号干扰。
寄生电源模式支持:在寄生电源模式下,强上拉电阻(如1kΩ)可在温度转换期间为DS18B20提供充足电流,确保测量稳定性。
选型依据:
上拉电阻阻值需根据总线长度与负载数量调整。在短距离(<1m)且单传感器场景中,4.7kΩ电阻可满足需求;在长距离(>10m)或多传感器组网场景中,需降低阻值(如2.2kΩ)以增强驱动能力。
4. 电源模块
型号推荐:AMS1117-3.3(线性稳压器)、LM2596S-ADJ(开关稳压器)、CR2032纽扣电池(便携式设备)。
核心功能:
电压转换:将外部输入电压(如5V)转换为DS18B20与MCU所需的3.3V电压,确保器件稳定工作。
低功耗设计:在电池供电场景中,选择低静态电流(<1μA)的稳压器(如AMS1117-3.3),延长设备续航时间。
选型依据:
在外部电源模式下,LM2596S-ADJ可提供高达3A的输出电流,支持多传感器长距离传输;在便携式设备中,CR2032纽扣电池结合AMS1117-3.3可实现小型化设计。
5. 显示模块
型号推荐:OLED显示屏(0.96寸、128×64分辨率、I2C接口)、LCD1602(16×2字符、并行接口)。
核心功能:
实时温度显示:将MCU处理的温度数据以数字或图形形式显示,便于用户直观读取。
低功耗设计:OLED显示屏在显示静态内容时功耗极低(<10mA),适合电池供电场景。
选型依据:
在高端应用中,OLED显示屏凭借其高对比度、广视角及低功耗特性,成为首选;在成本敏感型场景中,LCD1602以经济型价格满足基本显示需求。
6. 无线通信模块
型号推荐:ESP8266(Wi-Fi模块)、NRF24L01(2.4GHz无线模块)、LoRa模块(远距离低功耗)。
核心功能:
数据远程传输:将温度数据上传至云端服务器或移动终端,实现远程监控。
多节点组网:支持多个温度计节点与网关通信,构建大规模温度监测网络。
选型依据:
在室内短距离场景中,ESP8266可快速接入Wi-Fi网络;在工业现场或农业大棚等长距离场景中,LoRa模块凭借其10km以上的传输距离与低功耗特性,成为理想选择。
二、DS18B20工作原理与测温机制
DS12B20的测温核心基于减法计数器与斜率累加器的协同工作,其原理可分解为以下步骤:
1. 振荡器与计数器初始化
DS18B20内部集成低温度系数振荡器(LTO)与高温度系数振荡器(HTO)。LTO的振荡频率受温度影响极小,用于产生固定频率的脉冲信号;HTO的振荡频率随温度变化显著,其输出作为计数器2的脉冲输入。
在每次测温前,减法计数器1与温度寄存器被预置为-55℃对应的基数值(如12位分辨率下为0xFA90H)。
2. 温度测量循环
计数器1减法计数:LTO产生的脉冲信号输入减法计数器1,每接收到一个脉冲,计数器1值减1。
温度寄存器累加:当计数器1减至0时,温度寄存器值加1,同时计数器1重新加载初始值,继续减法计数。
计数器2控制测量时间:HTO产生的脉冲信号输入减法计数器2,当计数器2减至0时,停止温度寄存器累加,此时温度寄存器中的数值即为被测温度。
3. 斜率累加器非线性补偿
由于HTO的频率-温度关系并非绝对线性,测温过程中会产生非线性误差。斜率累加器通过动态修正计数器1的初始值,补偿非线性误差,提升测量精度。例如,在高温环境下,斜率累加器会增大计数器1的初始值,延长减法计数周期,从而抵消HTO频率过快导致的测量偏差。
4. 温度数据输出
测温完成后,温度值以16位二进制补码形式存储于高速暂存器的第0与第1字节(高位在前,低位在后)。其中,高5位为符号位(S),S=0表示正温度,S=1表示负温度;剩余11位为温度数据位。
正温度计算:将11位二进制数转换为十进制,乘以0.0625(12位分辨率)即可得到实际温度值。例如,07D0H(00000111 11010000)转换为十进制为2000,实际温度为2000×0.0625=125℃。
负温度计算:将11位二进制补码转换为原码(符号位不变,数值位取反后加1),再转换为十进制并乘以0.0625。例如,FC90H(11111100 10010000)转换为原码为10000011 01101111(即-870),实际温度为-870×0.0625=-54.375℃,四舍五入后为-55℃。
三、单总线通信协议与时序实现
DS18B20的单总线协议通过严格的时序控制实现数据传输,其通信流程包括初始化、ROM指令、功能指令与数据传输四个阶段。
1. 初始化时序
初始化是单总线通信的起始步骤,由主机发起,用于检测总线上的DS18B20是否存在。
主机复位脉冲:主机将DQ引脚拉低至少480μs,然后释放总线(上拉电阻将DQ拉高)。
设备应答脉冲:DS18B20检测到复位脉冲后,在15-60μs内将DQ拉低60-240μs,表示设备就绪。
主机检测应答:主机在释放总线后15-60μs内检测DQ电平,若为低电平则初始化成功。
2. ROM指令
ROM指令用于选择总线上的特定DS18B20或执行全局操作,常用指令如下:
Skip ROM(0xCC):跳过ROM地址匹配,直接访问总线上的所有设备,适用于单设备场景。
Read ROM(0x33):读取设备的64位ROM序列号,适用于单设备地址确认。
Match ROM(0x55):匹配指定ROM地址,仅选中的设备响应后续功能指令,适用于多设备场景。
Search ROM(0xF0):扫描总线上的所有设备ROM序列号,用于多设备地址识别。
3. 功能指令
功能指令用于控制DS18B20执行温度转换、数据读取等操作,常用指令如下:
Convert T(0x44):启动温度转换,转换完成后温度数据存入高速暂存器。
Read Scratchpad(0xBE):读取高速暂存器数据(包含温度数据、TH/TL报警值、配置寄存器等)。
Write Scratchpad(0x4E):向高速暂存器的TH/TL报警值与配置寄存器写入数据。
Copy Scratchpad(0x48):将高速暂存器中的TH/TL报警值与配置寄存器复制到EEPROM,实现掉电保存。
Recall EEPROM(0xB8):将EEPROM中的TH/TL报警值与配置寄存器复制到高速暂存器,恢复上次设置。
Read Power Supply(0xB4):读取设备供电模式(0=寄生电源,1=外部电源)。
4. 数据读写时序
单总线的数据传输通过“写时隙”与“读时隙”实现,时隙长度与时序精度直接影响通信稳定性。
写时隙:主机拉低DQ引脚60μs(写0)或2μs(写1),然后释放总线,DS18B20在15-60μs内采样DQ电平。
读时隙:主机拉低DQ引脚1μs后释放,DS18B20在15μs内将数据送至DQ引脚(0=拉低总线,1=释放总线),主机在15μs内完成数据采样。
四、硬件电路设计与实现
基于DS18B20的单总线数字温度计硬件电路包括电源模块、MCU模块、DS18B20温度传感器模块、显示模块与无线通信模块,以下以STM32F103C8T6为核心的设计方案为例进行说明。
1. 电源模块设计
电源模块需为MCU与DS18B20提供稳定的3.3V电压。在外部电源模式下,可采用LM2596S-ADJ开关稳压器将5V输入转换为3.3V输出,其电路如下:
输入滤波:在LM2596S-ADJ输入端并联100μF电解电容与0.1μF陶瓷电容,滤除高频噪声。
输出滤波:在输出端并联1000μF电解电容与0.1μF陶瓷电容,确保输出电压稳定。
反馈电阻:通过调整反馈电阻R1与R2的比值(R2=1.24kΩ,R1=3.3kΩ),实现3.3V输出。
在寄生电源模式下,需在DQ引脚与VDD之间连接4.7kΩ上拉电阻,并在温度转换期间通过强上拉(如1kΩ电阻)为DS18B20提供充足电流。
2. MCU模块设计
STM32F103C8T6的GPIO引脚需配置为推挽输出模式,以模拟单总线时序。其电路如下:
DQ引脚连接:将MCU的GPIO引脚(如PA0)通过4.7kΩ上拉电阻连接至3.3V电源,同时连接DS18B20的DQ引脚。
晶振电路:连接8MHz外部晶振与两个20pF电容,为MCU提供时钟信号。
复位电路:连接10kΩ上拉电阻与0.1μF电容,实现上电复位与手动复位功能。
3. DS18B20温度传感器模块设计
DS18B20的TO-92封装引脚定义如下(正对传感器切面,引脚从左到右):
GND:接地引脚,连接电源地。
DQ:数据引脚,连接MCU的GPIO引脚与上拉电阻。
VDD:电源引脚(外部电源模式下使用),连接3.3V电源。
在寄生电源模式下,VDD引脚悬空,仅通过DQ引脚供电;在外部电源模式下,VDD引脚连接3.3V电源,DQ引脚仍需上拉电阻。
4. 显示模块设计
以OLED显示屏为例,其I2C接口需连接MCU的SCL(PA5)与SDA(PA6)引脚,同时连接4.7kΩ上拉电阻以确保信号稳定性。OLED显示屏的VCC引脚连接3.3V电源,GND引脚接地。
5. 无线通信模块设计
以ESP8266 Wi-Fi模块为例,其电路如下:
电源连接:VCC引脚连接3.3V电源,GND引脚接地。
UART通信:TX引脚连接MCU的RX引脚(PA10),RX引脚连接MCU的TX引脚(PA9),实现数据透传。
天线连接:通过π型匹配网络(电感与电容)连接天线,优化无线信号传输。
五、软件程序设计与实现
软件程序需实现单总线初始化、DS18B20温度测量、数据处理与显示、无线通信等功能。以下以STM32F103C8T6的HAL库为例,说明关键函数实现。
1. 单总线初始化函数
cvoid DS18B20_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟 GPIO_InitStruct.Pin = GPIO_PIN_0; // DQ引脚为PA0 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式 GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速模式 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 初始化为高电平}
2. DS18B20复位与应答检测函数
cuint8_t DS18B20_Reset(void) { uint8_t presence = 0; HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 拉低DQ引脚480μs HAL_Delay(1); // 延时1ms(>480μs) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 释放DQ引脚 HAL_Delay(15); // 延时15-60μs if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) { // 检测应答信号 presence = 1; // 检测到应答 } HAL_Delay(240); // 延时240μs(>60μs) return presence;}
3. DS18B20写时隙函数
cvoid DS18B20_WriteByte(uint8_t data) { for (uint8_t i = 0; i < 8; i++) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 拉低DQ引脚2μs if (data & 0x01) { // 写1 HAL_Delay(2); // 延时2μs后释放DQ引脚 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); } else { // 写0 HAL_Delay(60); // 延时60μs后释放DQ引脚 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); } data >>= 1; // 右移一位 HAL_Delay(1); // 延时1μs(确保时隙长度>60μs) }}
4. DS18B20读时隙函数
cuint8_t DS18B20_ReadByte(void) { uint8_t data = 0; for (uint8_t i = 0; i < 8; i++) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 拉低DQ引脚1μs HAL_Delay(1); // 延时1μs HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 释放DQ引脚 HAL_Delay(10); // 延时10μs(DS18B20在15μs内送出数据) if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) { // 读取DQ引脚电平 data |= (1 << i); // 写1 } HAL_Delay(50); // 延时50μs(确保时隙长度>60μs) } return data;}
5. DS18B20温度测量函数
cfloat DS18B20_GetTemperature(void) { uint8_t temp_l = 0, temp_h = 0; int16_t temp_value = 0; float temperature = 0.0; if (DS18B20_Reset()) { // 复位DS18B20 DS18B20_WriteByte(0xCC); // 跳过ROM指令 DS18B20_WriteByte(0x44); // 启动温度转换 HAL_Delay(750); // 等待750ms(12位分辨率) DS18B20_Reset(); // 再次复位DS18B20 DS18B20_WriteByte(0xCC); // 跳过ROM指令 DS18B20_WriteByte(0xBE); // 读取暂存器指令 temp_l = DS18B20_ReadByte(); // 读取温度低字节 temp_h = DS18B20_ReadByte(); // 读取温度高字节 temp_value = (temp_h << 8) | temp_l; // 合并高低字节 if (temp_value & 0x8000) { // 判断符号位(负温度) temp_value = ~temp_value + 1; // 转换为原码 temperature = temp_value * (-0.0625); // 计算实际温度 } else { // 正温度 temperature = temp_value * 0.0625; // 计算实际温度 } } return temperature;}
6. OLED显示函数
cvoid OLED_ShowTemperature(float temperature) { char temp_str[10]; sprintf(temp_str, "Temp: %.2fC", temperature); // 格式化温度字符串 OLED_ShowString(0, 0, (uint8_t *)temp_str, 16); // 在OLED上显示温度(需实现OLED驱动函数)}
7. 主函数
cint main(void) { HAL_Init(); // 初始化HAL库 SystemClock_Config(); // 配置系统时钟 DS18B20_Init(); // 初始化DS18B20 OLED_Init(); // 初始化OLED显示屏 while (1) { float temperature = DS18B20_GetTemperature(); // 获取温度值 OLED_ShowTemperature(temperature); // 显示温度 HAL_Delay(1000); // 延时1s }}
六、实际应用案例与性能分析
1. 粮仓温度监测系统
在粮仓温度监测系统中,需同时监测多个点的温度以防止粮食霉变。采用DS18B20的单总线组网功能,可将数十个传感器挂载于同一总线上,通过MCU轮询读取温度数据。
系统优势:
布线简单:仅需一根总线与一根地线,降低布线成本。
高精度测温:12位分辨率下精度达±0.0625℃,可精准捕捉温度异常。
抗干扰能力强:单总线协议与CRC校验机制确保数据传输稳定性。
2. 工业设备过热保护系统
在工业设备过热保护系统中,DS18B20可实时监测设备关键部位的温度,当温度超限时触发报警信号并切断电源。
系统优势:
快速响应:750ms内完成12位温度转换,及时捕捉温度突变。
高可靠性:内置温度报警阈值(TH/TL),无需MCU额外比较。
低功耗设计:寄生电源模式下无需额外电源线,适合布线空间受限场景。
3. 智能家居温度控制系统
在智能家居温度控制系统中,DS18B20可与Wi-Fi模块(如ESP8266)连接,将温度数据上传至云端服务器,用户可通过手机APP远程监控与调节室内温度。
系统优势:
远程监控:通过无线通信实现温度数据远程传输。
多节点组网:支持多个DS18B20挂载于同一总线上,实现全屋温度监测。
低功耗设计:寄生电源模式下延长电池续航时间。
4. 性能分析
| 参数 | DS18B20 | 传统热敏电阻 |
|---|---|---|
| 测温范围 | -55℃至+125℃ | -40℃至+125℃ |
| 分辨率 | 9-12位可调(最高0.0625℃) | 需外部ADC,分辨率受限 |
| 转换时间 | 93.75ms(9位)至750ms(12位) | 依赖ADC速度,通常>1s |
| 供电方式 | 寄生电源/外部电源 | 仅外部电源 |
| 通信协议 | 单总线,支持多点组网 | 需额外模数转换与通信接口 |
| 抗干扰能力 | 强(CRC校验) | 弱(易受噪声干扰) |
| 成本 | 低(单芯片解决方案) | 高(需热敏电阻+ADC+通信模块) |
七、元器件采购与替代方案
1. 元器件采购渠道
DS18B20及配套元器件可通过拍明芯城(www.iczoom.com)采购,该平台提供型号查询、品牌、价格参考、国产替代、供应商厂家、封装、规格参数、数据手册等一站式服务。例如,搜索“DS18B20”可获取TO-92、MSOP8等封装型号的详细信息与采购链接。
2. 国产替代方案
在成本敏感型场景中,可采用国产替代芯片(如MAX31820,Maxim Integrated兼容型号)或模拟方案(如热敏电阻+ADC)。
MAX31820:与DS18B20引脚兼容,测温范围与精度相同,价格更低。
热敏电阻+ADC:适用于低精度场景(如±1℃),成本更低,但需额外设计模数转换与校准电路。
八、总结与展望
基于DS18B20的单总线数字温度计凭借其高精度、低功耗、抗干扰性强及单总线通信协议等特性,在工业自动化、环境监测、智能家居等领域具有广泛应用前景。通过合理选型与优化设计,可构建高可靠性、低成本的温度监测系统。未来,随着物联网技术的发展,DS18B20将与无线通信模块(如LoRa、NB-IoT)深度融合,实现更大规模的温度监测网络,为智慧城市、智慧农业等领域提供技术支撑。
责任编辑:David
【免责声明】
1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。
2、本文的引用仅供读者交流学习使用,不涉及商业目的。
3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。

产品分类

2012- 2022 拍明芯城ICZOOM.com 版权所有 客服热线:400-693-8369 (9:00-18:00)