一、前言
1.1 功能介紹
隨著工業(yè)自動(dòng)化和智能家居技術(shù)的不斷發(fā)展,精確測量和監(jiān)控環(huán)境溫度變得尤為重要。在許多應(yīng)用場景中,如倉庫管理、溫室控制、空調(diào)系統(tǒng)以及工業(yè)制造過程中,實(shí)時(shí)準(zhǔn)確地獲取環(huán)境溫度信息對于保障設(shè)備正常運(yùn)行、提高能源利用效率以及優(yōu)化生產(chǎn)流程具有重要意義。
DS18B20是一款高精度、高可靠性的數(shù)字溫度傳感器,它以其獨(dú)特的單線接口和直接輸出數(shù)字信號(hào)的特點(diǎn),簡化了溫度測量系統(tǒng)的設(shè)計(jì)。STC90C51作為一款經(jīng)典的8位微控制器,以其強(qiáng)大的數(shù)據(jù)處理能力和豐富的I/O端口資源,成為了實(shí)現(xiàn)溫度讀取和控制的理想選擇。
本項(xiàng)目設(shè)計(jì)并實(shí)現(xiàn)一個(gè)能夠?qū)崟r(shí)讀取環(huán)境溫度信息的系統(tǒng)。通過STC90C51對DS18B20進(jìn)行初始化、控制以及數(shù)據(jù)讀取,可以實(shí)現(xiàn)對環(huán)境溫度的精確測量,并將溫度數(shù)據(jù)通過顯示屏或其他輸出設(shè)備展示給用戶。該系統(tǒng)不僅可以提供實(shí)時(shí)溫度監(jiān)控功能,還可以根據(jù)溫度數(shù)據(jù)進(jìn)行相應(yīng)的控制操作,如啟動(dòng)或關(guān)閉冷卻設(shè)備、調(diào)整空調(diào)溫度等,以滿足不同應(yīng)用場景對環(huán)境溫度控制的需求。
本項(xiàng)目的開發(fā)背景體現(xiàn)了對環(huán)境溫度監(jiān)控和管理的迫切需求,通過結(jié)合STC90C51和DS18B20的技術(shù)優(yōu)勢,實(shí)現(xiàn)一個(gè)高效、精確的環(huán)境溫度測量和控制系統(tǒng),為工業(yè)自動(dòng)化和智能家居等領(lǐng)域提供有力支持。
1.2 DS1820介紹
DS1820是一款由美國Dallas半導(dǎo)體公司(后被Maxim半導(dǎo)體公司收購)推出的數(shù)字化溫度傳感器,它是世界上第一片支持“一線總線”接口的溫度傳感器。DS1820以其獨(dú)特的設(shè)計(jì)和優(yōu)異的性能,在溫度測量領(lǐng)域占據(jù)了重要地位。
DS1820的測量溫度范圍廣泛,覆蓋了從-55°C到+125°C的廣闊區(qū)間。在-10°C到+85°C的范圍內(nèi),其測量精度高達(dá)±0.5°C,這使得DS1820在各種環(huán)境條件下都能提供準(zhǔn)確可靠的溫度數(shù)據(jù)。
其DS1820采用了獨(dú)特的“一線總線”接口技術(shù),通過單一的數(shù)據(jù)線進(jìn)行通信和供電。這種設(shè)計(jì)不僅簡化了溫度測量系統(tǒng)的布線,降低了成本,還提高了系統(tǒng)的抗干擾能力和可靠性。同時(shí),DS1820還支持多個(gè)傳感器在同一總線上進(jìn)行連接,方便用戶構(gòu)建多點(diǎn)測溫系統(tǒng)。
在內(nèi)部結(jié)構(gòu)方面,DS1820采用了受溫度影響的振蕩器和計(jì)數(shù)器作為核心部件。低溫時(shí),振蕩器的脈沖可以通過門電路,使計(jì)數(shù)器對脈沖信號(hào)進(jìn)行計(jì)數(shù);高溫時(shí),振蕩器的脈沖頻率發(fā)生變化,無法通過門電路,此時(shí)計(jì)數(shù)器的計(jì)數(shù)值反映了被測溫度。通過這種方式,DS1820能夠?qū)崟r(shí)、準(zhǔn)確地測量環(huán)境溫度。
DS1820還具有一些其他特性。例如,它支持多種分辨率設(shè)置,最高可達(dá)12位,從而保證了高精度的溫度測量。同時(shí),DS1820還具有報(bào)警功能,用戶可以根據(jù)需要設(shè)定報(bào)警溫度,當(dāng)溫度超過或低于設(shè)定值時(shí),DS1820將觸發(fā)報(bào)警機(jī)制。
DS1820是一款功能強(qiáng)大、性能優(yōu)異的數(shù)字化溫度傳感器。它以其獨(dú)特的“一線總線”接口技術(shù)、廣泛的測量溫度范圍、高精度的測量能力以及豐富的功能特性,成為了溫度測量領(lǐng)域的佼佼者。無論是在環(huán)境控制、設(shè)備或過程控制、測溫類消費(fèi)電子產(chǎn)品等領(lǐng)域,DS1820都發(fā)揮著重要作用。
二、代碼實(shí)現(xiàn)
2.1 main.c
#include <reg51.h>
#include "delay.h"
#include "key.h"
#include "type.h"
#include "led.h"
#include "uart.h"
#include "timer.h"
#include "exti.h"
#include "infrared.h"
#include "ds18b20.h"
int main()
{
int temp=0;
UART_Init(); //初始化串口波特率為4800
while(1)
{
temp=DS18B20_ReadTemp();
if(temp<0) //如果溫度是負(fù)數(shù)
{
temp=temp-1;
temp=~temp;
printf("DS18b20=-%d.%drn",temp>>4,temp&0xF);
}
else
{
printf("DS18b20=%d.%drn",temp>>4,temp&0xF);
}
DelayMs(1000);
}
}
2.2 DS18B20.c
#include "ds18b20.h"
/*
說明: 在12MHZ晶振下,12T模式下,i++消耗的時(shí)間差不多是12us
*/
/*
函數(shù)名稱:u8 DS18B20_Init(void)
函數(shù)功能:向DS18B20發(fā)送復(fù)位脈沖,并檢測應(yīng)答信號(hào)
返 回 值:1表示失敗,0表示成功
說明: 51單片機(jī)IO口默認(rèn)輸出高電平
*/
u8 DS18B20_ResetSignal(void)
{
u8 i=0;
//1. 發(fā)送復(fù)位信號(hào)
DS18B20_GPIO=0;//將總線拉低480us
i=50;
while(i--){} //延時(shí)600us ,最少480us
i=0;
DS18B20_GPIO=1;//然后釋放(拉高)總線,如果DS18B20做出反應(yīng)會(huì)將在15us~60us后總線拉低
//2. 等待DS18B20拉低總線
while(DS18B20_GPIO)
{
i++;
if(i>10)return 1;//失敗 ,大概120us
}
//3. 等待DS18B20釋放總線
i=0;
while(DS18B20_GPIO==0) //60us~240us
{
i++;
if(i>20)return 1;//失敗,大概240us
}
return 0;//初始化成功
}
/*
函數(shù)名稱:u8 DS18B20_WriteByte(void)
函數(shù)功能:向DS18B20寫入一個(gè)字節(jié)的數(shù)據(jù)
函數(shù)形參:寫入的字節(jié)數(shù)據(jù)
*/
void DS18B20_WriteByte(u8 byte)
{
u16 i=0,j=0;
for(j=0;j<8;j++)
{
DS18B20_GPIO=0;//每寫入一位數(shù)據(jù)之前先把總線拉低1us
i++; //+1消耗的時(shí)間是12us
DS18B20_GPIO=byte&0x01;//然后寫入一個(gè)數(shù)據(jù),從最低位開始
i=6;
while(i--){}//持續(xù)時(shí)間最少60us,這里大概72us
DS18B20_GPIO=1;//然后釋放總線
byte>>=1;//繼續(xù)發(fā)送
}
}
/*
函數(shù)名稱:u8 DS18B20_ReadByte(void)
函數(shù)功能:從DS18B20讀取一個(gè)字節(jié)的數(shù)據(jù)
返 回 值:讀到的數(shù)據(jù)
*/
u8 DS18B20_ReadByte(void)
{
u8 byte=0;
u16 i=0,j=0;
for(j=0;j<8;j++)
{
DS18B20_GPIO=0;//先將總線拉低1us
i++;//+1消耗的時(shí)間是12us
DS18B20_GPIO=1;//然后釋放總線
i++;
i++;//至少等待15us的時(shí)間,在讀取數(shù)據(jù)
byte>>=1; //先從低位開始接收數(shù)據(jù)
if(DS18B20_GPIO)byte|=0x80;
i=4; //讀取完之后等待48us再接著讀取下一個(gè)數(shù)據(jù)
while(i--){}
}
return byte;
}
/*
函數(shù)名稱:u16 DS18B20_ReadTemp(void)
函數(shù)功能:讀取一次DS18B20的溫度數(shù)據(jù)
返 回 值:讀取的溫度值
注意: 返回值要使用有符號(hào)的數(shù)據(jù)類型,因?yàn)闇囟瓤梢苑祷刎?fù)數(shù)。
*/
int DS18B20_ReadTemp(void)
{
int temp=0;//存放溫度數(shù)據(jù)
u8 TH,TL;
//第一步: 啟動(dòng)溫度轉(zhuǎn)換
DS18B20_ResetSignal(); //發(fā)送復(fù)位脈沖并檢測應(yīng)答信號(hào)
DS18B20_WriteByte(0xcc);//跳過ROM操作命令
DS18B20_WriteByte(0x44);//溫度轉(zhuǎn)換命令
//第二步: 讀取溫度
DS18B20_ResetSignal();//發(fā)送復(fù)位脈沖并檢測應(yīng)答信號(hào)
DS18B20_WriteByte(0xcc);//跳過ROM操作命令
DS18B20_WriteByte(0xbe);//發(fā)送讀取溫度命令
TL=DS18B20_ReadByte();//讀取溫度值共16位,先讀低字節(jié)
TH=DS18B20_ReadByte();//再讀高字節(jié)
temp=TH<<8|TL; //合并成16位
return temp;
}
2.3 DS18B20.h
#ifndef _DS18B20_H
#define _DS18B20_H
#include "delay.h"
#include "type.h"
#include <reg51.h>
/*DS18B20硬件接口: P3.7*/
sbit DS18B20_GPIO=P3^7;
int DS18B20_ReadTemp(void);
#endif