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){// 拉低DQDS18B20_PORT=0;	// 持续750usdelay_10us(75);// 释放DQDS18B20_PORT=1;// 等待20usdelay_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,否则为0else 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)//判断符号位,负温度{// 取反再加1value=(~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;// 关闭所有ledled_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.rhkb.cn/news/293720.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker容器、Serverless与微服务:腾讯云云原生架构技术实践案例集解析

前言 随着云原生技术的飞速发展&#xff0c;容器化和函数计算正成为企业和开发者关注的焦点。在这一潮流中&#xff0c;腾讯云凭借其卓越的技术实力和深厚的行业积累&#xff0c;发布了《2023腾讯云容器和函数计算技术实践精选集》&#xff0c;为我们提供了一份深入探索云原生…

风控系统:通过净值及盈亏开启和关闭自动交易

一、风控对交易员的好处 帮助交易员执行交易纪律并保护他们的交易资金。 纪律风控&#xff1a;对不符合交易纪律的交易执行风控&#xff0c;对交易纪律性差的交易员执行约束操作。净值风控&#xff1a;对满足条件的净值执行风控&#xff0c;防止交易员的账户净值过度下降。手数…

train拦截器

拦截器拦截到的请求&#xff0c;设置本地变量member&#xff0c;主要为了获取memberId&#xff0c;在passenger表中存放memberId。 拦截器&#xff1a; 乘客表外键memberId关联member表

KUKA机器人调整示教器灵敏度(校屏)

KUKA机器人KRC4的示教器升级后&#xff0c;示教器屏幕由之前的电阻屏改为电容屏&#xff0c;不仅在外观上有所变化&#xff0c;屏幕校准的方法也有所不同。通过以下方法分别对新旧两款示教器进行屏幕校正&#xff0c;调整示教器屏幕灵敏度。 对新款示教器而言&#xff1a; 一…

BIONIOAIO

通信技术整体解决的问题 1.局域网内的通信要求 2.多系统间的底层消息传递机制 3.高并发下&#xff0c;大数据量的通信场景需要 4.游戏行业。无论是手游服务端、还是大型网络游戏&#xff0c;java的应用越来越广 IO模型基本说明 就是用什么样的通道或者说是通信模式和架构…

淘宝详情数据采集(商品上货,数据分析,属性详情,价格监控),海量数据值得get

淘宝详情数据采集涉及多个环节&#xff0c;包括商品上货、数据分析、属性详情以及价格监控等。在采集这些数据时&#xff0c;尤其是面对海量数据时&#xff0c;需要采取有效的方法和技术来确保数据的准确性和完整性。以下是一些关于淘宝详情数据采集的建议&#xff1a; 请求示…

2014年认证杯SPSSPRO杯数学建模B题(第二阶段)位图的处理算法全过程文档及程序

2014年认证杯SPSSPRO杯数学建模 B题 位图的处理算法 原题再现&#xff1a; 图形&#xff08;或图像&#xff09;在计算机里主要有两种存储和表示方法。矢量图是使用点、直线或多边形等基于数学方程的几何对象来描述图形&#xff0c;位图则使用像素来描述图像。一般来说&#…

[Qt] QString::fromLocal8Bit 的使用误区

QString::fromLocal8Bit 是一个平台相关的函数。默认情况下在 Windows 下 就是 gbk 转 utf-8 ,在 Linux就应该是无事发生。因为Linux平台默认的编码方式就是 utf-8 可以通过 void QTextCodec::setCodecForLocale(QTextCodec *c)来修改 Qt默认的编码方式。如下 第一输出乱码的…

当当狸智能激光雕刻机 多种材质自由雕刻,轻松打造独一无二的作品

提及“激光雕刻”&#xff0c;大多数人的印象一般都是&#xff1a;笨重巨大、价格昂贵、操作复杂、使用门槛较高、调试难度大...不是普通人能够随意操作的&#xff0c;让人望尘莫及。 而小米有品上新的这台「当当狸桌面智能激光雕刻机L1」&#xff0c;将超乎你的想象&#xff…

5.11 Vue配置Element UI框架

Vue配置Element UI框架 目录一、 概要二、 开发前准备1. 搭建Vue框架 三、 安装 Element UI1. 引入 Element UI 依赖2. 在 main.js 中引入 Element UI 和相关样式&#xff1a;3. 按需引入(非必须, 可忽略)4. 简单构建一个主页面 目录 一、 概要 Element UI 是一个基于 Vue.js …

学习笔记——C语言基本概念指针(下)——(8)

1.指针和数组 数组指针 -- 指向数组的指针。 指针数组 -- 数组的元素都是指针。 换句话理解就是&#xff1a;数组指针就是个指针&#xff0c;指针数组就是个数组。 1.1数组指针 数组指针&#xff1a;指向数组的指针&#xff1b; 先回顾一下数组的特点&#xff1a; 1.相…

机器学习模型——集成算法

集成学习的定义&#xff1a; 集成学习&#xff0c;顾名思义通过将多个单个学习器集成/组合在一起&#xff0c;使它们共同完成学习任务&#xff0c;以达到提高预测准确率的目的。有时也被称为“多分类器系统 (multi-classifier system)”。 集成学习概述&#xff1a; 集成学习…

Linux中如何修改界面为中文, 设置中文输入法

目录 修改界面为中文方法一方法二方法三(kali中)方法四方法五(kali中) 切换为中文/英文输入法方法一方法二(kali中) 待续、更新中 修改界面为中文 方法一 查看当前系统拥有的中文语言包 locale -a | grep CN zh_CN.utf8 : 简体中文语言包 打开文件locale.conf vi /etc/lo…

ISP-VPN实验

文章目录 ISP-VPN实验一&#xff0c;实验拓扑二、实验要求三、IP规划四、实验配置1、IP配置R1的配置R2的配置R3的配置R4的配置R5的配置 2、配置缺省路由3、认证与被认证配置4、HDLC封装5、构建MGRE和GRE6、整个私有网络基于RIP全网可达7、查看路由配置和PC端配置8、PC端pingR5的…

图扑数字孪生智慧城市,综合治理一屏统览

现代城市作为一个复杂系统&#xff0c;牵一发而动全身&#xff0c;城市化进程中产生新的矛盾和社会问题都会影响整个城市系统的正常运转。智慧城市是应对这些问题的策略之一。领导曾在中央城市工作会议上指出&#xff0c;城市工作要树立系统思维&#xff0c;从构成城市诸多要素…

大模型预测,下一个token何必是文字?

明敏 金磊 发自 凹非寺 量子位 | 公众号 QbitAI 太快了太快了… 大模型的生成技能&#xff0c;已经到了普通人看不懂的境界&#xff01; 它可以根据用户过去5年的体检报告&#xff0c;生成未来第1年、第2年、第3年的体检报告。 你看&#xff0c;这个生成的过程&#xff0c;…

Mybatis-Plus分页查询时碰到`total`有值但`records`为空

个人原因&#xff1a;Mybatis-Plus分页插件设置了maxLimit单页条数 // 分页插件配置 PaginationInnerInterceptor paginationInnerInterceptor new PaginationInnerInterceptor(DbType.MYSQL); paginationInnerInterceptor.setMaxLimit(200L); // 单页分页条数限制(默认无限…

webpack项目打包console git分支、打包时间等信息 exec

相关链接 MDN toLocaleString child_process Node.js strftime 格式 代码 buildinfo.js const { execSync, exec } require("child_process"); // exec: 在 Windows 执行 bat 和 cmd 脚本// execSync 同步 // exec 异步// exec 使用方法 // exec(git show -s,…

Python基础之Class类的定义、继承、多态

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、class类1.类属性操作&#xff08;增删改&#xff09;2.类方法操作 二、类的继承1、语法2、方法重写 二、类的多态 一、class类 、三部分组成 1、类名&#xff…

黑马HTMLCSS基础

黑马的笔记和资料都是提供好了的&#xff0c;这个文档非常适合回顾复习。我在黑马提供的笔记上做了一些微不足道的补充&#xff0c;以便自己复习查阅。该笔记比较重要的部分是 表单&#xff0c;http请求 第一章. HTML 与 CSS HTML 是什么&#xff1a;即 HyperText Markup lan…