一、DS18B20溫度傳感器
DS18B20是常用的數字溫度傳感器,其輸出的是數字信號,具有體積小,硬件開銷低,抗干擾能力強,精度高的特點。DS18B20數字溫度傳感器接線方便,封裝成后可應用于多種場合,如管道式,螺紋式,磁鐵吸附式,不銹鋼封裝式,型號多種多樣,有LTM8877,LTM8874等等。
主要根據應用場合的不同而改變其外觀。封裝后的DS18B20可用于電纜溝測溫,高爐水循環測溫,鍋爐測溫,機房測溫,農業大棚測溫,潔凈室測溫,彈藥庫測溫等各種非極限溫度場合。耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設備數字測溫和控制領域。
二、DS18B20常見封裝
圖1 DS18B20常見封裝
三、DS18B20的驅動程序
1. 頭文件
#ifndef DS18B20_H
#define DS18B20_H
#include
#include
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
/ 18b20 */
sbit DQ=P4^5;
extern uchar TPH,TPL,temp; //溫度值及中間變量的變量聲明
void DelayXus(uchar n);
void DS18B20_Reset();
uchar DS18B20_ReadByte();
void DS18B20_WriteByte(uchar dat1);
void DS18B20(); //使用時調用該函數即可
#endif
2. 主程序
#include "DS18B20.h"
void DelayXus(uchar n) //延時函數要根據單片機的時間周期來改寫,一般控制在1-2us
{
while (n--);
{
_nop_();
_nop_();
}
}
/**************************************
復位DS18B20,并檢測設備是否存在
**************************************/
void DS18B20_Reset()
{
CY = 1;
while (CY)
{
DQ = 0; //送出低電平復位信號
DelayXus(240); //延時至少480us
DelayXus(240);
DQ = 1; //釋放數據線
DelayXus(60); //等待60us
CY = DQ; //檢測存在脈沖
DelayXus(240); //等待設備釋放數據線
DelayXus(180);
}
}
/**************************************
從DS18B20讀1字節數據
**************************************/
uchar DS18B20_ReadByte()
{
uchar i;
uchar dat1 = 0;
for (i=0; i<8; i++) //8位計數器
{
dat1 > >= 1;
DQ = 0; //開始時間片
DelayXus(1); //延時等待
DQ = 1; //準備接收
DelayXus(1); //接收延時
if (DQ) dat1 |= 0x80; //讀取數據
DelayXus(60); //等待時間片結束
}
return dat1;
}
/**************************************
向DS18B20寫1字節數據
**************************************/
void DS18B20_WriteByte(uchar dat1)
{
char i;
for (i=0; i<8; i++) //8位計數器
{
DQ = 0; //開始時間片
DelayXus(1); //延時等待
dat1 > >= 1; //送出數據
DQ = CY;
DelayXus(60); //等待時間片結束
DQ = 1; //恢復數據線
DelayXus(1); //恢復延時
}
}
/**************************************
向DS18B20讀取溫度數據并轉換
**************************************/
void DS18B20()
{
DS18B20_Reset(); //設備復位
DS18B20_WriteByte(0xCC); //跳過ROM命令
DS18B20_WriteByte(0x44); //開始轉換命令
while (!DQ); //等待轉換完成
DS18B20_Reset(); //設備復位
DS18B20_WriteByte(0xCC); //跳過ROM命令
DS18B20_WriteByte(0xBE); //讀暫存存儲器命令
TPL = DS18B20_ReadByte(); //讀溫度低字節
TPH = DS18B20_ReadByte(); //讀溫度高字節
temp=(TPL+TPH*256)*0.0625;
}
3. 使用說明
該程序基于STC15F2K60S2單片機,如果需要在其他的單片機上使用,需要將引用的頭文件、引腳定義以及延時函數進行更改即可。若有其他需求,自行修改。
四、溫度值傳送到USART HMI上顯示
1.前期準備
首先要做好USART HMI的顯示界面,本項目的顯示界面如圖3所示。所用到的控件為右邊當前溫度值,該控件對應的是文本框t6,發送的指令格式為:
字符串+結束符:t6.txt=”溫度值” FF FF FF (三個FF的十六進制數)
例如發送溫度值50℃,發送的指令為:t6.txt=”50”FFFFFF
圖3 USART HMI顯示界面
2.部分程序
(1)數據發送程序
uchara=0,b=0,c=0,d=0,e=0,f=0;
/ 顯示溫度 /
a= CODE[temp/10]; //溫度十位數值
b= CODE[temp%10]; //溫度個位數值
c= CODE[temp_target/10]; //目標溫度十位數值
d= CODE[temp_target%10]; //目標溫度個位數值
write_txt("t6.txt="); //發送文本
write_COM(34); //雙引號
write_COM(a);
write_COM(b);
write_COM(34); //雙引號
write_END(); //結束符
(2)單片機串口通信部分程序
①頭文件
#ifndef UART_H
#define UART_H
#include
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
extern uchar pageflag1; //返回頁面ID的標志1
extern uchar pageflag2; //返回頁面ID的標志2
extern uchar pageflag_ID; //返回頁面ID的標志3
extern uchar page_end; //頁面結束數據檢測,滿3代表結束
extern uchar pageID; //頁面ID號
void write_COM(uchar COM);
void write_txt(char *s);
void write_END(void);
void UART_Init();
#endif
②主程序
#include "UART.h"
/ 串口送數據 */
void write_COM(uchar COM)
{
SBUF=COM;
while(!TI);
TI=0;
}
/ 發送文本串 */
void write_txt(char *s)
{
inti=0;
while(s[i]!=0)
{
write_COM(s[i]);
i++;
}
}
/ 發送結束符 */
void write_END(void)
{
write_COM(0xFF);
write_COM(0xFF);
write_COM(0xFF);
}
/ 串口初始化 */
void UART_Init()
{
//串口1 初始化
SCON = 0x50;
// P_SW1&= 0x7f;
// P_SW1|= 0x40;//uart1切換到P3^6P3^7
AUXR &= 0xBE;
AUXR |= 0x00;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1= 0xfd;
TL1= 0xfd;
TR1= 1; //定時器1啟動
ES= 1; //開放串口中斷
EA= 1;
// //串口2 初始化
// S2CON = 0x10;
// T2L = 0xE8;
// T2H = 0xFF;
// AUXR &= 0xE3;
// AUXR |= 0x10;
// IE2 &= 0xFE;
// IE2 |= 0x01;
}
/ UART1 中斷服務程序 *******/
void Uart1(void) interrupt 4
{
uchardataflag=0;//返回的十六進制數據的第一位
ES= 0; //暫時關閉串口中斷
if(RI) //如果是接收中斷
{
RI=0;
dataflag = SBUF; //將接收緩沖區的數據保存到dataflag變量中
/***********頁面接收**********/
if(dataflag== 0x66) pageflag1 = 1; //正在接收頁面ID數據
if(pageflag1== 1)
{
pageflag2++;
if(pageflag2== 2)
{
pageflag_ID= dataflag;//接收頁面ID號
}
if(dataflag== 0xff) //開始接收結束符
{
page_end++;
if(page_end== 3) //接收3個結束符,數據接收完成
{
pageID= pageflag_ID;
pageflag1= 0;
pageflag2= 0;
pageflag_ID= 0;
page_end= 0;
}
}
}
}
else //如果是發送中斷,將TI清0
TI= 0;
ES= 1; //打開串口中斷
}
注:串口中斷函數里對頁面ID的程序接收還存在一些問題,后期修改完畢再對此進行更正。
-
計數器
+關注
關注
32文章
2284瀏覽量
96051 -
DS18B20
+關注
關注
10文章
782瀏覽量
81978 -
串口通信
+關注
關注
34文章
1636瀏覽量
56563 -
USART
+關注
關注
1文章
200瀏覽量
31637 -
數字溫度傳感器
+關注
關注
0文章
191瀏覽量
15693
發布評論請先 登錄
智能溫度傳感器DS18B20的原理與應用
DS18B20溫度傳感器的溫度程序和驅動以及案例實現資料說明

使用1602LCD顯示DS18B20數字溫度傳感器的溫度值程序免費下載

ds18b20的特性_ds18b20溫度傳感器應用

LM016L顯示DS18B20溫度傳感器的溫度值的程序和仿真資料免費下載

評論