读取DS18B20温度、测量环境温度信息(单只DS18B20写法)

举报
DS小龙哥 发表于 2024/07/23 11:27:04 2024/07/23
【摘要】 本项目设计并实现一个能够实时读取环境温度信息的系统。通过STC90C51对DS18B20进行初始化、控制以及数据读取,可以实现对环境温度的精确测量,并将温度数据通过显示屏或其他输出设备展示给用户。该系统不仅可以提供实时温度监控功能,还可以根据温度数据进行相应的控制操作,如启动或关闭冷却设备、调整空调温度等,以满足不同应用场景对环境温度控制的需求。

一、前言

1.1 功能介绍

随着工业自动化和智能家居技术的不断发展,精确测量和监控环境温度变得尤为重要。在许多应用场景中,如仓库管理、温室控制、空调系统以及工业制造过程中,实时准确地获取环境温度信息对于保障设备正常运行、提高能源利用效率以及优化生产流程具有重要意义。

DS18B20是一款高精度、高可靠性的数字温度传感器,它以其独特的单线接口和直接输出数字信号的特点,简化了温度测量系统的设计。STC90C51作为一款经典的8位微控制器,以其强大的数据处理能力和丰富的I/O端口资源,成为了实现温度读取和控制的理想选择。

本项目设计并实现一个能够实时读取环境温度信息的系统。通过STC90C51对DS18B20进行初始化、控制以及数据读取,可以实现对环境温度的精确测量,并将温度数据通过显示屏或其他输出设备展示给用户。该系统不仅可以提供实时温度监控功能,还可以根据温度数据进行相应的控制操作,如启动或关闭冷却设备、调整空调温度等,以满足不同应用场景对环境温度控制的需求。

本项目的开发背景体现了对环境温度监控和管理的迫切需求,通过结合STC90C51和DS18B20的技术优势,实现一个高效、精确的环境温度测量和控制系统,为工业自动化和智能家居等领域提供有力支持。

image-20240612132239162

image-20240612132253790

image-20240612132310061

1.2 DS1820介绍

DS1820是一款由美国Dallas半导体公司(后被Maxim半导体公司收购)推出的数字化温度传感器,它是世界上第一片支持“一线总线”接口的温度传感器。DS1820以其独特的设计和优异的性能,在温度测量领域占据了重要地位。

DS1820的测量温度范围广泛,覆盖了从-55°C到+125°C的广阔区间。在-10°C到+85°C的范围内,其测量精度高达±0.5°C,这使得DS1820在各种环境条件下都能提供准确可靠的温度数据。

其DS1820采用了独特的“一线总线”接口技术,通过单一的数据线进行通信和供电。这种设计不仅简化了温度测量系统的布线,降低了成本,还提高了系统的抗干扰能力和可靠性。同时,DS1820还支持多个传感器在同一总线上进行连接,方便用户构建多点测温系统。

在内部结构方面,DS1820采用了受温度影响的振荡器和计数器作为核心部件。低温时,振荡器的脉冲可以通过门电路,使计数器对脉冲信号进行计数;高温时,振荡器的脉冲频率发生变化,无法通过门电路,此时计数器的计数值反映了被测温度。通过这种方式,DS1820能够实时、准确地测量环境温度。

DS1820还具有一些其他特性。例如,它支持多种分辨率设置,最高可达12位,从而保证了高精度的温度测量。同时,DS1820还具有报警功能,用户可以根据需要设定报警温度,当温度超过或低于设定值时,DS1820将触发报警机制。

DS1820是一款功能强大、性能优异的数字化温度传感器。它以其独特的“一线总线”接口技术、广泛的测量温度范围、高精度的测量能力以及丰富的功能特性,成为了温度测量领域的佼佼者。无论是在环境控制、设备或过程控制、测温类消费电子产品等领域,DS1820都发挥着重要作用。

二、代码实现

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) //如果温度是负数
        {
            temp=temp-1;
            temp=~temp;
            printf("DS18b20=-%d.%d\r\n",temp>>4,temp&0xF);
        }
        else
        {
            printf("DS18b20=%d.%d\r\n",temp>>4,temp&0xF);
        }
        DelayMs(1000);
    }
}

2.2 DS18B20.c

#include "ds18b20.h"
/*
说明: 在12MHZ晶振下,12T模式下,i++消耗的时间差不多是12us
*/

/*
函数名称:u8 DS18B20_Init(void)
函数功能:向DS18B20发送复位脉冲,并检测应答信号
返 回 值:1表示失败,0表示成功
说明: 51单片机IO口默认输出高电平
*/
u8 DS18B20_ResetSignal(void)
{
	u8 i=0;
    //1. 发送复位信号
	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;//初始化成功
}

/*
函数名称:u8 DS18B20_WriteByte(void)
函数功能:向DS18B20写入一个字节的数据
函数形参:写入的字节数据
*/
void DS18B20_WriteByte(u8 byte)
{
	u16 i=0,j=0;
	for(j=0;j<8;j++)
	{
		DS18B20_GPIO=0;//每写入一位数据之前先把总线拉低1us
		i++; //+1消耗的时间是12us
		DS18B20_GPIO=byte&0x01;//然后写入一个数据,从最低位开始
		i=6;
		while(i--){}//持续时间最少60us,这里大概72us
		DS18B20_GPIO=1;//然后释放总线
        byte>>=1;//继续发送
	}
}

/*
函数名称:u8 DS18B20_ReadByte(void)
函数功能:从DS18B20读取一个字节的数据
返 回 值:读到的数据
*/
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的时间,在读取数据
        byte>>=1; //先从低位开始接收数据
        if(DS18B20_GPIO)byte|=0x80;					  
		i=4; //读取完之后等待48us再接着读取下一个数据
		while(i--){}
	}				
	return byte;
}


/*
函数名称:u16 DS18B20_ReadTemp(void)
函数功能:读取一次DS18B20的温度数据
返 回 值:读取的温度值
注意: 返回值要使用有符号的数据类型,因为温度可以返回负数。
*/
int DS18B20_ReadTemp(void)
{
	int temp=0;//存放温度数据
	u8 TH,TL;
    //第一步: 启动温度转换
    DS18B20_ResetSignal(); //发送复位脉冲并检测应答信号
	DS18B20_WriteByte(0xcc);//跳过ROM操作命令		 
	DS18B20_WriteByte(0x44);//温度转换命令
    
    //第二步: 读取温度
    DS18B20_ResetSignal();//发送复位脉冲并检测应答信号
	DS18B20_WriteByte(0xcc);//跳过ROM操作命令
	DS18B20_WriteByte(0xbe);//发送读取温度命令
	TL=DS18B20_ReadByte();//读取温度值共16位,先读低字节
	TH=DS18B20_ReadByte();//再读高字节
	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
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。