《嵌入式硬件(四):溫度傳感器DS1820》

一、DS1820的引腳

DS1820單總線數字溫度計:異步串行半雙工

特性:

? ? ? ? 1)獨特的單線接口,只需 1 個接口引腳即可通信

? ? ? ? 2)多點(multidrop)能力使分布式溫度檢測應用得以簡化

? ? ? ? 3)不需要外部元件

? ? ? ? 4)可用數據線供電

? ? ? ? 5)不需備份電源

? ? ? ? 6)測量范圍從 - 55℃至 + 125℃,增量值為 0.5℃。等效的華氏溫度范圍是 - 67°F 至 257°F,增量值為 0.9°F

? ? ? ? 7)以 9 位數字值方式讀出溫度

? ? ? ? 8)在 1 秒(典型值)內把溫度變換為數字

? ? ? ? 9)用戶可定義的,非易失性的溫度告警設置

? ? ? ? 10)告警搜索命令識別和尋址溫度在編定的極限之外的器件(溫度告警情況)

應用范圍包括恒溫控制,工業系統,消費類產品,溫度計或任何熱敏系統

51單片機和DS1820是線與關系,數據接受方需要釋放總線->電平的高低由對方決定

上拉電阻通常在4.7k~10k,雙方在釋放總線時,保證線是高電平

二、ROM操作命令??

  • Read ROM (讀 ROM) [33h]:允許總線主機讀 DS1820 的 8 位產品系列編碼、唯一的 48 位序列號,以及 8 位的 CRC。僅能在總線上僅有一個 DS1820 時使用;若存在多個從屬器件,所有從片同時發送會發生數據沖突(漏極開路產生 “線與” 結果)。

  • Match ROM (“符合” ROM) [55h]:命令后緊跟 64 位 ROM 數據序列,允許總線主機對多點總線上特定的 DS1820 尋址。只有與 64 位 ROM 序列嚴格相符的 DS1820,才會對后繼存貯器操作命令響應;不符的從片會等待復位脈沖。總線上有單個或多個器件時都可使用。

  • Skip ROM (“跳過” ROM) [0Ch]:在單點總線系統中,允許總線主機不提供 64 位 ROM 編碼就訪問存儲器操作,以此節省時間。若總線上有多個從屬器件,且在該命令后發讀命令,多個從片同時發數據會引發總線數據沖突(漏極開路下拉產生 “線與” 效果)。

  • Search ROM (搜索 ROM) [F0h]:系統剛工作時,總線主機可能不清楚單線總線上的器件個數或 64 位 ROM 編碼。此命令允許主機用 “消去”(elimination) 處理,識別總線上所有從片的 64 位 ROM 編碼。

  • Alarm Search (告警搜索) [ECh]:流程與 “搜索 ROM” 命令相同,但僅當 DS1820 最近一次溫度測量出現告警(溫度高于 TH 或低于 TL)時,才會對此命令響應。DS1820 上電后,告警條件會保持,直到溫度測量顯示非告警值,或修改 TH/TL 設置使測量值回到允許范圍;EEPROM 內的觸發器值用于告警。

三、DS1820的寄存器

  • 讀暫存存儲器(Read Scratchpad)[BEh]:讀取暫存存儲器內容,從字節 0 開始,直到字節 8(CRC);若并非所有位置都可讀,主機可隨時發復位中止讀操作。
  • 復制暫存存儲器(Copy Scratchpad)[48h]:將暫存存儲器內容復制到 DS1820 的 E2 存儲器,把溫度觸發器字節存入非易失性存儲器;若總線主機發此命令后讀時間片,DS1820 在復制時總線輸出 “0”,完成后輸出 “1”;若為寄生電源供電,主機發命令后需立即強制上拉至少 10ms。
  • 溫度變換(Convert T)[44h]:啟動溫度變換,無需額外數據;若總線主機發此命令后讀時間片,DS1820 變換時總線輸出 “0”,完成后輸出 “1”;若為寄生電源供電,主機發命令后需立即強制上拉至少 2 秒。
  • 重新調出 E2(Recall E2)[B8h]:把 E2 中溫度觸發器的值調回暫存存儲器(器件上電時也會自動執行該操作,所以上電后暫存存儲器就有有效數據);發此命令后,第一個讀數據時間片,器件輸出 “0” 表示 “忙”,“1” 表示 “準備就緒”。
  • 讀電源(Read Power Supply)[B4h]:發此命令后,第一個讀出數據的時間片,器件會給出電源方式信號:“0” 表示寄生電源供電,“1” 表示外部電源供電。

四、DS1820的時序圖

1.初始化(檢測芯片是否能用)

方法:先給51單片機低電平,如果可以檢測到一個低電平,一個高電平,芯片就是好的

#include <reg52.h>
#include <intrins.h>#define DS18B20_SET		(P3 |= (1 << 7))   //拉高
#define DS18B20_CLEAR 	(P3 &= ~(1 << 7))  //拉低
#define DS18B20_TST	 	((P3 & (1 << 7)) != 0)	//判斷 高電平void Delay10us(unsigned int n)	//@12.000MHz
{unsigned char data i;_nop_();_nop_();_nop_();i = 2 * n;while (--i){_nop_();}
}int reset_ds18b20(void)
{int t = 0;DS18B20_CLEAR;Delay10us(50);DS18B20_SET;Delay10us(2);while(DS18B20_TST && t < 25){Delay10us(1);++t;}if(t >= 25){return 0;}t = 0;while(!DS18B20_TST && t < 20){Delay10us(1);++t;}if(t >= 20){return 0;}return 1;
}int main(void)
{int t = reset_ds18b20();if(1 == t){P2 = 0;}else{P2 = 0xFF;}while(1){}return 0;
}

溫度讀取

main.c

#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <string.h>
#include "uart.h"
#include "delay.h"
#include "ds18b20.h"int main(void)
{	xdata char s[24];init_uart();while(1){float f;f = get_temperatuer();sprintf(s, "%f", f);send_buffer(s, strlen(s));}return 0;
}

delay.c

#include "delay.h"
#include <intrins.h>
void delay(unsigned int n)//0~65526
{while(n--);
}void Delay10us(unsigned int n)	//@12.000MHz
{unsigned char data i;_nop_();_nop_();_nop_();i = 2 * n;while (--i){_nop_();}
}void delay_1ms(unsigned int n)
{while(n--){Delay10us(100);}
}

ds18b20.c

 #include <reg52.h>
#include <intrins.h>
#include "delay.h"
#include "ds18b20.h"static int reset_ds18b20(void)
{int t;DS18B20_CLEAR;Delay10us(70);DS18B20_SET;Delay10us(4);t = 0;while(DS18B20_TST && t < 30){Delay10us(1);++t;}if(t >= 30){return 0;}t = 0;while(!DS18B20_TST && t < 30){Delay10us(1);++t;}if(t >= 30){return 0;}return 1;
}void ds18b20_write(unsigned char n)	//0x01010 110 & 0000 0001
{int i;for(i = 0;i < 8;++i){if(n & 0x01) // 1{DS18B20_CLEAR;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();DS18B20_SET;Delay10us(5);				}else{DS18B20_CLEAR;Delay10us(6);DS18B20_SET;}n >>= 1;	}
}unsigned char ds18b20_read(void)
{unsigned char ret = 0;int i;for(i = 0;i < 8;++i){DS18B20_CLEAR;_nop_();_nop_();DS18B20_SET;_nop_();_nop_();_nop_();_nop_();if(DS18B20_TST){ret |= 1 << i;	}Delay10us(5);							}return ret;
}float get_temperatuer(void)
{unsigned char tl, th;short t;reset_ds18b20();ds18b20_write(0xCC);ds18b20_write(0x44);delay_1ms(750);reset_ds18b20();ds18b20_write(0xCC);ds18b20_write(0xBE);tl = ds18b20_read();th = ds18b20_read();t = tl;t |= th << 8;return t * 0.0625;
}

uart.c

#include "uart.h"
#include <reg52.h>xdata char rcv_buffer[64] = {0};
int pos = 0;void init_uart(void)
{unsigned char t;t = SCON;t &= ~(3 << 6);t |= (1 << 6) | (1 << 4);SCON = t;PCON |= (1 << 7);IE |= (1 << 7) | (1 << 4);t = TMOD;t &= ~(3 << 4);t |= (2 << 4);t &= ~(3 << 6);TMOD = t;TH1 = 204; //12MHzTL1 = 204;TCON |= (1 << 6);
}void uart_handler(void) interrupt 4
{if((SCON & (1 << 0)) != 0){rcv_buffer[pos++] = SBUF;SCON &= ~(1 << 0);}
}void send_char(char ch)
{SBUF = ch;while((SCON & (1 << 1)) == 0);SCON &= ~(1 << 1);
}void send_buffer(const char *p, int len)
{while(len--){send_char(*p++);}	
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/922032.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922032.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922032.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

langchain 輸出解析器 Output Parser

示例中使用的公共代碼&#xff1a; from langchain_deepseek import ChatDeepSeek chat ChatDeepSeek(model"deepseek-chat",temperature0,api_keyAPI_KEY, )使用方法&#xff1a; 引入解析器實例化解析器調用解析器的get_format_instructions()獲得提示詞&#xff…

LeetCode算法日記 - Day 37: 驗證棧序列、N叉樹的層序遍歷

目錄 1. 驗證棧序列 1.1 題目解析 1.2 解法 1.3 代碼實現 2. N叉樹的層序遍歷 2.1 題目解析 2.2 解法 2.3 代碼實現 1. 驗證棧序列 https://leetcode.cn/problems/validate-stack-sequences/description/ 給定 pushed 和 popped 兩個序列&#xff0c;每個序列中的 值…

金融數據庫--3Baostock

一、 Baostock 是什么&#xff1f;Baostock&#xff08;寶碩股票&#xff09;是一個免費、開源的證券數據平臺&#xff08;SDK&#xff09;&#xff0c;旨在為金融量化投資者、研究人員和學生提供穩定、準確、易用的A股歷史數據和相關金融數據。其核心是一個 Python 庫&#xf…

微信小程序-1-微信開發者工具環境搭建和初始化創建項目

文章目錄1 小程序概述1.1 什么是微信小程序1.2 大前端概念1.3 賬號注冊1.4 開發流程1.5 小程序成員2 創建項目2.1 創建項目流程2.2 創建項目2.3 本地開發支持http3 項目目錄3.1 項目目錄結構3.2 配置文件3.2.1 app.json(全局配置)3.2.2 xxx.json(頁面配置)3.2.3 project.config…

Go語言開發AI應用

為什么選擇Go語言開發AI應用在人工智能快速發展的今天&#xff0c;選擇合適的編程語言對于AI應用的成功至關重要。雖然Python長期以來被認為是AI開發的首選語言&#xff0c;但Go語言正在逐漸嶄露頭角&#xff0c;成為AI應用開發的有力競爭者。Go語言的核心優勢1. 卓越的性能表現…

10. 游戲開發中的TCP與UDP

1.TCP和UDP 2.TCP為什么慢于UDP 3.可靠UDP1.TCP和UDP 1).通過打電話的方式說明TCP和UDPa.TCP(傳輸控制協議), 就像打電話- 需要先撥號, 接通, 問候(建立連接)- 你一句, 我一句, 對方沒有聽清會要求你重復(確認與重傳)- 保證對話有條不紊, 內容準確無誤(可靠, 有序)- 如果信號不…

CMap常用函數

CMap 是 MFC 中用于存儲鍵值對&#xff08;key-value&#xff09;的關聯容器類&#xff0c;類似于 C 標準庫中的 std::map&#xff0c;但依賴 MFC 框架實現。它采用哈希表&#xff08;Hash Table&#xff09;作為底層數據結構&#xff0c;支持高效的鍵值查找、插入和刪除操作。…

Rocky9.0去堆疊雙發arp(支持“ARP 廣播雙發”)

摘要 在去堆疊/MLAG 場景下&#xff0c;默認 bonding 只會以單口回復 ARP&#xff0c;另一臺交換機收不到 ARP Reply。本文在 Linux bonding 驅動中增加參數 arp_broadcast_mode&#xff0c;當開啟時對 ARP 包臨時切換到 廣播模式&#xff0c;實現雙口同時發 ARP Reply。文內提…

網頁連接攝像頭

攝像機處理 <!-- camera_solve.html --> <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

FPGA雷達信號處理之:自適應門限閾值

一、原理 參考這個博主&#xff0c;講的很仔細&#xff1a;基于脈沖功率的雷達脈沖參數檢測原理詳解 二、FPGA實現 使用system generator搭建算法模型如下&#xff1a; 在這里&#xff0c;濾波器窗長度為8&#xff0c;原博主設置為50效果更好&#xff0c;門限公式如下&#xf…

Vue 中實現選中文本彈出彈窗的完整指南

在現代 Web 應用中&#xff0c;選中文本后顯示相關操作或信息是一種常見的交互模式。本文將詳細介紹如何在 Vue 中實現選中文本后彈出彈窗的功能&#xff0c;包括其工作原理、多種實現方式以及實際項目中的應用示例。 一、實現原理 1. 文本選中檢測機制 瀏覽器提供了 Select…

第4節-排序和限制-FETCH

摘要: 在本教程中&#xff0c;你將學習如何使用 PostgreSQL 的 FETCH 子句從查詢中檢索部分行。 PostgreSQL FETCH 簡介 在 PostgreSQL 中&#xff0c;OFFSET 子句的作用類似于 LIMIT 子句。FETCH 子句允許你限制查詢返回的行數。 LIMIT 子句并非 SQL 標準的一部分。不過&#…

洛谷 P2680 [NOIP 2015 提高組] 運輸計劃(二分答案 + 樹上差分)

題目鏈接題目概括與評價 很經典&#xff0c;突破口藏的很深&#xff0c;求最小值這里&#xff0c;是問題切入點&#xff0c;想到用二分答案&#xff0c;然后思考怎么寫 f_check 函數。二分答案樹上差分。代碼 #include <iostream> #include <vector> #include <…

接力鄧承浩,姜海榮能講好深藍汽車新故事嗎?

出品 | 何璽排版 | 葉媛深藍汽車迎來新話事人。9月5日&#xff0c;新央企長安汽車旗下品牌深藍汽車傳出新的人事調整。多家業內媒體報道稱&#xff0c;榮耀前中國區CMO姜海榮已正式加入長安汽車&#xff0c;并出任旗下深藍汽車CEO一職。原CEO鄧承浩則升任深藍汽車董事長&#x…

esp32-c3寫一個收集附近 WiFi 和藍牙信號通過

下面給你一個基于 ESP-IDF(v5.x) 的完整示例&#xff1a;在 ESP32-C3 上同時掃描附近 Wi-Fi 與藍牙&#xff08;BLE&#xff09;廣播&#xff0c;把結果以 JSON 結構統一輸出到串口&#xff0c;并且可可選通過 MQTT 上報到服務器&#xff08;打開一個宏即可&#xff09;。日志默…

文心大模型 X1.1:百度交出的“新深度思考”答卷

文心大模型 X1.1&#xff1a;百度交出的“新深度思考”答卷 2025年9月9日&#xff0c;WAVE SUMMIT 2025深度學習開發者大會在北京正式召開&#xff0c;由深度學習技術及應用國家工程研究中心主辦&#xff0c;百度飛槳與文心大模型聯合承辦。大會上&#xff0c;百度正式發布了基…

開始 ComfyUI 的 AI 繪圖之旅-Flux.1圖生圖(八)

文章標題一、Flux Kontext Dev1.關于 FLUX.1 Kontext Dev1.1 版本說明1.2 工作流說明1.3 模型下載2.Flux.1 Kontext Dev 工作流2.1 工作流及輸入圖片下載2.2 按步驟完成工作流的運行3.Flux Kontext 提示詞技巧3.1 基礎修改3.2 風格轉換3.3 角色一致性3.4 文本編輯4.常見問題解決…

Java 生成微信小程序二維碼

1. java 二維碼生成工具類import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.pdatao.api.controller.file.FileController; import com.pdatao.api.error.CommunityException; import org.apache.commons.io.IOUtils; import org.springframe…

智慧健康觸手可及:AI健康小屋——未來健康管理的全能守護者

AI健康小屋&#xff0c;這座融合人工智能、物聯網與醫療科技的“健康堡壘”&#xff0c;正悄然重構健康管理生態。它以科技為引擎&#xff0c;將專業醫療資源下沉至社區、企業、家庭&#xff0c;通過智能檢測、精準分析、個性化干預&#xff0c;實現從疾病治療到主動預防的健康…

[工作表控件19] 驗證規則實戰:如何用正則表達式規范業務輸入?

在企業應用中,數據準確性至關重要。工作表控件通過“驗證規則”能力,支持在文本字段和附件字段中使用正則表達式(RegEx)進行格式校驗。它能幫助開發者輕松實現郵箱、身份證號、車牌號、URL 等格式的高效驗證,大幅提升數據質量與表單使用體驗。 一、官方功能介紹與基礎能力…