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個溫度轉換和溫度讀取必須要用到的指令:
| 跳過ROM | SKIP 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数字温度传感器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教会AI认识麻将牌之实践篇
- 下一篇: c++ 数据结构 软件压缩/解压缩软件S