前言

温度传感器是各种传感器中最常用的一种,在做项目时经常会需要测量当前的温度,而DS18B20采用单总线协议,即与单片机借口仅需占用一个I/O端口,无需任何外部元件,仅需要一个上拉电阻,即可将外部环境温度以数字码的方式串行输出,从而大大简化了传感器与微处理器的接口,且DS18B20提供了9—12位的可编程分辨率为9—12位对应的可分辨温度分别为0.5°C,0.25°C,0.125°C,0.0625°C,其转化速率随着温度分辨率的增加而减少。并且DS18B20的测温范围在-55°C~+125°C满足了大部分基本的项目需求。

一、DS18B20的基本读写初始化时序操作

1 初始化操作

单片机先将DQ引脚拉至低电平480—960us发送一个低电平脉冲(复位)之后释放总线由上拉电阻将引脚上拉至高电平持续等待15—60us之后将单片机引脚转为输入模式检查DS18B20是否做出应答,若DS18B20存在,则会将总线拉低60—240us将DQ引脚拉低做出应答

2 写数据操作

DS18B20的写周期最少为60us最长不能超过120us,DS18B20写0时序与写1时序类似,在写0时序中单片机需要将DQ引脚拉低之后DS18B20会在引脚被拉低的第15—60us内进行采样读取到写0的操作,而对DS18B20进行写1操作需要单片机先将引脚拉低至低电平1us的时间之后将总线释放由上拉电阻将总线拉直高电平,DS18B20则会在第15—60us内读取到写1操作

3 读数据操作

由时序图可知读操作最短时间为60us最长不超过120us,DS18B20读操作开始时单片机需要将DQ引脚拉低至少1us的时间后将总线释放,在总线释放期间,若DS18B20发送0,则把总线拉低至少到15us,之后释放总线,若发送1,则不拉低总线,单片机需要在读周期开始后的15us内读取引脚的电平大小,之后释放总线45us完成时序

二、DS18B20的ROM指令和存储器指令

在完成对DS18B20的初始化后要对DS18B20进行操作,而DS18B20的指令可根据作用对象可分为ROM指令和存储器指令,前者可通过ROM指令选择所需操作的DS18B20,后者是对所选的DS18B20进行温度读取,转换等具体操作。

1,ROM指令

因为DS18B20的光刻ROM(地址)各不相同,如果在项目中如果需要同时操作多个DS18B20,则需要根据ROM指令对DS18B20进行选择

多个DS18B20: 当单片机上挂载了多个DS18B20,需要对某个进行单独操作时需要先将主机逐个与DS18B20连接,独处其序列号,然后再将所有的DS18B20挂载到总线上,之后由单片机发出匹配ROM指命令(55H)。紧接着单片机提供64位序列(包括该DS18B20的48位序列号)之后的操作就是对该DS18B20进行操作

单个DS18B20:如果单片机上仅挂载了一个DS18B20仅需要发送跳过ROM指令(CCH)命令即可,不需要进行读取ROM编码以及匹配ROM编码。

2,存储器指令

高速暂存器RAM

在存储器指令中最常用的是温度转换指令(44H)和读暂存器指令(BEH)。在每次读取温度前都需要对DS18B20发送温度转换指令,它会将获取的温度转换为数字存储在告诉暂存器ROM中的第0和第1的字节中,转换速度由分辨温度的精度限制,最快93.75ms。在温度转换完毕后通过读暂存器(BEH)读取高速存储器RAM中的数据,读取第0和第1字节即可。

温度数据存储格式

DS18B20在刚出厂时默认的配置为12位,即可分辨温度为0.0625.其中第11到第15位为符号位,0为正,1为负。因为在温度数据中第0位到第3位为小数位,所以在进行温度转换时若温度为负数需要先将数据取反在进行加1后再乘以0.0625得到实际温度,若为正数可直接乘以0.0625获得实际温度。

三、DS18B20改变高温报警和低温报警以及温度分辨位数

要改变DS18B20的高温报警,低温报警以及温度分辨位数需要通过写暂存器指令(4EH)来对高速暂存器RAM的第2,3,4位进行编写。

其中TH和TL寄存器的第七位为符号位S=0为正为1为负。

而配置寄存器中可通过改变R1和R0的值来改变DS18B20的测温精度。

R1 R0 分辨率 温度最大转换时间

0 0 9位 93.75ms

0 1 10位 187.5ms

1 0 11位 375ms

1 1 12位 750ms

四、向DS18B20写命令操作的基本步骤

1 写指令顺序

根据上图可知,在对DS18B20进行功能指令时必须先对DSS18B20进行初始化和ROM指令,如果只有一个DS18B20ROM指令可用跳过ROM(CCH),之后在进行存储器操作。

五、DS18B20操作的源代码

#include "obj_ds18b20.h"

int DS18B20_Init(void)

{

int i=0;

RCC->APB2ENR|=(1<<3);//打开GPIOB使能

GPIOB->ODR |= 1<<8; //GPIOB-8输出高电平

DS18B20_Mode_OutPut();//令DQ口为输出模式

PBout(8)=0;

delay_us(720);//延时480-960us

PBout(8)=1;

delay_us(30);//等待15-60us

DS18B20_Mode_InPut();//改为输入模式

while(PBin(8)==1) //若DS18B20存在则会将总线拉低60-240us

{

delay_us(1);

i++;

if(i>240) return 0; //时间大于240us总线仍为高电平则DS18B20不存在

}

return 1;

}

void DS18B20_WriteByte(uint8_t dat)

{

int i;

DS18B20_Mode_OutPut();

for(i=0;i<8;i++)

{

PBout(8)=0; //先拉低引脚

delay_us(15); //等待15us,在第15-60us内DS18B20会获取总线电平

PBout(8)=dat&0x01;

delay_us(60); //延时,使时序图完整

PBout(8)=1;

dat>>=1;

}

}

uint8_t DS18b20_ReadByte(void)

{

int j;

uint8_t dat,byte;

for(j=8;j>0;j--)

{

DS18B20_Mode_OutPut();

PBout(8)=0; //先拉低引脚

delay_us(1); //延时至少大于1us

PBout(8)=1; //释放总线

delay_us(10); //DS18B20会在15us发送数据

DS18B20_Mode_InPut();

dat=PBin(8);

byte=(byte>>1)|(dat<<7);

delay_us(45); //使时序完整

DS18B20_Mode_OutPut();

PBout(8)=1;

}

return byte;

}

/*改变DS18B20的高温报警和低温报警以及分辨率*/

void DS18B20_Resolving_Temp(void)

{

DS18B20_Init();//单片机每次向DS18B20发送功能指令前都需要重新初始化DS18B20和写ROM指令

delay_ms(1);

DS18B20_WriteByte(0xcc);

DS18B20_WriteByte(0xbe);//高温报警的上限

DS18B20_WriteByte(0x00);//低温报警的下限

DS18B20_WriteByte(0x7f);//改变温度分辨率

}

/*进行温度转化*/

void Ds18b20ChangeTemp(void)

{

DS18B20_Init();

delay_ms(1);

DS18B20_WriteByte(0xcc);//跳过ROM

DS18B20_WriteByte(0x44);//发送指令RAM温度变换

}

/*读取温度*/

void Ds18b20ReadTempCom(void)

{

DS18B20_Init();

delay_ms(1);

DS18B20_WriteByte(0xcc);//跳过ROM

DS18B20_WriteByte(0xbe);//发送指令RAM读暂时寄存器

}

int Ds18b20ReadTemp(void)

{

int temp;

float fp;

uint8_t tml,tmh;

DS18B20_Resolving_Temp();//改变高温报警和低温报警以及温度的分辨率

Ds18b20ChangeTemp();//进行温度转换

Ds18b20ReadTempCom();//读取温度

tml=DS18b20_ReadByte();//读低8位数据

tmh=DS18b20_ReadByte();//读高8位数据

temp=tmh;

temp<<=8;

temp|=tml;//拼接为16位数据

fp = temp;

if(temp < 0)//DS18B20存储数据为补码形式,当temp<0时需要转为原码

{

temp = ~temp;

temp += 1;

}

temp = fp*0.0625*10+0.5;//根据获得的温度所需的小数而改变,如果保留2位小数则乘100,+0.5是为了四舍五入

return temp;//返回数据

}

}

//头文件部分

#ifndef _OBJ_DS18B20_H

#define _OBJ_DS18B20_H

#include "stm32f10x.h"

#include "sys.h"

//因为DS18B20是单总线,只靠一根线获取和输出数据,所以要不停的切换模式

#define DS18B20_Mode_OutPut() {GPIOB->CRH &= 0xFFFFFFF0;GPIOB->CRH |= 0x00000003;}//输出模式

#define DS18B20_Mode_InPut() {GPIOB->CRH &= 0xFFFFFFF0;GPIOB->CRH |= 0x00000008;}//输入模式

int DS18B20_Init(void);//DS18B20的初始化

int Ds18b20ReadTemp(void);//DS18B20读取温度

#endif

ds18b20温度转换指令_使用STM32控制DS18B20温度传感器相关推荐

  1. ds18b20温度转换指令_【Proteus】DS18B20简易温控器

    前言 DS18B20是单片机课设或者仿真项目中一个比较常用的数字温度传感器,因此使用DS18B20仿真一个简易的温控器,超过温度就打开风扇,低于某温度就用继电器打开加热丝.整个程序我都会附在最后,如果 ...

  2. ds18b20温度转换指令_学习心得 | 温度检测工程模块划分总结与案例分析

    本文为明德扬原创文章,转载请注明出处! 很多朋友在学习FPGA的时候会发现模块划分很令人头大,今天我就通过明德扬温度检测工程来与大家分享一下本人的划分思路. 明德扬温度检测工程是基于FPGA的一个实用 ...

  3. ds18b20温度转换指令_DS18B20温度传感器(附代码并浅谈与或运算)

    DS18B20使用的是一种比较特殊的传输协议,仅需一个接线口就能实现通信 前言 DS18B20独特的单线接口仅需一个端口引脚进行通讯,这让每一个学习到这里的人都感到很神奇.在这篇文章中我们将通过学习1 ...

  4. ds18b20温度转换指令_STM32接口DS18S20温度传感器

    关联知识 STM32 介绍 在本文中,我们将学习DS18B20温度传感器与STM32微控制器的接口. DS18B20不支持Arduino Dallas库和OneWire库. 这就是我们必须不使用库而编 ...

  5. ds18b20温度转换指令_51单片机驱动DS18B20温度传感器程序及心得

    关于DS18B20温度传感器,在没有硬件设备的辅助下,写内部程序有些困难,因为看不到实际信号波形.对于单片机,我...渐渐的有些心灰意冷..虽然掌握了1_WIRE总线,却少了很多喜悦,下雨了...它是 ...

  6. ds18b20温度转换指令_ds18b20如何读取温度?温度数据怎么换算? - 全文

    DS18B20是温度传感器,读写数据有一定的时序: 1.写操作 (1) 数据线先置低电平"0". (2) 延时确定的时间为15微秒. (3) 按从低位到高位的顺序发送字节(一次只发 ...

  7. ds18b20温度转换指令_ds18b20温度数据怎么换算? - ds18b20如何读取温度?温度数据怎么换算?...

    ds18b20温度数据怎么换算? 高五位S为符号位,分辨率为0.0625.正温度把16进制数转成10进制即可:负温度把16进制数取反后加1再转成10进制数,第一个是00FA是(15*16+10)*0. ...

  8. ds18b20温度转换指令_DS18B20温度传感器使用方法以及代码

    第 7 章 DS18B20 温度传感器 7.1 温度传感器概述 温度传感器是各种传感器中最常用的一种, 早起使用的是模拟温 度传感器, 如热敏电阻, 随着环境温度的变化, 它的阻值也发生线性 变化, ...

  9. ds18b20温度转换指令_DS18B20传感器温度转换指令( )。

    解析: [解析题]甲骨文是哪一历史时期的代表性文字 [解析题]下列分子中含有不同长度共价键的是 [解析题]肝性脑病的诱因包括 [解析题]教学语言包括 [解析题]地球会因大气升温而灭亡. [解析题]中国 ...

  10. DS18B20温度转换与显示

    单片机练习 - DS18B20温度转换与显示 最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序. DS18B20 数字温度传感器 ...

最新文章

  1. 线程访问临界区的问题 实例,需解决
  2. 设计模式C++实现(8)——代理模式
  3. 使用c:forEach 控制5个换行
  4. 计算机几何学论坛,现代几何学与计算机科学-中国计算机学会.pdf
  5. 【luogu3834】【POJ2104】【模板】可持久化线段树 1 [主席树]
  6. 学习思考之《编程之美》.
  7. mysql查看编码_mysql 字符编码的查看与修改
  8. Maven本地仓库搭建
  9. ansys workbench 材料参数的定义
  10. Foxmail设置雅虎邮箱的方法
  11. 携手Wi-SUN联盟,利尔达助Wi-SUN落地生花
  12. html 鼠标形状箭头,CSS各种鼠标样式介绍
  13. [bzoj 4424]Cf19E Fairy
  14. Dynamics 365 New Feature之Rich Text Editor Control
  15. 中央气象局天气预报城市对应的编码(到县为止)
  16. 【转】黑客文化的精髓
  17. 联合国粮农组织推荐的人类五大健康食品
  18. SPM12 核磁数据预处理 傻瓜攻略
  19. 小白从零开始学习区块链的个人笔记(一) 什么是区块链
  20. python:实现计算电阻Calculate resistance(附完整源码)

热门文章

  1. 华为 linux网络工程师待遇,华为网络工程师待遇如何?
  2. linux环境搭建之tftp tftpd服务器
  3. 通信电子线路——multisim高频小信号放大器设计
  4. 物体检测学习笔记-3D相机成像原理简介
  5. Unity3D插件大全
  6. sx1276, sx1278, Si4463, Si4432, Si4438, sx1212小无线模块对比数据
  7. NOPI将数据导出至EXCEL表格
  8. Excel单元格向下,向右自动填充的快捷键
  9. 通过hive将excel文件_hive 之 将excel数据导入hive中 : excel 转 txt
  10. 基于机器学习的回归拟合、详细总结