娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年11月03日(星期日)

2021年11月03日 | stm32實用篇6:HAL庫 DS18B20 驅動

發布者:MysticDreamer 來源: eefocus關鍵字:stm32  HAL庫  DS18B20  驅動 手機看文章 掃描二維碼
隨時隨地手機看文章

DS18B20是很常用的溫度傳感器,精度很高,測試結果如下:

整個驅動程序基本是根據時序寫的。要注意的地方有兩個:


1 讀數據的時間 < 15us,這個值要實際測試,跟自己實現的延時函數效率有關,我使用的是10us,這個值如果設置的不合理,會直接導致整個數據讀取出錯;


2 建議使用DS18B20_GetTemp_SkipRom函數,不推薦使用設備號相關的那個讀取函數,不太穩定;


 


HAL庫驅動程序源碼:


bsp_ds18b20.c


/**

  ******************************************************************************

  * @file            bsp_ds18b20.c

  * @author

  * @date

  * @version         v1.0

  * @note            DHT11 driver

  ******************************************************************************

  */

 

#include "bsp_ds18b20.h"

 

/**

  * @brief DS18B20 輸出模式

  */

static void DS18B20_Mode_OUT_PP(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.Pin = BSP_DS18B20_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(BSP_DS18B20_PORT, &GPIO_InitStruct);

}

 

/**

  * @brief DS18B20 輸入模式

  */

static void DS18B20_Mode_IN_NP(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.Pin = BSP_DS18B20_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_NOPULL;

 

HAL_GPIO_Init(BSP_DS18B20_PORT, &GPIO_InitStruct);

}

 

/**

  * @brief 主機給從機發送復位脈沖

  */

static void DS18B20_Reset(void)

{

DS18B20_Mode_OUT_PP(); // 主機輸出

DS18B20_OUT_0; // 主機至少產生 480us 的低電平復位信號 

bsp_delay_us(750);

DS18B20_OUT_1; // 主機在產生復位信號后,需將總線拉高 

// 從機接收到主機的復位信號后,會在 15 ~ 60 us 后給主機發一個存在脈沖

bsp_delay_us(15);

}

 

/**

  * @brief  檢測從機給主機返回的存在脈沖

  * @return 0:成功 1:失敗

*/

static uint8_t DS18B20_Presence(void)

{

uint8_t pulse_time = 0;

DS18B20_Mode_IN_NP(); // 主機設為輸入 

// 等待存在脈沖的到來,存在脈沖為一個 60 ~ 240 us 的低電平信號 

// 如果存在脈沖沒有來則做超時處理,從機接收到主機的復位信號后,會在 15 ~ 60 us 后給主機發一個存在脈沖

 

while (DS18B20_IN && (pulse_time < 100)) // 等待低電平響應脈沖

{

pulse_time++;

bsp_delay_us(1);

}

// 經過 100 us 后,存在脈沖都還沒有到來

if (pulse_time >= 100)

{

return 1;

}

else

{

pulse_time = 0;

}

// 響應脈沖(低電平)到來,且存在的時間不能超過 240 us 

while(!(DS18B20_IN) && pulse_time < 240)

{

pulse_time++;

bsp_delay_us(1);

}

if(pulse_time >= 240)

{

return 1;

}

else

{

return 0;

}

}

 

 /**

   * @brief  DS18B20 初始化函數

   * @reurn  0:成功 1:失敗

   */

uint8_t DS18B20_Init(void)

{

DS18B20_Mode_OUT_PP();

DS18B20_OUT_1;

DS18B20_Reset();

return DS18B20_Presence();

}

 

/**

  * @brief 從DS18B20讀取一個bit

  */

static uint8_t DS18B20_ReadBit(void)

{

uint8_t dat;

DS18B20_Mode_OUT_PP(); // 讀 0 和讀 1 的時間至少要大于 60 us 

DS18B20_OUT_0; // 讀時間的起始:必須由主機產生 > 1us < 15us 的低電平信號 

// 這個時間非常重要,設置為 < 15,需要多次嘗試;如果設置不合理,數據會直接出錯

// 參數建議設為 10 11 12,具體值要根據延時函數的執行效率測試

bsp_delay_us(10);

DS18B20_Mode_IN_NP(); // 設置成輸入,釋放總線,由外部上拉電阻將總線拉高 

if (DS18B20_IN == 1)

{

dat = 1;

}

else

{

dat = 0;

}

bsp_delay_us(45); // 這個延時參數參考時序圖 

return dat;

}

 

/**

  * @brief 從 DS18B20 讀一個字節,低位先行

  */

static uint8_t DS18B20_ReadByte(void)

{

uint8_t i, j, dat = 0;

for(i = 0; i < 8; i++) 

{

j = DS18B20_ReadBit();

dat = (dat) | (j << i);

}

return dat;

}

 

/**

  * @brief 寫一個字節到 DS18B20,低位先行

  */

static void DS18B20_WriteByte(uint8_t dat)

{

uint8_t i, testb;

DS18B20_Mode_OUT_PP();

for( i = 0; i < 8; i++ )

{

testb = dat & 0x01;

 

dat = dat >> 1;

// 寫 0 和寫 1 的時間至少要大于60us 

if (testb) // 當前位寫 1

{

DS18B20_OUT_0;

bsp_delay_us(5); // 拉低發送寫時段信號

DS18B20_OUT_1; // 讀取電平時間保持高電平

bsp_delay_us(65);

}

else // 當前位寫 0

{

DS18B20_OUT_0; // 拉低發送寫時段信號

bsp_delay_us(70); // 讀取電平時間保持低電平

DS18B20_OUT_1;

bsp_delay_us(2); // 恢復時間

}

}

}

 

/**

  * @brief  跳過匹配 DS18B20 ROM

  */

static void DS18B20_SkipRom(void)

{

DS18B20_Reset();    

DS18B20_Presence();  

DS18B20_WriteByte(0XCC); /* 跳過 ROM */

}

 

/**

  * @brief  執行匹配 DS18B20 ROM

  */

static void DS18B20_MatchRom(void)

{

DS18B20_Reset();    

DS18B20_Presence();  

DS18B20_WriteByte(0X55); /* 匹配 ROM */

}

 

/**

* 存儲的溫度是16 位的帶符號擴展的二進制補碼形式

* 當工作在12位分辨率時,其中5個符號位,7個整數位,4個小數位

*

*         |---------整數----------|-----小數 分辨率 1/(2^4)=0.0625----|

* 低字節  | 2^3 | 2^2 | 2^1 | 2^0 | 2^(-1) | 2^(-2) | 2^(-3) | 2^(-4) |

*

*

*         |-----符號位:0->正  1->負-------|-----------整數-----------|

* 高字節  |  s  |  s  |  s  |  s  |    s   |   2^6  |   2^5  |   2^4  |

*

* 溫度 = 符號位 + 整數 + 小數*0.0625

*/

 

/**

  * @brief  在跳過匹配 ROM 情況下獲取 DS18B20 溫度值 

  * @param  無

  * @retval 溫度值

  */

float DS18B20_GetTemp_SkipRom(void)

{

uint8_t tpmsb, tplsb;

int16_t s_tem;

float f_tem;

DS18B20_SkipRom();

DS18B20_WriteByte(0X44); /* 開始轉換 */

DS18B20_SkipRom();

  DS18B20_WriteByte(0XBE); /* 讀溫度值 */

tplsb = DS18B20_ReadByte();  

tpmsb = DS18B20_ReadByte(); 

s_tem = tpmsb << 8;

s_tem = s_tem | tplsb;

if(s_tem < 0) /* 負溫度 */

{

f_tem = (~s_tem + 1) * 0.0625f;

}

else

{

f_tem = s_tem * 0.0625f;

}

return f_tem;

}

 

/**

  * @brief  在匹配 ROM 情況下獲取 DS18B20 溫度值 

  * @param  ds18b20_id:用于存放 DS18B20 序列號的數組的首地址

  */

void DS18B20_ReadId(uint8_t *ds18b20_id)

{

uint8_t uc;

DS18B20_WriteByte(0x33);       //讀取序列號

for (uc = 0; uc < 8; uc++)

{

ds18b20_id[uc] = DS18B20_ReadByte();

}

}

 

/**

  * @brief  在匹配 ROM 情況下獲取 DS18B20 溫度值 

  * @param  ds18b20_id:存放 DS18B20 序列號的數組的首地址

  * @retval 溫度值

  */

float DS18B20_GetTemp_MatchRom(uint8_t * ds18b20_id)

{

uint8_t tpmsb, tplsb, i;

int16_t s_tem;

float f_tem;

DS18B20_MatchRom();            /* 匹配ROM */

  for(i = 0;i < 8; i++)

{

DS18B20_WriteByte(ds18b20_id[i]);

}

DS18B20_WriteByte(0X44); /* 開始轉換 */

 

DS18B20_MatchRom();            /* 匹配ROM */

for(i = 0; i < 8; i++)

{

DS18B20_WriteByte(ds18b20_id[i]);

}

DS18B20_WriteByte(0XBE); /* 讀溫度值 */

tplsb = DS18B20_ReadByte();  

tpmsb = DS18B20_ReadByte(); 

s_tem = tpmsb << 8;

s_tem = s_tem | tplsb;

if (s_tem < 0) /* 負溫度 */

{

f_tem = (~s_tem + 1) * 0.0625f;

}

else

{

f_tem = s_tem * 0.0625f;

}

return f_tem;

}

 

// 測試程序

 

#if 0

 

uint8_t uc, ucDs18b20Id[8];

while (DS18B20_Init())

{

printf("rn no ds18b20 exit rn");

}

 

printf("rn ds18b20 exit rn");

 

DS18B20_ReadId(ucDs18b20Id);            // 讀取 DS18B20 的序列號

printf("rnDS18B20的序列號是: 0x");

 

for (uc = 0; uc < 8; uc++)          // 打印 DS18B20 的序列號

{

printf("%.2x", ucDs18b20Id[uc]);

}

 

while (1)

{

printf("rn溫度: %.1frn", DS18B20_GetTemp_SkipRom());

 

HAL_Delay(1000); /* 1s 讀取一次溫度值 */

}

 

#endif

 

bsp_ds18b20.h


/**

  ******************************************************************************

  * @file bsp_ds18b20.h

  * @author

  * @date

  * @version     v1.0

  * @note DS18B20 driver

  ******************************************************************************

  */

 

#ifndef __BSP_DS18B20_H

#define __BSP_DS18B20_H

 

#include "bsp_conf.h"

 

#define BSP_DS18B20_PORT             TEMP_SENSOR_GPIO_Port

#define BSP_DS18B20_PIN                TEMP_SENSOR_Pin

 

#define DS18B20_OUT_1                HAL_GPIO_WritePin(BSP_DS18B20_PORT, BSP_DS18B20_PIN, GPIO_PIN_SET)

#define DS18B20_OUT_0                HAL_GPIO_WritePin(BSP_DS18B20_PORT, BSP_DS18B20_PIN, GPIO_PIN_RESET)

 

#define DS18B20_IN         HAL_GPIO_ReadPin(BSP_DS18B20_PORT, BSP_DS18B20_PIN)

 

uint8_t DS18B20_Init(void);

void DS18B20_ReadId(uint8_t *ds18b20_id);

float DS18B20_GetTemp_SkipRom(void);

float DS18B20_GetTemp_MatchRom(uint8_t * ds18b20_id);

 

#endif /* __BSP_DS18B20_H */

關鍵字:stm32  HAL庫  DS18B20  驅動 引用地址:stm32實用篇6:HAL庫 DS18B20 驅動

上一篇:stm32實用篇5:HAL庫 DHT11 驅動
下一篇:STM32的DMA串口直通

推薦閱讀

人工智能(AI)是2018年安博會的核心話題,其中人臉識別相關產品和方案仍然是本屆安博會AI在安防監控應用領域展示量最大的部分。當前視頻監控已走向人臉識別、車輛識別的應用階段,大家都在關注識別算法精準度的提升,而如何提升這個精準度,撇開算法的層面,從設備硬件構造來講,首先需要保障的是監控圖像傳感器的性能。本次安博會,筆者也有幸采訪到了國...
10月31日,沈陽正式進入商用時代,各行業的5G應用也將大規模展開。 從京東了解到,省內首個由中國移動與京東物流共同打造的5G智慧物流示范園區,已在渾南區京東“亞洲一號”物流園進入實測階段,智能車輛匹配、覆蓋、全域信息、無人巡檢機器人穿梭……這些影視作品中的場景將在沈陽一一呈現。 巡檢機器人成功“攔截”可疑人員 “看!巡檢機器人發來...
近日,2020 中國保時捷賽車電競挑戰賽在上海國際賽車場迎來了總決賽。作為中國保時捷賽車電競挑戰賽官方合作伙伴,Bose 為其提供了首款 QuietComfort 35 II 消噪游戲耳機,以聲臨其境的逼真音效,還原真實競速的感官體驗,助力選手展現專業水準。此外,Bose 亦特別為本次活動定制了賽車電競限定款 QuietComfort 35 II 消噪耳機,作為決賽選手們的...
近日,佛山市國星光電股份有限公司(以下簡稱:國星光電)披露關于公司取得發明專利證書的公告。據悉,國星光電于近日收到 4 項發明專利證書,其中中國國家知識產權局頒發的發明專利證書 3 項、美國發明專利證書 1 項。取得發明專利證書的專利分別為“照明設備”(ZL2018 1 1368164.4)、“LED器件、背光模組和顯示裝置”(ZL 2019 1 0578865.9...

史海拾趣

問答坊 | AI 解惑

DT-1在線液體密度儀(密度計)

DT-1在線液體密度測試變送器可對各種液體或液態混合物在線進行密度測量。故在石化行業可廣泛應用于煉油、調油、油水介面監測;在食品工業用于葡萄汁、番茄汁、果糖漿、植物油及軟飲料加工等生產現場;奶制品業;造紙業,黑漿、綠漿、白漿、堿溶液的 ...…

查看全部問答∨

External Medical and IT Power Supplies Meet Latest Energy Efficiency Standards

XP Power has announced the launch of the AEF and AFM series of external AC/DC power supply units. Designed for a wide range of IT and portable medical equipment, the units provide single outputs with power output between 100 - 150 ...…

查看全部問答∨

大家有誰寫過casio dt930手持機的中間層函數嗎?

寫過casio dt930手持機程序的朋友對日趨公司提供的rich_XXX 中間層函數了解多少? 我們公司以前開發casio dt930手持機程序都是用的這個日趨函數,但是因為不清楚其函數內部源碼,現在公司要求自己寫一個類似于這個日趨中間層函數庫的東西,其實現函數 ...…

查看全部問答∨

CxImage移植到WinCE導致的編譯問題

我把CxImage移植到EVC4.0的時候,編譯庫沒發現什么問題,但是鏈接到exe(exe是基于MFC的)的時候發現了如下的鏈接錯誤: ximapng.obj : error LNK2019: unresolved external symbol ___CxxLongjmpUnwind@4 referenced in function "public: bool __th ...…

查看全部問答∨

奇怪!用手一碰單片機的晶振輸入腿,單片機就能運行了

在將程序寫入單片機后,程序沒有運行(B口驅動的二極管沒有發光);用手一碰單片機的晶振輸入腿,單片機就能運行了。 奇怪!是晶振沒有七振嗎?…

查看全部問答∨

問個問題!

現有10路待測信號要從串口輸出給PC,我把他們通過2片鎖存器接到P0和P1口,通過控制片選端來分別選擇P0和P1口數據。   當選了P0數據后,用KEIL C來編的話把P0數據送到SBUF的代碼怎樣寫呢?如果用中斷來做和這種方法哪個好些?關鍵中斷來做 ...…

查看全部問答∨

有些公司申請樣片的時候要交關稅,用什么信用卡?

有些公司申請樣片的時候要交關稅,按美元計算的,要用信用卡支付,不知道大家是用什么卡的?要花費多少?…

查看全部問答∨

LED日光燈電源設計討論

LED日光燈電源,今年非常火爆,有很多公司設計由于不懂規范,做出來的產品,往往在認證階段出現問題,花費大量的人力物力去整改, 下面我簡單介紹一下T8電源能滿足認證的的設計要求: 1.安全距離,由于電源是AC-DC的電源,有高壓存在,在UL里的安 ...…

查看全部問答∨

請教UCOS多任務堆棧的問題

請問是用內部RAM 32K的 LPC2136 。開5個任務。每個任務堆棧大小800字節。請問有問題嗎…

查看全部問答∨

關于VCA820的小問題

各位大神,小弟按VCA820 datasheet 23頁Figure84搭出來的圖檢測,Rf和Rg分別為1K與200,增益按道理應該是10倍,現在最大只有2~3倍,極度郁悶,求解中!!!…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 泰安市| 抚远县| 房山区| 绿春县| 武穴市| 宁远县| 青海省| 太白县| 平罗县| 浦城县| 贡觉县| 桑植县| 闸北区| 普兰店市| 民丰县| 佳木斯市| 平凉市| 南开区| 洪泽县| 内乡县| 安多县| 平安县| 通渭县| 塔城市| 安泽县| 双城市| 祁阳县| 鹿邑县| 舞钢市| 凤凰县| 潜江市| 广东省| 慈利县| 玉环县| 福鼎市| 长治市| 黄骅市| 怀柔区| 象州县| 当涂县| 永修县|