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

歷史上的今天

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

2021年11月03日 | stm32實(shí)用篇6:HAL庫 DS18B20 驅(qū)動(dòng)

發(fā)布者:MysticDreamer 來源: eefocus關(guān)鍵字:stm32  HAL庫  DS18B20  驅(qū)動(dòng) 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

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

整個(gè)驅(qū)動(dòng)程序基本是根據(jù)時(shí)序?qū)懙摹R⒁獾牡胤接袃蓚€(gè):


1 讀數(shù)據(jù)的時(shí)間 < 15us,這個(gè)值要實(shí)際測試,跟自己實(shí)現(xiàn)的延時(shí)函數(shù)效率有關(guān),我使用的是10us,這個(gè)值如果設(shè)置的不合理,會(huì)直接導(dǎo)致整個(gè)數(shù)據(jù)讀取出錯(cuò);


2 建議使用DS18B20_GetTemp_SkipRom函數(shù),不推薦使用設(shè)備號(hào)相關(guān)的那個(gè)讀取函數(shù),不太穩(wěn)定;


 


HAL庫驅(qū)動(dòng)程序源碼:


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 主機(jī)給從機(jī)發(fā)送復(fù)位脈沖

  */

static void DS18B20_Reset(void)

{

DS18B20_Mode_OUT_PP(); // 主機(jī)輸出

DS18B20_OUT_0; // 主機(jī)至少產(chǎn)生 480us 的低電平復(fù)位信號(hào) 

bsp_delay_us(750);

DS18B20_OUT_1; // 主機(jī)在產(chǎn)生復(fù)位信號(hào)后,需將總線拉高 

// 從機(jī)接收到主機(jī)的復(fù)位信號(hào)后,會(huì)在 15 ~ 60 us 后給主機(jī)發(fā)一個(gè)存在脈沖

bsp_delay_us(15);

}

 

/**

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

  * @return 0:成功 1:失敗

*/

static uint8_t DS18B20_Presence(void)

{

uint8_t pulse_time = 0;

DS18B20_Mode_IN_NP(); // 主機(jī)設(shè)為輸入 

// 等待存在脈沖的到來,存在脈沖為一個(gè) 60 ~ 240 us 的低電平信號(hào) 

// 如果存在脈沖沒有來則做超時(shí)處理,從機(jī)接收到主機(jī)的復(fù)位信號(hào)后,會(huì)在 15 ~ 60 us 后給主機(jī)發(fā)一個(gè)存在脈沖

 

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

{

pulse_time++;

bsp_delay_us(1);

}

// 經(jīng)過 100 us 后,存在脈沖都還沒有到來

if (pulse_time >= 100)

{

return 1;

}

else

{

pulse_time = 0;

}

// 響應(yīng)脈沖(低電平)到來,且存在的時(shí)間不能超過 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 初始化函數(shù)

   * @reurn  0:成功 1:失敗

   */

uint8_t DS18B20_Init(void)

{

DS18B20_Mode_OUT_PP();

DS18B20_OUT_1;

DS18B20_Reset();

return DS18B20_Presence();

}

 

/**

  * @brief 從DS18B20讀取一個(gè)bit

  */

static uint8_t DS18B20_ReadBit(void)

{

uint8_t dat;

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

DS18B20_OUT_0; // 讀時(shí)間的起始:必須由主機(jī)產(chǎn)生 > 1us < 15us 的低電平信號(hào) 

// 這個(gè)時(shí)間非常重要,設(shè)置為 < 15,需要多次嘗試;如果設(shè)置不合理,數(shù)據(jù)會(huì)直接出錯(cuò)

// 參數(shù)建議設(shè)為 10 11 12,具體值要根據(jù)延時(shí)函數(shù)的執(zhí)行效率測試

bsp_delay_us(10);

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

if (DS18B20_IN == 1)

{

dat = 1;

}

else

{

dat = 0;

}

bsp_delay_us(45); // 這個(gè)延時(shí)參數(shù)參考時(shí)序圖 

return dat;

}

 

/**

  * @brief 從 DS18B20 讀一個(gè)字節(jié),低位先行

  */

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 寫一個(gè)字節(jié)到 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 的時(shí)間至少要大于60us 

if (testb) // 當(dāng)前位寫 1

{

DS18B20_OUT_0;

bsp_delay_us(5); // 拉低發(fā)送寫時(shí)段信號(hào)

DS18B20_OUT_1; // 讀取電平時(shí)間保持高電平

bsp_delay_us(65);

}

else // 當(dāng)前位寫 0

{

DS18B20_OUT_0; // 拉低發(fā)送寫時(shí)段信號(hào)

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

DS18B20_OUT_1;

bsp_delay_us(2); // 恢復(fù)時(shí)間

}

}

}

 

/**

  * @brief  跳過匹配 DS18B20 ROM

  */

static void DS18B20_SkipRom(void)

{

DS18B20_Reset();    

DS18B20_Presence();  

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

}

 

/**

  * @brief  執(zhí)行匹配 DS18B20 ROM

  */

static void DS18B20_MatchRom(void)

{

DS18B20_Reset();    

DS18B20_Presence();  

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

}

 

/**

* 存儲(chǔ)的溫度是16 位的帶符號(hào)擴(kuò)展的二進(jìn)制補(bǔ)碼形式

* 當(dāng)工作在12位分辨率時(shí),其中5個(gè)符號(hào)位,7個(gè)整數(shù)位,4個(gè)小數(shù)位

*

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

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

*

*

*         |-----符號(hào)位:0->正  1->負(fù)-------|-----------整數(shù)-----------|

* 高字節(jié)  |  s  |  s  |  s  |  s  |    s   |   2^6  |   2^5  |   2^4  |

*

* 溫度 = 符號(hào)位 + 整數(shù) + 小數(shù)*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); /* 開始轉(zhuǎn)換 */

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ù)溫度 */

{

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

}

else

{

f_tem = s_tem * 0.0625f;

}

return f_tem;

}

 

/**

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

  * @param  ds18b20_id:用于存放 DS18B20 序列號(hào)的數(shù)組的首地址

  */

void DS18B20_ReadId(uint8_t *ds18b20_id)

{

uint8_t uc;

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

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

{

ds18b20_id[uc] = DS18B20_ReadByte();

}

}

 

/**

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

  * @param  ds18b20_id:存放 DS18B20 序列號(hào)的數(shù)組的首地址

  * @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); /* 開始轉(zhuǎn)換 */

 

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ù)溫度 */

{

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 的序列號(hào)

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

 

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

{

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 */

關(guān)鍵字:stm32  HAL庫  DS18B20  驅(qū)動(dòng) 引用地址:stm32實(shí)用篇6:HAL庫 DS18B20 驅(qū)動(dòng)

上一篇:stm32實(shí)用篇5:HAL庫 DHT11 驅(qū)動(dòng)
下一篇:STM32的DMA串口直通

推薦閱讀

英特兒能贏得蘋果的5G訂單嗎?  ? ? ? ? 新浪手機(jī)訊 11月3日上午消息,來自外媒macrumors的消息稱,一位未透露姓名的知情人士透露,蘋果公司將于2020年推出其首款5G iPhone手機(jī)。  ? ? ? ? 據(jù)稱,蘋果計(jì)劃在2020年的iPhone產(chǎn)品線中使用英特爾型號(hào)為8161的調(diào)制解調(diào)器芯片(也稱手機(jī)基帶)。英特爾將成為蘋果設(shè)備5G芯片的唯一供應(yīng)商,...
10月31日,沈陽正式進(jìn)入商用時(shí)代,各行業(yè)的5G應(yīng)用也將大規(guī)模展開。 從京東了解到,省內(nèi)首個(gè)由中國移動(dòng)與京東物流共同打造的5G智慧物流示范園區(qū),已在渾南區(qū)京東“亞洲一號(hào)”物流園進(jìn)入實(shí)測階段,智能車輛匹配、覆蓋、全域信息、無人巡檢機(jī)器人穿梭……這些影視作品中的場景將在沈陽一一呈現(xiàn)。 巡檢機(jī)器人成功“攔截”可疑人員 “看!巡檢機(jī)器人發(fā)來...
上個(gè)月,國家新能源汽車創(chuàng)新工程項(xiàng)目專家組組長王秉剛在全球新能源汽車供應(yīng)鏈大會(huì)上透露了一個(gè)消息,他參與制定的節(jié)能與新能源汽車技術(shù)路線圖2.0版已經(jīng)過審了,而在10月27日,中國汽車工程院院士、中國汽車工程學(xué)會(huì)理事長李駿代表汽車學(xué)會(huì)正式發(fā)布了《節(jié)能與新能源汽車技術(shù)路線圖2.0》(下稱”路線圖2.0”)六大目標(biāo),九大領(lǐng)域本次路線圖2.0公布的六大目標(biāo)...
隨著新能源汽車和自動(dòng)駕駛汽車時(shí)代的來臨,誕生了ADAS/AD、汽車互聯(lián)以及V2X等新應(yīng)用,這些給汽車架構(gòu)帶來了新的應(yīng)用方向,隨著架構(gòu)的演變,也對(duì)汽車SoC提出了新的需求,現(xiàn)在業(yè)界認(rèn)為,一種新的架構(gòu)將重塑汽車SoC的布局。在這樣的大變局下,汽車級(jí)IP又將起到怎樣的作用呢?汽車Zonal架構(gòu)出現(xiàn),汽車IP或?qū)⑻峁┲ΜF(xiàn)在汽車所需要的傳感器數(shù)量和類型越來越多...

史海拾趣

問答坊 | AI 解惑

簡易數(shù)控直流電源論文

簡易數(shù)控直流電源論文 …

查看全部問答∨

2812全國各地都什么價(jià)位啊?

過完年回來,記得還是100多以片的(少量購買),現(xiàn)在聽說哈爾濱已經(jīng)500多一片了。這到底是怎么了?…

查看全部問答∨

如圖 scsi <---> scsi controller <---> pci <---> cpu 如果我想對(duì)scsi編寫驅(qū)動(dòng)我該對(duì)哪個(gè)部分編寫?

如圖  scsi <--->  scsi controller <---> pci <---> cpu  如果我想對(duì)scsi編寫驅(qū)動(dòng)我該對(duì)哪個(gè)部分編寫?…

查看全部問答∨

求高人指教 WINCE 系統(tǒng)定制問題

我最近在跟著老師做點(diǎn)項(xiàng)目,也是剛接觸WinCE,我想讓Skype在Windows CE操作系統(tǒng)下運(yùn)行 ,可是運(yùn)行不起來,但是在Pocket PC 上可以跑起來,所以感覺要對(duì)WinCE 系統(tǒng)重新定制,請(qǐng)問各位高手給點(diǎn)意見。WinCE 相對(duì)于Pocket PC到底缺少那些咚咚.如何添加啊 ...…

查看全部問答∨

還有哪位網(wǎng)友申請(qǐng)到了MCU DAY的CC430

有哪位網(wǎng)友的CC430用不到,希望可以出給我,也算是資源充分利用,如果您有的話加我QQ77413811…

查看全部問答∨

STM32LQFP64proteldxpPCB封裝圖哪里有啊?

                                  …

查看全部問答∨

混合語言編程

請(qǐng)問在430中 iar環(huán)境下怎么使匯編和c語言混合使用。有什么比較好的教材或資料?有哪位大俠有例程??謝謝!…

查看全部問答∨

LM3S8962開發(fā)板一塊

本帖最后由 ddllxxrr 于 2016-1-7 17:08 編輯 參加青島2011年6月29號(hào)TI M3 DAY研討會(huì),依舊換新?lián)Q來的一塊LM3S8962的板子,全新,跟之前壇里活動(dòng)的板子一樣的, 所以想350元要出手,或者交換STM32開發(fā)板一塊。 有意者請(qǐng)聯(lián)系QQ:712996168 …

查看全部問答∨

步進(jìn)電機(jī)控制程序

本帖最后由 paulhyde 于 2014-9-15 03:08 編輯 大家可以驅(qū)動(dòng)電機(jī)啦    …

查看全部問答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 新沂市| 当雄县| 界首市| 彰武县| 平谷区| 青铜峡市| 克拉玛依市| 禹州市| 安化县| 军事| 郁南县| 武安市| 宿州市| 禹州市| 龙陵县| 女性| 海宁市| 内乡县| 乐昌市| 仪陇县| 克拉玛依市| 大姚县| 视频| 灵璧县| 建阳市| 马山县| 兴宁市| 新竹县| 东乌珠穆沁旗| 丹寨县| 巴马| 宁化县| 陕西省| 汉阴县| 麦盖提县| 西乌珠穆沁旗| 抚顺市| 小金县| 萍乡市| 九寨沟县| 博野县|