单总线数字传感器DS18B20使用总结

2023-11-21 22:20

本文主要是介绍单总线数字传感器DS18B20使用总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DS18B20是常用的一款数字型温度传感器,具有结构简单、抗干扰能力强、精度高、价格便宜等的优点。本文以它为例总结一些单总线数字传感器在使用过程中需要注意的一些事项,以供大家参考。

文章目录

  • 硬件综述
  • 基于51单片机的代码
  • 总结

硬件综述

在介绍这种传感器之前,先来梳理一下什么叫单总线数字传感器,个人理解为:所谓单总线,就是只有一根引脚用作主机和从机之间数据传递,如果是数字型的传感器,一般这根线一般还要承载时钟同步的任务。

DS18B20就是上面所说的那样一种传感器,如下图(图片来自百度):
在这里插入图片描述
它有3根引脚,但只有中间的那一根才用做数据交互、时钟同步等。对于这样的单总线数字传感器来说,它对主机产生的时序信号要求十分严格,主机产生的时序稍“不合它意”,就会出现时序紊乱的后果,最终会造成传感器不响应,这样也就不会有输出了。所以在使用这类传感器的时候,切记时序要严格控制。

基于51单片机的代码

以常用的51单片机为例,这里我们给出该传感器的驱动程序,首先是传感器的初始化(也称为复位),其时序应为:主机先将总线电平拉低一段时间,数据手册上说500us左右,但实际上可能存在传感器响应较快,而且单片机执行延时代码的时候,会额外占用一小部分机器周期,所以,延时的时候一般 50 − 100 u s 50-100us 50100us就差不多了;然后释放总线,等待传感器的响应,等待时间约为 15 − 60 u s 15-60us 1560us,但实际时间 5 − 10 u s 5-10us 510us就差不多了;之后,如果总线电平为0,说明响应成功,否则失败。具体可以参考我下面贴出来的代码:

void delay(unsigned int t) //延时,重要!单总线传感器对时序要求比较严苛,请不要轻易修改此函数!
{for(;t>0;t--) ;
}bit DS18B20_Init(void) //初始化;更多参考资料,尽在微信公众号“24K纯学渣”
{bit pre;DQ = 0;delay(50);DQ = 1;delay(3);pre = DQ;delay(25);return pre;
}	

之后就是往传感器里面写数据和读数据了,写1bit的时序为:写0的话,主机需要将总线拉低至少60us;写1的时候,先拉低15us,再拉高45us左右。读1bit数据的时序为:主机先将总线拉低15us,然后释放总线,接着的45us的时间内就是读取到的数据,也就是说,读和写的基本时间单位都为60us左右。下面以字节为单位,给出示例代码:

unsigned char TempReadByte(void) //读取字节数据;更多参考资料,尽在微信公众号“24K纯学渣”
{unsigned char i;unsigned char v;for(i=8;i>0;i--){v >>= 1;DQ = 0;DQ = 1;delay(1);if(DQ) v |= 0x80;delay(6);}return v;
}void TempWriteByte(unsigned char dat) 
{unsigned char i;for(i=8;i>0;i--){DQ = 0;DQ = dat&0x01;delay(5);DQ = 1;dat /= 2;}delay(5);
}

然后就是读取温度值了。既然是数字型传感器,那么就一定存在配置寄存器、读数据寄存器等流程,DS18B20的寄存器内部存储结构主要分为两部分,一部分是ROM,存放的是64位的序列号,另一部分才是我们感兴趣的数据或控制寄存器,以字节为单位总有8B,分别为:温度转换后的低字节、温度转换后的高字节、高温触发器(TH)、低温触发器(TL)、配置寄存器、3B的保留和最后的CRC校验字节。这些传感器中,我们只感兴趣的是前两个字节,它有16位,但是16bit中高5位为符号位(1为负、0为正)、紧接着7bit为整数部分,最后4bit为小数部分,所以读取出这16bit的数据之后还要做进一步的计算。下面给出获取一次温度数据的例子:

//更多参考资料,尽在微信公众号“24K纯学渣”
float getTemp(void) //获取一次温度数据,返回的数据可精确到0.0625
{unsigned char tl,th;unsigned int tt;float temp = 0.0;bit fg; //标记正负;更多参考资料,尽在微信公众号“24K纯学渣”DS18B20_Init();TempWriteByte(0xcc); //直接往控制寄存器写入命令TempWriteByte(0xbe);  //准备从数据寄存器读取数据;更多参考资料,尽在微信公众号“24K纯学渣”tl = TempReadByte();th = TempReadByte();	DS18B20_Init();TempWriteByte(0xcc);TempWriteByte(0x44); //转换,为下次读取做准备tt = th*256+tl;fg = 0; if(tt&0xf800)  //如果高5位为11111,则说明温度值为负{tt = ~tt + 1;fg = 1;}temp = tt/16.0; //转化为浮点数if(fg) temp *= (-1);return temp;
}

最后,借助51的串口,把数据以保留一位小数的格式打印到串口助手上,代码如下:

void main(void)
{float temp;int Itemp;char buf[8] = "ERROR! "; //如果DS18B20初始化失败或其他原因,将会发送错误提示字符串uartInit();while(1){temp = getTemp(); //计算得到一次浮点型温度数值Itemp = (int)(temp * 10); //可保留一位小数if(temp < 0) //标注正负符号{buf[0] = '-';Itemp = 0 - Itemp;}else{buf[0] = '+';}buf[1] = Itemp / 1000 + 0x30; //把浮点型数据转化为字符串buf[2] = (Itemp % 1000) / 100 + '0';buf[3] = (Itemp %100) / 10 + '0';buf[4] = '.';buf[5] = Itemp % 10 + '0';buf[6] = ' ';sendString(buf,7); //发送数据delay_ms(1000);}return;
}

总结

对于单总线数字传感器,这里还要再提一下,因为时序问题真的非常重要,如果时序不正确,初始化的时候就会失败,也就没有后面所谓的读写数据了,所以在调试的过程中,如遇到读不到数据的情况,很有可能就是时序问题导致的。最后的最后,完整的Keil Project共享在微信公众号“24K纯学渣”上面,回复“温度传感器”即可获取。

这篇关于单总线数字传感器DS18B20使用总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_42144047/article/details/106495631
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/405502

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四