【51單片機】程序實驗15.DS18B20溫度傳感器

主要參考學習資料:B站【普中官方】51單片機手把手教學視頻

開發資料下載鏈接:http://www.prechin.cn/gongsixinwen/208.html

單片機套裝:普中STC51單片機開發板A4標準版套餐7

目錄

  • DS18B20介紹
    • 主要特性
    • 內部結構
    • 控制時序
      • 初始化時序
      • 寫時序
      • 讀時序
  • 硬件設計
  • 實驗15 DS18B20溫度傳感器
    • DS18B20驅動
    • 數碼管驅動
    • 主函數

DS18B20介紹

主要特性

DS18B20是達拉斯半導體公司推出的單總線接口的傳感器,與傳統的熱敏電阻測溫元件相比,它是一種新型的體積小、工作范圍寬、與微處理器接口簡單的數字化溫度傳感器,具體特點如下:

①工作電壓范圍為3.0V~5.5V,除了依靠電源管腳供電,也可采用寄生電源方式(DQ數據線管腳供電)。

②采用單線接口方式,與微處理器只需要一根線即可實現數據通信。

③支持多點組網功能,多個DS18B20可以同時并聯在單總線上。

④不需要外圍元器件,所有傳感器和轉換電路都集成在DS18B20中。

⑤工作溫度范圍為-55℃~125℃,在-10℃~85℃的精度為±0.5℃。

⑥分辨率(測量數據的細微程度)設置范圍為912bit,即0.50.0625,分辨率越高,最大轉換時間越慢。DS18B20默認分辨率為12bit,最大轉換時間750ms。

⑦測量結果直接以數字通過DQ串行輸出給CPU,同時可傳輸CRC校驗碼,具有較強的抗干擾能力。

⑧具有負壓特性,GND和VDD反接時DS18B20不會因發熱而燒毀,但不能正常工作。

內部結構

ROM:刻有64位序列號,可以看作是地址序列號,含有8位產品類型標號(28H)、48位DS18B20自身序列號和8位針對前56位的CRC校驗碼。每個DS18B20的序列號都不相同,以便實現單總線的多點組網。

高速緩存存儲器:包括一個高速暫存器RAM和一個EEPROM,后者存放高/低溫觸發器TH、TL和結構寄存器。

高速暫存存儲器:由9個字節組成:

寄存器內容字節地址
溫度值低位LS Byte0
溫度值高位MS Byte1
高溫限值TH2
低溫限值TL3
配置寄存器4
保留5
保留6
保留7
CRC校驗值8

當溫度轉換命令44H發布后,經轉換所得溫度值以二進制補碼形式存放在存儲器MS和LS中,MS的高5位為符號位,若溫度非負,則符號位均為0,將測得的數值乘以分辨率即為實際溫度;溫度為負時,符號位均為1,測得的數值需先取反后加一再乘以分辨率。

配置寄存器:高3位依次為TM、R1、R0,低5位均為1。TM為測試模式位,用于設置DS18B20在工作模式還是測試模式,在出廠時已被設置為1(工作模式),不宜改動。R1和R0用于設置分辨率,默認均為1,如下表所示:

R1R0精度最大轉換時間
009bit93.75ms
0110bit187.5ms
1011bit375ms
1112bit750ms

控制時序

單總線器件需要嚴格的信號時序來保證數據的完整性,DS18B20的時序包括初始化時序、寫時序、讀時序。DS18B20發送命令和數據的字節均是低位在前。

初始化時序

單總線的所有通信均以初始化時序開始。①主機將總線先置高后拉低,保持480960μs。②主機釋放總線,電阻上拉,等待DS18B20在1560μs后響應。③DS18B20拉低總線,保持60~240μs。④主機讀取到低電平后繼續延時,延時時間從釋放總線算起至少480μs。

寫時序

寫時序包括寫0和寫1,所有寫時序的過程至少需要60μs,且兩次獨立的寫時序之間至少需要1μs的恢復時間。寫時序均起始于主機拉低總線,若寫0則延時60μs后拉高總線并繼續延時2μs;若寫1則延時大概2μs后拉高總線并繼續延時60μs。

讀時序

單總線器件僅在主機發出讀時序后才向主機發送數據,所以在主機發出讀取命令之后必須馬上產生讀時序。讀時序的過程也至少需要60μs,兩次獨立的讀時序之間至少需要1μs的恢復時間。讀時序均由主機產生至少1μs的低電平發起,隨后釋放總線,并在其后的15μs之間采集總線狀態,低電平則讀0,高電平則讀1。

DS18B20典型的溫度讀取過程:復位(初始化時序)→發動SKIP ROM命令(0XCC)→發送開始轉換命令(0X44)→延時→復位→發送SKIP ROM命令(0XCC)→發送讀存儲器命令(0XBE)→連續讀出兩個字節的溫度數據→結束。

硬件設計

本實驗板載DS18B20傳感器的數據總線綁定到P3.7IO口管腳。

實驗15 DS18B20溫度傳感器

實現功能:插上DS18B20溫度傳感器,數碼管顯示檢測的溫度值。

DS18B20驅動

按照實驗14中的多文件工程框架,在App>ds18b20中創建:

ds18b20.h

#ifndef _DS18B20_H
#define _DS18B20_H#include "public.h"//定義IO管腳
sbit DS18B20_PORT = P3^7;//聲明主函數需要的源文件函數
u8 ds18b20_init(void);
float ds18b20_read_temperature(void);#endif

ds18b20.c

#include "ds18b20.h"
//通過intrins.h調用延時2μs需要用到的nop函數
#include "intrins.h"//復位函數
void ds18b20_reset(void)
{DS18B20_PORT = 0;delay_10us(75);DS18B20_PORT = 1;delay_10us(2);
}/*
檢測DS18B20函數是否存在
若一直為高電平或低電平則不存在,返回1,否則返回0
*/
u8 ds18b20_check(void)
{//計時器變量u8 time_temp = 0;//檢測低電平while(DS18B20_PORT && time_temp<20){time_temp++;delay_10us(1);}//若等待超時則返回1,否則重置計時器if(time_temp >= 20)return 1;else time_temp = 0;//檢測高電平while((!DS18B20_PORT) && (time_temp<20)){time_temp++;delay_10us(1);}//若等待超時則返回1,否則返回0if(time_temp >= 20)return 1;return 0;
}//初始化同時檢測存在
u8 ds18b20_init(void)
{ds18b20_reset();return ds18b20_check();
}//寫字節函數
void ds18b20_write_byte(u8 dat)
{//8位輸入循環控制變量u8 i = 0;//存儲準備輸入的位的變量u8 temp = 0;//從低到高按位輸入for(i=0;i<8;i++){//和00000001進行與運算提取最低位temp = dat & 0X01;//字節右移將次低位移到最低位dat >>= 1;//根據temp寫1或寫0if(temp){//拉低總線DS18B20_PORT = 0;//延時2μs,nop函數延時1個機器周期,12MHz下即為1μs_nop_();_nop_();//寫入1DS18B20_PORT = 1;//延時60μsdelay_10us(6);}else{//拉低總線寫入0DS18B20_PORT = 0;//延時60μsdelay_10us(6);//釋放總線DS18B20_PORT = 1;//延時2μs_nop_();_nop_();}}
}//讀取一個位
u8 ds18b20_read_bit(void)
{//存儲讀取數據的變量u8 dat = 0;//拉低總線DS18B20_PORT = 0;//延時2μs_nop_();_nop_();//釋放總線后讀取DS18B20_PORT = 1;if(DS18B20_PORT)dat = 1;else dat = 0;delay_10us(5);return dat;
}//讀取一字節
u8 ds18b20_read_byte(void)
{//8位讀取循環控制變量u8 i = 0;//存儲讀取到的每一位的變量u8 temp = 0;//將每一位存儲進字節的變量u8 dat = 0;//從低到高按位讀取for(i=0;i<8;i++){//讀取一位temp = ds18b20_read_bit();//字節右移一位并將新位存儲到最高位dat >>= 1;//或運算防止其他位被擦除dat |= temp << 7;}return dat;
}//溫度讀取函數
float ds18b20_read_temperature(void)
{//存儲高八位數值u8 dath = 0;//存儲低八位數值u8 datl = 0;//存儲完整十六位數值u16 value = 0;//存儲轉換得到的實際溫度float temp = 0;//參照讀時序介紹中的溫度讀取過程ds18b20_reset();ds18b20_check();ds18b20_write_byte(0XCC);ds18b20_write_byte(0X44);ds18b20_reset();ds18b20_check();ds18b20_write_byte(0XCC);ds18b20_write_byte(0XBE);//先讀低八位,后讀高八位datl = ds18b20_read_byte();dath = ds18b20_read_byte();//高八位移到十六位中的高八位再與低八位結合得到完整的十六位數值value = (dath << 8) + datl;//和1111100000000000與運算檢測符號位if((value&&0XF800) == 0XF800){//符號位均為1則取反加一得到正值value = (~value) + 1;//計算實際溫度temp = value * (-0.0625);}else temp = value * 0.0625;return temp;
}

數碼管驅動

數碼管驅動延用實驗14,但為了數碼管顯示更加自定義,可以顯示負號、小數點等符號,段碼值轉換功能將移到函數外部來完成,即參數dat直接傳入段碼值,以下是smg.c修改后的程序:

#include "smg.h"u8 gseg_code[16] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};void seg_display(u8 dat[], u8 pos)
{u8 i = 0;u8 pos_temp = pos - 1;for(i = pos_temp;i < 8;i++){switch(i){case 0: LSC = 1;LSB = 1;LSA = 1;break;case 1: LSC = 1;LSB = 1;LSA = 0;break;case 2: LSC = 1;LSB = 0;LSA = 1;break;case 3: LSC = 1;LSB = 0;LSA = 0;break;case 4: LSC = 0;LSB = 1;LSA = 1;break;case 5: LSC = 0;LSB = 1;LSA = 0;break;case 6: LSC = 0;LSB = 0;LSA = 1;break;case 7: LSC = 0;LSB = 0;LSA = 0;break;}//此處刪去gesg_code[]SEG_A_DP_PORT = dat[i-pos_temp];delay_10us(100);SEG_A_DP_PORT = 0x00;}
}

主函數

#include "public.h"
#include "smg.h"
#include "ds18b20.h"void main()
{//讀取溫度間隔的延時控制變量u8 i = 0;//本實驗對溫度保留一位小數處理,方法為先乘十后提取整數部分,在數碼管上添加小數點顯示int temp_value = 0;//存儲每一位供數碼管顯示的段碼值,溫度測量結果最高占用5位數碼管u8 temp_buf[5];//初始化ds18b20_init();while(1){//計時器累加i++;//計時器延時50ms后讀取,可自行調整if(i%50 == 0)temp_value = ds18b20_read_temperature() * 10;//判斷溫度正負if(temp_value < 0){//若溫度為負,將溫度轉為正以便拆解數位,并使第一個數碼管顯示負號temp_value = -temp_value;temp_buf[0] = 0X40;}else//若溫度為正,第一個數碼管不顯示temp_buf[0] = 0X00;//將溫度拆解數位并轉換為段碼值依次存儲temp_buf[1] = gseg_code[temp_value / 1000];temp_buf[2] = gseg_code[temp_value % 1000 / 100];temp_buf[3] = gseg_code[temp_value % 100 / 10] | 0X80;temp_buf[4] = gseg_code[temp_value % 10];//將溫度顯示在數碼管后5位上seg_display(temp_buf, 4);}
}

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

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

相關文章

ESP32芯片模組方案,設備物聯網無線通信,WiFi藍牙交互控制應用

在當下&#xff0c;物聯網正以前所未有的速度席卷全球&#xff0c;從繁華都市的智能建筑&#xff0c;到寧靜鄉村的智慧農業&#xff0c;從人們日常使用的可穿戴設備&#xff0c;到工業領域復雜精密的自動化生產線&#xff0c;物聯網的觸角已深入到生活與生產的每一個角落。 而…

Linux第二次練習

1.首先在根下面創建一個名為text的目錄 2.在根目錄下新建一個text目錄&#xff0c;然后在text目錄中新建上圖的一級目錄、二級目錄以及三級目錄 3.顯示/text目錄下文件的樹形拓撲圖 4.將linux樹狀結構圖中列出的所有文件用ll命令列出來

百雞問題-

百雞問題 #include<stdio.h> int main(){int n;scanf("%d",&n);int x,y,z;for(x0;x<100;x){for(y0;y<100;y){for(z0;z<100;z){if((x*15y*9z)<(3*n) && ((xyz)100)){printf("x%d,y%d,z%d\n",x,y,z);}}}}return 0; }

LVDS(Low Voltage Differential Signaling)電平詳解

一、LVDS的定義與核心特性 LVDS&#xff08;低壓差分信號&#xff09;是一種 低功耗、高速、抗干擾 的差分信號傳輸技術&#xff0c;通過一對互補的電壓信號&#xff08;正負端差值&#xff09;傳遞數據。其核心特性包括&#xff1a; 電氣特性 電壓擺幅&#xff1a;差分電壓約…

【OpenFeign 面試專題】

OpenFeign 面試專題 OpenFeign 的核心原理OpenFeign 如何與 Ribbon、Hystrix 集成Ribbon的負載均衡策略如何自定義 OpenFeign 的請求編碼和響應解碼OpenFeign 如何傳遞請求頭&#xff08;Header&#xff09;信息OpenFeign 如何處理超時和重試OpenFeign 支持哪些 HTTP 客戶端實現…

Adobe Acrobat Pro setting

防火墻斷網組織彈窗 Adobe軟件突然彈窗“THIS APP HAS BEEN DISABLED”&#xff1f;別慌&#xff0c;幾步教你輕松解決&#xff01; 禁用代理 解決Adobe出現This unlicensed Photoshop app has been disabled.禁止使用 rules:- DOMAIN-KEYWORD,adobe,REJECT

搜索插入位置(js實現,LeetCode:35)

給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法。 示例 1: 輸入: nums [1,3,5,6], target 5 輸出: 2示例 2: 輸入…

5. 前后端實現文件上傳與解析

1. 說明 在實際開發中&#xff0c;比較常見的一個功能是需要在前端頁面中選擇系統中的某個文件上傳到服務器中進行解析&#xff0c;解析后的文件內容可以用來在服務器中當作參數&#xff0c;或者傳遞給其它組件使用&#xff0c;或者需要存儲到數據庫中。所以本文就提供一種方式…

《靈珠覺醒:從零到算法金仙的C++修煉》卷三·天劫試煉(32)萬劍歸宗破妖陣 - 最長遞增子序列(LIS)

《靈珠覺醒:從零到算法金仙的C++修煉》卷三天劫試煉(32)萬劍歸宗破妖陣 - 最長遞增子序列(LIS) 哪吒在數據修仙界中繼續他的修煉之旅。這一次,他來到了一片神秘的萬劍谷,谷中有一座巨大的萬劍歸宗劍陣,劍陣閃爍著神秘的光芒。谷口有一塊巨大的石碑,上面刻著一行文字:…

【redis】使用redis作為緩存時所注意事項

緩存更新策略 在 Redis 緩存中&#xff0c;緩存的更新策略主要有**定期生成&#xff08;定時更新&#xff09;和實時生成&#xff08;即時更新&#xff09;**兩種方式。不同的策略適用于不同的業務場景&#xff0c;涉及性能、數據一致性和系統負載等方面的權衡。 1. 定期生成&…

計算機網絡:計算機網絡的分類

按分布范圍分類&#xff1a;廣域網&#xff0c;城域網&#xff0c;局域網&#xff0c;個域網 按傳輸技術分類&#xff1a;廣播式網絡&#xff0c;點對點網絡 按拓撲結構分類&#xff1a;總線型&#xff0c;環形&#xff0c;星形&#xff0c;網狀 按傳輸介質分類&#xff1a;…

解決pip安裝uv時下載速度慢

驗證優化效果 方案 1&#xff1a;臨時使用國內鏡像源&#xff08;推薦&#xff09; pip install uv -i https://pypi.tuna.tsinghua.edu.cn/simple 速度提升&#xff1a;鏡像源服務器位于國內&#xff0c;帶寬充足&#xff0c;通常可達 1-10MB/s 支持源列表&#xff1a; # 清…

SpringCloud Alibaba——入門簡介

一、是什么 &#xff08;1&#xff09;誕生 2018.10.31&#xff0c;Spring Cloud Alibaba 正式入駐了 Spring Cloud 官方孵化器&#xff0c;并在 Maven 中央庫發布了第一個版本 &#xff08;2&#xff09;介紹 &#xff08;3&#xff09;&#xff1f;何為必須組件 二、能干嘛…

Python完全指南:從基礎到實踐的編程藝術

引言&#xff1a;數字時代的瑞士軍刀 在人工智能與大數據浪潮中&#xff0c;Python如同編程世界的"瑞士軍刀"&#xff0c;以其優雅的語法和強大的生態征服全球開發者。本文將從語言哲學到實戰應用&#xff0c;為您展開Python編程的全景畫卷&#xff0c;揭示這門語言…

Docker 運行 GPUStack 的詳細教程

GPUStack GPUStack 是一個用于運行 AI 模型的開源 GPU 集群管理器。它具有廣泛的硬件兼容性&#xff0c;支持多種品牌的 GPU&#xff0c;并能在 Apple MacBook、Windows PC 和 Linux 服務器上運行。GPUStack 支持各種 AI 模型&#xff0c;包括大型語言模型&#xff08;LLMs&am…

完整例子和調用關系qt OpenGL

項目結構 首先&#xff0c;你需要在 Qt 項目中創建一個類&#xff0c;繼承自 QOpenGLWidget 來進行 OpenGL 渲染。文件結構如下&#xff1a; - main.cpp - MyOpenGLWidget.h - MyOpenGLWidget.cpp - vertex_shader.glsl - fragment_shader.glsl 1. main.cpp 這是 Qt 項目的入口…

VSCode 配置優化指南:打造極致高效的前端開發環境

VSCode 配置優化指南&#xff1a;打造極致高效的前端開發環境 一、基礎環境配置&#xff1a;讓開發更流暢 1. 性能優化設置 // settings.json {"files.autoSave": "afterDelay", // 自動保存&#xff08;延遲1秒&#xff09;"files.exclud…

源IP泄露后如何涅槃重生?高可用架構與自動化防御體系設計

一、架構層解決方案 1. 高防代理架構設計 推薦架構&#xff1a; 用戶 → CDN&#xff08;緩存靜態資源&#xff09; → 高防IP&#xff08;流量清洗&#xff09; → 源站集群&#xff08;真實IP隱藏&#xff09; ↑ Web應用防火墻&#xff08;WAF&#xff09; 實施要點&a…

【英偉達AI論文】多模態大型語言模型的高效長視頻理解

摘要&#xff1a;近年來&#xff0c;基于視頻的多模態大型語言模型&#xff08;Video-LLMs&#xff09;通過將視頻處理為圖像幀序列&#xff0c;顯著提升了視頻理解能力。然而&#xff0c;許多現有方法在視覺主干網絡中獨立處理各幀&#xff0c;缺乏顯式的時序建模&#xff0c;…

無障礙閱讀(Web Accessibility)NVDA打開朗讀查看器后,enter鍵不生效的原因

用NVDA測試Web Accessibility時&#xff0c;打開朗讀查看器&#xff0c;enter鍵會無效&#xff0c;而不打開測試器&#xff0c;就沒有問題&#xff0c;很大原因是被應用的元素不是可聚焦的&#xff0c;解決方法嘗試&#xff1a; 將標簽改為可聚焦的語義化標簽&#xff0c;如 b…