单总线数字传感器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使用总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/405502

相关文章

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面