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