国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32F1使用HAL庫驅(qū)動DS18B20

這篇具有很好參考價(jià)值的文章主要介紹了STM32F1使用HAL庫驅(qū)動DS18B20。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

DS18B20概述

工程配置

?命令手冊

單總線協(xié)議

?初始化時(shí)序

?寫時(shí)序

讀時(shí)序

讀取溫度

驅(qū)動附錄


DS18B20概述

hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件

?DS18B20是一款單總線(one wire)芯片,因此其DQ引腳與單片機(jī)相連的IO口既要是輸入也要是輸出,cubeMX的初始化引腳設(shè)置只能選擇其一,這里我們使用手動配置引腳。

工程配置

先用cubeMX生成一個工程模板,初始化時(shí)鐘等等。

hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件

?命令手冊

hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件

?這里有兩個重要的指令,0x44表示觸發(fā)芯片進(jìn)行溫度轉(zhuǎn)化,0xbe表示請求讀取溫度轉(zhuǎn)化后的值。

hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件

還有一個常用指令為0xCC,意義是跳過讀取芯片ROM而節(jié)約時(shí)間。

單總線協(xié)議

由于是單總線協(xié)議,要想寫指令,收數(shù)據(jù)都要遵循其標(biāo)準(zhǔn),下面查看其時(shí)序

?初始化時(shí)序

hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件

單片機(jī)將DQ線拉低480us至960us后釋放總線,ds18b20檢測到總線電平變化,會等待15-60us,這段時(shí)間總線電平被電阻拉高,然后ds18b20會將總線拉低60-240us,作為應(yīng)答信號,表明總線上存在ds18b20芯片。然后ds18b20釋放總線,電阻將總線拉高。

整個過程為初始化

代碼如下

void onewire_init()
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	__HAL_RCC_GPIOB_CLK_ENABLE();
	GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pin=GPIO_PIN_9;
	GPIO_InitStruct.Pull=GPIO_NOPULL;
	GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
	HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
	HAL_Delay_us(500);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
	HAL_Delay_us(50);
	
	onewire_release();
	HAL_Delay_us(500);
}

用邏輯分析儀檢測如下

hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件

實(shí)際應(yīng)答時(shí)間約為110us?

?寫時(shí)序

hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件

寫時(shí)序分為寫0時(shí)序和寫1時(shí)序.

寫0時(shí)序

單片機(jī)拉低總線,產(chǎn)生一個下降沿并保持總線低電平60us-120us,在這期間,18b20會在下降沿出現(xiàn)后大約15us-60us內(nèi)讀取總線電平。然后單片機(jī)釋放總線,由上拉電阻拉高,直至下一次寫時(shí)序,這段時(shí)間為恢復(fù)時(shí)間,需要大于1us

寫1時(shí)序

單片機(jī)拉低總線,產(chǎn)生一個下降沿并保持總線低電平1-15us,在這期間,18b20會在下降沿出現(xiàn)后大約15us-60us內(nèi)讀取總線電平。然后單片機(jī)釋放總線,由上拉電阻拉高,直至下一次寫時(shí)序,這段時(shí)間為恢復(fù)時(shí)間,需要大于1us

void onewire_write(uint8_t dat)
{
	onewire_hold();
	if(dat==0)
	{
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
		HAL_Delay_us(60);
		onewire_release();
		HAL_Delay_us(2);
	}
	else
	{
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
		HAL_Delay_us(2);
		onewire_release();
		HAL_Delay_us(60);
	}
}

hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件

讀時(shí)序

hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件

?hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件

讀時(shí)序分為讀0時(shí)序和讀1時(shí)序

讀0時(shí)序

單片機(jī)拉低總線并至少保持1us的總線低電平,然后釋放總線,此時(shí)總線電平將由18b20決定,單片機(jī)在下降沿后15us處讀取總線電平值,為低電平

讀1時(shí)序

單片機(jī)拉低總線并至少保持1us的總線低電平,然后釋放總線,此時(shí)總線電平將由18b20決定,單片機(jī)在下降沿后15us處讀取總線電平值,為高電平

uint8_t onewire_read()
{
	uint8_t t;
	onewire_hold();
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
	HAL_Delay_us(2);
	onewire_release();
	HAL_Delay_us(12);
	t=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9);
	HAL_Delay_us(50);
	return t;
}

讀取溫度

float ds18b20_getTemp()
{
	uint16_t temp;
	float value;
	uint8_t lsb,msb;
	onewire_init();
	onewire_sendbyte(0xcc);
	onewire_sendbyte(0x44);
	HAL_Delay(750);
	onewire_init();
	onewire_sendbyte(0xcc);
	onewire_sendbyte(0xbe);
	lsb=onewire_readbyte();
	msb=onewire_readbyte();
	temp=msb;
	temp=(temp<<8)+lsb;
    if((temp&0xf800)==0xf800)
	{
		temp=(~temp)+1;
		value=temp*(-0.0625);
	}
	else
	{
		value=temp*0.0625;	
	}
	return value;	
}

邏輯分析儀波形

hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件

?上圖為開啟溫度轉(zhuǎn)化的引腳邏輯電平變化

hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件

上圖為讀取溫度值

讀取到的值為0000 0001 1011 1110

hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件

?由圖可知為16*1+8*1+2*1+1*1+0.5+0.25+0.125=27.875°C

與串口顯示溫度值一致

hal庫ds18b20,STM32單片機(jī),stm32,單片機(jī),嵌入式硬件

?至此,ds18b20的溫度轉(zhuǎn)化,溫度讀取已經(jīng)完成

驅(qū)動附錄

onewire.c

#include "onewire.h"

void HAL_Delay_us(uint32_t nus)
{
	uint32_t ticks;
	uint32_t told,tnow,tcnt=0;
	uint32_t reload=SysTick->LOAD;
	ticks=nus*72;
	told=SysTick->VAL;
	while(1)
	{
		tnow=SysTick->VAL;
		if(tnow!=told)
		{
			if(tnow<told)tcnt+=told-tnow;
			else tcnt+=reload-tnow+told;
			told=tnow;
			if(tcnt>=ticks)break;
		}
	}
}
void onewire_release()
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.Mode=GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull=GPIO_NOPULL;
	GPIO_InitStruct.Pin=GPIO_PIN_9;
	GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
	HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
}
void onewire_hold()
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pin=GPIO_PIN_9;
	GPIO_InitStruct.Pull=GPIO_PULLUP;
	GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
	HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
}
void onewire_init()
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	__HAL_RCC_GPIOB_CLK_ENABLE();
	GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pin=GPIO_PIN_9;
	GPIO_InitStruct.Pull=GPIO_NOPULL;
	GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
	HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
	HAL_Delay_us(500);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
	HAL_Delay_us(50);
	
	onewire_release();
	HAL_Delay_us(500);
}

void onewire_write(uint8_t dat)
{
	onewire_hold();
	if(dat==0)
	{
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
		HAL_Delay_us(60);
		onewire_release();
		HAL_Delay_us(2);
	}
	else
	{
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
		HAL_Delay_us(2);
		onewire_release();
		HAL_Delay_us(60);
	}
}

uint8_t onewire_read()
{
	uint8_t t;
	onewire_hold();
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
	HAL_Delay_us(2);
	onewire_release();
	HAL_Delay_us(12);
	t=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9);
	HAL_Delay_us(50);
	return t;
}

void onewire_sendbyte(uint8_t dat)
{
	uint8_t i;
	for(i=0;i<8;i++)
	{
		if((dat&0x01)==1)
			onewire_write(1);
		else
			onewire_write(0);
		dat=dat>>1;
	}
}
uint8_t onewire_readbyte(void)    // read one byte
{        
    uint8_t i,j,dat;
    dat=0;
	for (i=1;i<=8;i++) 
	{
        j=onewire_read();
        dat=(j<<7)|(dat>>1);
    }						    
    return dat;
}

onewire.h

#ifndef ONEWIRE_H
#define ONEWIRE_H
#include "main.h"
void onewire_init();
void onewire_write(uint8_t dat);
uint8_t onewire_read();
uint8_t onewire_readbyte(void);
void onewire_sendbyte(uint8_t dat);
#endif

ds18b20.c

#include "ds18b20.h"
#include "onewire.h"
void ds18b20_init()
{
	onewire_init();
}
float ds18b20_getTemp()
{
	uint16_t temp;
	float value;
	uint8_t lsb,msb;
	onewire_init();
	onewire_sendbyte(0xcc);
	onewire_sendbyte(0x44);
	HAL_Delay(750);
	onewire_init();
	onewire_sendbyte(0xcc);
	onewire_sendbyte(0xbe);
	lsb=onewire_readbyte();
	msb=onewire_readbyte();
	temp=msb;
	temp=(temp<<8)+lsb;
    if((temp&0xf800)==0xf800)
	{
		temp=(~temp)+1;
		value=temp*(-0.0625);
	}
	else
	{
		value=temp*0.0625;	
	}
	return value;
	
}

ds18b20.h文章來源地址http://www.zghlxwxcb.cn/news/detail-757354.html

#ifndef DS18B20_H
#define DS18B20_H
#include "main.h"

void ds18b20_init();
float ds18b20_getTemp();
#endif

到了這里,關(guān)于STM32F1使用HAL庫驅(qū)動DS18B20的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【正點(diǎn)原子STM32連載】 第四十二章 DS18B20數(shù)字溫度傳感器實(shí)驗(yàn) 摘自【正點(diǎn)原子】STM32F103 戰(zhàn)艦開發(fā)指南V1.2

    【正點(diǎn)原子STM32連載】 第四十二章 DS18B20數(shù)字溫度傳感器實(shí)驗(yàn) 摘自【正點(diǎn)原子】STM32F103 戰(zhàn)艦開發(fā)指南V1.2

    1)實(shí)驗(yàn)平臺:正點(diǎn)原子stm32f103戰(zhàn)艦開發(fā)板V4 2)平臺購買地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套實(shí)驗(yàn)源碼+手冊+視頻下載地址: http://www.openedv.com/thread-340252-1-1.html# 本章,我們將介紹STM32F103如何讀取外部溫度傳感器的溫度,來得到較為準(zhǔn)確的環(huán)境溫度。我們將學(xué)習(xí)

    2024年02月04日
    瀏覽(24)
  • STM32——DS18B20溫度傳感器

    STM32——DS18B20溫度傳感器

    一、DS18B20介紹 (一)DS18B20技術(shù)性能特征 1、獨(dú)特的單總線接口方式,DS18B20在與微處理器連接時(shí)僅需要一條口線即可實(shí)現(xiàn)微處理器與DS18B20的雙向通訊,大大提高了系統(tǒng)的抗干擾性。 2、測溫范圍? -55°C~+125°C 3、支持多點(diǎn)組網(wǎng)功能,多個DS18B20可以并聯(lián)在唯一的三線上,最多只

    2024年01月19日
    瀏覽(14)
  • STM32讀取DS18B20溫度,并在OLED上顯示

    STM32讀取DS18B20溫度,并在OLED上顯示

    部分代碼來源于網(wǎng)絡(luò),侵權(quán)刪 本文使用硬件:STM32F103C8T6最小系統(tǒng)板、IIC協(xié)議0.96寸OLED屏幕顯示、DS18B20傳感器 ?實(shí)現(xiàn)功能:在OLED上顯示出DS18B20采集到的溫度,精確到小數(shù)點(diǎn)后一位。 DS18B20.c DS18B20.h main.c 實(shí)物效果圖: 工程文件百度網(wǎng)盤鏈接:鏈接:https://pan.baidu.com/s/17QLXeaq2

    2024年02月15日
    瀏覽(18)
  • ESP32設(shè)備驅(qū)動-OLED顯示單個或多個DS18B20傳感器數(shù)據(jù)

    在本文中,我們將介紹如何ESP32驅(qū)動單個或多個DS18B20傳感器,并將DS18B20傳感器數(shù)據(jù)在OLE中顯示。 DS18B20 是一種溫度傳感器,本質(zhì)上是單線可編程的。 它廣泛用于測量存在于硬環(huán)境中的化學(xué)溶液和物質(zhì)的溫度。 使用此傳感器的優(yōu)勢之一是我們只需要 ESP 板上的一個引腳即可傳

    2024年02月07日
    瀏覽(22)
  • STM32CubeMX 讀取DS18B20溫度傳感器數(shù)據(jù)串口打印顯示

    STM32CubeMX 讀取DS18B20溫度傳感器數(shù)據(jù)串口打印顯示

    本文要做的所有工作標(biāo)題基本都包括了,讀取溫度傳感器的溫度數(shù)值,再通過串口打印到串口助手; 好多博主大神的教程我按步驟做了之后總是出現(xiàn)程序不報(bào)錯并且檢測不到傳感器的情況,后來找到原因并且修改后調(diào)試正常。 我用的是普中科技的實(shí)驗(yàn)板,主控芯片為STM3210

    2024年02月05日
    瀏覽(20)
  • STM32 Proteus仿真水箱水塔水位溫度控制系統(tǒng)DS18B20 -0065

    STM32 Proteus仿真水箱水塔水位溫度控制系統(tǒng)DS18B20 -0065

    STM32?Proteus仿真水箱水塔水位溫度控制系統(tǒng)DS18B20?-0065 Proteus 仿真小實(shí)驗(yàn): STM32?Proteus仿真水箱水塔水位溫度控制系統(tǒng)DS18B20?-0065 功能: 硬件組成:STM32F103C8單片機(jī)?+LCD1602顯示器+ADC220V轉(zhuǎn)3.3V電路+DS18B20溫度+多個按鍵(設(shè)置溫度和水位)+繼電器模擬加熱+繼電器模擬加水。 1.人工

    2024年02月15日
    瀏覽(20)
  • 通過stm32讀取DS18B20并在顯示屏上顯示溫度值(附源碼)

    通過stm32讀取DS18B20并在顯示屏上顯示溫度值(附源碼)

    使用stm32f103c8t6的芯片,在OLED顯示屏上顯示DS18B20的溫度值。 DS18B20 數(shù)字溫度計(jì)提供 9 位溫度讀數(shù),指示器件的溫度信息經(jīng)過單線接口送入 DS18B20 或從 DS18B20 送出, 因此從中央處理器到 DS18B20 僅需連接一條線。?讀、寫和完成溫度變換所需的電源可以由數(shù)據(jù)線本身提供而不需要外

    2024年02月15日
    瀏覽(24)
  • 單片機(jī)驅(qū)動多個ds18b20

    單片機(jī)驅(qū)動多個ds18b20

    目錄 1設(shè)計(jì)內(nèi)容 2ds18b20介紹 2.1傳感器引腳及原理圖 2.2寄存器配置 3程序?qū)崿F(xiàn) 3.1配置初始化 3.2配置寄存器 3.3ROM讀取 3.4溫度讀取 通過51單片機(jī),讀取總線上掛載的多個ds18b20的溫度信息。 如下圖,成功讀取到3路溫度數(shù)據(jù)。 DS18B20傳感器的引腳及封裝圖如下: DS18B20一共有三個引腳

    2024年02月21日
    瀏覽(20)
  • Linux下ds18b20驅(qū)動開發(fā)獲取溫度

    Linux下ds18b20驅(qū)動開發(fā)獲取溫度

    對ds18b20不了解的可以查看這篇文章,講解的比較詳細(xì)的:STM32一線協(xié)議-DS18B20溫度傳感器采樣實(shí)現(xiàn) 源碼是根據(jù)上一屆學(xué)長的,想要參考的可以去拜訪一下gitee:代碼鏈接 (1)修改設(shè)備樹 在路徑 linux-imx/arch/arm/boot/dts/ 下修改設(shè)備樹 igkboard.dts : 主節(jié)點(diǎn): 從節(jié)點(diǎn): 在源碼路徑下

    2023年04月22日
    瀏覽(25)
  • DS18B20使用說明

    DS18B20使用說明

    基礎(chǔ)介紹引腳介紹 DS18B20是單總線協(xié)議的典型代表,同時(shí)也是單總線協(xié)議最廣泛的應(yīng)用場景,是常用的數(shù)字溫度傳感器,其輸出的是數(shù)字信號。具有體積小,硬件開銷低,抗干擾能力強(qiáng),精度高的特點(diǎn)。DS18B20數(shù)字溫度傳感器接線方便,封裝成后可應(yīng)用于多種場合。 DS18B20 的溫

    2024年02月09日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包