news 2026/4/3 4:47:14

学习笔记——DS18B20 温度传感器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
学习笔记——DS18B20 温度传感器

DS18B20 温度传感器

一、传感器概述

1.1 基本特性

DS18B20 是由 Dallas Semiconductor(现 Maxim Integrated)生产的数字温度传感器。该器件采用单总线接口,可直接输出数字温度值,无需外部模数转换电路。

关键参数表

参数类别技术规格
温度测量范围-55℃ 至 +125℃
测量精度±0.5℃(-10℃ 至 +85℃范围内)
分辨率可编程配置:9、10、11、12 位
默认分辨率12 位(0.0625℃/LSB)
工作电压3.0V 至 5.5V
转换时间93.75ms(9位)至 750ms(12位)
封装形式TO-92、SO-8、µSOP

1.2 引脚定义

TO-92 封装引脚排列(正视,引脚朝下):

引脚功能说明

  • 引脚1(GND):电源地,连接至系统参考地

  • 引脚2(DQ):单总线数据输入/输出引脚

  • 引脚3(VDD):电源输入引脚(3.0V-5.5V)

二、单总线通信协议

2.1 协议概述

单总线协议(1-Wire Protocol)采用单根数据线实现双向通信。该协议包含以下关键技术特性:

  1. 单主多从架构:单总线上可挂接多个从设备

  2. 寄生供电模式:通过数据线为设备供电,无需独立电源

  3. 严格的时序要求:所有通信操作都有精确的时序规范

2.2 电气特性

典型应用电路: VCC (+3.3V-5V) │ ├─[4.7kΩ]─┐ │ │ └─────┐ │ │ │ DS18B20 │ 1│ 2│ 3│ GND DQ VDD │ │ GND ├─→ MCU I/O Pin │ GND

上拉电阻作用

  • 在总线空闲时提供确定的高电平状态

  • 确保信号完整性,减少噪声影响

  • 典型值:4.7kΩ ±5%

三、温度数据格式

3.1 温度寄存器结构

DS18B20 输出 16 位二进制补码格式的温度数据:

位位置1514131211109876543210
含义SSSSS2⁶2⁵2⁴2⁰2⁻¹2⁻²2⁻³2⁻⁴

说明

  • 位 15-11:符号位(S=1 表示负温度,S=0 表示正温度)

  • 位 10-4:整数部分(7 位二进制,范围 0-127)

  • 位 3-0:小数部分(4 位二进制)

3.2 分辨率配置

DS18B20 提供四种分辨率设置,通过配置寄存器实现:

分辨率位数R1R0温度精度最大转换时间
9 位000.5℃93.75ms
10 位010.25℃187.5ms
11 位100.125℃375ms
12 位110.0625℃750ms

默认配置:R1=1, R0=1(12 位分辨率)

四、通信时序详析

4.1 复位脉冲时序

时间参数要求

  • 主机复位脉冲宽度:最小 480μs

  • 主机释放总线后延迟:15-60μs

  • 从机响应脉冲宽度:60-240μs

  • 总线恢复时间:最小 480μs

4.2 写时序规范

写"0"时序

  • 主机将总线拉低至少60us

  • ds18b20在60us内去采样,采到低电平,则代表主机向ds18b20发送了一个bit'0'

  • 最后主机将总线拉高

写"1"时序

  • 主机将总线拉低大于1us

  • 主机释放总线,将总线拉高

  • 主机延时至少45us,确保ds18b20能够采样到一个高电平

写时间槽参数

  • 写"0"低电平时间:60-120μs

  • 写"1"低电平时间:1-15μs

  • 写周期总时间:最小 60μs,典型 70μs

4.3 读时序规范

读时间槽参数

  • 主机低电平时间:>1μs

  • 采样窗口:低电平释放后 15μs 内

  • 位周期总时间:最小 60μs

五、驱动程序实现

5.1 硬件抽象层定义

// 引脚操作宏定义 #define DS18B20_PORT P3 // 使用P3端口 #define DS18B20_PIN 7 // 使用P3.7引脚 // 总线操作宏 #define DQ_LOW() (DS18B20_PORT &= ~(1 << DS18B20_PIN)) #define DQ_HIGH() (DS18B20_PORT |= (1 << DS18B20_PIN)) #define DQ_INPUT() (DS18B20_PORT |= (1 << DS18B20_PIN)) // 设置为输入模式 #define DQ_READ() ((DS18B20_PORT & (1 << DS18B20_PIN)) ? 1 : 0)

5.2 精确延时函数

/** * @brief 微秒级延时函数 * @param us 延时微秒数 * @note 基于11.0592MHz晶振,12时钟周期 */ void delay_us(unsigned int us) { while(us--) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } } /** * @brief 毫秒级延时函数 * @param ms 延时毫秒数 */ void delay_ms(unsigned int ms) { while(ms--) { delay_us(1000); } }

5.3 复位函数实现

/** * @brief DS18B20复位序列 * @return 1:复位成功,检测到器件存在 * 0:复位失败,器件无响应 */ uint8_t DS18B20_Reset(void) { uint8_t presence = 0; // 主机驱动总线为低电平 DQ_LOW(); // 保持低电平480μs以上(推荐500-550μs) delay_us(550); // 主机释放总线,上拉电阻拉至高电平 DQ_HIGH(); DQ_INPUT(); // 切换为输入模式 // 延时等待15-60μs delay_us(30); // 检测从机响应脉冲 if(DQ_READ() == 0) { // 等待从机释放总线(60-240μs) uint16_t timeout = 250; while(!DQ_READ() && timeout--); if(timeout > 0) { presence = 1; // 检测到器件 } } // 等待总线恢复(至少480μs) delay_us(500); return presence; }

5.4 数据读写函数

/** * @brief 向DS18B20写入一个字节 * @param data 要写入的数据字节 */ void DS18B20_WriteByte(uint8_t data) { uint8_t i; for(i = 0; i < 8; i++) { // 写时间槽开始 DQ_LOW(); if(data & 0x01) // 写入"1" { // 保持低电平>1μs,然后释放总线 _nop_(); _nop_(); // 约2μs延时 DQ_HIGH(); DQ_INPUT(); // 保持总线高电平至少45μs delay_us(50); } else // 写入"0" { // 保持低电平60-120μs delay_us(70); DQ_HIGH(); DQ_INPUT(); } // 写时间槽结束,恢复总线 data >>= 1; // 准备下一位 delay_us(5); // 位间恢复时间 } // 字节写入完成后,确保总线处于释放状态 DQ_HIGH(); DQ_INPUT(); } /** * @brief 从DS18B20读取一个字节 * @return 读取到的数据字节 */ uint8_t DS18B20_ReadByte(void) { uint8_t i; uint8_t data = 0; for(i = 0; i < 8; i++) { // 读时间槽开始 DQ_LOW(); _nop_(); _nop_(); // 约2μs低电平 // 主机释放总线,准备采样 DQ_HIGH(); DQ_INPUT(); // 延时15μs后采样 delay_us(15); // 读取总线状态 if(DQ_READ()) { data |= (0x01 << i); // 读取到"1" } // 完成读时间槽(总时间>60μs) delay_us(45); // 确保总线恢复 DQ_HIGH(); DQ_INPUT(); } return data; }

5.5 温度读取完整流程

/** * @brief 读取当前温度值 * @return 温度值(浮点数,单位:℃) * @note 使用12位分辨率,转换时间约750ms */ float DS18B20_ReadTemperature(void) { uint8_t temp_low, temp_high; int16_t temp_raw; float temperature; // 步骤1:启动温度转换 if(!DS18B20_Reset()) { return ERROR_TEMPERATURE; // 定义错误值,如-999.0 } // 发送跳过ROM命令(仅单设备情况) DS18B20_WriteByte(0xCC); // 发送温度转换命令 DS18B20_WriteByte(0x44); // 等待转换完成(12位分辨率需750ms) delay_ms(750); // 步骤2:读取温度数据 if(!DS18B20_Reset()) { return ERROR_TEMPERATURE; } // 发送跳过ROM命令 DS18B20_WriteByte(0xCC); // 发送读暂存器命令 DS18B20_WriteByte(0xBE); // 读取温度寄存器(低字节和高字节) temp_low = DS18B20_ReadByte(); temp_high = DS18B20_ReadByte(); // 合成16位温度原始值 temp_raw = (temp_high << 8) | temp_low; // 步骤3:温度值转换 // 判断温度符号 if(temp_raw & 0x8000) // 负温度 { // 计算补码的绝对值 temp_raw = ~temp_raw + 1; temperature = -(temp_raw * 0.0625); } else // 正温度 { temperature = temp_raw * 0.0625; } return temperature; }

七、调试与故障排除

7.1 常见问题及解决方案

问题现象可能原因解决方案
读取温度始终为0总线无上拉电阻添加4.7kΩ上拉电阻至VCC
温度值异常波动电源噪声干扰在VDD和GND间添加100nF电容
器件无响应时序不符合规范使用逻辑分析仪检查时序
温度转换失败延时不足确保750ms转换等待时间
多个传感器冲突ROM未正确匹配实现ROM搜索和匹配算法

八、技术参数总结表

技术指标规格描述
通信接口单总线(1-Wire)
数据格式16位二进制补码
转换精度用户可编程9-12位
最大采样率9位:约10.6Hz,12位:约1.33Hz
总线负载能力理论上最多可挂接数百个器件
温度误差±0.5℃(-10℃至+85℃)
长期稳定性±0.2℃/年(典型值)
ESD保护人体模型:≥4kV
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 20:42:41

BGE-M3开箱即用:快速实现长文档检索的完整流程

BGE-M3开箱即用&#xff1a;快速实现长文档检索的完整流程 1. 引言&#xff1a;为什么选择BGE-M3进行长文档检索&#xff1f; 在当前信息爆炸的时代&#xff0c;企业知识库、技术文档、法律条文等长文本数据日益增多。传统的关键词匹配方法已难以满足对语义理解深度和检索精度…

作者头像 李华
网站建设 2026/4/1 20:27:50

Hunyuan实战案例:国际客服系统集成1.8B翻译模型详细步骤

Hunyuan实战案例&#xff1a;国际客服系统集成1.8B翻译模型详细步骤 1. 引言 1.1 业务场景描述 在全球化业务拓展中&#xff0c;跨国企业面临多语言客户沟通的挑战。传统人工翻译成本高、响应慢&#xff0c;而通用机器翻译服务在专业术语、语境理解方面存在局限性&#xff0…

作者头像 李华
网站建设 2026/3/30 18:18:29

IndexTTS 2.0使用秘籍:8种内置情感向量调节技巧

IndexTTS 2.0使用秘籍&#xff1a;8种内置情感向量调节技巧 1. 引言&#xff1a;重塑语音合成体验的零样本利器 还在为找不到贴合人设的配音发愁&#xff1f;试试 B 站开源的 IndexTTS 2.0&#xff01;这款自回归零样本语音合成模型&#xff0c;支持上传人物音频与文字内容&a…

作者头像 李华
网站建设 2026/4/1 20:15:37

ego1开发板大作业在Vivado中的仿真测试方法

Vivado仿真实战&#xff1a;如何高效完成ego1开发板大作业你有没有遇到过这样的情况&#xff1f;写完Verilog代码&#xff0c;兴冲冲地烧进ego1开发板&#xff0c;结果LED不亮、数码管乱跳&#xff0c;按下按键毫无反应。反复下载调试&#xff0c;耗时又费力&#xff0c;最后发…

作者头像 李华
网站建设 2026/4/3 3:38:20

通义千问2.5-7B-Instruct教程:模型服务监控仪表盘

通义千问2.5-7B-Instruct教程&#xff1a;模型服务监控仪表盘 1. 引言 1.1 业务场景描述 随着大语言模型在企业级应用中的广泛落地&#xff0c;如何高效监控和管理本地部署的模型服务成为工程实践中的关键挑战。特别是在多用户并发访问、长时间运行和资源受限的环境下&#…

作者头像 李华