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

引言

在嵌入式系统中,通信总线是连接 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.pswp.cn/bicheng/83126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于开源AI大模型AI智能名片S2B2C商城小程序源码的销售环节数字化实现路径研究

摘要&#xff1a;在数字化浪潮下&#xff0c;企业销售环节的转型升级已成为提升竞争力的核心命题。本文基于清华大学全球产业研究院《中国企业数字化转型研究报告&#xff08;2020&#xff09;》提出的“提升销售率与利润率、打通客户数据、强化营销协同、构建全景用户画像、助…

Linux浅谈

Linux浅谈 一、什么是 Linux&#xff1f;先抛开 “内核”&#xff0c;看整体 可以把 Linux 系统 想象成一台 “组装电脑”&#xff1a; 最核心的零件是 “主板”—— 这就是 Linux 内核&#xff08;Kernel&#xff09;&#xff0c;负责管理电脑里的所有硬件&#xff08;比如 …

PostgreSQL ERROR: out of shared memory处理

使用pg_dump命令导出一个库的时候&#xff0c;报 pg_dump: error: query failed: ERROR: out of shared memory HINT: You might need to increase "max_locks_per_transaction". 从错误字面上看是超出内存大小了&#xff0c;建议增加max_locks_per_transaction参…

IoT/基于NB28-A/BC28-CNV通信模组使用AT指令连接华为云IoTDA平台(HCIP-IoT实验2)

文章目录 概述检查通信环境通信模组固件信号强度CGATT指令参数 / 啥是PS域&#xff1f;PS附着状态&#xff1a;ATCGATTPLMN 选择&#xff1a;ATCOPSCEREG指令参数 / 啥是EPS与EPC?CEREG指令参数 / 啥是URC?网络注册状态&#xff1a;ATCEREG网络附着和网络注册 AT指令接入IoTD…

红外遥控(外部中断)

目录 1.红外遥控简介 通信方式&#xff1a; 红外LED波长&#xff1a; 通信协议标准&#xff1a; 2.硬件电路 发送部分1&#xff1a; 内部元件介绍&#xff1a; 工作原理&#xff1a; 为什么要以38KHZ亮灭&#xff1f; 电路图&#xff1a; 发送部分2&#xff1a; 电…

【C#】一个简单的http服务器项目开发过程详解

这跟安装NoteJs程序运行脚本文件搭建一个简单Http服务器一样&#xff0c;相比起来&#xff0c;它的优点是可以开发的应用是免安装&#xff0c;跨平台的&#xff0c;放在移动盘上便捷的&#xff0c;这里着重讲http服务器实现的过程&#xff0c;以便自主实现特定的功能和服务。 …

WPF【11_4】WPF实战-重构与美化(MVVM 架构)

11-9 【理论】MVVM 架构 在 WPF 项目中&#xff0c;我们主要采用的是一种类似 MVC 的架构&#xff0c;叫做 MVVM。 MVVM 继承了 MVC 的理念&#xff0c;是 Model-View-ViewModel 的缩写&#xff0c;中文意思是模型、视图、视图模型。这三个词分开看我们都能看懂&#xff0c;不…

使用PowerBI个人网关定时刷新数据

使用PowerBI个人网关定时刷新数据 PowerBI desktop连接mysql&#xff0c;可以设置定时刷新数据或在PowerBI服务中手动刷新数据,步骤如下&#xff1a; 第一步&#xff1a; 下载网关。以个人网关为例&#xff0c;如图 第二步&#xff1a; 双击网关&#xff0c;点击下一步&…

深度学习驱动的超高清图修复技术——综述

Deep Learning-Driven Ultra-High-Definition Image Restoration: A Survey Liyan Wang, Weixiang Zhou, Cong Wang, Kin-Man Lam, Zhixun Su, Jinshan Pan Abstract Ultra-high-definition (UHD) image restoration​​ aims to specifically solve the problem of ​​quali…

3 分钟学会使用 Puppeteer 将 HTML 转 PDF

需求背景 1、网页存档与文档管理 需要将网页内容长期保存或归档为PDF,确保内容不被篡改或丢失,适用于法律文档、合同、技术文档等场景。PDF格式便于存储和检索。 2、电子报告生成 动态生成的HTML内容(如数据分析报告、仪表盘)需导出为PDF供下载或打印。PDF保留排版和样…

电子邮箱设置SSL:构建邮件传输的加密护城河

在数字化通信高度依赖的今天&#xff0c;电子邮件作为企业协作与个人隐私的核心载体&#xff0c;其安全性直接关系到数据主权与商业利益。SSL&#xff08;Secure Sockets Layer&#xff09;作为网络通信加密的基石技术&#xff0c;通过为邮件传输建立加密隧道&#xff0c;有效抵…

Qt -使用OpenCV得到SDF

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【暂无】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 目录 cv::MatdistanceTransform获得SDF 本文的目标&#xff0c; 是简单学习并使用OpenCV的相关函数&#xff0c; 并获得QImage的SDF(Signed Distance Field 有向距离场) 至…

Compose仿微信底部导航栏NavigationBar :底部导航控制滑动并移动

文章目录 1、准备工作1.1 参考1.2 依赖添加&#xff1a;1.3 主要控件NavigationBarHorizontalPager、VerticalPager 2、功能描述&#xff1a;3、实现过程3.1 创建一个数据类3.2 创建一个list变量3.3 具体实现3.3.1 创建共享的Pager状态3.3.2 将页面索引与页面标题同步3.3.3 创建…

WindowServer2022下docker方式安装dify步骤

WindowServer2022下docker方式安装dify步骤&#xff08;稳定后考虑部署至linux中&#xff09; 教程&#xff1a;https://blog.csdn.net/qq_49035156/article/details/143264534 0、资源要求 ---windows&#xff1a;8核CPU、16G内存、200G500G存储 ---10.21.31.122/administra…

【数据治理】要点整理-信息技术数据质量评价指标-GB/T36344-2018

导读&#xff1a;指标为数据质量评估提供了一套系统化、标准化的框架&#xff0c;涵盖规范性、完整性、准确性、一致性、时效性、可访问性六大核心指标&#xff0c;助力组织提升数据处理效率、支持决策制定及业务流程优化&#xff0c;确保数据在数据生存周期各阶段的质量可控。…

前端实现图片压缩:基于 HTML5 File API 与 Canvas 的完整方案

在 Web 开发中,处理用户上传的图片时,前端压缩可以有效减少服务器压力并提升上传效率。本文将详细讲解如何通过<input type="file">实现图片上传,结合 Canvas 实现图片压缩,并实时展示压缩前后的图片预览和文件大小对比。 一、核心功能架构 我们将实现以…

通信算法之280:无人机侦测模块知识框架思维导图

1. 无人机侦测模块知识框架思维导图, 见文末章节。 2. OFDM参数估计,基于循环自相关特性。 3. 无人机其它参数估计

单片机寄存器的四种主要类型!

1. 控制寄存器&#xff08;Control Registers&#xff09;​​ ​​专业定义​​&#xff1a;用于配置硬件行为或触发操作的寄存器。 ​​大白话​​&#xff1a; 相当于设备的​​“控制面板”​​&#xff0c;通过写入特定值来​​开关功能​​或​​调整参数​​。例如&am…

第100+41步 ChatGPT学习:R语言实现误判病例分析

本期是《第33步 机器学习分类实战&#xff1a;误判病例分析》的R版本。 尝试使用Deepseek-R1来试试写代码&#xff0c;效果还不错。 下面上R语言代码&#xff0c;以Xgboost为例&#xff1a; # 加载必要的库 library(caret) library(pROC) library(ggplot2) library(xgboost)…

HTML Day04

Day04 0.引言1. HTML字符实体2. HTML表单2.1 表单标签2.2 表单示例 3. HTML框架4. HTML颜色4.1 16进制表示法4.2 rgba表示法4.3 名称表达法 5. HTML脚本 0.引言 刚刚回顾了前面几篇博客&#xff0c;感觉写的内容倒是很详细&#xff0c;每个知识点都做了说明。但是感觉在知识组织…