stm32 使用18B20 測試溫度

用18b20 測試溫度是非常常用的,不過18B20的調試不是這么容易的,有些內容網上很多的,不再重復說了,我先把波形說一下,再說程序部分:
在這里插入圖片描述
整個都溫度數據的順序是:
1.700uS的低電平復位并測試18B20的低電平響應
在這里插入圖片描述

2.主機發送0xCC,0x44兩個字節,表示跳過地址,只有一個18B20就不需要地址
在這里插入圖片描述

3.再次復位
4.發送0xCC,0xBE,兩個字節讓它轉換溫度
在這里插入圖片描述

5.讀取2個字節,這兩個字節就是溫度了。
在這里插入圖片描述

6.這兩個字節乘0.625就是溫度了。

有一點說明一下,主機輸出用GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;用開漏不行。

代碼貼一下:

void b12_18b20_in()
{GPIO_InitStruct.Pin = GPIO_PIN_12;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void b12_18b20_out()
{GPIO_InitStruct.Pin = GPIO_PIN_12;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

管腳自己注意一下

#define DS18B20_DQ_OUT0 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET)
#define DS18B20_DQ_OUT1 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET)#define DS18B20_DQ_IN HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12)
void DS18B20_Reset(void)
{//設置DS18B20為輸出模式b12_18b20_out();//拉低總線480-960usDS18B20_DQ_OUT0;delay_us(660);//釋放總線15-60usDS18B20_DQ_OUT1;delay_us(15);
}//等待DS18B20的回應
//返回1:未檢測到DS18B20的存在    返回0:存在
uint8_t DS18B20_Check(void)
{uint8_t retry = 0;b12_18b20_in();					//設置為輸入while (DS18B20_DQ_IN&&retry<200){retry++;delay_us(1);};if(retry>=200)return 1;else retry=0;while (!DS18B20_DQ_IN&&retry<240){retry++;delay_us(1);};if(retry>=240)return 1;return 0;
}//寫一個字節到DS18B20
//dat:要寫入的字節
void DS18B20_Write_Byte(uint8_t dat){uint8_t j;uint8_t testb;b12_18b20_out();					//設置為輸出for (j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if (testb) //輸出高{DS18B20_DQ_OUT0;			//輸出低電平delay_us(2);                //延時2usDS18B20_DQ_OUT1;			//輸出高電平delay_us(60); 				//延時60us}else //輸出低{DS18B20_DQ_OUT0;			//輸出低電平delay_us(60);               //延時60usDS18B20_DQ_OUT1;			//輸出高電平delay_us(2);                //延時2us}}
}//從DS18B20讀取一個位
//返回值:1/0
uint8_t DS18B20_Read_Bit(void) 			 //讀一位
{uint8_t data;b12_18b20_out();					//設置為輸出DS18B20_DQ_OUT0; 					//輸出低電平delay_us(2);DS18B20_DQ_OUT1; 					//拉高b12_18b20_in();						//設置為輸入delay_us(12);						//延時12usif(DS18B20_DQ_IN)data=1;			//讀取總線數據else data=0;delay_us(50);  						//延時50usreturn data;
}//從DS18B20讀取一個字節
//返回值:讀到的數據
uint8_t DS18B20_Read_Byte(void)    		//讀一字節
{uint8_t i,j,dat;dat=0;for (i=1;i<=8;i++){j=DS18B20_Read_Bit();dat=(j<<7)|(dat>>1);}return dat;
}void DS18B20_start()
{DS18B20_Reset();DS18B20_Check();DS18B20_Write_Byte(0xCC);DS18B20_Write_Byte(0x44);
}short Get_temp(void){uint8_t temp;short tem;DS18B20_start();DS18B20_Reset();DS18B20_Check();DS18B20_Write_Byte(0xCC);DS18B20_Write_Byte(0xBE);uint8_t TL = DS18B20_Read_Byte();uint8_t TH = DS18B20_Read_Byte();if( TH > 7 ){temp = 0;		//溫度為負TH = ~TH;TL = ~TL;}else{temp = 1; 		//溫度為正}tem = TH;tem <<= 8;tem += TL;//printf("=== %f\r\n", tem);tem = tem * 6.25;if(temp == 1){return tem;}else{return ~tem;}}

輸出

	  short temp = Get_temp();uint16_t t = temp ;printf("wendu = %02d.%02d\r\n" , t/100, t%100);

因為浮點數直接打印有點問題,現在這樣如果有負問題可能存在問題,自己注意一下。
使用了short。
us延時函數看我的前面一篇文章。

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

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

相關文章

【素書學習】人生境界的四個層次

馮友蘭先生認為人生境界有四個層次&#xff1a; 1、自然境界。總是依照社會習慣或本性而為&#xff0c;完全隨天地運轉而運轉&#xff0c;無明了的目的&#xff0c;不明所做的意義。日出而作&#xff0c;日落而息&#xff0c;不會去過多地思考此外的事情。不知何為苦、何為樂&…

mfc110u.dll丟失的解決方法,mfc110u.dll丟失原因是什么?

在計算機使用過程中&#xff0c;我們經常會遇到一些錯誤提示&#xff0c;其中之一就是“mfc110u.dll文件丟失”。那么&#xff0c;mfc110u.dll是什么&#xff1f;為什么會出現丟失的情況呢&#xff1f;本文將為您詳細介紹mfc110u.dll文件的含義、丟失原因以及解決方法。 首先&…

MyBatis進階之結果集映射注解版

文章目錄 注解實現結果集映射注解實現關系映射常用功能注解匯總 注解實現結果集映射 注意 配置結果集映射&#xff0c;只用看 SQL 執行結果&#xff0c;不看 SQL 語句&#xff01; 注意 由于注解在映射結果集上沒有實現 <resultMap> 的 100% 功能&#xff0c;因此&#x…

LeetCode763. Partition Labels

文章目錄 一、題目二、題解 一、題目 You are given a string s. We want to partition the string into as many parts as possible so that each letter appears in at most one part. Note that the partition is done so that after concatenating all the parts in orde…

java 有一個N位數字,各位加起來不超過M。

java 有一個N位數字&#xff0c;各位加起來不超過M。M<1000000 import java.util.*; //1:無需package //2: 類名必須Main, 不可修改public class Main { public static void main(String[] args) {Scanner scan new Scanner (System.in);int n scan.nextInt();int m scan…

【車載開發系列】Visio工具使用小技巧

【車載開發系列】Visio工具使用小技巧 【車載開發系列】Visio工具使用小技巧 【車載開發系列】Visio工具使用小技巧一. Word中編輯Visio技巧二. Word中插入visio圖形的問題三. 總結 一. Word中編輯Visio技巧 本節主要介紹了Microsoft Word中編輯Visio圖形的具體方法。 在 Word…

鴻蒙(HarmonyOS)應用開發——從網絡獲取數據(題目答案)

判斷題 1.在http模塊中&#xff0c;多個請求可以使用同一個httpRequest對象&#xff0c;httpRequest對象可以復用。 錯誤(False) 2.使用http模塊發起網絡請求后&#xff0c;可以使用destroy方法中斷網絡請求。 正確(True) 3.Web組件onConfirm(callback: (event?: { url: …

單臂路由與三層交換機

單臂路由 劃分VLAN后同一VLAN的計算機屬于同一個廣播域&#xff0c;同一VLAN的計算機之間的通信是不成問題的。然而&#xff0c;處于不同VLAN的計算機即使是在同一交換機上&#xff0c;它們之間的通信也必須使用路由器。 圖&#xff08;a&#xff09;是一種實現VLAN間路由的方…

人工智能原理復習

緒論 人工智能原理復習–緒論 知識表示 人工智能原理復習–知識表示&#xff08;一&#xff09; 人工智能原理復習–知識表示&#xff08;二&#xff09; 確定性推理 人工智能原理復習–確定性推理 不確定性推理 人工智能原理復習–不確定推理 搜索策略 人工智能原理復…

光伏連接器

光伏連接器 電子元器件百科 文章目錄 光伏連接器前言一、光伏連接器是什么二、光伏連接器的類別三、光伏連接器的應用實例四、光伏連接器的作用原理總結前言 常用的光伏連接器類型包括MC4、MC3、Amphenol和Tyco等,它們根據連接方式、電氣性能和標準規范等因素進行設計和選擇…

【原創】【一類問題解決】有正定陣A,讓求可逆陣R使得A=RTR(或A=RRT)的策略

【問題背景】有正定陣A&#xff0c;讓求可逆陣R使得ARTR&#xff08;或ARRT&#xff09;的策略 【法一】代數法&#xff1a;轉二次型配方 【實操】構造A的二次型fxTAx&#xff0c;將f在可逆變換xPy下配方為規范型yTy(即yTEyy1y2y3)〔即相應配方系數陣為P&#xff08;-1&#x…

電腦中環境變量的設置方法

環境變量是在操作系統中一個具有特定名字的對象&#xff0c;它包含了一個或者多個應用程序所將使用到的信息。例如Windows和DOS操作系統中的path環境變量&#xff0c;當要求系統運行一個程序而沒有告訴它程序所在的完整路徑時&#xff0c;系統除了在當前目錄下面尋找此程序外&a…

從賦碼、防竄到私域營銷,愛創科技助力西卡德高駛入發展快車道

在家居建材行業&#xff0c;西卡德高是一個繞不開的品牌。在瓷磚膠、美縫劑、防水等領域&#xff0c;西卡德高甚至一度成為這些細分產品的代名詞。西卡德高的銷售渠道以零售為主&#xff0c;其80%的產品是通過全國3000多個經銷商、3000多家專賣店、4000多個裝修師傅社群以及近2…

C++中的pair

一、頭文件 pair放在#include <utility>里面 二、作用與用法 其實就是一個存放2個不同數據類型數據對的一個結構。或者你可以直接理解為&#xff0c;放數據對的結構體。比如&#xff1a; pair<int ,string>p&#xff1b; 就差不多相當于 struct pair {int fi…

java泛型的使用

標題&#xff1a;Java泛型的使用 概要&#xff1a; Java中的泛型是一項強大的特性&#xff0c;可以讓我們編寫更加通用、類型安全的代碼。本文將介紹Java泛型的基本語法和使用方法&#xff0c;并通過示例代碼來說明其優勢。 正文&#xff1a; 泛型的基本概念 泛型是Java引入的…

class_2:Java概念 java se ee me jdk jre jvm

一、什么是Java&#xff1f; Java是一門面向對象的編程語言&#xff0c;不僅吸收了C語言的各種優點&#xff0c;還摒棄了C里難以理解的多繼承、指針等概念&#xff0c;因此Java語言具有功能強大和簡單易用兩個特征。Java語言作為靜態面向對象編程語言的代表&#xff0c;極好地…

JDK 9 模塊化系統 (Module System) 和 多版本兼容 Jar (Multi-Release Jar)

博文目錄 文章目錄 Module System原因JDK 模塊化模塊描述文件關鍵字 啟用模塊化測試結論 Multi-Release jar (MRJAR)原因原理結論用 IDEA 創建多版本兼容 Jar項目結構pom.xml測試 Module System 原因 Java 9引入了模塊化系統的主要原因是為了解決Java平臺面臨的復雜性和可維…

線程的使用(二)

新增實現方式之實現Callable接口 特點 1、可以有返回值。 2、方法可以拋異常。 3、支持泛型的返回值。 4、需借助FutureTask類&#xff0c;比如獲取返回值。 步驟 1、創建一個實現Callable接口的實現類。 2、重寫call方法&#xff0c; 將此線程需執行的操作聲明在call&…

C++中STL的容器vector

文章目錄 什么是vectorvector與普通順序表不同的點 vector的成員函數operatoroperator[]begin與end與iteratorsize()capacityresizeemptyreservepush_backpop_backinserteraseswapclear成員變量 總結 什么是vector vector&#xff1a;是數據結構里面的順序表&#xff0c;開辟一…

【LeetCode刷題】數組篇2

&#x1f387;數組中等題Part &#x1f308; 開啟LeetCode刷題之旅 &#x1f308; 文章目錄 &#x1f387;數組中等題Part&#x1f370;229.多數元素II&#x1f451;思路分析1.哈希表法2.摩爾投票法(進階) &#x1f370;15.三數之和&#x1f451;思路分析1.排序雙指針 &#x…