DS18B20温度传感器

2023-11-01

1、DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点:

  • 采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量。
  • 测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C范围内,精度为 ± 0.5°C 。
  • 在使用中不需要任何外围元件。
  • 持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温。
  • 供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。
  • 测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。
  • 负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
  • 掉电保护功能 DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。

2、DS18B20内部结构:

DS18B20内部主要包括,64位ROM、2字节温度输出寄存器、1字节上下警报寄存器(TH和TL)和1字节配置寄存器。ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同,这样就可以实现一根总线挂接多个DS18B20的目的。配置寄存器允许用户将温度 - 数字转换的分辨率设置为9,10,11或12位。DS18B20控制引脚需要一个上拉电阻,并通过开漏模式连接到总线。DS18B20无需外部电源也可运行,当总线为高电平时,通过DQ引脚提高电源,并将电存储在Cpp电容中,在总线处于低电平时为器件供电,这种方法称为“寄生电源”。另外DS18B20也可通过VDD供电。结构图如下:

 

3、DS18B20内部构成:

 高速暂存存储器由9个字节组成,分为温度的低八位数据0、温度的高8位数据1、高温阈值2、低温阈值3、配置寄存器4、保留5、保留6、保留7和CRC校验8。器件断电时,EEPROM寄存器中的数据保留,上电后,EEPROM数据被重新加载到相应的寄存器位置,也可以使用命令随时将数据从EEPROM重新加载到暂存器中。

4、温度寄存器数据格式:

DS18B20中的温度传感器数据用16位二进制形式提供,其中S为符号位(正数S=0,负数S=1)。温度传感器的分辨率可由用户配置为9、10、11或12位,分别对应0.5℃、0.25 ℃、0.125℃和0.0625℃的增量。开机时的默认分辨率是12位。如果DS18B20配置为12位分辨率,那么温度寄存器中的所有位都将包含有效数据。对于11位分辨率,0位没有定义。对于10位分辨率,位1和0没有定义,对于9位分辨率,位2、位1和位0没有定义。

5、TH和TL报警寄存器格式:

TH和TL寄存器存储温度报警触发值,符号位S表示值是正还是负,对于正数,S=0,对于负数,S=1。DS18B20执行温度转换后,将温度值与用户定义的两个报警触发值进行比较,由于TH和TL是8位寄存器,因此在比较TH和TL时只使用温度寄存器的第11位到第4位,如果被测温度低于或等于TL值,或高于或等于TH值,则在DS18B20内部存在报警条件,并设置报警标志。主设备可以通过发出一个[EC]命令来检查总线上所有DS18B20的报警标志状态。TH和TL寄存器是非易失性的(EEPROM),当设备断电时,它们将保留数据。可以通过内存部分暂存器的字节2和字节3访问TH和TL。

6、配置寄存器数据格式:

在配置寄存器中,我们可以通过R0和R1设置DS18B20的转换分辨率,DS18B20在上电后默认R0=1和R1=1(12分辨率),寄存器中的第7位和第0位到4位保留给设备内部使用。

7、 初始化时序:

主机首先发出一个最少480微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。

做为从器件的DS18B20在一上电后就一直在检测总线上是否有至少480微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。

8、写操作时序:

 

 写周期最少为60微秒,最长不超过120微秒。若主机想写0,则把总线拉低电平最少60微秒直至写周期结束。若主机想写1,则一开始主机先把总线拉低1微秒表示写周期开始,1微秒后就释放总线为高电平,一直到写周期结束。做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。

9、读操作时序:

 对于读数据操作时序也分为读0时序和读1时序两个过程。读时序是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成。

10、DS18B20 单线通信功能是分时完成的,他有严格的时序概念,如果出现序列混乱, 1-WIRE 器件将不响应主机,因此读写时序很重要。系统对 DS18B20 的各种操作必须按协议进行。根据 DS18B20 的协议规定,微控制器控制 DS18B20 完成温度的转换必须经过以下 3个步骤 :

  • 1、每次读写前对 DS18B20 进行复位初始化。复位要求主 CPU 将数据线下拉 500us ,然后释放, DS18B20 收到信号后等待 16us~60us 左右,然后发出60us~240us 的存在低脉冲,主 CPU 收到此信号后表示复位成功。

  • 2、发送一条 ROM 指令。

 

  •  3、发送存储器指令。

11、 Sensor_Temp.c

#include "sensor_temperature.h"
#include "bsp_systick.h"		 
							
// 传感器复位函数
void DS18B20_Reset(void)
{
    DS18B20_DQ_OUT_L;
    SYSTICK_DelayUs(480);   
    DS18B20_DQ_OUT_H;
    SYSTICK_DelayUs(15);	
}

// 等待传感器响应函数
bool DS18B20_Check(void) 	   
{   
    uint8_t retry = 0;
    while(DS18B20_DQ_IN)  { if(retry++ > 60) { return false;} else { SYSTICK_DelayUs(1);	} }	
    retry = 0;	
    while(!DS18B20_DQ_IN) { if(retry++ > 240){ return false;} else { SYSTICK_DelayUs(1);	} }	
	return true;
}

// 传感器初始化
bool DS18B20_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_AHBPeriphClockCmd(DS18B20_RCC_ClockCmd , ENABLE);

    GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_Pin_x;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(DS18B20_GPIOx, &GPIO_InitStructure);

    DS18B20_Reset(); // 传感器复位
    return DS18B20_Check();
}

// 向传感器写数据
void DS18B20_Write(uint8_t data)
{
    for (uint8_t i=0; i<8; i++) 			
    {		
	if(data&0x01)			
	{
	    DS18B20_DQ_OUT_L;
	    SYSTICK_DelayUs(2);     
	    DS18B20_DQ_OUT_H;
	    SYSTICK_DelayUs(60);    	 
	}
	else 						
	{
	    DS18B20_DQ_OUT_L;
	    SYSTICK_DelayUs(60);      
	    DS18B20_DQ_OUT_H;
	    SYSTICK_DelayUs(2);     
	}
	data >>= 1;
    }
}

// 从传感器读取一个Bit数据
uint8_t DS18B20_Read_Bit(void) 
{
    uint8_t data;
    DS18B20_DQ_OUT_L;
    DS18B20_DELAY_2US();
    DS18B20_DQ_OUT_H;
    DS18B20_DELAY_2US();
    data = DS18B20_DQ_IN;
    SYSTICK_DelayUs(50);
    return data;
}

// 从传感器中读取一个字节数据
uint8_t	DS18B20_Read_Byte(void)
{
    uint8_t data = 0;
    for(uint8_t i=0; i<8; i++)
    {
	data >>= 1;
	if(DS18B20_Read_Bit())
	{
	    data |= 0x80;			
	}
    }
    return data;
}


// 向传感器发送指令,测量温度
void DS18B20_Start(void)
{
    DS18B20_Reset();
    DS18B20_Check();
    DS18B20_Write(0xCC); // 忽略ROM地址,直接发送命令
    DS18B20_Write(0x44); // 启动DS18B20单个温度转换
}

float data;
// 读取传感器的值
float	DS18B20_Get_Temp(void)
{
    DS18B20_Start();
    DS18B20_Reset();
    DS18B20_Check();
    DS18B20_Write(0xCC); // 忽略ROM地址,直接发送命令
    DS18B20_Write(0xBE); // 读取暂存器中9字节数据
    data = ((uint16_t)DS18B20_Read_Byte() | DS18B20_Read_Byte()  << 8) * 0.0625f;
    return data;
}

8、Sensor_Temp.h

#ifndef _BSP_TEMPERATURE_H_
#define _BSP_TEMPERATURE_H_

#include "stm32f0xx.h"
#include <stdbool.h>

#define DS18B20_RCC_ClockCmd			RCC_AHBPeriph_GPIOA
#define DS18B20_GPIO_Pin_x			GPIO_Pin_0
#define DS18B20_GPIO_NUMBER			0
#define DS18B20_GPIOx				GPIOA
										   
#define	DS18B20_DQ_OUT_H	GPIO_SetBits(DS18B20_GPIOx, DS18B20_GPIO_Pin_x)
#define DS18B20_DQ_OUT_L	GPIO_ResetBits(DS18B20_GPIOx, DS18B20_GPIO_Pin_x)
#define	DS18B20_DQ_IN  		GPIO_ReadInputDataBit(DS18B20_GPIOx, DS18B20_GPIO_Pin_x)

// 定义内联延时函数
static inline void DS18B20_DELAY_2US(void)
{
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();		
}	 		
	

void DS18B20_Reset(void);
bool DS18B20_Check(void);
bool DS18B20_Init(void);
uint8_t DS18B20_Read_Bit(void);
uint8_t DS18B20_Read_Byte(void);
void DS18B20_Write_Byte(uint8_t dat);
void DS18B20_Start(void);
float DS18B20_Get_Temp(void);
	
#endif

9、主函数

int main()
{
    SYSTICK_Init(1); // 滴答定时器初始化
    DS18B20_Init(); // 传感器初始化
    USART1_Init(); // 串口初始化
    while(1)
    {
	printf("Temperature is: %f\r\n",DS18B20_Get_Temp());	
	SYSTICK_DelayMs(800);
    }
}

参考资料地址:http://www.21ic.com/jichuzhishi/datasheet/DS18B20/data/187578.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DS18B20温度传感器 的相关文章

  • 高斯整数环学习心得随笔及其实现

    高斯整数环学习心得随笔 过些天补上 代码 两个高斯整数相伴 即为相等 小于和大于 用复数的范数Norm来比较 应用场景举例 高斯整数环的唯一分解定理证明 整除和取模 带余除法 复数除法的结果是个有理数 但为了方便还是直接用double存了
  • torch 矩阵操作

    1 按索引赋值 index put index put不改变变量本身 index put 改变变量本身 相当于inplace操作 index input 维度1坐标列表 维度2坐标列表 赋值列表 x torch ones 3 3 print
  • Ubuntu20.04换为清华的镜像源

    安装过程 Ubuntu 的软件源配置文件是 etc apt sources list 在修改之前 先将系统自带的该文件做个备份 将该文件替换为清华源官网提供的内容 即可使用 TUNA 的软件源镜像 第一步 切换到root账户 sudo s
  • web前端(HTML+CSS)试题总结

    一 填空题 1 网页的后缀名通常为 xxx html 或 xxx htm 的页面 2 请写出在网页中设定表格边框的厚度的属性 border 设定表格单元格之间宽度属性 cellspacing 设定表格资料与单元格线的距离属性 cellpad
  • docker_run_application

    docker三种方式运行application 1 一次性运行 docker run ubuntu 14 04 bin echo Hello world 登录到container ubuntu14 04 运行命令 bin echo Hell
  • 六、HSV颜色空间应用实例——颜色分割提取与替换

    教程汇总 python基础入门系列 通过之前的章节 四 OpenCV颜色空间 HSV颜色模型 我们已经初步认识了HSV颜色空间的特性与优势 现在就来看两个典型的应用实例 颜色分割提取 与 颜色替换 颜色分割 通过HSV颜色空间的操作我们可以
  • visual studio 2019 调试驱动

    搭建驱动开发环境 搭建环境需要两台机器 本地机器用来代码开发 一台虚拟机用来测试和安装驱动 搭建驱动开发环境参考 visual studio 添加调试机器 驱动工程的属性 gt Driver Installer gt Deployment
  • 第三篇.WDF驱动之Helloworld

    借助Microsoft提供的kmdf框架 来理解一下驱动的一般流程 驱动的开发流程 1 驱动程序入口函数 DriverEntry 驱动程序的入口函数 类似于 main函数 程序的标准入口函数是DriverEntry 与WDM不同 WDF的D
  • Vue2.0安装Element-ui

    1 在项目终端输入 npm i element ui S 如果想知道是否安装成功 2 随后在main js里引入element组件 加载 element 组件库 import ElementUI from element ui 加载 ele
  • Linux入门级命令

    目录 1 开启终端 2 Linux命令格式 3 扩展 Linux下的命令补全 4 切换用户 5 uname命令 6 ls命令 用法一 用法二 用法三 7 pwd命令 8 cd命令 9 clear命令 10 reboot命令 11 shutd
  • MySQL表字段设置默认值

    环境 MySQL 5 1 命令行工具 问题 MySQL表字段设置默认值 解决 SQL CREATE TABLE test i a int NOT NULL DEFAULT 1 ts b timestamp NOT NULL DEFAULT
  • chrome启动参数设置

    chrome禁止本地浏览时加载本地其他文件 可以采用添加启动参数的方式来支持 添加参数为 allow file access from files 或者 disable web security Google Chrome 浏览器默认安装路
  • KDD‘21华为数值型特征做embedding,An Embedding Learning Framework for Numerical Features in CTR Prediction

    本文是针对数值型特征做embedding的方法 背景 图1 常用的数值型embedding方法可以分为以下三类 No Embedding 这类方法不做embedding 而是直接用原始的数值作为特征 或者在数值上面做一些改进 例如youtu
  • React 核心概念(3)

    React 核心概念 3 1 事件处理 React 元素的事件处理和 DOM 元素的很相似 但是有一点语法上的不同 引自 事件处理 React 事件的命名采用小驼峰式 camelCase 而不是纯小写 使用 JSX 语法时你需要传入一个函数
  • 写网关介绍比较好的文章地址

    https www jianshu com p 5bc4c0f58bf3
  • 自带内网穿透的文件同步工具Syncthing介绍

    文章目录 特征简介 下载与安装 简单介绍 后记 特征简介 Syncthing是一个文件同步工具 可以实现异地电脑间的文件同步 Syncthing自带内网穿透功能 文件同步过程将以P2P方式进行 Syncthing支持Windows MacO
  • QT中QDockWidget使用详解

    Qt系列文章目录 文章目录 Qt系列文章目录 前言 一 具体操作 1 QDockWidget控件配置函数 2 代码 1 头文件 2 实现文件 效果 遇到的问题 前言 QDockWidget提供了dock widget的概念 也称为工具面板或
  • shell脚本基础5——常用命令写作技巧

    文章目录 一 grep命令 二 sed命令 2 1 选项参数 2 2 常用命令 三 AWK命令 3 1 常用参数 3 2 常用示例 四 find与xargs 五 date命令 六 对话框 6 1 消息框 6 2 yes no对话框 6 3
  • 信息安全风险评估---矩阵法计算风险

    矩阵法计算风险 假设 有以下信息系统中资产面临威胁利用脆弱性的情况 共有两项重要财产 资产A1和资产A2 资产A1面临一个主要威胁T1 资产A2面临两个主要威胁T2 T3 威胁T1可以利用资产A1存在的两个脆弱性 脆弱性V1和V2 威胁T2

随机推荐

  • 小程序DOM如何转为图片并将图片分享给朋友?

    方案一 h5中转页 1 利用web端插件html2canvas将dom转成图片 h5端 入参请参考文档 http www dtmao cc ios 65361 html html2canvas refdom useCORS true sca
  • 可穿戴设备未来市场巨大

    可穿戴设备将冲击智能手机的存在 不可否认 可穿戴设备未来的市场非常之大 甚至极有可能冲击智能手机的存在 从功能角度讲 可穿戴设备有机会一步步替代智能手机 现阶段来讲 许多可穿戴设备只能算是手机的附庸产品 通讯 社交等功能以手机为基础 可穿戴
  • STM32定时器(输入捕获)

    上一章讲了输出比较的内容 输出比较就是定时器自增 同时和CCR比较 按照自己设置的比较要求 输出REF高低电平 这一章我们讲下面结构图输出比较左边部分 也就是输入捕获 首先 介绍一下输入捕获 IC input capture 输入捕获 输入
  • Vuforia SDK分析

    Vuforia Architecture 高通组件 camera 单实例 在需要摄像头的时候会返回唯一的摄像头实例 Image Converter 单实例 像素级的图像转换器 在相机的 OpenGL ES rendering 格式和 tra
  • Android中保存当前按钮的状态 按back键返回之后再次进入没有改变

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 一 使用SharedPreferences类 把用户操作记录保存到里面 因为是按钮的状态 所以在点击事件里面保存用户的操作数据 获取用户
  • 哨向 Mika & Lelush 1

    Report On Sentinels Guides of Atypical Combinations 非典型性哨兵向导结合报告 1 你是我的灯塔
  • HTML5 地理定位 【来自百度应用分享平台】

    百度给的地图API接口相当完善 复制过来一下 以后备用 基本使用方法
  • Day2:跨站脚本攻击

    目标 持续输出 每日分享关于web前端常见知识 面试题 性能优化 新技术等方面的内容 篇幅不会过长 方便理解和记忆 主要面向群体 前端开发工程师 初 中 高级 应届 转行 培训等同学 Day2 今日话题 想必大家经常会在面试中或者工作生活中
  • QT从入门到实战x篇_30_绘图设备(QPixmap、QBitmap、QImage和 QPicture;QPixmap、QBitmap绘制及保存;QImage像素操作;QPicture记录和重现)

    前面QT从入门到实战x篇 27 绘图事件QPainter 绘图事件void painterEvent 声明一个画家对象 QPainter painter this 画笔QPen 画刷QBrush QT从入门到实战x篇 28 绘图事件QPai
  • 用pandas进行数据分析实战

    安装pandas模块包 载入练习数据 在pandas中 常用的载入函数是read csv 除此之外还有read excel和read table table可以读取txt 若是服务器相关的部署 则还会用到read sql 直接访问数据库 但
  • 机器学习基础:核密度估计(Machine Learning Fundamentals: Kernel Density Estimation)

    在概率密度估计过程中 如果我们队随机变量的分布是已知的 那么可以直接使用参数估计的方法进行估计 如最大似然估计方法 然而在实际情况中 随机变量的参数是未知的 因此需要进行非参数估计 核密度估计是非参数估计的一种方法 也就是大家经常听见的pa
  • 关于LLVM IR和Valgrind 中间语言区别

    1 LLVM和Valgrind简介 LLVM Low Level VirtualMachine 是伊利诺伊州立大学香槟分校的ChrisLattner主持开发的一个编译器框架 随着ChrisLattner去苹果公司 LLVM作为苹果公司官方支
  • pymongo使用update_many方法批量更新记录

    使用的主要函数是 coll update many 当需要对同一批数据进行更新的时候 可以用这个函数 使用时 coll update many 筛选这一批数据需要查询的内容 字典类型 set 更新的内容 字典类型 使用方法如示例代码 示例代
  • 从0搭建Hyperledger Fabric2.5环境

    Hyperledger Fabric 2 5环境搭建 一 Linux环境准备 root登录 yum y install git curl docker docker compose tree yum y install autoconf a
  • NSNumber NSValue与NSDate 详解

    我们在编码中 很多时候需要将C里面原生的数据封装成对象 这样可以用NSDictionary或者NSArray来存取访问 尤其是一些做适配的情况下 这种封装是不可避免的 Objective C提供了不少类可以帮助我们 比较常见的是NSNumb
  • [转载]Stanford华人教授李飞飞写给她学生的一封信,如何做好研究以及写好PA

    De mystifying Good Research and Good Papers By Fei Fei Li 2009 03 01 Please remember this 1000 computer vision papers ge
  • 算法——动态规划算法

    动态规划的核心思路 动态规划的解题核心主要分为两步 第一步 定义问题 有的问题过于抽象 或者过于啰嗦干扰我们解题的思路 我们要做的就是将题干中的问题转化成一系列同类问题的某个解的情况 比如说 题目 求一个数列中最大连续子序列的和 我们要将这
  • tomcat部署项目

    今天总算是把部署tomcat部署项目的几种方式实验了一下 一 1 下载 Tomcat 服务器 官网下载地址 http tomcat apache org 2 启动并部署 Tomcat 服务器 解压 tomcat 安装包到一个非中文目录下 配
  • 微服务架构详解

    一 微服务架构的由来 在微服务架构出现之前 最常用的架构就是单体架构 俗称 一个jar war 包打天下 在一个jar包工程中 采用MVC架构 分为表现层 业务层 数据访问层 所有的业务模块 都放在这个工程中集成 如下图所示 随着软件行业规
  • DS18B20温度传感器

    1 DS18B20 单线数字温度传感器 即 一线器件 其具有独特的优点 采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯 单总线具有经济性好 抗干扰能力强 适合于恶劣环境的现场温度测量 测量