【单片机】温度传感器 DS18B20

【51单片机】DS18B20(江科大) DS18B20是一种常见的数字温度传感器,其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点· 测温范围 :- 55℃到+125℃· 通信接口:1-Wire(单总线)· 其它特征:可形成总线结构、内置温度报警功能、可寄生供电。 阅读详情

前言

大家好,我是林白柏;

希望你看完之后,能有所收获,不足请指正!

PS:本文提到的模块都使用正点原子的stm32开发板战舰驱动,模块用的某宝现成的模块。

PS:代码为正点原子的代码,整理成自己习惯的接口

DS18B20介绍

基本情况

DS18B20是单总线接口的温度传感器,而且一个总线上可以挂多个DS18B20,通过传感器内部的64bit ROM区分不同的DS18B20(前8bit为家族码,随后48bit为序列号每个DS18B20的序列号均不相同,最后8bit是前56bit的CRC检验码),这点跟DHT11不同。

DS18B20的内部结构如下图

image-20220424211510902

寄生电源电路可以使DS18B20在不接电源的情况下工作。本文演示时有外接VDD

image-20220424212157388

另一个跟DHT11不同点是温度测量范围和精度,DS18B20测温范围-55_+125℃,精度±0.5℃(DHT11:0-50℃;±2℃),并且可以通过配置寄存器设置采样分辨率(温度数据的位数,9~12bits),位数越多采样需要的时间越长,对应关系如下图

image-20220424212538012

温度数据读回来后不能直接用,需要根据规格书提供的表进行转换才能得到温度值(这点没有DHT11那么直观,但也不复杂),对应关系如下表

image-20220424212810632

记温度值为T0,读回来的数据为T1,从表中可以得到T0 = T1 * 0.0625;

怎么通信

现在,你对DS18B20有了基本的了解,那接下来要解决的问题就是单片机怎么跟DS18B20通信了。

时序

  • 初始化信号(复位信号)

    主机拉低最少480us,之后将引脚设置为输入等待DS18B20(后面简称从机)15-60us后响应;从机的响应信号为拉低60-240us,之后释放总线,由上拉电阻将总线拉高;时序图如下图所示

image-20220424220644249

  • 读/写“0”和“1”

    写“1”和写“0”都是先拉低,如果是写“1”则在1us~15us内拉高,如果时写“0”,则在60us后拉高;

    读“1”和读“0”都是先拉低,然后将引脚配置为输入,在拉低的1us~15us内读取引脚电平,为高则为“1”,为低则为“0”;时序图如下图所示

    image-20220424221641095

通信流程

了解了初始化信号,读写“0”“1”的时序,接下来根据特定的通信流程,我们就能读出温度数据啦!

DS18B20的规格书有两页的通讯流程图,有兴趣的小伙伴可以去看下规格书下载,这里我们就用最简单的流程

  1. 触发传感器开始转换:

    复位 -> 发 SKIP ROM 命令(0xCC) -> 发开始转换命令(0x44)

  2. 延时,等待转换完成

  3. 读取温度:

    复位 -> 发送 SKIP ROM 命令(0xCC) -> 发读存储器命令(0xBE) -> 连续读出两个字节数据(即温度)

  4. 结束

发送命令 0xCC可跳过发送64bit ROM的环节,类似I2C的发送设备地址,因为我们只用了1个DS18B20,不用关心序列号,所以可以跳过;

发送命令0xBE可读出DS18B20的整个存储器的9bytes的数据,中间允许主机发送复位信号打断。因为我们只需要温度数据,所以只接收前2bytes的数据;读取数据时,数据是从Byte0(下图)的低位开始传输,写数据也是低位先写。更多命令请查看规格书

DS18B20的内存映射如下图所示

image-20220424215354959

代码讲解

这部分只讲解部分代码,完整代码可通过文末链接获取

基本信号

  • 复位信号

这部分跟DHT11的代码很像

void DS18B20_Rst(void)	   
{                 
	DS18B20_IO_OUT(); 	//SET PG11 OUTPUT
    DS18B20_DQ_OUT=0; 	//拉低DQ
    delay_us(750);    	//拉低750us(大于480us即可)
    DS18B20_DQ_OUT=1; 	//DQ=1 
	delay_us(15);     	//15US
}

复位信号之后等待DS18B20响应

u8 DS18B20_Check(void) 	   
{   
	u8 retry=0;
	DS18B20_IO_IN();	//SET PG11 INPUT	 
    while (DS18B20_DQ_IN&&retry<200)//DS18B20会拉低60-240us,没拉低说明传感器不存在
	{
		retry++;
		delay_us(1);
	};	 
	if(retry>=200)return 1;
	else retry=0;
    while (!DS18B20_DQ_IN&&retry<240)//等待DS18B20响应后释放总线。上面时序部分有提到,总线最后是由上拉电阻拉高
	{
		retry++;
		delay_us(1);
	};
	if(retry>=240)return 1;	    
	return 0;
}
  • 写1byte
void DS18B20_Write_Byte(u8 dat)     
 {             
    u8 j;
    u8 testb;
	DS18B20_IO_OUT();	//SET PG11 OUTPUT;
    for (j=1;j<=8;j++) 
	{
        testb=dat&0x01;//低位先写
        dat=dat>>1;
        if (testb) 
        {
            DS18B20_DQ_OUT=0;	// Write 1
            delay_us(2);                            
            DS18B20_DQ_OUT=1;
            delay_us(60);             
        }
        else 
        {
            DS18B20_DQ_OUT=0;	// Write 0
            delay_us(60);             
            DS18B20_DQ_OUT=1;
            delay_us(2);                          
        }
    }
}
  • 读1byte
u8 DS18B20_Read_Bit(void) 	 
{
    u8 data;
	DS18B20_IO_OUT();	//SET PG11 OUTPUT
    DS18B20_DQ_OUT=0; 
	delay_us(2);
    DS18B20_DQ_OUT=1; 
	DS18B20_IO_IN();	//SET PG11 INPUT
	delay_us(12);
	if(DS18B20_DQ_IN)data=1;
    else data=0;	 
    delay_us(50);           
    return data;
}

u8 DS18B20_Read_Byte(void)     
{        
    u8 i,j,dat;
    dat=0;
	for (i=1;i<=8;i++) 
	{
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }						    
    return dat;
}

读一帧数据

需要说明一点,前面提到温度值为T0 = T1 * 0.0625,这样就需要返回float变量;代码中是*0.625,得到的值为实际温度值的10倍,用户处理起来也比较方便。
举例:

  1. 产品需要将采集到的温度传给其他设备,如果返回float,用户如果直接传需要4bytes,否则得做转换;如果返回short,则用户可以直接传,只用2bytes;
  2. 产品需要在oled显示温度值,如果是float,要取小数部分就比较麻烦一点;如果是short,直接%10就可以得到小数部分。
uint8_t ds18b20_read_data( short * data )
{
    u8 temp;
    u8 TL,TH;
	short tem;
    DS18B20_Start ();  			// ds1820 start convert
    DS18B20_Rst();
    if( DS18B20_Check() ) {
        return 1;
    } 
    DS18B20_Write_Byte(0xcc);	// skip rom
    DS18B20_Write_Byte(0xbe);	// read [function command]  
    TL=DS18B20_Read_Byte(); 	// 低字节
    TH=DS18B20_Read_Byte(); 	// 高字节
	    	  
    if(TH>7)
    {
        TH=~TH;
        TL=~TL; 
        temp=0;					//温度为负  
    }else temp=1;				//温度为正	  	  
    tem=TH; 					//获得高八位
    tem<<=8;    
    tem+=TL;					//获得底八位
    tem=(float)tem*0.625;		//转换
	if(temp) *data = tem; 		//返回温度值
	else *data = -tem;  

    return 0;
}

代码使用方法

int main(void){
    dht11_init();
    
    while(1) {
        short temp_data = 0;
        
        if( !ds18b20_read_data( &temp_data ) ) {
            _LOG_DEBUG( "[ds] temp %0.1fC\n\n", ((float)temp_data/10.0));
        }
        else {
            _LOG_INFO("[err] ds18b20 read\n");
        }
        delay_ms(2000);
    }
}

今天就分享到这里,希望你在这篇文章中有所收获;不变秃且变强[doge]。

代码获取

共用代码:https://gitee.com/sumoting1629/mcu-practice/tree/master/common

驱动代码:https://gitee.com/sumoting1629/mcu-practice/tree/master/component

51单片机完全学习——DS18B20温度传感器 首先我们知道DS18B20使用的是单总线传输,默认情况下读出来的温度是12位的,我们这里只讨论外部电源供电这种情况。有这张图片我们知道,12位温度的最小分辨率是10^-4次方,因此就是0.0625.我们只需要将最后读到的温度,乘以0.0625即可得到我们测量到的温度。通过单总线端口访问DS18B20的协议是:首先进行初始化、ROM操作命令、存储器操作命令、执行/数据,这4步来完成的。接下来我们一步一步的来看。 阅读详情

相关推荐

FPGA学习笔记——DS18B20(数字温度传感器)

DS18B20数字温度传感器技术解析 DS18B20是DALLAS半导体公司推出的单总线数字温度传感器,具有体积小、精度高(±0.5℃)、抗干扰能力强等特点。该传感器采用独特的单总线接口,支持多点组网(通过64位唯一ROM编码识别),供电方式灵活(3-5.5V)。其12位分辨率可实现0.0625℃精度,测量范围-55℃至+125℃。工作流程包括初始化、ROM命令和功能命令三个阶段,通过特定的时序协议(包括480-960μs复位脉冲和存在响应)实现通信。传感器内部包含9字节高速缓存器,可配置温度报警阈值和分辨

ZHP的博客 2888

DS18B20 温度传感器

DS18B20是一种,应用非常广泛。它输出的是数字信号,同时具有体积小,硬件资源耗费少,抗干扰能力强,精度高等特点。1、采用与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量。2、测温范围: DS18B20温度传感器的测温范围可达-55℃~+125℃,在-10℃到+85℃范围内误差为±0.4°。3、支持多点组网功能:多个DS18B20温度传感器可以并联在一条数据线上,,实现多点测温。

2301_76461741的博客 1万+

51单片机温度传感器DS18B20

DS18B20是由DALLAS半导体公司推出的一种的“一线总线(单总线)”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、 适用电压宽、与微处理器接口简单的数字化温度传感器。

zhouhaoNB_的博客 8369

DS18B20的原理及实例代码(51单片机、STM32单片机)

DS18B20的原理及实例代码(51单片机、STM32单片机)

m0_73931287的博客 2万+

51单片机DS18B20温度传感器

51单片机DS18B20温度传感器

weixin_74209371的博客 7042

51单片机-温度传感器DS18B20

DS18B20的核心功能是它可以直接读出数字的温度数值。温度传感器的精度为用户可编程的9,10,11或12位,分别以0.5℃,0.25℃,0.125℃和0.0625℃增量递增。在上电状态下默认的精度为12位。DS18B20启动后保持低功耗等待状态,当需要执行温度测量和AD转换时,总线控制器必须发出[44h]命令。转换完以后,产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中,DS18B20继续保持等待状态。

好乐无荒之地 3524

51单片机——DS18B20温度传感器

管脚1为GND,管脚2为数据DQ,管脚3为VDD。

2301_81699298的博客 4803

51单片机 | DS18B20 温度传感器实验

DS18B20 温度传感器实验

F4_Family的博客 4326

51单片机——DS18B20 温度传感器实验,小白讲解,相互学习

计算-0.5,数据输出十六进制是0XFFF8,因为高字节的高 5 位为 1,表明检测的温度是负温度,那么0XFFF8对应的二进制(1111111111111000)就要取反,取反后变成0X0007,0X0007对应的十进制为7,在将7+1在乘以12 位精度 0.0625是0.5,因为高 5 位为 1,表明检测的温度是负温度,所以是 -0.5显示。知道了怎么计算温度,接下来我们就来看看如何读取温度数据,由于 DS18B20 是单总线器件,所有的单总线器件都要求采用严格的信号时序,以保证 数据的 完整性。

songbo1010的博客 1万+

基于51单片机的DS18B20温度传感器

DS18B20温度传感器 选用芯片:AT89S52 函数功能:如下 /************************************************************************* 此程序功能如下:此程序为DS18B20的使用程序。将DS18B20的温度值读取出来,并显 示在液晶LCD1602上。 作者:Crazy Wind 日期:2020.11.9 version:1.0.0 ******************************************

hu1436226193的博客 2309

Win10或Win8下ObjectARX2015 Wizard向导创建项目失败解决方法

[原创]objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法总结 by edata @2017-5-1 objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法 因为Win8/Win10对系统盘(默认c:)使用了高级权限管理,所以在此盘下操作文件的修改工作都需要管理员权限才行。 基于这个原因,导致非管理员安

edata的博客 7029

51单片机&15单片机 温度传感器DS18B20

DS18B20模块讲解 15单片机 & 51单片机利用DS18B20温度读取的源码分享

weixin_63135906的博客 8634

Win11下DCMTK的Visual Studio 2022配置教程

最近有个新需求,需要完成读取和解析DICOM数据相关的SDK

qq_45797625的博客 3261

51单片机DS18B20温度传感器及数码管显示温度

51单片机DS18B20温度传感器及数码管显示温度 大家好,今天给大家带来的代码及原理解释是,在51单片机在接收DS18B20温度传感器数据,并且在数码管上实时显示温度 DS18B20及数码管显示温度介绍51单片机DS18B20温度传感器及数码管显示温度DS18B20作用怎么读取DS18B20的“1”和“0”怎么让数码管显示在单片机的数码管上 DS18B20作用 我们常用的DS18B20长什么样呢 它一共有3个角,分别是 GND(接地) DQ(数据总线,与单片机的一个IO口相连) Vdd

knbroken的博客 3万+

飞牛NAS一键部署小雅Emby全家桶:解锁海量影音资源与智能刮削

本文详细介绍了如何在飞牛NAS上通过Docker一键部署小雅Emby全家桶,完美解决传统WebDAV挂载无法刮削元数据的问题。该方案整合了小雅Alist海量影音资源与Emby媒体服务器,通过预下载超百GB元数据包,自动实现海报、简介等信息的完美匹配,打造出精美的个人影音库。部署过程需准备阿里云盘令牌与充足存储空间,并详解了从环境配置、镜像拉取到最终验证的完整步骤及优化技巧。

weixin_28312391的博客 919

【毕业设计参考】基于yolov8+pyqt5自适应界面设计的锂电池表面缺陷检测系统

基于YOLOv8+PyQt5的锂电池表面缺陷检测系统结合了先进的目标检测技术与友好的用户界面设计,为锂电池质量检测提供了一种高效、准确的解决方案。未来,随着深度学习技术的不断发展,我们可以进一步优化模型,提高检测精度和速度,同时拓展系统功能,如实现实时视频流检测、与生产系统的深度集成等,为锂电池产业的发展注入新的活力。希望本文对大家在相关领域的研究和实践有所帮助,欢迎大家在评论区交流讨论。

1182

51单片机(十三)DS18B20温度传感器

本节主要介绍学习DS18B20温度传感器的相关知识,包括DS18B20温度传感器基础知识介绍、本节目标等;并利用两个小实验来写程序进行练习,分别是**DS18B20温度读取**以及**DS18B20温度报警器**,最后附上相关代码。

AnChenliang_1002的博客 1万+

BUCK电路的大信号模型与小信号模型推导

推导开关电源信号模型的核心是将非线性开关过程线性化,常用。如需具体拓扑的推导细节,可进一步说明!

创新改变世界! 1169

c51单片机和DS18B20温度传感器

需要注意的是,具体的实现方式可能因单片机的型号和编程语言而有所不同。R0 用来设置 DS18B20 的精度(分辨率),可设置为 9,10,11 或 12 位,对应的分辨率温度是 0.5℃,0.25℃,0.125℃和 0.0625℃。配置寄存器是配置不同的位数来确定温度和数字的转化,低五位一直都是"1",TM 是测试模式位,用于设置 DS18B20 在工作模式还是在测试模式。6、可编程的分辨率为 9~12 位,对应的可分辨温度分别为 0.5℃、0.25℃、0.125℃ 和 0.0625℃,可实现高精度测温。

2302_76950368的博客 3761

在x86机器上运行jailhouse

jailhouse jaihouse提供了一个demo ,https://github.com/siemens/jailhouse-images可以用于编译一整套可用的demo。 适用于多个平台。编译过程主要参考https://blog.youkuaiyun.com/weixin_39541632/article/details/110422345 此demo可以生成多个平台所用的操作系统image。 ...

闲人的专栏 3004

Hypermesh到Abaqus CEL网格转换全攻略:解决欧拉体导入难题

本文详细解析了Hypermesh到Abaqus CEL网格转换的全流程,重点解决欧拉体导入难题。通过单元类型转换、INP文件编辑和多组件合并技术,实现流固耦合仿真的高效前处理。文章包含实用脚本和工程案例,帮助工程师突破ABAQUS CEL分析中的网格转换瓶颈。

weixin_30832143的博客 189

蓝桥杯单片机——DS18B20温度传感器(16)

一、原理分析 DS18B20是常用的数字温度传感器,其输出的是数字信号,温度转换时的延时时间为750ms。 在蓝桥杯单片机资源包中,会提供一个关于DS18B20的底层驱动库文件,onewire.c文件和onewire.h文件。里面实际上只有DS18B20复位操作、字节写操作和字节读操作三个函数。温度传感器DS18B20是单总线通信器件,对总线的操作有很严格的时序要求。如果出现序列混乱,器件将不响应主机,因此DS18B20底层驱动程序中时序很重要。对于不同系统时钟的微处理器,其时序延时参数可能需要做.

m0_57263863的博客 1万+

解决Jupyter Notebook中Plotly图表显示问题

摘要:在Jupyter Notebook中使用Plotly绘图时遇到图表无法显示的问题。通过分析发现Python 3.12版本与Jupyter存在兼容性问题。解决方案是将Python降级到3.11版本,重新创建虚拟环境后图表正常显示。这表明版本兼容性对数据可视化工具至关重要,环境配置检查是解决问题的关键步骤。该案例为遇到类似问题的开发者提供了参考方案。

m0_74337424的博客 124

单片机学习 14-DS18B20温度传感器实验

​ DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线(单总线)”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。​ DS18B20 温度传感器具有如下特点:​ 1、适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电。很少这样操作,一般直接用电源供电。​ 2、独特的单线接口方式,DS18B20 在与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。

qq_25218501的博客 3168

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

51单片机驱动DS18B20温度传感器测量温度

51单片机驱动DS18B20温度传感器测量温度1.DS18B20温度传感器介绍;2.51单片机驱动DS18B20测量温度 1.DS18B20温度传感器介绍; ①引脚定义 引脚 符号 说明 1 GND 地 2 DQ 单总线的数据输入/输出引脚(需接5KΩ上拉电阻) 3 V DD 电源正 ②测量范围从-55 至+125 增量值为 0.5 等效的华氏温度范围是-67 F至257 F 增量值为 0.9 F; ③在设计电路中数据线需接5KΩ电阻; ④单线接口访问 DS1820 的协议:

jun8086的博客 2902

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【51单片机】DS18B20温度传感器

2024.1.29更新。

qq_63100905的博客 1079

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 【单片机】超声波测距模块
下一篇: 泰凌微B91开发环境搭建
该起床了1111
博客等级 码龄9年 67粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值