• 方案介紹
  • 附件下載
  • 相關推薦
申請入駐 產業(yè)圖譜

讀取DS18B20溫度、測量環(huán)境溫度信息(單只DS18B20寫法)

06/21 14:50
1330
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

更多詳細資料請聯(lián)系.docx

共1個文件

一、前言

1.1 功能介紹

隨著工業(yè)自動化智能家居技術的不斷發(fā)展,精確測量和監(jiān)控環(huán)境溫度變得尤為重要。在許多應用場景中,如倉庫管理、溫室控制、空調系統(tǒng)以及工業(yè)制造過程中,實時準確地獲取環(huán)境溫度信息對于保障設備正常運行、提高能源利用效率以及優(yōu)化生產流程具有重要意義。

DS18B20是一款高精度、高可靠性的數(shù)字溫度傳感器,它以其獨特的單線接口和直接輸出數(shù)字信號的特點,簡化了溫度測量系統(tǒng)的設計。STC90C51作為一款經典的8位微控制器,以其強大的數(shù)據(jù)處理能力和豐富的I/O端口資源,成為了實現(xiàn)溫度讀取和控制的理想選擇。

本項目設計并實現(xiàn)一個能夠實時讀取環(huán)境溫度信息的系統(tǒng)。通過STC90C51對DS18B20進行初始化、控制以及數(shù)據(jù)讀取,可以實現(xiàn)對環(huán)境溫度的精確測量,并將溫度數(shù)據(jù)通過顯示屏或其他輸出設備展示給用戶。該系統(tǒng)不僅可以提供實時溫度監(jiān)控功能,還可以根據(jù)溫度數(shù)據(jù)進行相應的控制操作,如啟動或關閉冷卻設備、調整空調溫度等,以滿足不同應用場景對環(huán)境溫度控制的需求。

本項目的開發(fā)背景體現(xiàn)了對環(huán)境溫度監(jiān)控和管理的迫切需求,通過結合STC90C51和DS18B20的技術優(yōu)勢,實現(xiàn)一個高效、精確的環(huán)境溫度測量和控制系統(tǒng),為工業(yè)自動化和智能家居等領域提供有力支持。

image-20240612132239162

image-20240612132253790

image-20240612132310061

1.2 DS1820介紹

DS1820是一款由美國Dallas半導體公司(后被Maxim半導體公司收購)推出的數(shù)字化溫度傳感器,它是世界上第一片支持“一線總線”接口的溫度傳感器。DS1820以其獨特的設計和優(yōu)異的性能,在溫度測量領域占據(jù)了重要地位。

DS1820的測量溫度范圍廣泛,覆蓋了從-55°C到+125°C的廣闊區(qū)間。在-10°C到+85°C的范圍內,其測量精度高達±0.5°C,這使得DS1820在各種環(huán)境條件下都能提供準確可靠的溫度數(shù)據(jù)。

其DS1820采用了獨特的“一線總線”接口技術,通過單一的數(shù)據(jù)線進行通信和供電。這種設計不僅簡化了溫度測量系統(tǒng)的布線,降低了成本,還提高了系統(tǒng)的抗干擾能力和可靠性。同時,DS1820還支持多個傳感器在同一總線上進行連接,方便用戶構建多點測溫系統(tǒng)。

在內部結構方面,DS1820采用了受溫度影響的振蕩器計數(shù)器作為核心部件。低溫時,振蕩器的脈沖可以通過門電路,使計數(shù)器對脈沖信號進行計數(shù);高溫時,振蕩器的脈沖頻率發(fā)生變化,無法通過門電路,此時計數(shù)器的計數(shù)值反映了被測溫度。通過這種方式,DS1820能夠實時、準確地測量環(huán)境溫度。

DS1820還具有一些其他特性。例如,它支持多種分辨率設置,最高可達12位,從而保證了高精度的溫度測量。同時,DS1820還具有報警功能,用戶可以根據(jù)需要設定報警溫度,當溫度超過或低于設定值時,DS1820將觸發(fā)報警機制。

DS1820是一款功能強大、性能優(yōu)異的數(shù)字化溫度傳感器。它以其獨特的“一線總線”接口技術、廣泛的測量溫度范圍、高精度的測量能力以及豐富的功能特性,成為了溫度測量領域的佼佼者。無論是在環(huán)境控制、設備或過程控制、測溫類消費電子產品等領域,DS1820都發(fā)揮著重要作用。

二、代碼實現(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) //如果溫度是負數(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++消耗的時間差不多是12us
*/

/*
函數(shù)名稱:u8 DS18B20_Init(void)
函數(shù)功能:向DS18B20發(fā)送復位脈沖,并檢測應答信號
返 回 值:1表示失敗,0表示成功
說明: 51單片機IO口默認輸出高電平
*/
u8 DS18B20_ResetSignal(void)
{
	u8 i=0;
    //1. 發(fā)送復位信號
	DS18B20_GPIO=0;//將總線拉低480us
	i=50;	
	while(i--){}   //延時600us ,最少480us
    i=0;
	DS18B20_GPIO=1;//然后釋放(拉高)總線,如果DS18B20做出反應會將在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寫入一個字節(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消耗的時間是12us
		DS18B20_GPIO=byte&0x01;//然后寫入一個數(shù)據(jù),從最低位開始
		i=6;
		while(i--){}//持續(xù)時間最少60us,這里大概72us
		DS18B20_GPIO=1;//然后釋放總線
        byte>>=1;//繼續(xù)發(fā)送
	}
}

/*
函數(shù)名稱:u8 DS18B20_ReadByte(void)
函數(shù)功能:從DS18B20讀取一個字節(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消耗的時間是12us
		DS18B20_GPIO=1;//然后釋放總線
		i++; 
		i++;//至少等待15us的時間,在讀取數(shù)據(jù)
        byte>>=1; //先從低位開始接收數(shù)據(jù)
        if(DS18B20_GPIO)byte|=0x80;					  
		i=4; //讀取完之后等待48us再接著讀取下一個數(shù)據(jù)
		while(i--){}
	}				
	return byte;
}


/*
函數(shù)名稱:u16 DS18B20_ReadTemp(void)
函數(shù)功能:讀取一次DS18B20的溫度數(shù)據(jù)
返 回 值:讀取的溫度值
注意: 返回值要使用有符號的數(shù)據(jù)類型,因為溫度可以返回負數(shù)。
*/
int DS18B20_ReadTemp(void)
{
	int temp=0;//存放溫度數(shù)據(jù)
	u8 TH,TL;
    //第一步: 啟動溫度轉換
    DS18B20_ResetSignal(); //發(fā)送復位脈沖并檢測應答信號
	DS18B20_WriteByte(0xcc);//跳過ROM操作命令		 
	DS18B20_WriteByte(0x44);//溫度轉換命令
    
    //第二步: 讀取溫度
    DS18B20_ResetSignal();//發(fā)送復位脈沖并檢測應答信號
	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

  • 更多詳細資料請聯(lián)系.docx
    下載

相關推薦