1-Wire 一线式总线:从原理到实战,玩转 DS18B20 温度采集

article/2025/6/21 5:20:03

引言

在嵌入式系统中,通信总线是连接 CPU 与外设的桥梁。从 I2C、SPI 到 UART,每种总线都有其独特的应用场景。而本文要介绍的1-Wire 一线式总线,以其极简的硬件设计和独特的通信协议,在温度采集、身份识别等领域大放异彩。本文将从原理入手,结合 STM32 与 DS18B20 温度传感器的实战案例,带您深入理解一线式总线的奥秘。

一、一线式总线的核心原理

1. 定义与特性

一线式串行总线,顾名思义,只需一根数据线即可实现 CPU 与外设的通信(需上拉电阻,默认高电平)。与 I2C、SPI 等多线总线不同,它的特点是:

  • 单数据线:数据传输与时钟同步都依赖这根线。

  • 串行通信:一位一位地传输数据,而非并行。

  • 总线结构:支持多个从设备挂接在同一数据线上(需通过 ROM 寻址)。

2. 时钟机制:无时钟线如何同步?

一线式总线没有独立的时钟信号线,它通过严格的时序控制实现数据同步:

  • 主设备(MCU) 通过精确控制数据线的高低电平持续时间,定义时钟周期。

  • 从设备(如 DS18B20)根据主设备的时序要求,在特定时间窗口内采样或发送数据。

这种设计虽然增加了软件实现的复杂度,但极大简化了硬件连接。

二、DS18B20 温度传感器实战:硬件设计

1. 硬件连接

以 STM32F103 与 DS18B20 为例,硬件连接如下:

  • 数据线(DQ):连接 STM32 的 PG11 引脚(需 4.7KΩ 上拉电阻)。

  • 电源(VDD):接 3.3V 或 5V(支持寄生电源模式,本文使用外部供电)。

  • 地(GND):共地。

2. GPIO 初始化代码

// 定义DS18B20连接引脚
#define DS18B20_PORT    GPIOG
#define DS18B20_PIN     GPIO_Pin_11
#define DS18B20_IO_OUT  DS18B20_PORT->ODR
#define DS18B20_IO_IN   DS18B20_PORT->IDR
​
void DS18B20_Init(void) {// 1. 打开GPIOG时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);// 2. 配置PG11为推挽输出,50MHzGPIO_InitTypeDef GPIO_Config;GPIO_Config.GPIO_Pin   = DS18B20_PIN;GPIO_Config.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Config.GPIO_Mode  = GPIO_Mode_Out_PP;GPIO_Init(DS18B20_PORT, &GPIO_Config);
}

三、一线式总线通信协议详解

1. 通信三部曲

由厂家提供的芯片手册可知要想获取温度值,访问 DS18B20 需遵循固定顺序:

  1. 初始化复位:类似 I2C 的 START 信号,检测设备是否在线。

  2. 发送 ROM 命令:识别总线上的特定设备(如读取唯一 ID 或跳过 ID 直接访问)。

  3. 发送功能命令:执行具体操作(如温度转换、读取寄存器)。

2. 底层时序实现

(1)初始化复位信号

// 初始化复位
void DS18B20_Reset(void) {u8 tempTime = 0;// 1. 拉低总线 >=480usDS18B20_OUT();DS18B20_IO_OUT = 0;delay_us(500);// 2. 释放总线(拉高)15~60usDS18B20_IO_OUT = 1;delay_us(30);// 3. 等待DS18B20应答(拉低60~240us)DS18B20_IN();while (DS18B20_IO_IN && tempTime < 240) {tempTime++;delay_us(1);}if (tempTime >= 240) {printf("DS18B20 Reset Failed\n");} else {printf("DS18B20 Reset Success\n");tempTime = 0;}// 4. 总线恢复高电平delay_us(200);
}
(2)数据读写操作

// 发送单字节
void DS18B20_Write_Byte(u8 data) {u8 i;DS18B20_OUT();for (i = 0; i < 8; i++) {if (data & 0x01) {  // 写1// 拉低 >1usDS18B20_IO_OUT = 0;delay_us(2);// 拉高 >45usDS18B20_IO_OUT = 1;delay_us(60);} else {  // 写0// 拉低60~120usDS18B20_IO_OUT = 0;delay_us(60);// 拉高 >1usDS18B20_IO_OUT = 1;delay_us(2);}data >>= 1;}
}
​
// 读取单字节
u8 DS18B20_Read_Byte(void) {u8 i, data = 0;for (i = 0; i < 8; i++) {// 1. 拉低 >1usDS18B20_OUT();DS18B20_IO_OUT = 0;delay_us(2);// 2. 释放总线,准备读取DS18B20_IN();delay_us(8);  // 等待DS18B20输出数据// 3. 读取数据data |= DS18B20_IO_IN << i;delay_us(50);  // 完成读时隙}return data;
}

四、DS18B20 温度采集实战

1. ROM 命令与功能命令

DS18B20 支持多种 ROM 命令,常见的有:

  • SKIP ROM(0xCC):跳过 ROM 匹配,适用于单设备场景。

  • MATCH ROM(0x55):匹配特定设备的 64 位 ROM ID,适用于多设备场景。

功能命令则包括:

  • CONVERT T(0x44):启动温度转换。

  • READ SCRATCHPAD(0xBE):读取温度寄存器数据。

2. 温度采集代码实现

(1)单设备场景(SKIP ROM)
// 获取温度值(单设备)
float DS18B20_GetTemperature(void) {u8 temp_lsb, temp_msb;u16 temp;float value;// 1. 初始化 -> SKIP ROM -> 启动温度转换DS18B20_Reset();DS18B20_Write_Byte(0xCC);  // SKIP ROMDS18B20_Write_Byte(0x44);  // CONVERT Tdelay_ms(800);  // 等待转换完成(最大750ms)// 2. 初始化 -> SKIP ROM -> 读取温度寄存器DS18B20_Reset();DS18B20_Write_Byte(0xCC);  // SKIP ROMDS18B20_Write_Byte(0xBE);  // READ SCRATCHPAD// 3. 读取温度数据(低8位和高8位)temp_lsb = DS18B20_Read_Byte();temp_msb = DS18B20_Read_Byte();temp = (temp_msb << 8) | temp_lsb;// 4. 温度值转换(分辨率默认为12位)if ((temp & 0xF800) == 0xF800) {  // 负数temp = (~temp) + 1;value = temp * (-0.0625);} else {  // 正数value = temp * 0.0625;}return value;
}
(2)多设备场景(MATCH ROM)
u8 rom[8];  // 存储DS18B20的64位ROM ID
​
// 读取ROM值
void DS18B20_ReadRom(void) {u8 i;DS18B20_Reset();DS18B20_Write_Byte(0x33);  // READ ROMfor (i = 0; i < 8; i++) {rom[i] = DS18B20_Read_Byte();printf("%02X ", rom[i]);}printf("\n");
}
​
// 匹配指定ROM的设备
void DS18B20_MatchRom(void) {u8 i;DS18B20_Reset();DS18B20_Write_Byte(0x55);  // MATCH ROMfor (i = 0; i < 8; i++) {DS18B20_Write_Byte(rom[i]);}
}
​
// 获取指定设备的温度(多设备场景)
float DS18B20_GetTemperature(void) {// 与单设备类似,但将SKIP ROM替换为MATCH ROM// ...
}

五、常见问题与优化建议

1. 通信稳定性问题

  • 上拉电阻:务必使用 4.7KΩ 上拉电阻,确保总线在空闲时为高电平。

  • 延时精度:一线式总线对时序要求极高,建议使用精确的微秒级延时函数。

  • 线路长度:数据线过长会导致信号衰减,建议控制在 2 米以内(或增加驱动电路)。

2. 多设备寻址技巧

  • ROM 搜索算法:通过SEARCH ROM(0xF0)命令遍历总线上所有设备的 ROM ID。

  • 寄生电源模式:DS18B20 可通过数据线获取电源,但可能影响稳定性,建议优先使用外部供电。

3. 代码优化方向

  • 超时处理:在关键通信环节添加超时检测,避免程序卡死。

  • CRC 校验:DS18B20 的 ROM 和数据寄存器包含 CRC 校验值,可提高数据可靠性。

六、总结

一线式总线以其极简的硬件设计和独特的通信机制,为嵌入式系统提供了一种低成本、易扩展的解决方案。通过本文的实战案例,我们掌握了 DS18B20 温度传感器的基本原理和编程方法,理解了一线式总线的通信协议与实现技巧。

在实际应用中,一线式总线不仅适用于温度采集,还可用于湿度、压力等多种传感器的连接。掌握这一技术,将为您的嵌入式开发工具箱增添一件有力武器!


http://www.hkcw.cn/article/tAPvGtOXKw.shtml

相关文章

有机黑鸡蛋与普通鸡蛋:差异剖析与选购指南

在我们的日常饮食结构里&#xff0c;鸡蛋始终占据着不可或缺的位置&#xff0c;是人们获取营养的重要来源。如今&#xff0c;市场上鸡蛋种类丰富&#xff0c;除了常见的普通鸡蛋&#xff0c;有机黑鸡蛋也逐渐崭露头角&#xff0c;其价格通常略高于普通鸡蛋。这两者究竟存在哪些…

Fastapi 学习使用

Fastapi 学习使用 Fastapi 可以用来快速搭建 Web 应用来进行接口的搭建。 参考文章&#xff1a;https://blog.csdn.net/liudadaxuexi/article/details/141062582 参考文章&#xff1a;https://blog.csdn.net/jcgeneral/article/details/146505880 参考文章&#xff1a;http…

数字化转型进阶:精读41页华为数字化转型实践【附全文阅读】

该文档聚焦华为数字化转型实践&#xff0c;核心内容如下&#xff1a; 转型本质与目标&#xff1a;数字化转型是通过数字技术穿透业务&#xff0c;实现物理世界与数字世界的融合&#xff0c;目标是支撑主业成功、提升体验与效率、探索模式创新。华为以 “平台 服务” 为核心&am…

共享内存-systemV

01. 共享内存简述 共享内存是一个允许多个进程直接访问同一块物理内存区域的进程通信工具&#xff0c;因其本身不涉及用户态与核心态之间转换&#xff0c;故效率最佳。为了使用一个共享内存段&#xff0c;一般需要以下几个步骤&#xff1a; 调用shmget()创建一个新共享内存段…

大语言模型值ollama使用(1)

ollama为本地调用大语言模型提供了便捷的方式。下面列举如何在windows系统中快捷调用ollama。 winR打开运行框&#xff0c;输入cmd 1、输入ollama list 显示已下载模型 2、输入ollama pull llama3 下载llama3模型 3、 输入 ollama run llama3 运行模型 4、其他 ollama li…

【基础算法】高精度(加、减、乘、除)

文章目录 什么是高精度1. 高精度加法解题思路代码实现 2. 高精度减法解题思路代码实现 3. 高精度乘法解题思路代码实现 4. 高精度除法 (高精度 / 低精度)解题思路代码实现 什么是高精度 我们平时使用加减乘除的时候都是直接使用 - * / 这些符号&#xff0c;前提是进行运算的数…

uni-data-picker级联选择器、fastadmin后端api

记录一个部门及部门人员选择的功能&#xff0c;效果如下&#xff1a; 组件用到了uni-ui的级联选择uni-data-picker 开发文档&#xff1a;uni-app官网 组件要求的数据格式如下&#xff1a; 后端使用的是fastadmin&#xff0c;需要用到fastadmin自带的tree类生成部门树 &#x…

MonitorSDK_性能监控(从Web Vital性能指标、PerformanceObserver API和具体代码实现)

性能监控 性能指标 在实现性能监控前&#xff0c;先了解Web Vitals涉及的常见的性能指标 Web Vitals 是由 Google 推出的网页用户体验衡量指标体系&#xff0c;旨在帮助开发者量化和优化网页在实际用户终端上的性能体验。Web Vitals 强调“以用户为中心”的度量&#xff0c;而…

Kubernetes架构与核心概念深度解析:Pod、Service与RBAC的奥秘

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言&#xff1a;云原生时代的操作系统 在云原生技术浪潮中&#xff0c;Kubernetes&#xff08;简称K8s&#xff09;已成为容器编排领域的"分布式操…

enumiax:IAX 协议用户名枚举器!全参数详细教程!Kali Linux教程!

简介 enumIAX 是一个 Inter Asterisk Exchange 协议用户名暴力枚举器。enumIAX 可以以两种不同的模式运行&#xff1b;顺序用户名猜测或字典攻击。 enumIAX 可以以两种不同的模式运行&#xff1a;顺序用户名猜测或字典攻击。 顺序用户名猜测 在顺序用户名猜测模式下&#xf…

《深入解析SPI协议及其FPGA高效实现》-- 第一篇:SPI协议基础与工作机制

第一篇&#xff1a;SPI协议基础与工作机制 1. 串行外设接口导论 1.1 SPI的核心定位 协议本质 &#xff1a; 全双工同步串行协议&#xff08;对比UART异步、IC半双工&#xff09;核心优势 &#xff1a; 无寻址开销&#xff08;通过片选直连&#xff09;时钟速率可达100MHz&…

C++语法系列之模板进阶

前言 本次会介绍一下非类型模板参数、模板的特化(特例化)和模板的可变参数&#xff0c;不是最开始学的模板 一、非类型模板参数 字面意思,比如&#xff1a; template<size_t N 10> 或者 template<class T,size_t N 10>比如&#xff1a;静态栈就可以用到&#…

STL-list

1.list概述 List 并非 vector 与 string 那样连续的内存空间&#xff0c;list 每次插入或删除一个元素&#xff0c;都会新配置或释放一个元素的空间&#xff0c;所以list对于空间的使用很充分&#xff0c;一点也没有浪费&#xff0c;对于任意位置的插入或删除元素&#xff0c;时…

导入Maven项目

目录 5. 5.1 导入方法1 5.2 导入方法2 5.1 导入方法1 建议选择pom.xml文件导入 导入成功 5.2 导入方法2 导入成功

【含文档+PPT+源码】基于微信小程序的社区便民防诈宣传系统设计与实现

项目介绍 本课程演示的是一款基于微信小程序的社区便民防诈宣传系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…

【Unity笔记】Unity WASD+QE 控制角色移动与转向(含 Shift 加速)实现教程

摘要&#xff1a; 在 Unity 游戏开发中&#xff0c;键盘控制角色的移动与转向是基础功能之一。本文详细讲解如何使用 C# 实现基于 WASD 移动、QE 转向 与 Shift 加速奔跑 的角色控制器&#xff0c;适用于第一人称、第三人称、自由漫游等场景。通过直观的 Transform 控制方法与可…

通讯方式学习——单总线协议(2024.04.09)

参考链接1: 单总线器件DS18B20测温程序该怎么编写&#xff1f;这个视进行了详细讲解&#xff01; 在此感谢各位前辈大佬的总结&#xff0c;写这个只是为了记录学习大佬资料的过程&#xff0c;内容基本都是搬运的大佬博客&#xff0c;觉着有用自己搞过来自己记一下&#xff0c;如…

大语言模型(LLM)入门 - (1) 相关概念

文章来自&#xff1a;大语言模型(LLM)小白入门自学项目-TiaoYu-1 GitHub - tiaoyu1122/TiaoYu-1: For People! For Freedom!For People! For Freedom! Contribute to tiaoyu1122/TiaoYu-1 development by creating an account on GitHub.https://github.com/tiaoyu1122/TiaoYu…

[9-3] 串口发送串口发送+接收 江协科技学习笔记(26个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26中断

【Linux系列】Linux/Unix 系统中的 CPU 使用率

博客目录 多核处理器时代的 CPU 使用率计算为什么要这样设计&#xff1f; 解读实际案例&#xff1a;268.76%的 CPU 使用率性能分析的意义 相关工具与监控实践1. top 命令2. htop 命令3. mpstat 命令4. sar 命令 实际应用场景容量规划性能调优故障诊断 深入理解&#xff1a;CPU …