目錄
DS18B20簡介
DS18B20是常用的數字溫度傳感器,其輸出的是數字信号,具有體積小,硬件開銷低,抗幹擾能力強,精度高的特點。傳感器可在3~5.5V電壓工作,測溫範圍可達-55℃~ 125℃(雖然芯片手冊能到這個範圍個人建議留有70%餘地使用,原因你懂的),精度的話也能到±0.5℃(在-10 — 85℃範圍内)傳感器較為簡單,基本的關于測溫範圍精度參數就是如上了。下圖為常見搭建好簡易電路的DS18B20模塊
二、DS18B20寄存器配置
在DS18B20的手冊中可以找到下面關于功能框圖以及存儲映射的部分的内容
字節0和1為隻讀寄存器,其中包含了我們主要需要獲取的溫度數據,字節2和3分别設置達到報警溫度的上限值和下限值,其他的寄存器我們一般不用默認不動就行,傳感器分辨率默認12位
當溫度轉換的命令發送到傳感器的時候,經過傳感器轉換之後得到的溫度數值将會以二進制字節補碼的形式存儲在上述寄存器的第0字節和第1字節,第0字節中存儲溫度數據的低位,第1字節中存儲高位
對溫度進行讀取時,讀取寄存器的低位在前,高位在後,轉換之後得到的二進制數據最高位為符号位S,當符号位S=0時,直接将二進制位轉換為十進制即可,而當S=1時,需要先将補碼變為原碼,再計算十進制值,具體關于補碼原碼知識可自行百度,資料應該挺多的,下圖為溫度寄存器的格式說明
内部框圖以及寄存器部分大緻就如上所述,程序編寫主要可以分為三個步驟
1、初始化
2、ROM指令(跟随任意必需的數據交換)
3、DS18B20 功能指令(跟随任意必 需的數據交換)
三、例程燒錄與接線
關于程序編寫部分就不在此做出說明了,個人覺得意義不大,下面我們直接燒錄編寫好的程序(需要程序可在下方留言郵箱或私信郵箱),具體程序編寫對照着程序代碼和手冊時序相信自己研究一遍對自己的幫助會更大。
下圖展示了DS18B20的引腳,并且模塊上已經上拉了電阻,闆載了電源指示燈
ps:DS18B20正常通信時需要上拉電阻,原因可自行百度
引腳功能可參照下表
51單片機程序燒錄與接線
51單片機驅動單總線設備的教程中應該有非常多的教學是使用的DS18B20進行教學的,也是非常經典的單總線設備,想想當初學51單片機單總線也是驅動的DS18B20甚是懷念,話不多說,直接看51單片機的程序與接線
程序效果
我這裡使用STC89C52單片機接上DS18B20與LCD1602的屏幕之後,燒錄程序,1602顯示屏上會顯示獲取到的溫度數據,并且會在單片機串口持續輸出獲取到的溫度數據
下面看到程序關鍵部分(需要程序可在下方留言或者私信郵箱)
void UsartInit()
{
SCON=0X50; //設置為工作方式1 ,既然是方式一,自然要确定波特率,設置定時器1
TMOD=0X20;//8位重裝載
PCON=0X00;
TH1=0xFd;//波特率9600
TL1=0XFd;
ES=1; //打開通信中斷
EA=1; //打開總中斷
TR1=1; //打開計數器
}
上面部分函數在主函數中為串口初始化部分,一般需要修改波特率的可以自行計算 TH1=0xFd; TL1=0XFd; 的值(不會計算百度找找51串口通信教程,挺多的)
#define LCD P2
sbit E=P0^5;
sbit RS=P0^7;
sbit RW=P0^6;
sbit BF=P2^7;
在工程中打開 1602.h 看到上述部分為頭部定義的引腳,可自行修改到适當位置接自己的1602屏幕,18B20接線或者修改接線端口打開 18B20.h 找到下面部分代碼
#include<reg52.h>
#include<intrins.h>
sbit DQ=P0^4;
上述 sbit DQ=P0^4; 定義了18B20連接的端口
默認接線可參照下表
下方為使用的51單片機系統闆以及電路原理圖
原理圖
接好線燒錄程序之後的圖片,51單片機燒錄程序自行百度,相信我百度能解決很多問題
我這塊開發闆是自帶了USB-TTL的轉換電路,如果是使用最小系統闆不帶下載電路的話可自行購買USB-TTL的模塊接到單片機的P30和P31端口做串口通信
打開串口軟件,找到對應識别的端口,通信參數配置成96N81模式即可,打開串口之後不要勾選十六進制顯示就可以看到正常發送到電腦上的溫度數據,如下圖所示
stm32程序燒錄與接線
stm32的性能相比51單片機會高出很多,使用stm32驅動DS18B20的案例個人見到的相對來說較少,不過這裡還是找了個串口程序然後将上面51單片機的程序移植過來,感覺和重寫一遍區别不大,草率了(需要程序的都可以在下方留言或者私信郵箱)
程序默認使用的是PA0端口,有需要修改端口的可以找到 main.c 中的時鐘初始化函數 void RCC_Configuration(void)//時鐘初始化 修改需要使用端口的時鐘(不一定要修改,視情況而定)
void RCC_Configuration(void)//時鐘初始化
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1串口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}
端口配置函數 void GPIO_Configuration(void)//GPIO端口配置 函數中可以修改對應使用的端口
void GPIO_Configuration(void)//GPIO端口配置
{
GPIO_InitTypeDef GPIO_InitStructure;
/*PA9,tx*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*PA10,rx*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*PA0,DS18B20使用端口*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; //設置IO口為開漏輸出模式*/
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStructure);
}
上面是端口配置部分,找到 pbdata.h 文件打開,文件中有三個宏定義對應着高低電平的輸出,可以參照程序中的備注
#define DS18B20_DQ_OUT_Low GPIO_ResetBits(GPIOA,GPIO_Pin_0) //數據端口 PA0 輸出低電平
#define DS18B20_DQ_OUT_High GPIO_SetBits(GPIOA,GPIO_Pin_0) //數據端口 PA0 輸出高電平
#define DS18B20_DQ_IN GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) //數據端口 PA0 讀取
默認接線參照下表即可
DS18B20接好線之後在串口1會持續輸出檢測到的溫度數據,和51的闆子一樣用了一塊帶USB-TTL電路的闆子,沒有的話自己弄個USB-TTL的模塊接到STM32的串口1上面就行,串口助手換成了XCOM,之前那個HC的不知道什麼情況就接收不到數據了
ps:沒找到哪裡的問題不知道是軟件bug還是代碼導緻的
接線的圖片
打開串口助手選擇對應的端口号,參數配置成96N81,如下圖所示
arduino程序燒錄與接線
arduino相較于其他的單片機有非常多的庫供調用,大大加快了開發調試的速度,同樣的我們也是調用arduino IDE管理庫裡面的庫進行修改(需要的小夥伴可以在下方留言郵箱或者自行在管理庫裡面搜索DS18B20下載即可)
程序中有定義DS18B20連接的數據引腳,波特率參數,功能實現在串口輸出器件地址,精度,模式,溫度信息相關信息
#include <DS18B20.h>
DS18B20 ds(2);
void setup() {
Serial.begin(115200);
Serial.print("Devices: ");
Serial.println(ds.getNumberOfDevices());
Serial.println();
}
代碼段 DS18B20 ds(2); 中的 2 表示接到arduino的2号引腳,可适當根據自己的需求修改為其他引腳進行連接,Serial.begin(115200); 定義波特率為 115200 ,同樣可進行修改,接線按照下表進行連接即可
下圖為連接之後的圖片
燒錄提供的程序中Multiple的之後,打開arduino編譯器的串口監視器查看輸出的數據
四、總結
DS18B20為較為常見的單總線測溫器件,在51單片機的學習過程中使用較多,以上提供的三種單片機的數據采集之後串口輸出溫度數據基本可以滿足大部分場合移植使用,電路上如果采用單獨的傳感器不是模塊一定要記得上拉電阻(單片機上拉模式應該也沒問題,不過沒有用過),需要程序等資料的朋友在下方留言或者私信郵箱即可,看到就會發過去,歡迎留言交流,大家互相學習互相進步!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!