DS18B20是一個非常簡單的溫度傳感器,對于像我這樣單片機萌新是比較友好的。網(wǎng)上關于它的介紹非常多,包括原理、引腳、通信、以及51單片機、STM32的各種代碼等等。本人寫了一個簡單的ds18b20.c庫文件分享給大家,該文件內(nèi)的函數(shù)可以實現(xiàn)單個元件的單次測溫功能,溫度精確到整數(shù)。這個程序在STM32F103C8上進行了實際測試,但是稍加修改就可以移植到其他類型的單片機上。
DS18B20的引腳定義、線路連接、工作時序、指令含義等,在他人寫的文章中有詳細闡述,在這里不再介紹。值得注意的是,經(jīng)過我多次測試,發(fā)現(xiàn)在有VCC供電的情況下,VCC穩(wěn)定在3.1V以上,才能正常測溫;而如果使用數(shù)據(jù)線供電,在我單片機3.3V的VCC下沒法正常測溫(或許5V的VCC可以,但我沒試驗過)所以不推薦這種方法。
首先是頭文件ds18b20.h:
#ifndef INC_DS18B20_H_
#define INC_DS18B20_H_
#define DS18_GPIO_Port GPIOB
#define DS18_Pin GPIO_PIN_0
unsigned char ds18b20_Init(void);
char readtemp(void);
void ds18b20start(void);
#endif /* INC_DS18B20_H_ */
頭文件中#define 這兩行是對ds18b20數(shù)據(jù)線對應管腳的定義,用戶需要根據(jù)自己單片機上連接的管腳進行修改。需要注意的是,下面ds18b20_Init()中并沒有包含管腳的初始化。用戶需要在調(diào)用該函數(shù)之前先完成對GPIO管腳的初始化操作,將其配置成為開漏輸出模式并配置上拉電阻。(我用的STM32Cube,自動生成了對GPIO管腳的初始化函數(shù))
下面三個函數(shù)是main函數(shù)中需要調(diào)用的函數(shù)。具體調(diào)用方法如下:
-
在初始化時調(diào)用ds18b20_Init()函數(shù)。
-
每次測量溫度前,都要先調(diào)用ds18b20start()函數(shù)。
-
調(diào)用完ds18b20start()后,需要等至少500ms,其測量完溫度后再調(diào)用readtemp()函數(shù)進行讀?。▎挝皇菙z氏度)。
接下來是這些函數(shù)的具體實現(xiàn),即ds18b20.c:
/*
* ds18b20.c
*
* Created on: Dec 20, 2021
* Author: ASUS
* 使用前必讀
* 需要修改的部分包括:
* 1.在DELAY_Us中,修改__NOP()的數(shù)量,CPU頻率是多少MHz,就用多少個NOP.
* 2.添加或修改DS18_GPIO_Port,DS18_Pin的重定義內(nèi)容,使之匹配對應的端口。
* 3.如HAL_GPIO_WritePin()和HAL_GPIO_ReadPin沒有定義,則自己寫一個。
* 4.在主程序中,需要對響應的GPIO端口進行初始化,設置為開漏輸出和上拉電阻模式。
* 本文件只有單次測量溫度的程序。調(diào)用函數(shù)的方法:
* 開機先用ds18b20_Init(void)初始化。每次測量前先用ds18b20start()開始測溫,等大約0.5s后用readtemp()讀取結果。
*/
#include "ds18b20.h"
#include "main.h"
void DELAY_Us(unsigned int count)
{
while(count--)
{
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
}
}
unsigned char ds18b20_Init(void)
{
/*****初始化DS18B20*****/
unsigned char x=0;
HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,1); //DQ復位
DELAY_Us(30); //稍做延時
HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,0); //單片機將DQ拉低
DELAY_Us(500); //精確延時,大于480us
HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,1); //拉高總線
DELAY_Us(100);
x=HAL_GPIO_ReadPin(DS18_GPIO_Port,DS18_Pin); //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗
DELAY_Us(500);
return x;
}
void ds18b20_Write1byte(unsigned char data)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,0);
DELAY_Us(3);
HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,data&0x01);
DELAY_Us(70);
HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,1);
DELAY_Us(3);
data>>=1;
}
DELAY_Us(30);
}
unsigned char ds18b20_Read1byte(void)
{
unsigned char i,j,dat;
dat=0;
for (i=1;i<=8;i++)
{
HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,0);
DELAY_Us(3);
HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,1);
DELAY_Us(18);
j=HAL_GPIO_ReadPin(DS18_GPIO_Port,DS18_Pin);
DELAY_Us(50);
dat=(j<<7)|(dat>>1);
}
return dat;
}
void ds18b20start(void)
{
ds18b20_Init();
ds18b20_Write1byte(0xcc);
ds18b20_Write1byte(0x44);
}
char readtemp(void)
{
unsigned char TL=0x01,TH=0x07;
char temp;
ds18b20_Init();
ds18b20_Write1byte(0xcc);
ds18b20_Write1byte(0xbe);
TL=ds18b20_Read1byte();
DELAY_Us(1);
TH=ds18b20_Read1byte();
temp=(char)((TH<<4)|TL>>4);
return temp;
}
這里首先一個函數(shù)是微秒級延時函數(shù)DELAY_Us()。這里使用了一個簡單的__NOP()做延時。這實際上對應著CPU的匯編指令,表示延時一個時鐘周期,什么都不做。所以用戶需要根據(jù)CPU時鐘頻率修改__NOP()的個數(shù),頻率是多少MHz就加多少個__NOP()。當然,不同單片機的指令名稱可能有所不同,用戶自行替換就行了。
用戶還需要修改的一部分是對GPIO端口的讀寫操作函數(shù)。我這里用的STM32HAL庫,所以用的是HAL_GPIO_WritePin()和HAL_GPIO_ReadPin()函數(shù)。如果大家沒有此庫函數(shù),就在本文件下面寫一個,重新定義一下。
用戶修改完上述部分后,就可以在主程序中調(diào)用ds18b20.h中的三個函數(shù),進行溫度的測量了。測量的結果就可以根據(jù)你喜歡的方式進行輸出~(不過這就不是本文件需要包含的內(nèi)容了)文章來源:http://www.zghlxwxcb.cn/news/detail-452494.html
如果有錯誤,還請在評論區(qū)指正。如果想看多點測溫,歡迎在評論區(qū)留言,想看的人多我就寫一寫(嘿嘿文章來源地址http://www.zghlxwxcb.cn/news/detail-452494.html
到了這里,關于DS18B20溫度測量程序文件(簡單通用)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!