day07 51单片机-18B20温度检测

news/2024/5/19 21:30:24

18B20温度检测

1.1 需求描述

本案例讲解如何从18B20传感器获取温度信息并显示在LCD上。

1.2 硬件设计

1.2.1 硬件原理图

在这里插入图片描述

1.2.3 18B20工作原理

可以看到18B20有两根引脚负责供电,一根引脚负责数据交换。18B20就是通过数据线和单片机进行数据交换的。

1)18B20工作时序

在这里插入图片描述

2)初始化信号

在这里插入图片描述

#define DQ P44/*** @brief 初始化方法** @return 1代表存在,0代表不存在*/
static bit Int_DS18B20_Init()
{bit result;// 主机拉低DQ = 0;Delay60us(8);// 主机释放DQDQ = 1;Delay60us(1);// 查看18B20状态result = ~DQ;Delay60us(7);return result;
}

3)写数据时序

写‘1’时序

在这里插入图片描述

写‘0’时序

在这里插入图片描述

写字节

在这里插入图片描述

让18B20测量温度,并将温度保存在RAM中。根据说明书第五节“温度测量”,我们需要向18B20发送功能指令0x44,可以触发温度测量动作,根据上面的事件序列,我们可以得知,这一步的通信流程如下:发送初始化信号。发送跳过ROM命令的指令(因为我们不需要ROM命令),查询ROM命令列表可得知,我们需要向18B20发送0xCC。发送温度测量指令,查询功能命令列表可得知,我们需要向18B20发送0x44。

4)读数据时序

在这里插入图片描述

在这里插入图片描述

5)从18B20中读取刚刚测量的温度。

查询说明书的命令指令可得知,如果我们想读取18B20寄存器,需要向18B20发送功能指令0xBE,再从18B20中连续接收9字节数据。这9字节数据中,只有前两个字节是我们需要的温度数据。所以我们在接收两个字节后,需要再发送一次复位(初始化)信号,打断接下来的数据传输。整个通信流程如下:发送初始化信号。发送跳过ROM命令的指令0xCC。发送读取寄存器的命令0xBE。接收两个字节。发送初始化信号打断传输。

1.3软件设计

1)Util.h

在Util.h中加入新的延时函数声明。

/*** @brief 延时10us**/
void Delay10us();/*** @brief 延时50us**/
void Delay50us();/*** @brief 延时60us** @param n 倍数*/
void Delay60us(u8 n);

2)Util.c

void Delay60us(u8 n) //@11.0592MHz
{unsigned char data i;while (n--){i = 25;while (--i);}
}void Delay10us() //@11.0592MHz
{unsigned char data i;i = 2;while (--i);
}void Delay50us() //@11.0592MHz
{unsigned char data i;_nop_();i = 20;while (--i);
}

3)Int_DS18B20.h

在Int目录下创建Int_DS18B20.h,写入以下内容。

#ifndef __INT_DS18B20_H__
#define __INT_DS18B20_H__
#include <STC89C5xRC.H>
#include "Util.h"/*** @brief 获取温度** @return u8*/
u8 Int_DS18B20_GetTemperature();#endif

4)Int_DS18B20.c

在Int目录下创建Int_DS18B20.c,写入以下内容。

#include "Int_DS18B20.h"#define DQ P44/*** @brief 初始化方法** @return 1代表存在,0代表不存在*/
static bit Int_DS18B20_Init()
{bit result;// 主机拉低DQ = 0;Delay60us(8);// 主机释放DQDQ = 1;Delay60us(1);// 查看18B20状态result = ~DQ;Delay60us(7);return result;
}/*** @brief 向18B20发送字节** @param dat 要发送的字节*/
static void Int_DS18B20_SendByte(u8 dat)
{u8 i;for (i = 0; i < 8; i++){// 首先拉低总线DQ = 0;// 延时10usDelay10us();// 根据要发送的bit决定是高是低DQ = dat & 0x1;dat >>= 1;// 延时50usDelay50us();// 释放总线DQ = 1;}
}/*** @brief 从18B20读取字节** @return u8 读取的字节*/
static u8 Int_DS18B20_RecvByte()
{u8 i, result = 0;// 8个bitfor (i = 0; i < 8; i++){// 主机初始化读时段DQ = 0;result >>= 1;DQ = 1;// 等待10usDelay10us();// 采样if (DQ == 1){result |= 0x80;}// 等待整个读时段过去Delay50us();}return result;
}u8 Int_DS18B20_GetTemperature()
{u8 ls_byte, ms_byte;// 初始化Int_DS18B20_Init();// 发送跳过ROM指令的指令(0xCC)Int_DS18B20_SendByte(0xCC);// 发送温度转换指令(0x44)Int_DS18B20_SendByte(0x44);// 初始化Int_DS18B20_Init();// 发送0xCCInt_DS18B20_SendByte(0xCC);// 发送读取暂存器指令(0xBE)Int_DS18B20_SendByte(0xBE);// 收字节,总共9个,只要两个ls_byte = Int_DS18B20_RecvByte();ms_byte = Int_DS18B20_RecvByte();// 初始化Int_DS18B20_Init();// 将读取到的两字节转化成温度返回ls_byte >>= 4;ms_byte <<= 4;return ms_byte | ls_byte;
}

5)Main.c

在Main.c文件中,写入以下内容。

#include <STC89C5xRC.H>
#include "Int_LCD1602.h"
#include "Int_DS18B20.h"void main()
{Int_LCD1602_Init();while (1){Int_LCD1602_ShowNum(0, 0, Int_DS18B20_GetTemperature());Delay1ms(500);}
}

s_byte | ls_byte;
}


**5)Main.c**在Main.c文件中,写入以下内容。```c
#include <STC89C5xRC.H>
#include "Int_LCD1602.h"
#include "Int_DS18B20.h"void main()
{Int_LCD1602_Init();while (1){Int_LCD1602_ShowNum(0, 0, Int_DS18B20_GetTemperature());Delay1ms(500);}
}

http://www.mrgr.cn/p/64406574

相关文章

zabbix监控安装文档

Zabbix安装部署文档https://blog.csdn.net/m0_56055257/article/details/131260948以上文档可以直接复制内容部署,写的非常好用在本教程中,展示如何在 CentOS 8 / RHEL 8 / Oracle Linux 8 / Alma Linux 8/ Rocky Linux 8 上安装最新的 Zabbix 6.4 版本。1、基本配置1.0关闭防…

ansible作业

ansible作业 0.ansible了解 roles:多个角色的集合目录, 可以将多个的role,分别放至roles目录下的独立子目录中,如下示例 roles/mysql/nginx/tomcat/redis/默认roles存放路径/root/.ansible/roles /usr/share/ansible/roles /etc/ansible/rolesroles目录结构: playbook1.yml…

使用composer开发自己的扩展包

前言 日常的开发中我们经常用到composer去安装其他人封装好的扩展包&#xff0c;如果你有好的功能代码想分享给其他人使用&#xff0c;就可以使用composer打包成扩展包。其他人用composer安装后就可以使用你的扩展包了。这篇文章教你如何打包自己的composer扩展包。 1.新建仓…

【JAVA】PO、VO、DAO、BO、DTO、POJO你分得清吗?

在Java开发中&#xff0c;PO、VO、DAO、BO、DTO、POJO这些词汇是比较常见的&#xff0c;每个术语都有其特定的含义和用途。下面是它们的具体区别&#xff1a; 名称简要概况用途和特定PO (Persistence Object) 持…

【汇编语言】直接定址表

【汇编语言】直接定址表 文章目录 【汇编语言】直接定址表前言一、移位指令移位指令过程逻辑移位指令shl 和 shr 二、操作显存数据显示的原理显示缓冲区的结构显示信息的一种“直接”方式 三、描述内存单元的标号关于标号去了冒号的数据标号数据标号同时描述内存地址和单元长度…

实验一———美团APP

墨刀、Axure、Mockplus等原型设计工具优缺点分析: 一、墨刀 优点:在轻量级的移动端原型制作更加迅速,展示更加方便。 缺点:价格较贵,不能画流程图,相对于其他两款功能还不是很全面;应用局限性,专注于app原型设计,在后台和网页稍有乏力;归档能力不足,更倾向于链接、二…

LLM学习(5)——系统评估与优化

5.1 如何评估 LLM 应用 5.1.1 验证评估的一般思路 通过不断寻找Bad Case并进行针对性优化,将这些案例逐步加入验证集,形成一个具有一定样本数量的验证集。针对这种验证集,逐个进行评估变得不切实际,需要一种自动评估方法来对整体性能进行评估。验证迭代是构建以LLM为核心的…

1张图片+3090显卡微调Qwen-VL视觉语言大模型(仅做演示、效果还需加大数据量)

原项目地址&#xff1a;https://github.com/QwenLM/Qwen-VL/blob/master/README_CN.md 环境本地部署&#xff08;见之前博文&#xff09; 【本地部署 】23.08 阿里Qwen-VL&#xff1a;能对图片理解、定位物体、读取文字的视觉语言模型 (推理最低12G显存) 一、数据集格式说明 …

ESLlint重大更新后,使用旧版ESLint搭配Prettier的配置方式

概要 就在前几天&#xff0c;ESLint迎来了一次重大更新&#xff0c;9.0.0版本&#xff0c;根据官方文档介绍&#xff0c;使用新版的先决条件是Node.js版本必须是18.18.0、20.9.0&#xff0c;或者是>21.1.0的版本&#xff0c;新版ESLint将不再直接支持以下旧版配置(非扁平化…

Modbus转Profinet网关连接LED大屏与PLC通讯

Modbus转Profinet网关(XD-MDPN100)的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。Modbus转Profinet网关集成了Modbus和Profinet两种协议,支持Modbus RTU主站/从站,并可以与RS485接口的设备,如变频器、智能高低压电器、电量测量装置等进行连接。通过Modbus转…

【Go语言】接口类型(一)接口类型与接口的值

本文是介绍golang接口类型的第一篇&#xff0c;主要介绍接口类型与接口类型的值的相关概念。 1. 静态类型、动态类型、动态值 所谓的静态类型&#xff08;即 static type&#xff09;&#xff0c;就是变量声明的时候的类型。 var age int // int 是静态类型 var name strin…

2024年最好用的10款ER图神器!

分享10款ER图工具,详细分析他们的功能特点、价格和适用场景,可以根据你的需求进行选择。ER图(Entity-Relationship Diagram)是数据库设计中常用的一种模型,用于描述实体之间的关系。这种图形化的表示方法旨在帮助人们理解和设计数据库结构,它们在数据库开发和设计中非常有…

【Network Automation系列】-- 第二章

继续上文,【Network Automation系列】-- 第一章 在第1章,对TCP/IP协议套件和Python的回顾中,我们研究了网络通信协议背后的理论和规范。 我们还快速浏览了一下Python语言。在本章中,我们将开始深入研究使用Python对网络设备的管理。 特别是,我们将研究使用Python以编程方式…

初中中考阅读理解难题一网打尽!句子结构深度解析+答案揭秘,助你轻松冲刺高分!-012

PDF格式公众号回复关键字:ZKYDT012原文1 Richard found the bird in the forest, didn’t he? 解析 1 Richard ,found 发现了, the bird 这只鸟, in the forest 在森林里, didn’t he? 不是吗 理查德在森林里发现了这只鸟,不是吗? 2 He saw a strange bird in a bush. 他…

【51单片机项目】基于51单片机自制多功能小键盘/模拟USB键盘【附源码】(STC89C52RC+CH9328)

目录 一、效果展示 二、创作灵感 三、硬件电路 注意事项 工作原理 四、源码 main.c 五、附录 CH9328工作原理 CH9328的模式选择 ​编辑 全键盘键码值表 参考链接 一、效果展示 该小键盘具有三种功能&#xff1a; 1、自动输入开机密码 2、每隔一段时间自动按下ct…

【Qt 专栏】DateTime日期时间组件

本文转载自:https://cloud.tencent.com.cn/developer/article/2371799 本章将重点介绍QDateTime日期与时间组件的常用方法及灵活运用。在Qt中,日期和时间的处理通常使用 QDateTime 类。QDateTime 是一个用于表示日期和时间的类,而与之相关的组件还包括 QDate 、 QTime以及QD…

【threejs教程7】threejs聚光灯、摄影机灯和汽车运动效果

【图片完整效果代码位于文章末】 在上一篇文章中我们实现了汽车模型的加载&#xff0c;这篇文章主要讲如何让汽车看起来像在运动。同时列出聚光灯和摄像机灯光的加载方法。 查看上一篇&#x1f449;【threejs教程6】threejs加载glb模型文件&#xff08;小米su7&#xff09;&…

七段数码管

import turtle, datetime def drawGap(): # 绘制数码管间隔 turtle.penup() turtle.fd(5) def drawLine(draw): # 绘制单段数码管 drawGap() turtle.pendown() if draw else turtle.penup() turtle.fd(40) drawGap() turtle.right(90) def drawDigit(d): # 根据数字绘制七段…

微软如何打造数字零售力航母系列科普02 --- 微软低代码应用平台加速企业创新 - 解放企业数字零售力

微软低代码应用平台推动企业创新- 解放企业数字零售力 微软在2023年GARTNER发布的魔力象限图中处于头部领先&#xff08;leader&#xff09;地位。 其LCAP产品是Microsoft Power Apps&#xff0c;扩展了AI Builder、Dataverse、Power Automate和Power Pages&#xff0c;这些都包…

git 命令怎么回退到指定的某个提交 commit hash 并推送远程分支?

问题 如下图&#xff0c;我要回退到 【002】Babel 的编译流程 这一次提交 解决 1、先执行下面命令&#xff0c;输出日志&#xff0c;主要就是拿到提交 commit 的 hash&#xff0c;上图红框即可 git log或者 vscode 里面直接右击&#xff0c;copy sha 2、执行下面命令回退 g…