(九)One-Wire总线-DS18B20

文章目录

  • One-Wire总线篇
    • 复位和应答
    • 读/写0,1
  • DS18B20篇
    • 原理图
    • 概述
    • 最主要特性
    • 几个重要的寄存器(部分要掌握)
      • 存储有数字温度结果的2个字节宽度的温度寄存器
        • 寄存器描述:
        • 寄存器说明:
      • 一个字节的过温和一个字节的低温(TH和TL)温度报警寄存器
        • 寄存器描述:
        • 寄存器说明:
      • 一个字节的配置寄存器(自定义温度转换为9、10、11、12位精度)
        • 寄存器描述:
        • 寄存器说明:
    • 总览一下寄存器
    • DS18B20通讯规则以及指令
      • 哪些ROM指令
      • 哪些DS18B20的指令
    • DS18B20的温度读取应用
      • 思路
      • 重点代码
      • 现象演示


One-Wire总线篇

one-wire的底层驱动比赛会提供

资源包下载通道(涵盖了赛场所有资料)

复位和应答

在这里插入图片描述
简单理解:
规则:一个复位信号必须大于960us
主设备(单片机)拉低总线超过480us,紧接着释放总线(拉高)也就是来个上升沿,等待15us-60us后,再拉低总线60us-240us发送一个存在脉冲。

读/写0,1

在这里插入图片描述
简单理解:
规则:读写一个位,要在60us到120us内完成,位与位之间,读写间隔1us

写0再写1:主机将拉低总线,快速释放总线,准备要写入的数据(写0-拉低总线),这些操作要在15us内完成,然后维持至少60us;然后再释放总线1us,继续写1,拉低总线,快速释放总线,准备 要写入的数据(写1-拉高总线),同样这些操作要在15us内完成,再维持60us,然后释放总线超过1us;

读0再读1:主机拉低总线,快速释放总线,这个操作也是要在15us内完成,然后检测总线上的电平被DS18B20拉高了还是低了即可;

DS18B20篇

原理图

可以看到18b20通过P14口挂载在单总线上的!
在这里插入图片描述

打开手册可以看到:

DS18B20英文手册

根据自己理解翻和译,提取重要信息如下

概述

DS18B20数字温度传感器提供9-Bit到12-Bit的摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能。

DS18B20采用的1-Wire通信即仅采用一个数据线(以及地)与微控制器进行通信。该传感器的温度检测范围-55℃至+125℃。此外,DS18B20可以直接由数据线供电而不需要外部电源供电。

每片DS18B20都有一个独一无二的64位序列号,这个系列号是烧在内部ROM里面的,所以一个1-Wire总线上可连接多个DS18B20设备。

最主要特性

· 独特的1-Wire总线接口仅需要一个管脚来通信。(DQ引脚

· 每个设备的内部ROM上都烧写了一个独一无二的64位序列号(板子上面就一个DS18B20 所以 一般直接跳过ROM指令,不进行配对)

· 内部温度采集精度可以由用户自定义为9-Bits至12-Bits(这里一般不去设置)

· 温度转换时间在转换精度为12-Bits时达到最大值750ms写代码时候要注意

几个重要的寄存器(部分要掌握)

存储有数字温度结果的2个字节宽度的温度寄存器

在这里插入图片描述

寄存器描述:

用来存储数字温度转换结果

温度数据以一个16位标志扩展二进制补码数的形式存储在温度寄存器中(见Figure2)
说人话:用来储存测得的温度的,高5位作为符号位,其余位做数据位

寄存器说明:

高字节5位为符号标志位(S)温度的正负极性:正数则S=0,负数则S=1。(一般比赛都是正温度)

如果DS18B20被定义为12位的转换精度,温度寄存器中的所有位都将包含有效数据。
若为11位转换精度,则bit 0为未定义的。
若为10位转换精度,则bit 1和bit 0为未定义的。
若为9位转换精度,则bit 2、bit 1和bit 0为未定义的。

下表格为在12位转换精度下温度输出数据与相对应温度之间的关系表。

在这里插入图片描述


一个字节的过温和一个字节的低温(TH和TL)温度报警寄存器

在这里插入图片描述

寄存器描述:

(比赛用不到了解即可

用来储存过温和低温的对比参照数值

过温和低温(TH和TL)温度报警寄存器是非易失性的(EEPROM),所以其可以在设备断电的情况下保存。

寄存器说明:

符号标志位(S)温度的正负极性:正数则S=0,负数则S=1。其余位为数据位

过温和低温(TH和TL)温度报警寄存器是一个8位的寄存器,所以在于其比较时,2个字节的温度寄存器的4位至11位才是有效的数据。

如果温度转换数据小于或等于TL及大于或等于TH,DS18B20内部的报警标志位将会被置位。该标志位在每次温度转换之后都会更新,因此,如报警控制消失,该标志位在温度转换之后将会关闭。

说人话:俩寄存器,用看存放过温和低温阈值温度数据的,也就是TH和TL分别放着对比的过温和低温数值,每次测到的2个字节的温度的第4-12位数据都来跟它比较,进行报警监测


一个字节的配置寄存器(自定义温度转换为9、10、11、12位精度)

在这里插入图片描述

寄存器描述:

用来配置测温数据的精度的寄存器

说明:9、10、11、12位精度分别为0.5℃、0.25℃、0.125℃、0.0625℃分辨率。
上电默认为:12位转换精度

这里也可以看(Figure2图)每一位对应的权数
**比如:BIT0位2的负4次方,如果数据位可以达到12位精度,分辨率就是1/16 = 0.0625℃
同理 :
11位 精度就是1/8 = 0.125;
10位 精度就是1/4 = 0.25;
9位 精度就是1/2 = 0.5;

寄存器说明:

用户通过改变R0和R1的值来配置DS18B20的分辨率。上电默认为R0=1及R1=1(12位分辨率)。需要注意的是,转换时间与分辨率之间是有制约关系的。Bit 7和Bit 0至Bit 4作为内部使用而保留使用,不可被写入。

温度分辨率配置以及转化时间表:

在这里插入图片描述

总览一下寄存器

在这里插入图片描述

DS18B20通讯规则以及指令

在这里插入图片描述
访问DS18B20的事件序列如下所示:
第一步:初始化
第二步:ROM命令(紧跟任何数据交换请求)
第三步:DS18B20功能命令(紧跟任何数据交换请求)
每次对DS18B20的访问都必须遵循这样的步骤来进行,如果这些步骤中的任何一个丢失或者没有执行,则DS18B20将不会响应。
除了ROM搜索命令[F0h]和报警搜索命令[ECh]之外。当执行完这些命令之后,主设备必须回到上述步骤中的第一步,也就是必须再次初始化。

哪些ROM指令

搜索ROM[F0h]
读取ROM[33h]
匹配ROM[55h]
跳过ROM[CCh]
警报搜索[ECh]

哪些DS18B20的指令

温度转换[44h]
写入暂存寄存器[4Eh]
读取暂存寄存器[BEh]
拷贝暂存寄存器[48h]
召回EEPROM[B8h]
读取供电模式[B4h]

DS18B20的温度读取应用

思路

根据上面的通讯规则(执行命令后必须重新初始化)和指令(ROM和DS18B20指令):

步骤响应的操作
初始化init_ds18b20();
跳过ROM指令Write_DS18B20(0xcc);
启动温度转化指令Write_DS18B20(0x44);
初始化init_ds18b20();
跳过ROMWrite_DS18B20(0xcc);
读取暂存寄存器指令Write_DS18B20(0xbe);
读温度低字节low = Read_DS18B20();
读温度高字节high = Read_DS18B20();
转化温度看所需精度

说明:前面提到12位精度,需要750ms,按道理需要加上延时,但经过测试连续读取也是没问题的,因为即使这次温度没转化好,读取到的也是上一次的数值。
当然也可以避免这样操作:在每次读取完就开启温度转化,等下次到来温度肯定转化好了,再读取就没问题了

重点代码

这里以12位精度为例:

float ReadTemperature(void)
{float temp = 0.0;u8 high = 0;u8 low = 0;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);low = Read_DS18B20();high = Read_DS18B20();temp = ((high<<8)|low)*0.0625;return temp;	
}

现象演示

(九)One-Wire总线-DS18B20



----- 如有错误欢迎大家批评指正!!!

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

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

相关文章

msckf_vio在ubuntu20.04中的编译

1.新建catkin workspace文件夹&#xff0c;并在其中新建src文件夹&#xff0c;并将源码clone至src内。 源码地址&#xff1a;https://github.com/KumarRobotics/msckf_vio 目录层级示意如下&#xff0c;build和devel不必新建&#xff0c;后续指令会自动新建。 2. 在编译之前…

Python 面向对象之反射

Python 面向对象之反射 【一】概念 反射是指通过对象的属性名或者方法名来获取对象的属性或调用方法的能力反射还指的是在程序额运行过程中可以动态获取对象的信息(属性和方法) 【二】四个内置函数 又叫做反射函数 万物皆对象&#xff08;整数、字符串、函数、模块、类等等…

第02章_变量与进制

第02章_变量与进制 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题脉络 1、关键字(keyword) 定义&#xff1a;被C语言赋予了特殊含义&#xff0c;用做专门用途的字符串&#xff08;或单…

力扣:438. 找到字符串中所有字母异位词 题解

Problem: 438. 找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 预备知识解题思路复杂度Code其它细节推荐博客或题目博客题目滑动窗口哈希表 预备知识 此题用到了双指针算法中的滑动窗口思想&#xff0c;以及哈希表的运用。c中是unordered_map。如果对此不了解的u…

二、UI文件设计与运行机制

一、UI文件设计与运行机制 1、创建工程 2、添加控件&#xff0c;实现按钮点击 &#xff08;1&#xff09;添加控件 &#xff08;2&#xff09;添加信号和槽 2、分析项目结构 test_02test_02.pro Qt工程文件Headerswidget.h 设计的窗体类的头文件Sourcesmain.cpp 主程序入…

rk3588中编译带有ffmpeg的opencv

有朋友有工程需要&#xff0c;将视频写成mp4&#xff0c;当然最简单的方法当然是使用opencv的命令 cv::VideoWriter writer;bool bRet writer.open("./out.mp4", cv::VideoWriter::fourcc(m, p, 4, v), 15, cv::Size(640, 512), 1); 但是奈何很难编译成功&#xff…

Python | 基于Mediapipe框架的手势识别系统

一、项目要求 1、题目 本题着力于解决会商演示系统中的非接触式人机交互问题&#xff0c;具体而言&#xff0c;其核心问题就是通过计算机视觉技术实现对基于视频流的手势动作进行实时检测和识别。通过摄像头采集并识别控制者连续的手势动作&#xff0c;完成包括点击、平移、缩放…

离散数学1

注&#xff1a;线性代数已经更新了最大部分的内容&#xff0c;因此过段时间再补充剩余内容。 小王能歌善舞。因此&#xff0c;小王必须得会唱歌也必须得会跳舞&#xff0c;才满足题意 小王能唱歌或者小王能跳舞。因此&#xff0c;小王会唱歌也会跳舞满足。小王不会唱歌但会跳舞…

JavaScript常用事件演示

文章目录 一、在JavaScript中什么是事件&#xff1f;二、什么是JavaScript 常用事件&#xff1f;三、常用JS事件代码示例:四、事件总结 一、在JavaScript中什么是事件&#xff1f; JavaScript 使我们有能力创建动态页面。事件是可以被 JavaScript 侦测到的行为。 网页中的每个…

C++|【34】C++中的const

文章目录 constconst最基本的用法const和指针const和类 const const最基本的用法 用于限定a的大小&#xff0c;使a变成一个恒定不变的值。 应用场景&#xff1a;比如设置一些和标准相关的值&#xff0c;如上下限等等。 const和指针 指针总是包含两部分信息&#xff0c;一个是…

如何信任机器学习模型的预测结果?

在本篇中&#xff0c;我将通过一个例子演示在 MATLAB 如何使用 LIME 进行复杂机器学习模型预测结果的解释。 我使用数据集 carbig&#xff08;MATLAB 自带的数据集&#xff09;训练一个回归模型&#xff0c;用于预测汽车的燃油效率。数据集 carbig 是 70 年代到 80 年代生产的汽…

docker的基础知识

介绍docker 什么是docker Docker是一种开源的容器化平台&#xff0c;可以让开发人员将应用程序与其依赖的运行时环境一起打包到一个称为容器的独立单元中。这个容器可以在任何支持Docker的机器上运行&#xff0c;提供了一种快速和可移植的方式来部署应用程序。Docker的核心组件…

Python库学习(十四):ORM框架-SQLAlchemy

1.介绍 SQLAlchemy 是一个用于 Python 的 SQL 工具和对象关系映射&#xff08;ORM&#xff09;库。它允许开发者通过 Python 代码而不是 SQL查询语言来操作数据库。SQLAlchemy 提供了一种灵活且强大的方式来与关系型数据库交互&#xff0c;支持多种数据库后端&#xff0c;如 P…

【十七】【动态规划】DP41 【模板】01背包、416. 分割等和子集、494. 目标和,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

GeoServer发布地图服务(WMS、WFS)

文章目录 1. 概述2. 矢量数据源3. 栅格数据源 1. 概述 我们知道将GIS数据大致分成矢量数据和栅格数据&#xff08;地形和三维模型都是兼具矢量和栅格数据的特性&#xff09;。但是如果用来Web环境中&#xff0c;那么使用图片这个栅格形式的数据载体无疑是最为方便的&#xff0…

WebofScience快速检索文献的办法

Web of Science为什么老是搜不到文章&#xff0c;原来是要在这个地方全部勾选 如果是搜标题的话&#xff0c;选Title&#xff0c;输入你要搜的文章标题 另外&#xff0c;也可以在浏览器直接搜文章标题&#xff0c;得到文章的DOI&#xff0c;然后选DOI&#xff0c;直接搜DOI也行…

中通快递查询,中通快递单号查询,批量删除不需要的快递单号

快递单号的管理现在是许多企业和个人日常工作中不可或缺的一部分&#xff0c;面对堆积如山的快递单号&#xff0c;如何快速、准确地处理成了许多人的难题。今天&#xff0c;我们将为大家带来一款强大的快递单号处理软件——快递批量查询高手&#xff0c;让你从此告别繁琐的手动…

SpringCloud-高级篇(十一)

&#xff08;1&#xff09;搭建Redis-主从架构 前面我们实现了Redis的持久化&#xff0c;解决了数据安全问题&#xff0c;但是还有需要解决的问题&#xff0c;下面学习Redis的主从集群&#xff0c;解决Redis的并发能力的问题 Redis的集群往往是主从集群&#xff0c;Redsi为什么…

【leetcode】字符串中的第一个唯一字符

题目描述 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 用例 示例 1&#xff1a; 输入: s “leetcode” 输出: 0 示例 2: 输入: s “loveleetcode” 输出: 2 示例 3: 输入: s “aabb”…

游戏缺少x3daudio1_7.dll文件怎么办?x3daudio1_7.dll丢失总共有六个解决方法

导语&#xff1a;在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“x3daudio1_7.dll丢失”。那么&#xff0c;x3daudio1_7.dll到底是什么文件呢&#xff1f;它的作用和影响又是什么呢&#xff1f;本文将为您详细介绍x3daudio1_7.dll的相关知…