一、DS18B20硬件原理圖與功能介紹
DS18B20是數(shù)字溫度傳感器,單總線接口,讀取溫度只需要一個(gè)IO口,還有不同的封裝形式,支持不同的環(huán)境。每個(gè)DS18B20還有64位的光刻ROM序列號(hào),支持一個(gè)IO口上掛載多個(gè)DS18B20時(shí),區(qū)分設(shè)備,也就是支持級(jí)聯(lián),非常方便,不費(fèi)IO口。
下面就介紹在STM32F407上面如果驅(qū)動(dòng)DS18B20讀取溫度,代碼采用keil編寫,采用多文件的形式,代碼分為3個(gè)部分:
- DS18B20.c文件,主要是核心函數(shù)的實(shí)現(xiàn)。
- DS18B20.h文件,函數(shù)的聲明。
- main.c文件。主函數(shù),調(diào)用DS18B20讀取文件,并換算之后打印出來(lái)。
下面是DS18B20在開(kāi)發(fā)板上的原理圖:
二、DS18B20核心代碼
2.1 DS18B20.c源碼
#include "ds18b20.h"
/*
函數(shù)功能:DS18b20IO口初始化
硬件連接:PG9
復(fù)用表示自動(dòng)輸出數(shù)據(jù)
通用表示手動(dòng)輸出數(shù)據(jù)
*/
void DS18B20_Init(void)
{
/*1. 開(kāi)時(shí)鐘*/
RCC->AHB1ENR|=1<<6;//使能PORTG時(shí)鐘
/*2. 初始化IO模式*/
DS18B20_OUTPUT();
}
/*
函數(shù)功能:等待DS18B20的回應(yīng)
返回1:未檢測(cè)到DS18B20的存在
返回0:存在
*/
u8 DS18B20_Check(void)
{
u8 retry=0;
DS18B20_INPUT() //設(shè)置DS18B20輸入模式
while(DS18B20_IN&&retry<200)
{
retry++;
DelayUs(1);
};
if(retry>=200)return 1;
else retry=0;
while(!DS18B20_IN&&retry<240)
{
retry++;
DelayUs(1);
};
if(retry>=240)return 1;
return 0;
}
/*
從DS18B20讀取一個(gè)字節(jié)
返回值:讀到的數(shù)據(jù)
*/
u8 DS18B20_ReadByte(void)
{
u8 i,data=0;
for(i=0;i<8;i++)
{
DS18B20_OUTPUT(); //初始化為輸出模式
DS18B20_OUT=0; //輸出0
DelayUs(2);
DS18B20_OUT=1; //上拉總線電平
DS18B20_INPUT() //初始化為輸入模式
DelayUs(12);
data>>=1;
if(DS18B20_IN)
{
data|=0x80;
}
DelayUs(50);
}
return data;
}
/*
寫一個(gè)字節(jié)到DS18B20
dat:要寫入的字節(jié)
*/
void DS18B20_WriteByte(u8 dat)
{
u8 i;
DS18B20_OUTPUT(); //初始化IO為輸出模式
for(i=0;i<8;i++)
{
if(dat&0x01) //先發(fā)低位
{
DS18B20_OUT=0;//輸出0
DelayUs(2);
DS18B20_OUT=1;//輸出1
DelayUs(60);
}
else
{
DS18B20_OUT=0;//輸出0
DelayUs(60);
DS18B20_OUT=1;//輸出1
DelayUs(2);
}
dat>>=1;
}
}
/*
從ds18b20得到溫度值
精度:0.1C
返回值:溫度值 (-550~1250)
*/
short DS18B20_Get_Temp(void)
{
u16 temp;
u8 TL,TH;
DS18B20_OUTPUT();
DS18B20_OUT=0; //輸出0 //拉低DQ
DelayUs(750); //拉低750us
DS18B20_OUT=1; //輸出1 //DQ=1
DelayUs(15); //15US
DS18B20_Check();
DS18B20_WriteByte(0xcc); //跳過(guò)芯片ID檢測(cè)
DS18B20_WriteByte(0x44); //轉(zhuǎn)換一次溫度
DS18B20_OUTPUT();
DS18B20_OUT=0; //輸出0 //拉低DQ
DelayUs(750); //拉低750us
DS18B20_OUT=1; //輸出1 //DQ=1
DelayUs(15); //15US
DS18B20_Check();
DS18B20_WriteByte(0xcc);// 跳過(guò)芯片ID檢測(cè)
DS18B20_WriteByte(0xbe);// 讀取轉(zhuǎn)換成功的溫度數(shù)據(jù)
TL=DS18B20_ReadByte(); // LSB
TH=DS18B20_ReadByte(); // MSB
temp=((u16)TH<<8)|TL;
return temp;
}
復(fù)制代碼
DS18B20.h源碼
#ifndef _DS18B20_H
#define _DS18B20_H
#include "stm32f4xx.h"
#include "sys.h"
#include "delay.h"
void DS18B20_Init(void);
short DS18B20_Get_Temp(void);
#define DS18B20_IN PGin(9)
#define DS18B20_OUT PGout(9)
#define DS18B20_INPUT() \
{\
GPIOG->MODER&=~(0x3<<9*2);\
GPIOG->MODER|=0x0<<9*2;\
GPIOG->PUPDR&=~(0x3<<9*2);\
GPIOG->PUPDR|=0x1<<9*2;\
}
#define DS18B20_OUTPUT() \
{\
GPIOG->MODER&=~(0x3<<9*2);\
GPIOG->MODER|=0x1<<9*2;\
GPIOG->OTYPER&=~(0x1<<9);\
GPIOG->OSPEEDR&=~(0x3<<9*2);\
GPIOG->OSPEEDR|=0x2<<9*2;\
GPIOG->ODR|=1<<9;\
}
#endif
復(fù)制代碼
main.c源碼
#include "stm32f4xx.h" // Device header
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "sys.h"
#include "exti.h"
#include "timer.h"
#include "pwm.h"
#include "ds18b20.h"
int main(void)
{
short temp;
unsigned short intT,decT; //溫度值的整數(shù)和小數(shù)部分
LED_Init();
KEY_Init();
USART1_Init(84,115200);
KEY_EXTI_Init();
DS18B20_Init();
while(1)
{
/*讀取溫度信息*/
temp=DS18B20_Get_Temp();
intT = temp >> 4; //分離出溫度值整數(shù)部分
decT = temp & 0xF; //分離出溫度值小數(shù)部分
printf("DS18B20: %d.%d *C\r\n",(int)intT,(int)decT);
DelayMs(1000);
}
}
復(fù)制代碼
溫度讀取效果
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
溫度傳感器
+關(guān)注
關(guān)注
48文章
3210瀏覽量
163071 -
DS18B20
+關(guān)注
關(guān)注
10文章
782瀏覽量
83332 -
STM32F407
+關(guān)注
關(guān)注
15文章
189瀏覽量
31624
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
基于STM32的DS18B20溫度傳感器設(shè)計(jì)
DS18B20內(nèi)置了64位產(chǎn)品序列號(hào),方便識(shí)別身份,在一根線上可以掛接多個(gè)DS18B20傳感器,通過(guò)64位身份驗(yàn)證,可以分別讀取來(lái)至不同傳感器采集的
[MicroPython]stm32f407控制DS18B20檢測(cè)溫度
元器件 F407Micropython開(kāi)發(fā)板1塊 數(shù)據(jù)線1條 DS18b20溫度傳感器1個(gè) DS18B2
發(fā)表于 08-13 16:42
DS18B20溫度傳感器簡(jiǎn)介
DS18B20溫度傳感器1. DS18B20簡(jiǎn)介2. 硬件設(shè)計(jì)3. 軟件設(shè)計(jì)3.1 STM32CubeMX設(shè)置3.2 MDK-ARM編程4.
發(fā)表于 08-12 07:32
DS18B20溫度傳感器實(shí)驗(yàn)
單片機(jī)驅(qū)動(dòng)DS18B20溫度傳感器實(shí)現(xiàn)溫度的串口打印顯示,本實(shí)驗(yàn)中STM32基于HAL庫(kù)開(kāi)發(fā)。本
發(fā)表于 08-18 07:44
stm32f407+DS18B20讀出的溫度顯示在TFT屏幕上
stm32f407 + DS18B20 碰出不一樣的火花,DS18B20相關(guān)知識(shí)以及單總線協(xié)議。 最后將讀出的溫度顯示在 TFT 屏幕上。
發(fā)表于 08-24 06:34
數(shù)字溫度傳感器DS18B20的設(shè)計(jì)及應(yīng)用
數(shù)字溫度傳感器DS18B20的設(shè)計(jì)及應(yīng)用
1引言
DS18B20是DALLAS公司生產(chǎn)的一線式數(shù)字溫度
發(fā)表于 04-02 18:00
?3373次閱讀
DS18B20數(shù)字溫度傳感器
本設(shè)計(jì)基于單片機(jī)STM32開(kāi)發(fā)板,對(duì)DS18B20數(shù)字溫度傳感器進(jìn)行控制,有源代碼
發(fā)表于 05-11 14:54
?42次下載
智能溫度傳感器DS18B20的原理與應(yīng)用
DS18B20是DALLAS公司生產(chǎn)的單線數(shù)字溫度傳感器,他具有獨(dú)特的單線總線接口方式。文章詳細(xì)的介紹了單線數(shù)字溫度傳感器
發(fā)表于 10-11 18:19
?50次下載
ds18b20的特性_ds18b20溫度傳感器應(yīng)用
本文首先介紹了ds18b20的特性,其次介紹了DS18B20工作原理,最后介紹了ds18b20溫度傳感器應(yīng)用。
發(fā)表于 04-24 09:10
?1.2w次閱讀
STM32入門開(kāi)發(fā): 編寫DS18B20溫度傳感器驅(qū)動(dòng)(讀取環(huán)境溫度、支持級(jí)聯(lián))
一、環(huán)境介紹編程軟件: keil5操作系統(tǒng): win10STM32編程方式: 寄存器開(kāi)發(fā) (方便程序移植到其他單片機(jī))溫度傳感器:
發(fā)表于 11-21 11:51
?46次下載
STM32F207 DS18B20數(shù)字式溫度傳感器調(diào)試記錄
STM32F207 DS18B20數(shù)字式溫度傳感器調(diào)試記錄平臺(tái):STM32F207 HAL庫(kù)。調(diào)試內(nèi)容:通過(guò)
發(fā)表于 11-25 11:21
?16次下載
STM32CubeMX系列|DS18B20溫度傳感器
DS18B20溫度傳感器1. DS18B20簡(jiǎn)介2. 硬件設(shè)計(jì)3. 軟件設(shè)計(jì)3.1 STM32CubeMX設(shè)置3.2 MDK-ARM編程4.
發(fā)表于 01-18 10:04
?19次下載
STM32 DS18B20溫度傳感器實(shí)驗(yàn)(HAL庫(kù))
單片機(jī)驅(qū)動(dòng)DS18B20溫度傳感器實(shí)現(xiàn)溫度的串口打印顯示,本實(shí)驗(yàn)中STM32基于HAL庫(kù)開(kāi)發(fā)。本
發(fā)表于 01-18 10:08
?48次下載
ds18b20溫度傳感器如何使用
DS18B20是一款廣泛使用的數(shù)字溫度傳感器,它具有高精度、低功耗和易于使用的特點(diǎn)。 DS18B20溫度
STM32F407入門開(kāi)發(fā): DS18B20溫度傳感器應(yīng)用
評(píng)論