日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32学习之DS18B20数字温度传感器

發布時間:2024/3/7 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32学习之DS18B20数字温度传感器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????????DS18B20是一種常見的數字溫度傳感器,控制命令和數據都是以數字信號輸入輸出的

????????測溫范圍:-55~+125°C

????????測溫精度:0.5°C

????????通信接口:單總線

引腳功能
VDD電源(3.0~5.5V)
GND電源接地
DQ單總線接口
N.C.not? connected(空腳)

????????單總線要求采用嚴格的信號時序,以保證數據的完整性。而DS18B20共有六種信號類型:復位脈沖,應答脈沖,寫0寫1,讀0讀1。除應答脈沖外,其他5種信號都是由主機發出的同步信號。接下來依次介紹這六種信號類型。

? ? ? ? 復位脈沖及應答脈沖:

? ? ? ? 單總線上的所有通信都是以初始化序列開始。

????????主機輸出低電平,保持低電平至少480us,以產生復位脈沖。

? ? ? ? 接著主機釋放總線,將單總線拉高,延時15~60us,并進入接收模式(Rx),接著DS18B20拉低總線60~240us,以產生低電平應答脈沖。

/******************************************************************************* * 函數名 : DS18B20_Res * 功能 : DS18B20復位 * 輸入 : 無 * 輸出 : 無 *******************************************************************************/ void DS18B20_Res(void) {DS18B20_IO_OUT(); //配置為輸出模式DS18B20_DQ_OUT = 0;delay_us(750);DS18B20_DQ_OUT = 1;delay_us(15); //為應答脈沖做準備 } /******************************************************************************* * 函數名 : DS18B20_Check * 功能 : 等待DS18B20的回應 * 輸入 : 無 * 輸出 : 返回1 無響應 返回0 有響應 *******************************************************************************/ u8 DS18B20_Check(void) {u8 t = 0;DS18B20_IO_IN(); //配置為輸入模式while (DS18B20_DQ_IN && t < 200){t++;delay_us(1);}if (t >= 200)return 1;elset = 0;while (!DS18B20_DQ_IN && t < 240){t++;delay_us(1);}if (t >= 240) return 1;return 0; }

? ? ? ? 寫0寫1:

? ? ? ??

? ? ? ? 寫0:主機輸出低電平,延時60~120us,然后釋放。

? ? ? ? 寫1:主機輸出低電平,延時1~15us,然后釋放。

? ? ? ? 無論是寫0還是寫1,寫時序至少60us,且在2次獨立的寫時序之間,至少需要1us的恢復時間。

? ? ? ? 從機在總線拉低30us后,讀取電平。若為低電平,表示寫0,若為高電平,表示寫1

/******************************************************************************* * 函數名 ? ?? ? ? ?? ?: DS18B20_Write_Byte * 功能?? ??? ??? ?: 寫入一個字節到DS18B20 * 輸入?? ??? ??? ?: 要輸入的字節? * 輸出?? ??? ??? ?: 無 *******************************************************************************/ void DS18B20_Write_Byte(u8 byte) {DS18B20_IO_OUT();?? ?//配置引腳成輸出模式u8 i,test;for (i = 0; i < 8; i++){test = byte & 0x01;byte = byte >> 1;if (test)?? ?//寫1{DS18B20_DQ_OUT = 0;delay_us(2);DS18B20_DQ_OUT = 1;delay_us(60);}else?? ?//寫0{DS18B20_DQ_OUT = 0;delay_us(60);DS18B20_DQ_OUT = 1;delay_us(2);}} }

? ? ? ? 讀0讀1:

????????

? ? ? ? 主機輸出低電平,延時1~15us,然后釋放總線,并且在拉低后的15us內讀取電平(盡量在接近15us的時刻),讀取低電平為0,高電平為1。??

????????無論是讀0還是讀1,讀時序至少60us,且在2次獨立的讀時序之間,至少需要1us的恢復時間。??????

????????

/******************************************************************************* * 函數名 : DS18B20_Read_bit * 功能 : 讀取字節的一位 * 輸入 : 無 * 輸出 : 0/1 *******************************************************************************/ u8 DS18B20_Read_bit(void) {u8 bit;DS18B20_IO_OUT(); DS18B20_DQ_OUT = 0;delay_us(2);DS18B20_DQ_OUT = 1;DS18B20_IO_IN();delay_us(12);if (DS18B20_DQ_IN)bit = 1;elsebit = 0;delay_us(50);return 0; }/******************************************************************************* * 函數名 : DS18B20_Read_Byte * 功能 : 讀取一個字節 * 輸入 : 無 * 輸出 : 該字節 *******************************************************************************/ u8 DS18B20_Read_Byte(void) {u8 i, data;data = 0x00;for (i = 0; i < 8; i++){if (DS18B20_Read_bit())data = data | (0x01 << i);}return data; }

????????這里還有3個溫度轉換和溫度讀取必須要用到的指令:

跳過ROMSKIP ROM[CCh]
溫度轉換CONVERT T[44h]
讀暫存器READ SCRATCHPAD[BEh]

? ? ? ? 溫度轉換:

? ? ? ? 初始化——跳過ROM——溫度轉換

/******************************************************************************* * 函數名 : DS18B20_T_Change * 功能 : 溫度轉換 * 輸入 : 無 * 輸出 : 無 *******************************************************************************/ void DS18B20_T_Change(void) {DS18B20_Res();DS18B20_Check();DS18B20_Write_Byte(0xCC);DS18B20_Write_Byte(0x44); }

? ? ? ? 溫度讀取:

? ? ? ? 初始化——跳過ROM——讀暫存器——讀低八位——讀高八位

????????在這里隨筆者看一下溫度存儲格式:

????????其中第0位到第3位是溫度的小數部分,第4位到第10位是溫度的整數部分,第11位到第15位為0.若溫度為負,則16位全部取反。

????????因此處理這部分數,以我們習慣的十進制表達,程序略顯麻煩。

/******************************************************************************* * 函數名 : DS18B20_T_Get * 功能 : 溫度讀取 * 輸入 : 無 * 輸出 : 溫度 *******************************************************************************/ short DS18B20_T_Get(void) {u8 TL, TH,temp;short temperature;DS18B20_T_Change();DS18B20_Res();DS18B20_Check();DS18B20_Write_Byte(0xCC);DS18B20_Write_Byte(0xBE);TL = DS18B20_Read_Byte;TH = DS18B20_Read_Byte;if (TH > 7){TH = ~TH;TL = ~TL;temp = 0; //溫度為 -}elsetemp = 1; //溫度為 +temperature = TH; //獲得高8位temperature <<= 8;temperature += TL; //獲得低八位temperature = (float)temperature * 0.625;if (temp)return temperature;elsereturn -emperature;}

———————————————————————————————————————————

參考資料:

1.51單片機入門教程-2020版 程序全程純手打 從零開始入門_嗶哩嗶哩_bilibili

2.《STMF1開發指南—庫函數版》? ? ? ? 正點原子


?

總結

以上是生活随笔為你收集整理的STM32学习之DS18B20数字温度传感器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。