首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >读取DS18B20温度、测量环境温度信息(单只DS18B20写法)

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

作者头像
DS小龙哥
发布2025-05-27 12:50:37
发布2025-05-27 12:50:37
14700
代码可运行
举报
运行总次数:0
代码可运行

一、前言

1.1 功能介绍

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

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

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

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

image-20240612132239162
image-20240612132239162
image-20240612132253790
image-20240612132253790
image-20240612132310061
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

代码语言:javascript
代码运行次数:0
运行
复制
#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

代码语言:javascript
代码运行次数:0
运行
复制
#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

代码语言:javascript
代码运行次数:0
运行
复制
#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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
    • 1.1 功能介绍
    • 1.2 DS1820介绍
  • 二、代码实现
    • 2.1 main.c
    • 2.2 DS18B20.c
    • 2.3 DS18B20.h
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档