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

news2024/11/16 4:38:58

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker部署MinIO对象存储服务

1. 拉取MinIO镜像 # 下载镜像 docker pull minio/minio#查看镜像 docker images2. 创建目录 # 文件存储目录 mkdir -p /opt/minio/data# 配置文件 mkdir -p /opt/minio/config# 日志文件 mkdir -p /opt/minio/logs3. 创建Minio容器并运行 docker run \ -p 9000:9000 \ -p 90…

第4章.精通标准提示,引领ChatGPT精准输出

标准提示 标准提示&#xff0c;是引导ChatGPT输出的一个简单方法&#xff0c;它提供了一个具体的任务让模型完成。 如果你要生成一篇新闻摘要。你只要发送指示词&#xff1a;汇总这篇新闻 : …… 提示公式&#xff1a;生成[任务] 生成新闻文章的摘要&#xff1a; 任务&#x…

数据结构——快速排序的三种方法和非递归实现快速排序

数据结构——快速排序的三种方法和非递归实现快速排序&#xff08;升序&#xff09; 前言快速排序的单趟排序hoare法挖坑法前后指针法 快速排序的实现key基准值的选取快速排序代码快速排序的优化 快速排序&#xff08;非递归&#xff09; 前言 快速排序是Hoare于1962年提出的一…

http和https之间的区别和优势

HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;安全超文本传输协议&#xff09;是两种在互联网通信中应用广泛的协议&#xff0c;它们在数据传输、安全性、加密等方面有着明显的区别和优势。下面将详细介绍HTTP和HTTPS之间的区别和各自的优势。 区别和优势 1…

admin端

一、创建项目 1.1 技术栈 1.2 vite 项目初始化 npm init vitelatest vue3-element-admin --template vue-ts 1.3 src 路径别名配置 Vite 配置 配置 vite.config.ts // https://vitejs.dev/config/import { UserConfig, ConfigEnv, loadEnv, defineConfig } from vite im…

2024最新版克魔助手抓包教程(9) - 克魔助手 IOS 数据抓包

引言 在移动应用程序的开发中&#xff0c;了解应用程序的网络通信是至关重要的。数据抓包是一种很好的方法&#xff0c;可以让我们分析应用程序的网络请求和响应&#xff0c;了解应用程序的网络操作情况。克魔助手是一款非常强大的抓包工具&#xff0c;可以帮助我们在 Android …

uniApp使用XR-Frame创建3D场景(7)加入点击交互

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用 这篇我们讲解如何与场景中的模型交互&#xff08;点击识别&#xff09; 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"><xr-node><xr-mesh id"…

阿里云CentOS7安装ZooKeeper单机模式

前提条件 阿里云CentOS7安装好jdk&#xff0c;可参 hadoop安装 的jdk安装部分 下载 [hadoopnode1 ~]$ cd softinstall [hadoopnode1 softinstall]$ wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz 解压 [hadoopnode1 …

Svg Flow Editor 原生svg流程图编辑器(四)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;一&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;三&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;四&#xf…

flutter 修改app名字和图标

一、修改名字 在Android中修改应用程序名称&#xff1a; 在AndroidManifest.xml文件中修改应用程序名称&#xff1a; 打开Flutter项目中的android/app/src/main/AndroidManifest.xml文件。找到<application>标签&#xff0c;然后在android:label属性中修改应用程序的名称…

Jenkins拉取github项目相关问题

1.私有仓库问题 1.1如果你的仓库是私有的&#xff0c;21年起github就不支持账号密码的方式拉取代码了 那么就需要在github上面创建一个token (classic) 然后在Jenkins代码设置那里 然后应该就可以顺利打包了。 2.找不到pom&#xff08;多了一层文件夹&#xff09;问题 解…

关系型数据库mysql(8)sql高级语句②

目录 一.子查询——Subquery 语法 环境准备 In——查询已知的值的数据记录 子查询——Insert 子查询——Update 子查询——Delete Not In——表示否定&#xff0c;不在子查询的结果集里 Exists——判断查询结果集是否为空 子查询——别名 ​编辑 二.视图 理论&a…

踩坑uniapp中打包Andiord app,在真机调试时地图以及定位功能可以正常使用,打包成app后失效的问题

首先看到这是uni官网提出的&#xff0c;app上建议使用高德地图。 下面就用高德地图进行配置。 步骤一&#xff1a;登陆高德地图控制台 名称和类型根据自己情况填写选择即可 步骤二&#xff1a; 添加key 步骤三&#xff1a;取到SHA1 进入uniapp开发官网 点击应用名称&#…

如何使用Windows电脑部署Lychee私有图床网站并实现无公网IP远程管理本地图片

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-MSVdVLkQMnY9Y2HW {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

Webpack生成企业站静态页面 - 增强数据处理能力

一些项目因需求不同&#xff0c;如需SEO或小项目&#xff0c;使用angular、react或vue就大材小用了。我们可以通过webpack、gulp这些构建工具&#xff0c;也能快速完成html页面开发&#xff0c;并且也能使用less/sass/styus等样式预编译功能&#xff0c;以及将js、html分模块、…

pyecharts操作三

pyecharts操作三 pyecharts 是一个用于生成Echarts图表的Python库。Echarts是百度开源的一个数据可视化JS库&#xff0c;可以生成一些非常酷炫的图表。 环境安装 pip install pyecharts 检查版本 import pyecharts print(pyecharts.version) 2.0.3 GL关系图 import rando…

Linux(CentOS7)安装 Redis

目录 下载 上传 解压 编译与安装 修改配置文件 ​编辑 启动redis 客户端使用 下载 官网地址&#xff1a; Download | RedisRedisYou can download the last Redis source files here. For additional options, see the Redis downloads section below.Stable (7.2)Re…

想学网络安全,从哪里开始?网络安全的学习路线

网络安全学习路线&#xff1a; 想学习网络安全专业的知识&#xff0c;想当黑客&#xff0c;但是不知道该从哪里开始学。 我给你一个路线&#xff01; 清晰图片和大纲&#xff1a;https://docs.qq.com/doc/DU1lpVFpSbWVrd2p3

Linux安装redis(基于CentOS系统,Ubuntu也可参考)

前言&#xff1a;本文内容为实操记录&#xff0c;仅供参考&#xff01; 一、下载并解压Redis 1、执行下面的命令下载redis&#xff1a;wget https://download.redis.io/releases/redis-6.2.6.tar.gz 2、解压redis&#xff1a;tar xzf redis-6.2.6.tar.gz 3、移动redis目录&a…

MySQL进阶-----索引的语法与SQL性能分析

目录 前言 一、索引语法 1.SQL语法 2.案例演示 二、SQL性能分析 三、慢查询日志 1.开启日志 2.测试样例 四、profile详情 1.开启profile 2.profile测试SQL语句 五、explain详情 1.语法结构 2.执行顺序示例&#xff08;id&#xff09; 3.执行性能示例(type) 前言 本…