51单片机学习笔记11 使用DS18B20温度传感器

51单片机学习笔记11 使用DS18B20温度传感器

  • 一、DS18B20简介
    • 1. 主要特点
    • 2. 工作原理
    • 3. 引脚说明
    • 4. ROM
  • 二、1-wire协议简介
      • 1. 总线结构:
      • 2. 通信方式:
      • 3. 数据传输:
      • 4. 设备识别:
      • 5. 供电方式:
      • 6. 应用场景:
      • 7. 优缺点:
  • 三、DS18B20 寄存器与ROM操作命令
    • 1. 配置寄存器
    • 2. 温度寄存器
      • (1)**数据格式**:
      • (2)**温度表示**
    • 3. ROM操作命令
    • 4. 时序
      • (1)初始化时序
      • (2)写时序
      • (3)读时序
    • 5. 温度测试操作过程
    • 6. 寄生电源
    • 7. 寄生电源/VDD供电约定
  • 四、使用示例
    • 1. 硬件连接
    • 2. 代码实现
      • (1)DS18B20 初始化
      • (2)等待响应
      • (3)写字节
      • (4)读一个bit
      • (5)读一个字节
      • (6)启动转换
      • (7)读取温度全过程
      • (8)main.c

一、DS18B20简介

DS18B20是一种具有高精度、数字输出和单总线通信数字温度传感器,可以提供9位温度读数。

1. 主要特点

  1. 数字输出:DS18B20以数字形式输出温度数据,使得温度测量更为准确和方便。
  2. 高精度:DS18B20具有较高的温度测量精度,通常为±0.5°C。
  3. 单总线通信:DS18B20采用1-Wire总线协议进行通信,只需要一条数据线就可以完成通信和供电,简化了连接方式。
  4. 多种封装形式:DS18B20可提供不同的封装形式,包括TO-92、TO-220、SMD等,以适应不同的应用场景。
  5. 低功耗:DS18B20在工作时的功耗较低,适合于一些对电源要求较为严格的应用。
  6. 数字校准:DS18B20内置了温度校准寄存器,可以通过软件进行校准,提高了温度测量的准确性。

2. 工作原理

DS18B20温度传感器基于基于热敏电阻原理工作。其内部包含了一个温度敏感的热敏电阻和一个用于转换模拟信号为数字信号的模数转换器(ADC)。当传感器被激活时,它会测量周围环境的温度,并将温度转换为数字信号。然后,数字信号通过1-Wire总线协议传输给主控制器,主控制器可以读取并解析这些数据,并将其转换为实际温度值。

下面是DS1820的方框图:
在这里插入图片描述

3. 引脚说明

在这里插入图片描述

DS1820S引脚:

  • GND: 地
  • DQ:数字输入输出
  • VDD:可选的VDD
  • NC:空引脚
  • DNC:不连接

4. ROM

每个DS18B20包括了一个唯一的 64位长ROM编码,这样可以在一个I/O端口上连接多个DS18B20设备。
ROM编码格式如下:

8位CRC编号48位序列号8位产品系列编码

二、1-wire协议简介

1-Wire协议是一种串行通信协议,用于在单一数据线上进行通信和供电。它由独特的通信方式和协议约定组成,广泛应用于各种数字设备和传感器之间的通信。

1. 总线结构:

1-Wire总线通常由一条数据线(Data Line,通常简称为DQ线)组成,用于同时传输数据和提供电源。总线结构简单,只需要一条数据线就可以实现通信和供电,因此非常适合于一些有限空间和资源的应用场景。

2. 通信方式:

1-Wire通信采用两种基本状态:高电平和低电平。数据传输是通过一系列脉冲来实现的,每个脉冲的持续时间决定了数据位的传输速率。

3. 数据传输:

数据传输通过一系列脉冲来完成,包括复位脉冲(Reset Pulse)、写脉冲(Write Pulse)、读脉冲(Read Pulse)等。通信的开始通常由主设备发出复位脉冲来初始化通信。

4. 设备识别:

1-Wire协议允许多个设备连接到同一数据线上,每个设备具有唯一的64位ROM代码,可以通过该代码唯一识别每个设备。因此,在进行通信之前,需要先对设备进行识别和寻址。

5. 供电方式:

1-Wire设备通常具有内部电源管理电路,可以通过数据线提供电源。这意味着在连接1-Wire设备时,不仅可以传输数据,还可以通过数据线为设备提供电源。但对于某些特定的1-Wire设备,可能需要额外的电源引脚来提供电源。

6. 应用场景:

1-Wire协议广泛应用于各种数字设备和传感器之间的通信,包括温度传感器(如DS18B20)、实时时钟模块、智能卡等。由于其简单、灵活和节省资源的特点,1-Wire设备在一些特定的应用场景中具有很大的优势。

7. 优缺点:

  • 优点:简单、节省引脚、灵活性高、成本低。
  • 缺点:通信速率较慢、距离受限、抗干扰能力相对较差。

三、DS18B20 寄存器与ROM操作命令

1. 配置寄存器

TMR1R011111

配置寄存器主要使用R1、R0寄存器,用来配置精度,默认是 12bits。

设置DS18B20工作在不同精度上,最大转换时间也会不同,对应关系如下:

R1R0精度Bit位数最大转换时间
00±0.5°C9 bits94ms
01±0.25°C10 bits188ms
10±0.125°C11 bits375ms
11±0.0625°C12 bits750ms

2. 温度寄存器

DS18B20温度传感器内部有一个16位的温度寄存器,用于存储当前测量到的温度值。这个温度寄存器是只读的,主要用于将温度数据传递给主控制器。

(1)数据格式

温度寄存器内部存储的温度数据以二进制形式表示,包括整数部分和小数部分。对于12位分辨率的DS18B20,温度数据被表示为一个16位的二进制数,其中高字节存储整数部分,低字节存储小数部分。

(2)温度表示

DS18B20采用补码表示温度数据,温度的范围是-55°C到+125°C。温度数据的实际值可以通过以下公式计算得到:

温度值 = (温度寄存器内容 * 0.0625) °C

温度寄存器T0放温度的低字节,T1温度的高字节。 其中高字节的 bit15~bit11表示温度的正负。

  • 如果测量结果是正值,则符号位全是0,测量的结果*精度 (默认0.0625)就是实际结果。
  • 如果测量结果是负值,则符号位全是1,测量的结果要把测试的结果取反+1,再去乘精度。

示例:

温度数字输出二进制实际结果16进制
25°C00000000 001100100x0032
-25°C11111111 110011100xFFCE
0°C0000 00000x0000

这个表格列出了几个例子,包括温度、对应的数字输出二进制以及实际结果的16进制表示。

3. ROM操作命令

DS18B20温度传感器在ROM操作未定建立之前不能使用存储和控制操作。
主机必须首先提供5种ROM操作之一:

  • READ ROM
  • Match ROM
  • Search ROM
  • Skip ROM
  • Alarm Search

下面是ROM操作命令说明:

  1. Read ROM (0x33):读取ROM代码

    • 这个命令允许主机读取DS18B20的64位唯一ROM代码。
    • 主机发送此命令后,DS18B20会按顺序将其ROM代码的各个字节发送回主机。
  2. Match ROM (0x55):匹配ROM代码

    • 此命令用于向DS18B20设备发送一个64位的ROM代码,以便与设备进行匹配。
    • 当主机发送Match ROM命令并提供与DS18B20设备ROM代码相匹配的地址时,DS18B20设备会响应后续的命令。
  3. Skip ROM (0xCC):跳过ROM代码

    • 此命令用于跳过ROM代码匹配阶段,直接向总线上的所有DS18B20设备发送命令。
    • 当主机发送Skip ROM命令时,总线上所有的DS18B20设备都会响应后续的命令。
  4. Search ROM (0xF0):搜索ROM代码

    • 这个命令用于在总线上搜索所有连接的DS18B20设备的64位ROM代码。
    • 主机发送Search ROM命令后,总线上的所有DS18B20设备都会响应,按顺序发送其ROM代码。
  5. Alarm Search (0xEC):搜索报警状态

    • 此命令用于搜索总线上所有连接的DS18B20设备,并确定是否有设备处于报警状态。
    • 主机发送Alarm Search命令后,总线上的所有DS18B20设备都会响应,按顺序发送其报警状态。

通过这些ROM操作命令,主机可以与DS18B20设备进行通信、唯一识别每个设备并获取设备信息,从而实现对DS18B20温度传感器的精确控制和监控。

4. 时序

(1)初始化时序

在这里插入图片描述

  1. 主机输出低电平(480us~960us);
  2. 主机释放总线(I/O拉高,15-60us),进入接收模式;
  3. DS18B20应答,拉低 (60-240us);
  4. DS18B20拉高或持续拉低输出1bit数据。

(2)写时序

在这里插入图片描述
写时序分为写0、写1时序,一次读至少60us,两个读之间至少间隔1us恢复时间。

写1示例:

  1. 主机拉低总线(2us左右);
  2. 主机释放总线
  3. 主机拉高,(延时60us左右);

写0示例:
4. 主机拉低;
5. 继续低 ,60us左右;

(3)读时序

在这里插入图片描述
一次读时序至少60us,两次读之间至少1us恢复时间;

  1. 主机拉低(1us);
  2. 释放总线;
  3. 在15us内读取总线数据;

5. 温度测试操作过程

温度测量的操作过程通常包括以下步骤:

  1. 初始化:如果需要唯一识别特定的DS18B20设备,则需要发送ROM操作命令来匹配设备的ROM代码。
  2. 启动温度转换:发送给所有DS18B20设备的(Skip ROM命令,0XCC)。
  3. 发开始转换命令:0x44
  4. 延时
  5. 复位
  6. 发SKIP ROM
  7. 发读存储器命令: 0xBE
  8. 读两个字节数据
  9. 转换成温度值使用。

6. 寄生电源

DS18B20温度传感器具有一种称为"寄生电源"(Parasitic Power)的特殊模式,可以通过这种模式在单一数据线上进行通信和供电。在寄生电源模式下,DS18B20传感器不需要额外的电源引脚,而是通过数据线从主控制器获取所需的电源。

DS1820的工作电流达1mA,当几个SD1820在同一条I/O口并进行温度变换时,I/O口可能没有足够的驱动能力。 解决的方法有两种:

  1. 发生温度变换时,在I/O提供强上拉,这时VDD接地。
    在这里插入图片描述
  2. 另一种方法是VDD接外部电源,这样I/O就不需要强上拉。

7. 寄生电源/VDD供电约定

I/O口的主机通常不知道总线上的DS182是寄生电源供电还是外部VDD供电。如果MCU需要获知供电方式 , 在DS18B20内部采取了一种方法来通知主控制器它的供电方式。

当主控制器发送一个跳过(Skip)ROM命令后,紧接着发送一个读取电源状态的命令时,DS18B20会做出不同的响应以表明其供电方式。

  • 如果DS18B20采用寄生电源供电,它会在单一数据线上发送一个“0”;
  • 如果DS18B20采用外部VDD供电,它会发送一个“1”。

主控制器根据接收到的响应来确定是否需要在数据线上提供强上拉。

四、使用示例

1. 硬件连接

开发板 DS18B20连接在P3.7引脚,该引脚已经默认上拉。
在这里插入图片描述
在这里插入图片描述

2. 代码实现

(1)DS18B20 初始化

/**
* @brief  DS18B20初始化
*/
void ds18b20_reset(void){
	// 拉低DQ
	DS18B20_PORT=0;	
	// 持续750us
	delay_10us(75);
	// 释放DQ
	DS18B20_PORT=1;
	// 等待20us
	delay_10us(2);
}

(2)等待响应

/**
* @brief DS18B20响应信号,用来判断DS18B20是否存在
* @return 0:成功 1:失败
*/
u8 ds18b20_ack(void){
    u8 timeout = 0;
    // 读取响应信号,60us左右的低电平信号
    while(DS18B20_PORT && timeout <20){
        timeout ++;
        delay_10us(1);
    }
    if(timeout >= 20){
        // 超时了
        return 1;
    }else{
        timeout = 0;
    }
    // 释放引脚,引脚会被拉高,240us左右的高电平信号
		while((!DS18B20_PORT)&&timeout<20)	//等待DQ为高电平
		{
			timeout++;
			delay_10us(1);
		}
    if(timeout >= 20){
        return 1;
    }
    return 0;
}

(3)写字节

/**
* @brief DS18B20写一个字节
* @return 写字节
*/
void ds18b20_write_byte(u8 dat){
	u8 i=0;
	u8 temp=0;

	for(i=0;i<8;i++)//循环8次,每次写一位,且先写低位再写高位
	{
		temp=dat&0x01;//选择低位准备写入
		dat>>=1;//将次高位移到低位
		if(temp)
		{
			DS18B20_PORT=0;
			_nop_();_nop_();
			DS18B20_PORT=1;	
			delay_10us(6);
		}
		else
		{
			DS18B20_PORT=0;
			delay_10us(6);
			DS18B20_PORT=1;
			_nop_();_nop_();	
		}	
	}	
}

(4)读一个bit

/**
* @brief DS18B20读取一个bit
* @return 读取到的bit
*/
u8 ds18b20_read_bit(void){
	u8 dat=0;
	
	DS18B20_PORT=0;
	_nop_();_nop_();
	DS18B20_PORT=1;	
	_nop_();_nop_(); //该段时间不能过长,必须在15us内读取数据
	if(DS18B20_PORT)dat=1;	//如果总线上为1则数据dat为1,否则为0
	else dat=0;
	delay_10us(5);
	return dat;
}

(5)读一个字节

/**
* @brief DS18B20读取一个字节
* @return 读取到的字节
*/
u8 ds18b20_read_byte(void){
	u8 i=0;
	u8 dat=0;
	u8 temp=0;

	for(i=0;i<8;i++)//循环8次,每次读取一位,且先读低位再读高位
	{
		temp=ds18b20_read_bit();
		dat=(temp<<7)|(dat>>1);
	}
	return dat;	
}

(6)启动转换

/**
* @brief DS18B20开始转换
*/
void ds18b20_start(void){
    ds18b20_reset();
    ds18b20_ack();
    ds18b20_write_byte(0xcc);
    ds18b20_write_byte(0x44);
}

(7)读取温度全过程

/**
* @brief DS18B20读取温度
* @return 温度值
*/
float ds18b20_get_temperature(void){
	float temp;
	u8 tempH=0;
	u8 tempL=0;
	u16 value=0;

	// 开始转换
	ds18b20_start();
	// 复位
	ds18b20_reset();
	// 等待DS18B20的响应
	ds18b20_ack();
	// 发送SKIP ROM命令
	ds18b20_write_byte(0xcc);
	// 发送读存储器命令
    ds18b20_write_byte(0xbe);

	// 读取温度值低字节
	tempL = ds18b20_read_byte();
	// 读取温度值高字节
	tempH = ds18b20_read_byte();
	// 计算温度值
	value = (tempH<<8) + tempL;

	// 温度值转换,负温度是补码
	if((value&0xf800)==0xf800)//判断符号位,负温度
	{
		// 取反再加1
		value=(~value)+1; 
		temp=value*(-0.0625);
	}
	else 
	{
		// 正温度
		temp=value*0.0625;	
	}
	return temp;
}

为简便起见,本文示例代码未显示小数点。

(8)main.c

#include <reg52.h>
#include "led_utils.h"
#include "common_utils.h"
#include "timer_utils.h"
#include "uart_utils.h"
#include "key_utils.h"
#include "eeprom_utils.h"
#include "segment_display_utils.h"
#include "ds18b20.h"

/**
* @brief 主函数
*/
main()
{
	float temperature = 0;
	int intTemperature = 0;
	u8 i =0;
	// 关闭所有led
	led_all_off();
	uart_init(0xFA);
	ds18b20_init();
	
	while(1)
	{
		i++;
		if(i % 50==0){
			temperature = ds18b20_get_temperature();
			intTemperature = temperature * 10;
		}
		segment_show_int(intTemperature);
	}
}

本文代码开源地址:
https://gitee.com/xundh/learn51

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue页面实现旋转饼图

一、示例图片 二、参考 3D饼图-半透明 - ECharts图表集,echarts gallery社区,Make A Pie,分享你的可视化作品isqqw.com 三、实现 1、自定义组件RotatingPieChart.vue <template><div>【旋转饼图】</div><div ref"chart" class"chart-c…

C语言单链表的窗口化操作

#include <stdio.h> #include <stdlib.h>// 定义链表的节点结构 struct Node {int data;struct Node* next; };// 初始化链表 void initialize(struct Node** head) {*head NULL; }// 在链表末尾插入节点 void insert(struct Node** head, int value) {// 创建新节…

基于BEV的自动驾驶会颠覆现有的自动驾驶架构吗

基于BEV的自动驾驶会颠覆现有的自动驾驶架构吗 引言 很多人都有这样的疑问–基于BEV(Birds Eye View)的自动驾驶方案是什么&#xff1f;这个问题&#xff0c;目前学术界还没有统一的定义&#xff0c;但从我的开发经验上&#xff0c;尝试做一个解释&#xff1a;以鸟瞰视角为基础…

Web框架开发-Form组件和ajax实现注册

一、注册相关的知识点 1、Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面建一个forms.py的文件来存放 2、局部钩子函数 1 2 3 4 5 6 7 # 局部钩子函数 def clean_username(self): userna…

《QT实用小工具·六》代码行数统计工具

1、概述 源码放在文章末尾 该项目实现了对不同编程语言文件的代码行数的统计 统计的内容包含&#xff1a; 1、代码行数 2、注释行数 3、空白行数 下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #pragma execution_character_set("utf-8")#inclu…

区块链食品溯源案例实现(一)

引言&#xff1a; 食品安全问题一直是社会关注的热点&#xff0c;而食品溯源作为解决食品安全问题的重要手段&#xff0c;其重要性不言而喻。传统的食品溯源系统往往存在数据易被篡改、信息不透明等问题&#xff0c;而区块链技术的引入&#xff0c;为食品溯源带来了革命性的变革…

【ProComponents】解决 ProTable 中 params 参数改变,request 函数未触发问题

文章目录 先建议自查下官方文档&#xff0c;了解params和request直接的关系 确定params绑定的参数是否改变&#xff0c;例如 user_name 参数 import { ProTable, WxIcon } from /components; import { getSearchParams } from ice; import { useEffect, useMemo, useRef, useS…

智慧公厕是什么?智慧公厕的主要功能、特点?

智慧公厕&#xff0c;顾名思义&#xff0c;是指应用了智能科技的公共厕所&#xff0c;旨在提供更加便捷、舒适、智能化的卫生服务。相比传统的公厕&#xff0c;智慧公厕不仅拥有更加智能化的设备&#xff0c;还配备了远程监控与管理系统&#xff0c;以及节能环保技术&#xff0…

优化页面加载时间:改善用户体验的关键

✨✨ 祝屏幕前的您天天开心&#xff0c;每天都有好运相伴。我们一起加油&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、为什么页面加载时间重要&#xff1f; 二、如何减少页面加载时间&#xff1f; …

SiLM824x系列SiLM8244 配置为高、低边驱动 支持死区可编程,隔离双通道门级驱动器

SiLM824x系列SiLM8244是一款具有不同配置的隔离双通道门极驱动器。SiLM8244配置为高、低边驱动&#xff0c;SiLM8244可提供4A的输出源电流和6A的灌电流能力&#xff0c;并且其驱动输出电压可以支持到33V。支持死区可编程&#xff0c;通过调整DT脚外部的电阻大小&#xff0c;调整…

基于单片机汽车超声波防盗系统设计

**单片机设计介绍&#xff0c;基于单片机汽车超声波防盗系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机汽车超声波防盗系统设计概要主要涉及利用超声波传感器和单片机技术来实现汽车的安全防盗功能。以下是对…

注册接口和前置SQL及数据生成及封装

注册接口 演示注册接口的三步操作&#xff1a;【注册流程逻辑】 第一步&#xff1a;发送注册短信验证码接口请求 请求方法&#xff1a; put 请求地址&#xff1a;http://shop.lemonban.com:8107/user/sendRegisterSms 请求参数&#xff1a;{“mobile”:“13422337766”} 请求头…

【面试专题】Mybatis高频面试题

一、介绍下MyBatis中的工作原理 1。介绍MyBatis的基本情况&#xff1a;ORM 2。原理&#xff1a; MyBatis框架的初始化操作处理SQL请求的流程 1.系统启动的时候会加载解析全局配置文件和对应映射文件。加载解析的相关信息存储在 Configuration 对象 Testpublic void test1(…

C++算法补充---STL

这里写目录标题 CSTL容器字符串函数(string容器函数)字符串转字符 算法交换函数拿到容器或者数组的第一个最大&#xff08;小&#xff09;值元素的下标或者值排序函数求字符数组的有效长度atoi函数&#xff08;将字符串类型的数字转为真正的int型数字&#xff09;string转字符 …

STM32八种I/O口模式

STM32八种I/O口模式 文章目录 STM32八种I/O口模式前言一、stm32八种I/O类型二、区别1.模拟输入2.浮空输入3.上拉输入4.下拉输入5.推挽输出6.开漏输出7.复用推挽输出8.复用推挽输出 总结 前言 作为两年嵌入式软件攻城狮&#xff0c;还没仔细去理解过STM32的GPIO的八种使用模式&…

企业招聘,应用MBTI来做人才测评招聘测评

每年的校招季都是企业争抢优秀应届毕业生人才的忙碌季。只有精准识人用人&#xff0c;才能不断为企业注入新鲜活力和青春智慧。但是随着毕业生数量越来越多&#xff0c;企业如何在招聘中精准发现自己最需要的人才&#xff0c;成为摆在人力资源部门的大难题。人才测评是各企业都…

springboot在线学习做题答题统计系统-可视化分析系统

系统阐述的是使用可视化的学习系统的设计与实现&#xff0c;对于java、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 springboot框架和MySql数据库技术搭建系统的整体架构。…

【分析教程】unity游戏修改so文件

基础知识 0x1.apk安装后在手机中的目录 apk安装后会在两个包下生成相关包&#xff1a;data/data/、data/app/。 这里拿网易云音乐的安装目录举例。Data/App目录下通常会有三个文件&#xff1a; lib文件夹&#xff08;包含so库文件&#xff09;、 ‚oat文件夹&#xff08;O…

算法系列--递归,回溯,剪枝的综合应用(2)

&#x1f495;"对相爱的人来说&#xff0c;对方的心意&#xff0c;才是最好的房子。"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–递归,回溯,剪枝的综合应用(2) 大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(2) 一.括号…

揭秘阿里面试必问:Tomcat类加载机制解析

各位小米的小伙伴们,大家好呀!今天小米要和大家聊聊一个很有趣的话题——阿里巴巴面试题:Tomcat的类加载机制。作为一个技术爱好者,小米深知技术分享的重要性,希望通过这篇文章与大家一起深入了解Tomcat的类加载机制,加深对Java Web开发的理解,也希望能够帮助到正在准备…