STM32_DS18B20_1_芯片简介及初始化配置

news/2024/4/17 8:35:06

DS18B20介绍        

        DS18B20数字温度计提供9位到12位摄氏度的温度测量,并具有非易失性,用户可编程的上下触发点的报警功能。DS18B20通过1线总线进行通信,根据定义,该总线只需要一条数据线,即可与中央微处理器进行通信。它的工作温度范围为-55°C到+125°C,在-10°C到+85°C的范围内精确到±0.5°C。此外,DS18B20可以直接从数据线获得电力,消除了对外部电源的需要。

        每个DS18B20都有一个唯一的64位串行码,它允许多个DS18B20在同一个1线总线上工作。因此,使用一个微处理器来控制分布在大面积区域内的许多ds18b20是很简单的。可以受益于此特性的应用程序包括暖通空调环境控制、建筑物内部的温度监测系统、设备或机械内部的温度监测系统,以及过程监控和控制系统。

引脚说明

8引脚SOIC封装T0-9封装符号说明
51GND接地
42DQ数据输入/输出引脚。对于单线操作:漏极开漏。当工作在寄生电源模式时用来提供电源(建“寄生电源”节)
33VDD可选的VDD引脚。工作与寄生电源模式时VDD必须接地。

Tips:上表没说的引脚不需要连接。

        DS18B20的另一个功能是可以在没有外部电源供电的情况下工作。当总线处于高电平状态,DQ与上拉电阻连接通过单总线对器件供电。同时处于高电平状态的总线信号对内部电容(Cpp)充电,在总线处于低电平状态时,该电容提供能量给器件。这种提供能量的形式被称为“寄生电源”。作为替代选择,DS18B20同样可以通过VDD引脚连接外部电源供电。

配置寄存器

bit 7bit 6bit 5bit 4bit 3bit 2bit 1bit 0
0R1R011111

可通过按R1和R0来设置DS18B20的精度。上电默认设置:R0=1,R1=1(12位精度)。

Tips:精度和转换时间之间一般成反比。 

温度计精确度配置表

R1R0精度最大转换时间
009-bit93.75ms(Tconv/8)
0110-bit187.5ms(Tconv/4)
1011-bit375ms(Tconv/2)
1112-bit750ms(Tconv)

        温度转换期间(tconv) 

执行序列

        通过单线总线端口访问DS18B20的协议如下:

  1. 初始化
  2. ROM操作指令
  3. DS18B20功能指令

        每次执行DS18B20都需要满足以上步骤,若是步骤缺少或混乱,DS18B20都将不会返回值。

初始化

        通过单总线的所有执行操作都从一个初始化序列开始。初始化序列包括一个由总线控制器发出的复位脉冲和其后由从机发出的存在脉冲。从机的存在脉冲告知总线控制器DS18B20已就绪。

初始化序列

        在初始化序列期间,总线控制器拉低总线并保持480us发出(TX)一个复位脉冲,然后释放总线,进入接受状态(RX)。单总线由5K上拉电阻拉到高电平。当DS18B20探测到I/O引脚上的上升沿后,等待15-60us,然后发出一个由60-240us低电平信号构成的存在脉冲。

        简而言之,Vpu单总线刚开始为输出模式,输出480us低电平,然后输出高电平(15-60us)后,转换为上拉输入模式,总线接收到DS18B20的60-240us的低电平存在脉冲。

 ROM操作指令

        一旦总线控制器探测到一个存在脉冲,他就发出一条ROM指令。如果总线上挂有多个DS18B20,这些指令将通过器件独有的64位ROM片序列码使得总线控制器选出特定的需要控制的器件进行操作。

        33h(读取ROM指令)

        在总线只有单只DS18B20的时候才能使用这条命令。该命令允许总线控制器在不适用搜索ROM指令的情况下读取从机的64位片序列码;

        CCh(忽略ROM指令)

        这条指令允许总线控制器不用提供64位ROM编码使用功能指令。

        其他ROM指令可以去看DS18B20的手册。

DS18B20控制指令

        在总线控制器发给准备连接的DS18B20一条ROM命令后,随之发送一条DS18B20功能指令。这些命令可以让总线控制器读写DS18B20的暂存器,发起一些功能。

        44h(温度转换指令)       

        使用这条指令可以启动一次温度转换。温度转换执行后,产生的温度转换结果数据以2个字节的形式被存储在高速暂存器中,而后DS18B20保持等待状态。如果在寄生电源模式下发出该指令后,在温度转换期间(tconv),在10us之内,给单总线一个强上拉。

        B4h(读电源模式指令)

        发出指令后,若是寄生电源模式,DS1820将拉低总线,若是外部电源模式,DS18B20将把总线拉高。

供电

        DS18B20可以通过从VDD引脚接入一个外部电源供电,或者可以工作与寄生电源模式(通过数据线贡献),该模式允许DS18B20工作于无外部电源供电的状态。寄生电源在远距离测温时非常有用。

        Tips:寄生电源模式时,VDD必须接地。

        对于总线控制器不直到总线上的 DS18B20 是用寄生电源还是用外部电源的情况,DS18B20 预备了一种信号指示电源的使用意图。总线控制器发出一个 Skip ROM指令[CCh],然后发出读电源指令[B4h],这条指令发出后,控制器发出读时序,寄生电源会将总线拉低,而外部电源会将总线保持为高。如果总线被拉低,总线控制器就会知道需要在温度转换期间对单总线提供强上拉。

测温操作

        DS18B20能够直接读取数字。DS18B20启动后保持低消耗状态;当需要执行温度测量和AD转换时,总线控制必须发出0x44的命令。之后,产生的温度数据以两个字节的形式被存储到高速暂存的温度寄存器中,然后DS18B20继续保持等待状态。

        当DS18B20由外部电源供电时,总线控制器在温度转换指令之后发起“读时序”。

 读时序 

        总线控制器发起读时序时,DS18B20 仅被用来传输数据给控制器。因此,总线控制器在发出读暂存器指令[BEh]或读电源模式指令[B4H]后必须立刻开始读时序,DS18B20可以提供请求信息。除此之外,总线控制器在发出发送温度转换指令[44h]或召回 EEPROM 指令[B8h]之后读时序。
        所有读时序必须最少 60us,包括两个读周期间至少 1us 的恢复时间。当总线控制器把数据线从高电平拉到低电平时,读时序开始,数据线必须至少保持 1us,然后总线被释放。在总线控制器发出读时序后,DS18B20 通过拉高或拉低总线上来传输 1 或 0。当传输逻辑 0 结束后,总线将被释放,通过上拉电阻回到上升沿状态。从 DS18B20 输出的数据在读时序的下降沿出现后 15us 内有效。因此,总线控制器在读时序开始后必须停止把 I/O 脚驱动为低电平 15us,以读取I/O 脚状态。

代码

 bsp_ds18b20.c

#include  "bsp_ds18b20.h"
void DS18B20_Mode_Out_PP(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);
}void DS18B20_Mode_IPU(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void DS18B20_GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void DS18B20_Init(void)
{DS18B20_Mode_Out_PP();DS18B20_DATA_OUT(0);Delay_us(750);DS18B20_DATA_OUT(1);Delay_us(15);DS18B20_Mode_IPU();while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6) != 0);while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6) == 0);
}

bsp_ds18b20.h

#ifndef __BSP_DS18B20_H__
#define __BSP_DS18B20_H__#include <stm32f10x.h>
#include "bsp_SysTick.h"#define DS18B20_DATA_OUT(a)	GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(a))void DS18B20_GPIO_Configuration(void);
void DS18B20_Init(void);#endif

bsp_SysTick.c

#include "bsp_SysTick.h"unsigned int TimingDelay;void SysTick_Configuration(void)
{while(SysTick_Config(72));SysTick->CTRL &= ~(1<<0);   //暂时初始化后先关闭定时器,使用前开启
}
void Delay_us(unsigned int n)
{TimingDelay = n;SysTick->CTRL |= (1<<0);   //开启Sys_Tickwhile(TimingDelay);SysTick->CTRL &= ~(1<<0);
}

bsp_Systick.h

#ifndef __BSP_SYSTICK_H__
#define __BSP_SYSTICK_H__#include <stm32f10x.h>extern unsigned int TimingDelay;void SysTick_Configuration(void);
void Delay_us(unsigned int n);#endif


https://www.xjx100.cn/news/3293504.html

相关文章

【Python】进程与线程实现子进(线)程终止,另一个子进(线)程继续执行,不干扰

需求&#xff1a; 1.一个工具有两个子进程&#xff0c;分别是进程A与进程B&#xff0c;现在情况是其中一个进程A出现异常停止&#xff0c;另一个进程B也被终止了&#xff1b;现在想进程A终止的时候&#xff0c;进程B继续运行&#xff0c;如何实现&#xff0c;给出python代码示例…

Spring08、使用注解开发

8、使用注解开发 8.1、说明 在spring4之后&#xff0c;想要使用注解形式&#xff0c;必须得要引入aop的包 在配置文件当中&#xff0c;还得要引入一个context约束 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.sprin…

搭建XSS 测试平台

XSS 测试平台是测试XSS漏洞获取cookie并接收Web 页面的平台&#xff0c;XSS 可以做 JS能做的所有事&#xff0c;包括但不限于窃取cookie、后台增删改文章、钓鱼、利用XSS漏洞进 行传播、修改网页代码、网站重定向、获取用户信息(如浏览器信息、IP 地址)等。这 里使用的是基于x…

[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

嵌出式工程师小小知识点006

二极管作用 1.整流&#xff1a;利用二极管单向导电性&#xff0c;可以把方向交替变化的交流电zhi变换成单一方向的脉冲直流电 2.、开关&#xff1a;二极管在正向电压作用下电阻很小&#xff0c;处于导通状态&#xff0c;相当于一只接通的开关&#xff1b;在反向电压作用下&…

為什麼使用海外動態代理IP進行網路爬蟲?

網路爬蟲作為獲取網路數據的重要工具&#xff0c;其重要性不言而喻。但隨著網站反爬策略的日益嚴格&#xff0c;爬蟲任務變得愈發困難&#xff0c;不過海外動態代理IP可以很好地解決這一問題。本文將詳細闡釋動態代理IP在爬蟲中的應用&#xff0c;以及如何使用動態代理IP提升爬…

oracle 如何使用脚本实现访问控制(无需额外插件)

随着这些年勒索病毒的爆发,各个企业对数据安全的要求越来越高,常见的办法有开启数据库审计,加数据库防火墙,网络限制等等;但是细粒度审计会消耗大量系统资源,第三方数据库防火墙一般是需要收费的;这里介绍我个人常用的四个db级别trigger,用于记录部分关键信息可以应对部…

MySQL的锁(简单入门)

文章目录 前言全局锁表级锁行级锁总结 前言 今天来讲一讲 MySQL 的锁&#xff0c;一个简单的入门。 MySQL 锁&#xff0c;分为全局锁&#xff0c;表级锁&#xff0c;行级锁&#xff0c;三个锁按照名字的颗粒度来算是越来越小的。锁越大性能越差&#xff0c;InnoDB 默认的是行…