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

news2024/9/22 1:06:34

一、前言

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python面试宝典第19题:最小路径和

题目 给定一个包含非负整数的m x n网格grid&#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&#xff1a;grid [[1, 3, 1], [1, 5, 1], [4, 2, 1]] 输出&…

【帆软报表开发】决策系统挂载报表

登陆决策系统 点击服务器->报表平台管理登陆或者输入网址http://IP:端口号/webroot/decision登陆&#xff08;默认端口号&#xff1a;8075&#xff09; 第一次需要输入超级管理员的用户名和密码&#xff0c;然后登陆决策系统 成功登陆决策系统 报表模板所在位置 制作好的报…

PHP安全编程宝典:30000字精细解析

文章目录 基础语法单双引号的区别前后端分离数据类型PHP常量函数var_dump函数count函数print_r函数**readfile&#xff08;&#xff09;函数****file_get_contents()函数****file_put_contents()函数**header函数fopen函数fread 函数rename函数copy&#xff08;&#xff09;函数…

生活实用英语口语“拆迁”用英文怎么说?柯桥成人学英语到蓝天广场

● 1. “拆迁”英语怎么说&#xff1f; ● 01. 其实国外也有拆迁 但国外的拆迁&#xff0c;只管拆 不管安置&#xff0c;你爱去哪去哪 英文可以说 housing removal 02. 但我们中国的“拆迁” 既管“拆”也管“迁” &#xff08;还是中国人幸福~&#xff09; 英文可以说 housin…

C语言 ——— 函数指针的定义 函数指针的使用

目录 何为函数指针 打印 函数名的地址 及 &函数名的地址 函数指针的代码&#xff08;如何正确存储函数地址&#xff09; 函数指针的使用 何为函数指针 类比&#xff1a; 整型指针 - 指向整型数据的指针&#xff0c;整型指针存放的是整型数据的地址 字符指针 - 指向字…

视觉语言动作模型:从网页知识到机器人控制的实战RT-2

作者&#xff1a; Anthony Brohan, Noah Brown, Justice Carbajal, Yevgen Chebotar, Xi Chen, Krzysztof Choromanski, Tianli Ding, Danny Driess, Avinava Dubey, Chelsea Finn, Pete Florence, Chuyuan Fu, Montse Gonzalez Arenas, Keerthana Gopalakrishnan, Kehang Han…

等级保护 总结2

网络安全等级保护解决方案的主打产品&#xff1a; HiSec Insight安全态势感知系统、 FireHunter6000沙箱、 SecoManager安全控制器、 HiSecEngine USG系列防火墙和HiSecEngine AntiDDoS防御系统。 华为HiSec Insight安全态势感知系统是基于商用大数据平台FusionInsight的A…

VMware 17.5.2 下载安装教程

迅雷&#xff1a; 分享文件&#xff1a;VMware17.5.2 链接&#xff1a;https://pan.xunlei.com/s/VO2YWzmIoNXXUziaESHVX2OrA1?pwdhbqh# 百度网盘&#xff1a; 链接: https://pan.baidu.com/s/18iexDwJAec9OkATYnfUlSg?pwd8888 提取码: 8888 1.双击安装包运行 2.若出现以…

《软件导刊》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《软件导刊》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《软件导刊》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;湖北省科学技术厅 主办单位&#xff1a;湖北…

Redisson分布式锁使用详解

引言 日常开发中&#xff0c;难免遇到一些并发的场景&#xff0c;为了保证接口执行的一致性&#xff0c;通常采用加锁的方式&#xff0c;因为服务是分布式部署模式&#xff0c;本地锁Reentrantlock和Synchnorized这些就先放到一边了&#xff0c;Redis的setnx锁存在无法抱保证原…

VBA技术资料MF178:将某个文件夹中的图片导入Word

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

敏捷开发笔记(第13章节)--COMMAND模式和ACTIVE OBJECT模式

1&#xff1a;PDF上传链接 【免费】敏捷软件开发(原则模式与实践)资源-CSDN文库 没有人天生就具有命令他人的权利。 --Denis Diderot&#xff08;1713一1784&#xff0c;法国哲学家&#xff0c;百料全书编者) 在近几…

20240724----安装git和配置git的环境变量/如何用命令git项目到本地idea

备注参考博客&#xff1a; 1&#xff09;可以参考博客&#xff0c;用git把项目git到本地 2&#xff09;可以参考博客vcs没有git 3)git版本更新&#xff0c;覆盖安装 &#xff08;一&#xff09;安装git &#xff08;1&#xff09;官网下载的链接 https://git-scm.com/downlo…

【轨物方案】新型储能管理系统(EMS)解决方案

储能EMS作为储能系统的大脑&#xff0c;其重要性不言而喻&#xff0c;但是随着储能行业的不断扩大以及对应产品的不断升级&#xff0c;其对应的售后运维变得越来越复杂&#xff0c;储能系统急需配备完善的EMS系统来监控和优化自身的运营状态&#xff0c;同时满足售后运维&#…

LeetCode 热题 HOT 100 (010/100)【宇宙最简单版】

【链表】No. 0206 反转链表 【简单】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xf…

Docker-Compose配置zookeeper+KaFka+CMAK简单集群

1. 本地DNS解析管理 # 编辑hosts文件 sudo nano /etc/hosts # 添加以下三个主机IP 192.168.186.77 zoo1 k1 192.168.186.18 zoo2 k2 192.168.186.216 zoo3 k3注&#xff1a;zoo1是192.168.186.77的别名&#xff0c;zoo2是192.168.186.18的别名&#xff0c;zoo3是192.168.186.1…

JavaScript(14)——DOM

Web API 作用&#xff1a;就是使用JS去操作html和浏览器 分类&#xff1a;DOM&#xff08;文档对象模型&#xff09;、BOM&#xff08;浏览器对象模型&#xff09; DOM DOM是用来呈现以及与任意HTML或XML文档交互的API&#xff0c;简单来说就是操作网页的内容。 DOM树 将H…

Ansible的脚本-----playbook剧本【下】

目录 实战演练六&#xff1a;tags 模块 实战演练七&#xff1a;Templates 模块 实战演练六&#xff1a;tags 模块 可以在一个playbook中为某个或某些任务定义“标签”&#xff0c;在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。 playboo…

secureCRT同时在所有已打开窗口执行命令、mac-os下使用的SecureCRT版本 以及 SecureCRT一段时间不操作没有响应的问题

一、secureCRT命令行工具一次性同时在所有已打开窗口执行命令 公司的服务器比较多&#xff0c;最近因为opcache&#xff0c;上线发布后&#xff0c;需要重启所有的WEB服务器上的php。目前使用的jenkins发布&#xff0c;不过账号安全问题&#xff0c;给jenkins的账号权限受限不能…

【BUG】已解决:IndexError: positional indexers are out-of-bounds

IndexError: positional indexers are out-of-bounds 目录 IndexError: positional indexers are out-of-bounds 【常见模块错误】 【解决方案】 原因分析 解决方法 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博…