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

news2024/11/16 18:39:39

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 摄氏度。

欢迎指正。

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

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

相关文章

公众号软文怎么写?媒介盒子告诉你

公众号软文是指在微信公众号平台上发布的一种营销文章&#xff0c;旨在通过有针对性的内容和亲民易懂的语言吸引读者&#xff0c;提高品牌知名度和销售额。然而公众号软文想要写好需要一定的技巧&#xff0c;今天媒介盒子就来和大家聊聊。 一、 分析用户需求 文案是写给用户看…

【深度学习】图片预处理,分辨出模糊图片

ref:https://pyimagesearch.com/2015/09/07/blur-detection-with-opencv/ 论文 ref:https://www.cse.cuhk.edu.hk/leojia/all_final_papers/blur_detect_cvpr08.pdf 遇到模糊的图片&#xff0c;还要处理一下&#xff0c;把它挑出来&#xff0c;要么修复&#xff0c;要么弃用。否…

【数学】第十三届蓝桥杯省赛C++ A组/研究生组 Python A组/研究生组《数的拆分》(C++)

【题目描述】 给定 T 个正整数 &#xff0c;分别问每个 能否表示为 的形式&#xff0c;其中 , 为正整数&#xff0c;, 为大于等于 2 的正整数。 【输入格式】 输入第一行包含一个整数 T 表示询问次数。 接下来 T 行&#xff0c;每行包含一个正整数 。 【输出格式】 对于…

CentOS 7 下安装RabbitMQ教程

CentOS 7 下安装RabbitMQ教程 一、做准备&#xff08;VMWare 虚拟机上的 CentOS 7 镜像 上安装的&#xff09; &#xff08;1&#xff09;准备RabbitMQ的安装包&#xff08;rabbitmq-server-3.8.5-1.el7.noarch&#xff09;下载地址mq &#xff08;2&#xff09;还得准备erl…

你的 Python 代码需要解释一下了!

Python 是一种相对简单的编程语言。它主要以解释型语言著称&#xff0c;这意味着每行代码都要通过解释器逐行执行。不过在某些时候&#xff0c;将 Python 代码翻译成计算机可以理解的内容&#xff0c;然后再逐行执行&#xff0c;可以减少繁琐。 在这种情况下&#xff0c;编译器…

日本EPSON 爱普生HUD汽车抬头显示系统芯片

目前HUD产品在新车上的配装率逐年上升&#xff0c;预计在2025年将达到30%。那么在介绍爱普生HUD整合方案之前&#xff0c;让我们先了解一下什么叫HUD。 HUD&#xff08;Head Up Display&#xff09;中文叫抬头显示系统&#xff0c;又被叫做平行显示系统。早被应用在飞机辅助…

2024游泳耳机哪个牌子好?分析测评四大热门游泳耳机

随着科技的不断发展&#xff0c;游泳耳机已经成为游泳爱好者们在水中畅游时的最佳伴侣。近年来游泳耳机市场涌现出了众多品牌和产品&#xff0c;让人眼花缭乱。为了帮助大家挑选到最适合自己的游泳耳机&#xff0c;我们特意对市面上四大热门游泳耳机进行了详细的分析测评&#…

【正点原子FreeRTOS学习笔记】————(13)队列集

这里写目录标题 一、队列集简介&#xff08;了解&#xff09;二、队列集相关API函数介绍&#xff08;熟悉&#xff09;三、队列集操作实验&#xff08;掌握&#xff09; 一、队列集简介&#xff08;了解&#xff09; 一个队列只允许任务间传递的消息为同一种数据类型&#xff…

【字节二面】SpringBoot可以同时处理多少请求

目录 一、示例代码二、那么springboot可以处理多少请求&#xff1f;三、maxConnections、maxThreads、acceptCount的关系 一、示例代码 RestController Slf4j public class RequestController {GetMapping("/test")public String test(HttpServletRequest request) …

飞书很好,但赢不了,只能裁员

心碎飞书 3 月 26 日&#xff0c;字节跳动旗下产品飞书的 CEO 谢欣发布全员信&#xff0c;正式宣布进行新一轮的组织调整&#xff0c;即裁员。 内部全员信如下&#xff1a; 我有不少朋友是在字节跳动&#xff0c;甚至就在 Lark 的。 同时我也因为会经常和一些平台的运营小伙伴有…

抖店被判无货源违规后该怎么办?避免这几项!开抖音小店无风险!

哈喽~我是电商月月 今天我们来聊一聊抖音小店被提示无货源风险后 商家怎么做&#xff0c;才能最大化挽回损失&#xff0c;以及后续如何避免的解决方案&#xff1a; 一&#xff0e;被判无货源的四个程度 1.收到平台提示&#xff1a;店铺存在无货源风险时 这个时候店铺基本就…

设置http响应报文

一、总结&#xff1a; (1)设置响应状态码&#xff1a; response.statusCode (2)设置响应状态描述&#xff1a; response.statusMessage() 使用的极少 (3)设置响应头信息&#xff1a; response.setHeader(头值,头名) (4)设置响应体&#xff1a; response…

个人或企业防止网络攻击的方法总结

个人或企业防止网络攻击的方法总结。 随着威胁形势的不断发展&#xff0c;建立全面的网络安全解决方案需要外围安全性和主动的网内防御 。随着网络攻击的范围&#xff0c;规模和频率不断增加&#xff0c;网络卫生正变得越来越重要。 与个人卫生相似&#xff0c;网络卫生是指旨…

文献速递:基于SAM的医学图像分割--SAMUS:适应临床友好型和泛化的超声图像分割的Segment Anything模型

Title 题目 SAMUS: Adapting Segment Anything Model for Clinically-Friendly and Generalizable Ultrasound Image Segmentation SAMUS&#xff1a;适应临床友好型和泛化的超声图像分割的Segment Anything模型 01 文献速递介绍 医学图像分割是一项关键技术&#xff0c;用…

阿里云部署宝塔,设置了安全组还是打不开。

1.在安全组是开放正确的端口好。8888要开&#xff0c;但是不只是开放8888&#xff0c;举个例子&#xff0c;https://47.99.53.222:17677/49706cf7这个&#xff0c;要开放17677这个端口号。 2.安全组要挂载到实例上&#xff0c;从三个点的进入点击管理实例&#xff0c;加到对应的…

对 Transformer 中位置编码 Position Encoding 的理解

目录 什么是位置编码 Position Encoding 一、将绝对位置编码加在 Transformer 的输入端 (Sinusoidal 位置编码或可学习位置编码) 二、将绝对位置编码乘在 q k v (RoPE 位置编码) 三、将相对位置编码加在注意力权重 (ALiBi 位置编码) 什么是位置编码 Position Encoding Tr…

wordcloud-1.9.2(1.9.3) for python 3.6/python3.X增强补丁

wordcloud-1.9.1开始无法在python3.6和海龟编辑器内正常使用&#xff0c;特做了一个whl 提供给python3.6使用。 另外我自己使用Python3.8 &#xff0c;因此wordcloud-1.9.2-cp36-cp36-win_amd64.whl 和wordcloud-1.9.3-cp38-cp38-win_amd64.whl&#xff0c;词云图上有前20个单…

【2024.3.27练习】小朋友排队

题目描述 题目分析 该题的答案交换次数与冒泡排序算法的交换次数应该是相同的。由于冒泡排序的时间复杂度为&#xff0c;不适合本题的数据大小。所以我们需要一个更加高效的数据结构。 分析题目&#xff0c;思路每轮是将最小的数字交换至最前&#xff0c;该数字的交换次数即它…

P5507 机关

题目背景 Steve成功降落后&#xff0c;在M星上发现了一扇大门&#xff0c;但是这扇大门是锁着的 题目描述 这扇门上有一个机关&#xff0c;上面一共有12个旋钮&#xff0c;每个旋钮有4个状态&#xff0c;将旋钮的状态用数字1到4表示 每个旋钮只能向一个方向旋转&#xff08…

页面router路由设计

Vue命名视图 命名视图 | Vue Router 如果要在 如何要在main区域里使用路由的话&#xff0c;整体区域是Layout&#xff0c;内涵Header和Nav以及Main path: /index,name: index,component: Layout, 若要只修改main区域的话&#xff0c;则取要加上v-if判断&#xff0c;来确实是…