当前位置: 首页 > news >正文

DS18B20温度传感器:单总线通信全解析

一、DS18B20 核心参数

参数项

规格说明

供电电压

3.0V ~ 5.5V,支持寄生供电(仅靠数据线供电,无需外接电源)

测温范围

-55℃ ~ +125℃

测量精度

-10℃ ~ +85℃ 范围内误差 ≤ ±0.5℃

分辨率

可编程 9/10/11/12 位,出厂默认12 位- 12 位:0.0625℃ 分辨率,最大转换时间 750ms - 11 位:0.125℃,375ms - 10 位:0.25℃,187.5ms - 9 位:0.5℃,93.75ms

通信接口

单总线(1-Wire),仅需 1 根数据线 + 地线即可通信

内置存储

片内 EEPROM,可保存温度报警阈值、分辨率配置

多设备支持

同一根总线上可挂载多个 DS18B20,通过 64 位唯一 ROM 地址区分


二、单总线通信基础:线与特性与上拉电阻

1. 线与(Wire-AND)特性

DS18B20 的 DQ 数据引脚采用 \\开漏输出(Open Drain)\\结构,自身无法输出高电平,只能输出低电平或高阻态,所有挂载在单总线上的器件共享这一特性:

  • 总线电平由所有器件共同决定:只要有任意一个器件拉低总线,总线就为低电平;只有所有器件都释放总线,总线才会回到高电平

  • 这就是 “线与” 逻辑:全高才为高,有低则为低。

  • 作用:天然支持多器件组网,无需复杂的总线仲裁,靠硬件电平特性避免冲突。

2. 上拉电阻
  • 必要性:由于器件都是开漏输出,自身不能输出高电平,必须外接上拉电阻才能让总线回到空闲高电平。没有上拉电阻时总线永远为低,完全无法通信。

  • 典型取值4.7kΩ(最常用),合理范围 1kΩ ~ 10kΩ。

    • 阻值过小:总线拉低时电流过大,功耗升高,甚至损坏器件

    • 阻值过大:总线上升沿过慢,信号失真,通信距离缩短

  • 接法:一端接 DQ 数据线,另一端接系统 VCC(3.3V/5V),靠近单片机端放置效果最佳。

  • 寄生供电模式下,上拉电阻还负责在总线高电平时为 DS18B20 充电供电。


三、核心通信时序

所有通信都由主机(单片机)发起,以总线拉低作为时隙起始,严格遵循时间窗口要求。

1. 复位 + 存在脉冲(初始化时序)

每次通信的第一步,用于确认器件在线、同步总线。

  1. 主机发送复位脉冲:拉低总线≥ 480μs

  2. 主机释放总线:切换为输入模式,等待从机响应

  3. 从机回复存在脉冲:检测到总线上升沿后,等待 15\60μs,然后拉低总线 60\240μs

  4. 从机释放总线:总线回到高电平,初始化完成

成功标志:主机释放总线后,在 15~60μs 窗口内检测到低电平,即表示器件存在。 对应你的代码:复位拉低 700μs、释放后等待 50μs 再检测,符合标准时序要求。

2. 写时序(主机向从机写 1 位)

每个写时隙 ≥ 60μs,两个时隙之间至少间隔 1μs。

  • 写 1 时序

    • 主机拉低总线

    • 15μs 内释放总线,由上拉电阻拉高

    • 剩余时间保持时隙长度(总时长 ≥ 60μs)

  • 写 0 时序

    • 主机拉低总线

    • 保持低电平 ≥ 60μs

    • 释放总线

DS18B20 会在主机拉低后的 15~60μs 窗口内采样总线电平,判断写入的是 0 还是 1。

3. 读时序(主机从从机读 1 位)

读时隙同样由主机发起,数据有效窗口极短,必须严格控制读取时机。

  1. 主机拉低总线≥ 1μs

  2. 主机立刻释放总线,并在释放后 15μs 内读取总线电平

  3. 整个时隙总时长 ≥ 60μs,两个时隙之间至少间隔 1μs

关键:从机输出的数据仅在主机拉低后的 15μs 内有效,必须在这个窗口内完成读取,否则数据会失效。


四、完整温度采集流程(单器件场景)

对应你代码中get_temp()的执行逻辑,分为「启动转换」和「读取结果」两大步,每步都需要先复位初始化。

第一步:启动温度转换
  1. 主机发送复位脉冲,检测存在脉冲,确认器件在线

  2. 主机发送ROM 指令 0xCC(跳过 ROM / Skip ROM):总线上只有 1 个 DS18B20 时使用,跳过 64 位 ROM 地址匹配

  3. 主机发送功能指令 0x44(启动温度转换 / Convert T)

  4. 等待转换完成:12 位分辨率下最多等待 750ms(你的代码用 1s 是留了安全余量)

第二步:读取温度结果
  1. 主机再次发送复位脉冲,检测存在脉冲

  2. 主机发送 ROM 指令 0xCC(跳过 ROM)

  3. 主机发送功能指令 0xBE(读暂存器 / Read Scratchpad)

  4. 从机依次输出暂存器的 9 个字节,主机按顺序读取:

    1. 字节 0:温度低字节(TL)

    2. 字节 1:温度高字节(TH)

    3. 字节 2:高温报警阈值

    4. 字节 3:低温报警阈值

    5. 字节 4:配置寄存器(设置分辨率)

    6. 字节 5~7:保留位

    7. 字节 8:CRC 校验字节

  5. 读取前 2 字节即可计算温度值;读完 9 字节可做 CRC 校验,提升通信可靠性。

多器件场景:不能使用 0xCC 指令,需要用 0x55(匹配 ROM)+ 64 位器件地址,选中指定的 DS18B20。


五、温度数据格式与计算

DS18B20 输出 16 位二进制补码,高字节在前、低字节在后,12 位分辨率下格式如下:

位序号

15~11

10~4

3~0

含义

符号位 S

温度整数部分

温度小数部分

  • 正温度:符号位全为 0

  • 负温度:符号位全为 1

计算公式(12 位分辨率)

温度值(℃) = 16位原始短整型值 × 0.0625

由于 C 语言中short类型天然支持补码运算,直接相乘即可自动处理正负温度,和你代码中的写法完全一致。

示例

  • +25.0℃ → 原始值0x0190→ 400 × 0.0625 = 25.0℃

  • -10.0℃ → 原始值0xFF60→ -160 × 0.0625 = -10.0℃

http://www.cnnetsun.cn/news/3413857.html

相关文章:

  • 免费分享几千款5000G游戏资源 安卓单机游戏 支持手机平板可用安卓游戏网盘下载
  • Unity赛车游戏赛道设计:5分钟用Curvy Splines快速生成与OBJ导出
  • Arduino Uno驱动蜂鸣器:从《大鱼》到自定义乐谱的编程实践
  • MCU串口通信与工业接口设计实战指南
  • Pandas数据处理实战:从环境搭建到完整数据分析案例
  • 腾讯混元Hy3模型实战:MoE架构与Agent能力开发指南
  • 架构整理 完美架构?
  • 手机号到QQ号查询:基于协议逆向工程的Python技术实现与架构解析
  • OpenAI Codex CLI完整教程:从环境配置到MCP协议集成实战
  • 从拆解到通解:攻克1/(1+x^4)不定积分的三种思维路径
  • wsl磁盘迁移
  • 基于RT-Thread Studio与GUI Guider,从零构建LVGL应用界面
  • Subtitle Edit:免费开源字幕编辑神器,轻松制作专业级字幕
  • 利用Optuna实现CatBoost模型超参数优化与可视化分析
  • 163MusicLyrics:5分钟搞定网易云和QQ音乐歌词下载的终极免费方案
  • 稳压管工作原理与电路设计全解析
  • RimWorld终极角色定制指南:3步安装EdB Prepare Carefully模组,打造完美开局团队
  • 大语言模型技术选型指南:从核心能力到实战部署
  • GitHub Copilot 深度解析:从代码补全到AI协同开发范式
  • 【电路】电容(二)——滤波电容的选型与实战
  • 拆开光的“快递包裹“:光照贴图(Lightmap)里,究竟塞了些什么?
  • 【编译原理】【C语言】实验一:从零构建一个C语言子集词法分析器
  • 智读致用《噪声》02|你以为是“直觉”,其实是“噪声”——帮你看见判断中的隐形变量
  • Codex免费版够用吗?Free、Plus和Pro怎么选
  • 【C语言进阶】头文件守卫与模块化设计实战指南
  • 矩阵特征值与特征向量的核心性质及其应用场景解析
  • 光谷财税哪家靠谱:智能预警系统如何选与比价
  • Java线程诊断实战:jstack命令深度解析与性能问题定位
  • 物联网环境传感器应用与系统架构设计
  • KLayout终极指南:从新手到专家的版图验证实战教程