NO11 蓝桥杯单片机之DS18B20数字温度计

DS18B20数字温度计这个模块和以往单片机学习的模块可能不同,这里还要知道其头文件(.h)和.c文件代码的理解。

具体这个温度计是怎么实现检测温度的,呃呃呃呃呃这可能就要去查阅专业资料,涉及的知识体系应该很庞大,以下就温度计怎么使用的流程来讲讲。

【进阶强化-01】单总线温度传感器DS18B20的基本原理与应用开发-小蜜蜂笔记 (xmf393.com)

1 DS18B20数字温度计 .c文件代码的理解

芯片手册的阅读起来可能太多,可以看看小蜜蜂老师对.c文件里代码的理解。

单总线数字温度传感器DS18B20的基本原理及开发要点-小蜜蜂笔记 (xmf393.com)

以下结合小蜜蜂老师的文章写一些东东。

1.1 延时函数

延时函数就和我们平时训练的差不多,这里定义的是整数类型t

//单总线延时函数
void Delay_OneWire(unsigned int t)
{
  while(t--);
}

1.2  初始化函数(主要是用于复位操作)

总线用DQ表示,0表示拉低,1表示释放总线;定义一个initflag作为复位的标志。

拉低总线(DQ=0)->  释放总线(DQ=1) -> 复位标志置一(initflag=1) ->  返回复位标志

//DS18B20芯片初始化
bit Init_DS18B20(void)
{
	bit initflag = 0;

	DQ = 0;
	Delay_OneWire(80); 
	DQ = 1;
	Delay_OneWire(10); 
	initflag = DQ;    
	Delay_OneWire(20);
  
	return initflag;
}

1.3 写入函数

注意这里是把dat写入,而且是一位一位写。DQ = dat&0x01;   就保证了每次只写一个数据。

//DS18B20的写操作底层驱动代码参考--51版
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)             
	{
		DQ = 0;		     //先拉低总线电平10~15us						
		DQ = dat&0x01;	     //向总线写入一个位数据			
		Delay_OneWire(5);    //维持状态20~45us
		DQ = 1;	             //释放总线			
		dat >>= 1;           //准备发送下一个数据位			
	}
}

1.3 读取函数

读取函数最终返回的是是dat的值,这里也是dat按位来读取,

//DS18B20的读操作底层驱动代码参考--51版
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
	for(i=0;i<8;i++)
	{
		DQ = 0;              //先将总线电平拉低10~15us
		dat >>= 1;	     					
		DQ = 1;		     //然后释放总线						
		if(DQ)		     //读取总线上的电平状态						
		{
		    dat |= 0x80;
		}	    
		Delay_OneWire(5);    //延时45us左右,再度下一个数据位		
	}
	return dat;
}

2 DS18B20 的 .h文件

.h 头文件头文件主要是做一些函数声明,定义等。

现在把这个划分成几个部分来讲解以下:首先DS18B20的两个文件名如下:

#ifndef _XMF_DS18B20_H
#define _XMF_DS18B20_H

#include "reg52.h"

#define OW_SKIP_ROM 0xcc
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xbe

//IC引脚定义
sbit DQ = P2^2;

//函数声明
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
bit Init_DS18B20(void);
unsigned char Read_DS18B20(void);

#endif

2.1 ifndef define endif

  • #ifndef:如果未定义)用于判断指定的标识符是否已经被定义。如果该标识符未定义,则执行下面的代码块,否则跳过。
  • #define: 用于定义指定的标识符,通常用于定义宏。在条件编译中,一般用来定义一个标识符,以便在后面的代码中进行条件判断。
  • #endif :用于结束条件编译的代码块

(参考【#ifndef, #define, 和 #endif】_#ifndef #define #endif-CSDN博客)

可以看到,文件开头用了#ifndef 和 #define+(_ 文件名_H)的形式进行了宏定义,文件末尾还用了#endif(注意定义的时候文件名要大写,即使保存文件名的时候用的是小写。)

2.2 使用了reg52.h的头文件 和引脚定义

使用了red52.h 的头文件,并定义了DQ引脚。

2.3 定义了三个重要指令

用define定义了三个指令。

CCH跳过ROM指令。忽略64位ROM地址,直接向DS18B20发起各种执行指令。
44H温度转换指令。启动DS18B20进行温度转换。
BEH读取暂存器指令。DS18B20收到该指令后,会逐个输出高速暂存器中字节0到字节9的内容。如果要停止读取,必须进行复位操作。如果只需要读取温度数据,那么,在读完第0个字节和第1个字节数据后,不再理会DS18B20后面发出的数据即可。

2.4 对.c文件用到的函数进行声明。

.c 使用了四个函数, 直接复制过来即可。

3 温度换算原理及使用方法

3.1 使用方法

这里的使用方法较为套公式化,只要记住相关步骤写入代码即可。

这里同样参考小蜜蜂老师的那篇文章以及代码。

微处理器读取单个DS18B20的温度数据,可参考以下步骤:
【1】DS18B20复位。
【2】写入字节0xCC,跳过ROM指令。
【3】写入字节0x44,开始温度转换。
【4】延时700~900ms。
【5】DS18B20复位。
【6】写入字节0xCC,跳过ROM指令。
【7】写入字节0xBE,读取高速暂存器。
【8】读取暂存器的第0字节,即温度数据的LSB。
【9】读取暂存器的第1字节,即温度数据的MSB。
【10】 DS18B20复位。,表示读取数据结束。
【11】将LSB和MSB整合成为一个16位数据。
【12】判断读取结果的符号,进行正负温度的数据处理。


float Read_Temperature()
{
  float temp;
  unsigned char LSB,MSB;      
  unsigned int dat = 0;      
  
  init_ds18b20();             //初始化DS18B20
  Display_Num();
  Write_DS18B20(0xcc);        //忽略ROM操作
  Write_DS18B20(0x44);        //启动温度转换
  Delay(1000);                //等待温度转换完成
  init_ds18b20();             //初始化DS18B20
  Write_DS18B20(0xcc);        //忽略ROM操作
  Write_DS18B20(0xbe);        //读出内部存储器
	
  LSB = Read_DS18B20();       //第0字节:温度低8位
  MSB = Read_DS18B20();       //第1字节:温度高8位
  init_ds18b20();             //初始化DS18B20,停止数据读取
  //上述程序中插入多处数码管刷新,可使显示亮度充足
  dat = MSB;                  
  dat = (dat << 8) | LSB;     //合并为16位温度原始数据
  //判断符号,处理正温度
  if((dat & 0xf800) == 0x0000)    	
  {
    temp = dat * 0.0625;      //计算实际温度值
  }
  return temp;
}

上述代码的前面部分主要是按步骤来走并且定义一些你可能用到的变量。主要是以下这部分温度转换需要知道是怎么来的。 

3.2 温度换算的原理

由图,其数据由两个寄存器LSB和MSB组成16位,(MSB为高8位,LSB为低8位)且为二进制补码形式读出。
低4位为小数部分,中间7位为整数部分。
高5位为扩展符号位,即BIT15~BIT11为00000,读出的数据为正温度,若为11111,则为负温度。

比如常见的温度对应的值小蜜蜂老师也总结了起来!!(大爱)

注意:在上电复位的时候,温度寄存器中的值为0x0550,即+85摄氏度。所以在应用开发中,有些朋友一直读到的数据都是85.5摄氏度,就说明DS18B20根本没有进行温度转换,你读到的是上电复位的初始值。


换算之前首先要把两个寄存器的16位进行合并。

可以使用以下代码,先把高8位的MSB值赋给变量dat,然后再把变量像左移动8位,其实就是为LSB的低8位腾出位置,然后再或上LSB。

  dat = MSB;                  
  dat = (dat << 8) | LSB;     //合并为16位温度原始数据

合并完16位后,就可以进行温度的换算率,换算原理小蜜蜂老师是这样写的:

从输出数据与温度值的关系表中可知,DS18B20的分辨率为0.0625。(最小分辨率即最小单位,这里最小为2的-4次方,等于0.0625(4位小数))
读出数据为正温度时,将LSB和MSB整合成的16位整数,直接乘以0.0625即可。(n个0.0625嘛)
读出数据为负温度时,则需要将LSB和MSB整合成的16位整数,取反加1后,再乘以0.0625,因为温度数据是以补码形式表示的。
例如:
读出结果为00A2H,温度值 = 162×0.0625 = 10.125 摄氏度。
读出结果为FF5EH,取反加1就是00A2H,温度值则为 -10.125 摄氏度。

欢迎指正。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ABNDP: Co-optimizing Data Access and Load Balance in Near-Data Processing——论文泛读

ASPLOS 2023 Paper 论文阅读笔记整理 问题 近数据处理&#xff08;NDP&#xff09;是一种很有前途的体系结构范式&#xff0c;可以解决数据密集型应用程序的内存墙挑战。基于3D堆叠存储器的典型NDP系统包含大量并行处理单元&#xff0c;每个并行处理单元都可以访问其本地存储…

YOLOv9改进策略:block优化 | SEAM提升小目标遮挡物性能

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;SEAM提升小目标遮挡物性能&#xff0c;在多个数据集得到很好的验证 改进结构图如下&#xff1a; YOLOv9魔术师专栏 ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️ ☁️☁️☁️…

Github实现push触发自动构建(包括提交代码到另一个仓库中和发布npm)

将指定内容自动更新到另一个代码仓库中 登录https://github.com&#xff0c;创建Personal access token&#xff1a; &#xff08;1&#xff09;github右上角&#xff0c;点击头像&#xff0c;进入Settings > Developer settings > Personal access tokens 下面的Tokens …

一名00后程序员初次使用低代码开发平台的感受

前言 大家好&#xff0c;我是小代&#xff0c;一名00后的Java后端开发工程师。我热爱编程&#xff0c;希望通过写博客来分享我的学习经验和心得。最近&#xff0c;我加入了一家专注于低代码开发平台的公司&#xff0c;这里的技术挑战和新颖性让我决定开始我的博客之旅。 工作…

3.1 SQL概述

SQL&#xff08;Structured Query Language&#xff09; 结构化查询语言&#xff0c;是关系数据库的标准语言 SQL是一个通用的、功能极强的关系数据库语言 功能&#xff1a;查询&#xff0c;数据库模式创建&#xff0c;数据库数据的插入与修改&#xff0c;数据库完整性、安全…

影响欧美货币对因素?fpmarkets提醒如何避免陷阱

欧元兑美元汇率不仅取决于美国经济数据&#xff0c;还取决于欧洲央行的报告。 美国经济数据不仅包括美联储利率和美国就业报告&#xff0c;还有美国石油储备、汽油储备和页岩油钻井平台数量的报告。fpmarkets发现更谨慎的投资者还会分析失业数据、平均时薪变化这些更细致的数据…

1.使用eNSP绘制拓扑图实训

1&#xff0e;实训目的 掌握使用eNSP绘制拓扑图的方法。 2&#xff0e;应用环境 某企业需要提升自己的网络环境&#xff0c;为了保证项目顺利的实施&#xff0c;需要使用eNSP事先绘制拓扑图。 3&#xff0e;实训设备 安装有eNSP的计算机。 4&#xff0e;实训内容 按照设…

矿场设备远程监控解决方案

矿场设备远程监控解决方案 在现代工业智能化进程中&#xff0c;针对矿场设备远程监控的解决方案显得尤为重要。这一方案旨在通过集成先进的信息技术与物联网技术&#xff0c;实现对矿场各类设备的实时、精准、高效的远程监控和管理&#xff0c;从而优化生产效率&#xff0c;降…

WHM中启用FTP功能

WHM面板上FTP功能默认是禁用的&#xff0c;我们在创建完cPanel账户之后&#xff0c;用到FTP去登录的时候会发现登录受限&#xff0c;这个时候可以去WHM面板上启用&#xff0c;这边以Hostease的独立服务器并且购买了cPanel面板为例&#xff0c;步骤如下&#xff1a; 1.先登陆WH…

what is apache?

Apache 通常指 Apache Software Foundation (ASF) 或 Apache HTTP Server&#xff0c;两者都是计算机软件领域的重要实体。 Apache 软件基金会 (ASF)&#xff1a;Apache 软件基金会是一个开发开源软件项目的非营利组织。它为涵盖软件开发各个方面的广泛项目提供支持&#xff0c…

01背包-动态规划

01背包 易知状态转移方程为&#xff1a; dp[i][j] max(dp[i-1][j],dp[i-1][j-v[i]]w[i]) 代码 N,V map(int,input().split()) v, w [0],[0] # 体积v&#xff0c;价值w for i in range(N):a list(map(int,input().split()))v.append(a[0]) # 体积viw.append(a[1]) # 价值w…

【牛客】【刷题节】美团2024届秋招笔试第一场编程真题

1.小美的外卖订单【简单题】 题意理解&#xff1a; 这道题是简单题&#xff0c;主要是一个逻辑实现和判断的问题。但是简单题一般喜欢加一点小障碍&#xff0c;所以读题的时候就要比较注意一些约束条件。就比如这道题&#xff1a;过了15/20个测试用例&#xff0c;出现error, 当…

基于ssm的社区文化宣传网站论文

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;社区文化宣传网站当然也不能排除在外。社区文化宣传网站是以实际运用为开发背景&#xff0c;运用软件工程开发方法&…

奇舞周刊第523期:来自 rust 生态的强烈冲击?谈谈 Leptos 在语法设计上的精妙之处...

奇舞推荐 ■ ■ ■ 来自 rust 生态的强烈冲击&#xff1f;谈谈 Leptos 在语法设计上的精妙之处 过去很长一段时间&#xff0c;前端框架们都在往响应式的方向发展。同时又由于 React hooks 的深远影响&#xff0c;函数式 响应式成为了不少前端心中最理想的前端框架模样。Solid …

语音情感分类(1)简单可运行项目(附代码)

1.目标 题主最开始是想做一个音乐情感分类的模型&#xff0c;但是查阅相关文献发现这个范围太大了&#xff0c;音乐情感特征包括文本&#xff0c;音频&#xff0c;甚至有的还有画面&#xff0c;是一个多模态的范畴。所以退而求其次&#xff0c;找了一个接近的语音情感分类来学…

Vmware虚拟机无法用root直连说明

Vmware虚拟机无法用root直连说明 背景目的SSH服务介绍无法连接检查配置 背景 今天在VM上新装了一套Centos-stream-9系统&#xff0c;网络适配器的连接方式采用的是桥接&#xff0c;安装好虚拟机后&#xff0c;在本地用ssh工具进行远程连接&#xff0c;ip、用户、密码均是成功的…

图片格式转换:快速将PNG转换为JPG的步骤

在我们的日常生活中&#xff0c;经常会遇到需要改变图片格式的情况&#xff0c;有时候&#xff0c;我们可能需要将PNG格式的图片转换为jpg格式&#xff0c;以适应不同的需求和应用场景;本文将介绍哥实用的方法和工具&#xff0c;帮助您顺利将png图片转换为jpg格式。 压缩图网站…

睿考网:注册会计师考试有什么题型?

注册会计师专业阶段考试共6门科目&#xff0c;各科目考试题型略有不同。 《会计》考试题型为单项选择题、多项选择题、计算分析题、综合题。 《审计》考试题型为单项选择题、多项选择题、综合题、简答题。 《税法》考试题型为单项选择题、多项选择题、综合题、计算问答题。 …

GPT提示词分享 —— 口播脚本

可用于撰写视频、直播、播客、分镜头和其他口语内容的脚本。 提示词&#x1f447; 请以人的口吻&#xff0c;采用缩略语、成语、过渡短语、感叹词、悬垂修饰语和口语化语言&#xff0c;避免重复短语和不自然的句子结构&#xff0c;撰写一篇关于 [主题] 的文章。 GPT3.5&#…

代码随想录算法训练营Day36|LC435 无重叠区间LC763 划分字母区间LC56 合并区间

一句话总结&#xff1a;都是和昨天的用最少箭引爆气球类似的题。 原题链接&#xff1a;435 无重叠区间 计数不重叠的区间的个数&#xff0c;然后用总长度减去这个值即可。 class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals, (a,…