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

news2024/9/20 18:41:22

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);

    // 主机释放DQ
    DQ = 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);

    // 主机释放DQ
    DQ = 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;
        // 延时10us
        Delay10us();
        // 根据要发送的bit决定是高是低
        DQ = dat & 0x1;
        dat >>= 1;
        // 延时50us
        Delay50us();
        // 释放总线
        DQ = 1;
    }
}

/**
 * @brief 从18B20读取字节
 *
 * @return u8 读取的字节
 */
static u8 Int_DS18B20_RecvByte()
{
    u8 i, result = 0;

    // 8个bit
    for (i = 0; i < 8; i++)
    {
        // 主机初始化读时段
        DQ = 0;
        result >>= 1;
        DQ = 1;
        // 等待10us
        Delay10us();

        // 采样
        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();
    // 发送0xCC
    Int_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.coloradmin.cn/o/1617410.html

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

相关文章

PROSAIL模型前向模拟与植被参数遥感提取代码实现

原文链接&#xff1a;PROSAIL模型前向模拟与植被参数遥感提取代码实现https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247602140&idx7&sn7c4ca9239865d536ba81ba4c26a34031&chksmfa820e3bcdf5872d540c0dfe8c533c8696c8b4658427aab254f246a739f96b36bc37…

GPT 在目标设定中的应用:实现梦想的技术方法

在技术快速进步的时代&#xff0c;我们设定和实现目标的方式正在不断发展。 该领域最重要的创新之一是引入生成式预训练 Transformer (GPT)。 本文将探讨 GPT 技术如何彻底改变目标设定的艺术&#xff0c;提供实用的见解和案例研究来展示其影响。 GPT 和目标设定简介 ​ 了解 …

Ansible安装基本原理及操作(初识)

作者主页&#xff1a;点击&#xff01; Ansible专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月23日15点18分 Ansible 是一款功能强大且易于使用的IT自动化工具&#xff0c;可用于配置管理、应用程序部署和云端管理。它使用无代理模式&#xff08;agentles…

控制台居然可以这么玩?五分钟带你上手ANSI指令,实现一个log工具包

目录 前言 基础知识 进阶实践 ANSI参数 ANSI类 JSLog类 工具的使用说明 配置相关 全局配置项 默认配置 基本用法 打印字符 添加全局配置项 清空所有样式及操作行为 校验传入的参数是否正确 样式控制 Node环境 浏览器中 光标控制指令 光标位置偏移 滚动条控…

Pytorch:张量的梯度计算

目录 一、自动微分简单介绍1、基本原理2、梯度计算过程3、示例&#xff1a;基于 PyTorch 的自动微分a.示例详解b.梯度计算过程c.可视化计算图 4、总结 二、为什么要计算损失&#xff0c;为何权重更新是对的&#xff1f;1、梯度下降数学原理2、梯度上升 三、在模型中使用自动微分…

力扣HOT100 - 199. 二叉树的右视图

解题思路&#xff1a; 相当于层序遍历&#xff0c;然后取每一层的最后一个节点。 class Solution {public List<Integer> rightSideView(TreeNode root) {if (root null) return new ArrayList<Integer>();Queue<TreeNode> queue new LinkedList<>…

element中file-upload组件的提示‘按delete键可删除’,怎么去掉?

问题描述 element中file-upload组件会出现这种提示‘按delete键可删除’ 解决方案&#xff1a; 这是因为使用file-upload组件时自带的提示会盖住上传的文件名&#xff0c;修改一下自带的样式即可 ::v-deep .el-upload-list__item.is-success.focusing .el-icon-close-tip {d…

vue 关键字变红

1.html <div v-html"replaceKeywordColor(item.title)" ></div> 2.js //value为搜索框内绑定的值 replaceKeywordColor(val) {if (val?.includes(this.value) && this.value ! ) {return val.replace(this.value,<font color"red&…

PyCharm 中的特殊标记

再使用 PyCharm 开发 Python 项目的时候&#xff0c;经常会有一些特殊的标记&#xff0c;有些是编辑器提示的代码规范&#xff0c;有些则为了方便查找而自定义的标记。 我在之前写过一些关于异常捕获的文章&#xff1a;Python3 PyCharm 捕获异常报 Too broad exception clause…

【电控笔记5.8】数字滤波器设计流程频域特性

数字滤波器设计流程&频域特性 2HZ : w=2pi2=12.56 wc=2*pi*5; Ts=0.001; tf_lpf =

块存储、文件存储、对象存储概念与区别

1. 块存储 块存储是将数据切分成固定大小的块&#xff0c;然后将这些块存储在物理设备&#xff08;如硬盘、固态硬盘&#xff09;上。每个块都有唯一的标识符&#xff0c;并且可以独立地被读取、写入或删除。块存储通常用于存储文件系统&#xff0c;例如操作系统的文件系统&am…

牛客周赛 Round 40(A,B,C,D,E,F)

比赛链接 官方讲解 这场简单&#xff0c;没考什么算法&#xff0c;感觉有点水。D是个分组01背包&#xff0c;01背包的一点小拓展&#xff0c;没写过的可以看看&#xff0c;这个分类以及这个题目本身都是很板的。E感觉就是排名放高了导致没人敢写&#xff0c;本质上是个找规律…

群辉安装python3教程

目录 群辉安装python3一、需求二、群辉套件安装python3三、ssh连接群辉&#xff08;一&#xff09;finshell连接群辉&#xff0c;root登录&#xff08;二&#xff09;安装pip3库&#xff08;三&#xff09;配置环境变量 四、测试 群辉安装python3 一、需求 需求&#xff1a;语…

【目标检测】YOLO系列-YOLOv1 理论基础 通俗易懂

为方便大家理解YOLO的原理&#xff0c;这里将YOLOv1的部分内容基础内容进行用比较直白的话和例子进行阐述&#xff0c;为后续大家学习YOLO作为铺垫。 1、模型所干的活 工作中&#xff0c;大家经常将 Word 文档 上传到某转换器&#xff0c;然后转换输出为PDF文档。目标检测中我…

认识rust中闻风丧胆生的命周期,不用过于担心,它对于所有人都是平等的

生命周期&#xff0c;简而言之就是引用的有效作用域。在大多数时候&#xff0c;我们无需手动的声明生命周期&#xff0c;因为编译器可以自动进行推导&#xff0c;用类型来类比下&#xff1a; 就像编译器大部分时候可以自动推导类型 <-> 一样&#xff0c;编译器大多数时候…

Rust Tracing 入门

Tracing 是一个强大的工具&#xff0c;开发人员可以使用它来了解代码的行为、识别性能瓶颈和调试问题。 Rust 是一种以其性能和安全保证而闻名的语言&#xff0c;在它的世界中&#xff0c;跟踪在确保应用程序平稳高效运行方面发挥着至关重要的作用。 在本文中探讨Tracing 的概…

4K Video Downloader v4.30.0.5644 一款专业级的4K视频下载器

4K Video Downloader 中文破姐版 本站所有素材均来自于互联网&#xff0c;版权属原著所有&#xff0c;如有需要请购买正版。如有侵权&#xff0c;请联系我们立即删除。

Multiscale Vision Transformers

1、引言 论文链接&#xff1a;https://arxiv.org/abs/2104.11227 Haoqi Fan[1] 等通过在 ViT[2] 中引入多尺度特征层次结构&#xff0c;提出了一种用于视频和图像识别的 Multiscale Vision Transformers(MViT)[1]。在视频识别任务中&#xff0c;它优于依赖大规模外部预训练的视…

react 基础学习笔记一

1、jsx语法过程 jsx使用react构造组件&#xff0c;通过bable进行编译成js对象&#xff0c;在用ReactDom.render()渲染成DOM元素&#xff0c;最后再插入页面的过程。 2、创建组件 组件的定义&#xff1a;将公用的代码组装成一个独立的文件&#xff0c;保持代码独立性&#xff0…

【QT学习】9.绘图,三种贴图,贴图的转换

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统&#xff0c;可以使用相同的 API 在屏幕和绘图设备上进行绘制&#xff0c;它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作&#xff0c;其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…