STM32——DS18B20温度传感器

2023-11-15

一、DS18B20介绍

(一)DS18B20技术性能特征

1、独特的单总线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,大大提高了系统的抗干扰性。

2、测温范围  -55°C~+125°C

3、支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多会使供电电压过低,从而造成信号传输的不稳定。

4、工作电源:3.0~5.5V/DC(可以数据线寄生电源)

5、在使用中不需要任何外围元件。

6、测量结果以9~12位数字量方式传送。

(二)DS18B20封装:

连接方式

硬件连接

(三)单总线是一种半双工通信方式。DS18B20共有6种信号:复位脉冲、应答脉冲、写0、写1、读0、读1。这些信号中除了应答脉冲以外,都由主机发出同步信号,并且发送所有的命令和数据都是字节的低位在前。

底层操作

//信号线:PG9
//IO方向设置
#define DS18B20_IO_IN()  {GPIOG->MODER&=~(3<<(9*2)); GPIOG->MODER|=0<<9*2;}//PG9输入模
#define DS18B20_IO_OUT() {GPIOG->MODER&=~(3<<(9*2)); GPIOG->MODER|=1<<9*2;}//PG9输出模
//IO操作
#define  DS18B20_DQ_OUT PGout(9)  //数据端口PG9
#define  DS18B20_DQ_IN  PGin(9)   //数据端口PG9

上面提到,单片机中有五种信号类型是发送给DS18B20,只有一种应答信号是需要DS18B20返回信号的,因此需要设置某个时刻IO口的输入与输出,STM32F4中通过操作MODER寄存器来实现该方式。

二、信号类型详情

1、复位脉冲

单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平时间至少480us,以产生复位脉冲。接着主机释放总线,4.7K的上拉电阻将单总线拉高,延时15~69us,并进入接收模式(Rx),接着DS18B20拉低总线60~240us,以产生低电平应答脉冲。

//复位DS18B20
void DS18B20_Rst(void)
{
  DS18B20_IO_OUT();//设置为输出模式
  DS18B20_DQ_OUT=0;//拉低DQ
  delay_us(750);//拉低750us(至少480us)
  DS18B20_DQ_OUT=1;//DQ=1拉高释放总线
  delay_us(15);//15US
  //进入接收模式,等待应答信号
}

2、应答信号

//等待DS18B20的回应
//返回1;未检测到DS18B20的存在  返回0:存在
u8 DS18B20_Check(void)
{
  u8 retry=0;
  DS18B20_IO_IN();//SET PA0 INPUT
  while(DS18B20_DQ_IN&&retry<200)
  {
    retry++;
    delay_us(1);
  }
  if(retry>=200) return 1;
  else retry=0;
  while(!DS18B20_DQ_IN&&retry<240)
  {
    retry++;
    delay_us(1);
  }
  if(retry>=240)  return 1;
  return 0;
}

3、写时序

写时序包括写0时序和写1时序,所有写时序至少需要60us,且在2次独立的写时序之间至少需要1us的恢复时间,两种写时序均起始于主机拉低总线。

写1时序:主机输出低电平,延时2us,然后释放总线,延时60us

写0时序:主机输出低电平,延时60us,然后释放总线,延时2us

//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 dat)
{
  u8 j;
  u8 testb;
  DS18B20_IO_OUT();//设置PA0为输出
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)//输出高
    {
      DS18B20_DQ_OUT=0;//主机输出低电平
      delay_us(2);//延时2us
      DS18B20_DQ_OUT=1;//释放总线
      delay_us(60);//延时60us
    }
    else//输出低
    {
      DS18B20_DQ_OUT=0;//主机输出高电平
      delay_us(60);//延时60us
      DS18B20_DQ_OUT=1;//释放总线
      delay_us(2);//延时20us
    }
  }
}

4、读时序

单总线器件仅在主机发出读时序使,才向主机传输数据,所以在主机发出读数据命令之后,必须马上产生读时序,以便从机能够传输数据。

所有读时序至少需要60us,且在2次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us内采样总线状态。

典型的读时序过程为:主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取单总线当前的电平,然后延时50us。

//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void)
{
  u8 data;
  DS18B20_IO_OUT();//设置为输出
  DS18B20_DQ_OUT=0;//输出低电平2us
  delay_us(2);
  DS18B20_DQ_OUT=1;//拉高释放总线
  DS18B20_IO_IN();//设置为输入
  delay_us(12);//延时12us
  if(DS18B20_DQ_IN)  data=1;//读取总线数据
  else  data=0;
  delay-us(50);//延时50us
  return data;
}

读取一个字节数据

//从DS18B20读取一个字节
//返回值:读到的数据
u8 DS18B20_Read_Byte(void)//读取一个字节
{
  u8 i,j,dat;
  dat=0;
  for(i=0;i<=8;i++)
  {
    j=DS18B20_Read_Bit();
    dat=(j<<7)|(dat>>1);
  }
  return dat;
}

三、DS18B20典型温度读取过程

复位-->发SKIP ROM命令(0XCC)-->发开始转换命令(0X44)-->延时-->复位-->发送SKIP ROM命令(0XCC)-->发读存储命令(0XBE)-->连续读出两个字节数据(即温度)-->结束

//从DS18B20得到温度值
//精度:0.1°C
//返回值:温度值(-550~1250)
short DS18B20_Get_Temp(void)
{
  u8 temp;
  u8 TL,TH;
  short tem;
  DS18B20_Start();//开始温度转换(调用另一个函数)
  DS18B20_Rst();//复位
  DS18B20_Check();
  DS18B20_Write_Byte(0xcc);
  Ds18B20_Write_Byte(0xbe);
  TL=DS18B20_Read-Byte();
  TH=DS18B20_Read_Byte();
  if(TH>7)
  {
   TH=~TH;
   TL=~TL;
   temp=0;//温度为负
  }
  else temp=1;//温度为正
  tem=TH;//获得高八位
  tem<<=8;
  tem+=TL;//获得低八位
  tem=(float)tem*0.625//转换
  if(temp) return  term;//返回温度值
  else retrn -term;
}
//开始温度转换函数
void DS18B20_Start(void)
{
  DS18B20_Rst();
  DS18B20_Check;
  DS18B20_Write_Byte(0xcc);
  DS18B20_Write_Byte(0x44);
}

关于温度转换:

 

代码中TL对应LS Byte  TH对应MS Byte

转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得得温度大于0,这五位为0,只要将测到得数值乘以0.0635即可得到实际温度;如果温度小于0,这五位为1,测到得数值需要取反加一再乘以0.0625即可得到实际温度。

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

STM32——DS18B20温度传感器 的相关文章

随机推荐

  • 方法的重写-overrideoverwrite

    方法的重写 override overwrite 1 定义 定义 子类继承父类以后 可以对父类中同名同参数的方法 进行覆盖操作 应用 重写以后 当创建子类对象以后 通过子类对象调用子父类中的同名同参数的方法时 实际执行的是子类重写的方法 使
  • 2D和3D人体姿态数据集

    转自链接 https www jianshu com p c046db584a21 2D数据集 LSP 地址 http sam johnson io research lsp html 样本数 2k 关节点数 14 全身 单人 FLIC 地
  • 用go实现一个telnet带上账号密码的协议请求

    实现一个telnet协议请求 需要用到网络编程的知识 下面是一份简单的代码示例 package main import bufio fmt net strings func main ln err net Listen tcp 8080 i
  • 数据结构之直接插入排序(算法思想,复杂度分析)以及冒泡排序和直接插入排序的比较

    一般来说 插入排序都采用in place在数组上实现 具体算法描述如下 从第一个元素开始 该元素可以认为已经被排序 取出下一个元素 在已经排序的元素序列中从后向前扫描 如果该元素 已排序 大于新元素 将该元素移到下一位置 重复步骤3 直到找
  • 【算法入门12】链表合并

    核心考点 链表合并 思维缜密程度 输入两个递增的链表 合并这两个链表并使新链表中的结点仍然是递增排序的 解析一 常规 合并两个链表最常规的做法就是 依次比较两个链表的第一个结点 取较小的结点 此处为递增排序 尾插到一个新链表后 直到其中一个
  • C语言 缓存区溢出 3221225725

    目录 问题描述 解决办法 问题描述 DEV C报错 Process exited after 4 03 seconds with return value 3221225725 原因 数组定义的容量太大 五十万起步的样子 而且每次循环都会再
  • Laravel定时任务的每秒执行

    我的个人博客 逐步前行STEP laravel中的任务调度可以不将每条命令都写入crontab 便于管理维护 而且可以基于laravel框架环境运行 而不需写独立的脚本执行 非常方便 但是最小的执行间隔也是一分钟 要想达到每秒执行的效果 就
  • 2018.7.18 something you want to replace

    Something I want to replace is iphone6 which looks like a small box When I come to university my parents brought me this
  • 【C++ Core Guidelines解析】C++学习之路的一盏明灯

    前言 C 语言的功能非常丰富 表达能力非常强 因为一种成功的通用编程语言拥有的功能必须比任何开发人员所需要的更多 任何一种有生命力且不断发展的语言都会不断积累用于表达程序员思想的替代用法 这会导致选择过载 那么 开发人员应该如何根据编程风格
  • 旧手机改服务器,并配合花生壳实现外网访问的方法

    旧手机改服务器 并配合花生壳实现外网访问的方法 前提准备 开始手机端操作 开始电脑端操作 至此所有操作结束 前提准备 1 手机必须root 2 busybox 3 linux deploy 4 花生壳安卓内网穿透版 下载时注意 有个管理版
  • 测试开发学习路线

    测试开发学习路线 HI 大家好 我是Lee 通过某些圈子了解大家对于测试开发这个岗位了解的很模糊 对于技术栈不知道应该学习什么 接下来就通过各方面来说一下测试开发具体是做什么以及需要掌握哪些技术 1 了解测试开发 什么是测试开发 大家应该都
  • 【学习笔记】mybatis-generator自动生成工具的使用教程 2021最新版

    一 什么是mybatis generator mybatis geneator是一款mybatis自动代码生成工具 可以通过配置 快速生成DAO POJO和xml等文件 二 如何在IDEA上使用mybatis generator 1 导入依
  • Redis Stream 数据结构实现原理真的很强

    1 是什么 Stream 是 Redis 5 0 版本专门为消息队列设计的数据类型 借鉴了 Kafka 的 Consume Group 设计思路 提供了消费组概念 同时提供了消息的持久化和主从复制机制 客户端可以访问任何时刻的数据 并且能记
  • dft转换与反转

    这次介绍下opencv中DFT的使用 对应的例程是 EXAMPLE dft 在图像处理领域 通过DFT可以将图像转换到频域 实现高通和低通滤波 还可以利用矩阵的卷积运算等同于其在频域的乘法运算从而优化算法降低运算量 即先将图像转换到频域 然
  • 容器化部署 Jib

    概念 Google Jib 容器化构建工具 Jib是google开源的Java容器化工具 可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库 以 Maven 和 Gradle 插件形式提供 通过 Jib Java 开发者可
  • 【省带宽、压成本专题】从产品架构来看,PCDN如何节流50%

    过去几年 我们一直在视频省流量方面潜心钻研 取得不俗的成果 本次 省带宽 压成本 系列一共会推出六篇文章 从技术迭代 硬件更新等角度出发 向大家介绍节省CDN流量 降低视频播放成本的方法 第一篇 从产品架构来看 PCDN如何节流50 目前国
  • 华为OD机试 - 欢乐的周末(Java)

    题目描述 小华和小为是很要好的朋友 他们约定周末一起吃饭 通过手机交流 他们在地图上选择了多个聚餐地点 由于自然地形等原因 部分聚餐地点不可达 求小华和小为都能到达的聚餐地点有多少个 输入描述 第一行输入m和n m代表地图的长度 n代表地图
  • 哈佛商学院私人笔记:如何一天拥有48小时?

    你的身边有没有这样一群人 永远精力充沛 永远有用不完的时间 工作 社交 生活 兴趣什么都不落下 谁都知道这得益于他们对时间的高效利用 但具体的妙招是什么呢 刚来到学校 哈佛 的时候我就被告知 你们的第一年是故意设计成很紧张的时间表 以锻炼你
  • C 标准库 - 《stdarg.h》

    原文链接 https www runoob com cprogramming c standard library stdarg h html 简介 stdarg h 头文件定义了一个变量类型 va list 和三个宏 这三个宏可用于在参数
  • STM32——DS18B20温度传感器

    一 DS18B20介绍 一 DS18B20技术性能特征 1 独特的单总线接口方式 DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯 大大提高了系统的抗干扰性 2 测温范围 55 C 125 C 3 支