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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83126.shtml
英文地址,請注明出處:http://en.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;每個知識點都做了說明。但是感覺在知識組織…