IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 4.5 51单片机-DS18B20温度传感器 -> 正文阅读

[嵌入式]4.5 51单片机-DS18B20温度传感器

4.5 DS18B20温度传感器

4.5.1 原理图介绍

图4-5-1?

图4-5-2

实验板上的DS18B20模块接在单片机的P3.5?IO口上,在插入DS18B20芯片时,圆弧朝上插入,具体效果可以看上面图片。

4.5.2 DS18B20温度传感器介绍

DS18B20是常用的数字温度传感器,其输出的是数字信号,它的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。

DS18B20的主要特征如下:

(1)、全数字温度转换及输出。

(2)、先进的单总线数据通信。(一根线即可采集温度)

(3)、最高 12 位分辨率,精度可达土 0.5 摄氏度。

(4)、12 位分辨率时的最大工作周期为 750 毫秒。

(5)、可选择寄生工作方式。

(6)、检测温度范围为–55° C ~+125° C (–67° F ~+257° F)

(7)、内置 EEPROM,限温报警功能。

(8)、64位光刻 ROM,内置产品序列号,方便多机挂接。(支持一根线操作多个芯片)

(9)、多样封装形式,适应不同硬件系统,封装可以看下面的图片。

图4-5-3

图片里芯片的引脚功能:GND电压地 、DQ单数据总线、VDD电源电压、NC 空引脚

4.5.3 ?DS18B20的工作原理介绍

DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。

它的一个工作周期可分为两个部分,温度检测和数据处理。

DS18B20内部有三种形态的存储器:

?(1) ROM只读存储器:用于存放 DS18B20ID 编码,其前 8 位是单线系列编码(DS18B20 的编码是19H),后面 48 位是芯片唯一的序列号,最后8位是以上56的位的 CRC 码(冗余校验),数据在芯片出厂时设置不可由用户更改。DS18B20 共 64 位 ROM(8+48+8)。

(2) RAM数据暂存器:用于内部计算和数据存取,数据在掉电后丢失,DS18B20 共 9 个字节 RAM,每个字节为 8 位。第 1、 2 个字节是温度转换后的数据值信息,第 3、 4 个字节是用户 EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第 5 个字节则是用户第 3 个 EEPROM的镜像。第 6、 7、 8 个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第 9 个字节为前 8 个字节的 CRC 码。

(3) EEPROM非易失性记忆体:用于存放长期需要保存的数据。比如:?上下限温度报警值和校验数据,DS18B20共有3个字节的EEPROM,并在 RAM 都存在镜像,以方便用户操作。

图4-5-4

DS18B20默认工作在12位分辨率模式,转换后得到的12位数据,存储在DS18B20的两个8比特的RAM中(最前面的两个字节),二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度

数据提取也可以使用位运算,读取出来的数据是2个字节一共16位(H和L),最低4位是小数位,剩下的是整数位。如果读取的数据是负数,需要-1再取反即可得到真实数据。

例如:

int?temp=0;
temp=DS18B20_ReadTemp();?//读取一次DS18B20采集的温度(返回H+L位)
if(temp<0)?//如果温度是负数
{
????temp=temp-1;
????temp=~temp;
????printf("DS18b20=-%d.%d\r\n",temp>>4,temp&0xF);
}
else
{
printf("DS18b20=%d.%d\r\n",temp>>4,temp&0xF);
}

4.5.4 ?DS18B20操作ROM/RAM的常用指令介绍

1.读取64位ROM编码指令:0x33

这个命令允许总线控制器读到DS18B20的64位ROM。只有当总线上只存在一个 DS18B20的时候才可以使用此指令,如果挂接不只一个,当通信时将会发生数据冲突。

2.匹配芯片指令:0x55

这个指令后面紧跟着由控制器发出的64 位序列号,当总线上有多只 DS18B20 时,只有与控制发出的序列号相同的芯片才可以做出反应,其它芯片将等待下一次复位。这条指令适应单芯片和多芯片挂接。

3.跳过ROM编码匹配:0xCC

这条指令使芯片不对 ROM 编码做出反应,在单总线的情况之下,为了节省时间则可以选用此指令。如果在多芯片挂接时使用此指令将会出现数据冲突,导致错误出现。

4.启动温度转换:0x44

收到此指令后芯片将进行一次温度转换,将转换的温度值放入 RAM 的第 1、 2 地址。此后由于芯片忙于温度转换处理,当控制器发一个读时间隙时,总线上输出“0”,当储存工作完成时,总线将输出“1”。在寄生工作方式时必须在发出此指令后立刻超用强上拉并至少保持 500MS,来维持芯片工作。

5.从RAM中读数据指令:0xBE

此指令将从 RAM中读数据,读地址从地址0开始,一直可以读到地址 9,完成整个 RAM 数据的读出。芯片允许在读过程中用复位信号中止读取,即可以不读后面不需要的字节以减少读取时间。

4.5.5 DS18B20时序图

(1). ?DS18B20复位与应答时序图

图4-5-5 复位及应答时序图?

图4-5-6

每一次与DS18B20通信之前都必须进行复位,复位的时间、等待时间、回应时间应严格按时序编程。

(2) 写数据时序

图4-5-7 写数据时序图

上面的时序图是向DS18B20写数据的时序图,该图分为两部分,左边部分是发送数据0的时序图,右边部分是发送数据1的时序图。

根据时序图提示(右边部分),每次发送数据之前(不管是数据0还是数据1)都需要先将总线拉低至少1us。

如果接下来发送的数据是0,那么需要将数据线拉低至少60us的时间,DS18B20对总线的采样时间在15~60us内;在采样时间内,如果总线为低电平,则表示写0,如果总线为高电平,则表示写1。

如果接下来发送的数据是1,那么也需要将数据线拉低至少60us的时间,DS18B20对总线的采样时间在15~60us内;在采样时间内,如果总线为低电平,则表示写0,如果总线为高电平,则表示写1。

注意: 在通信时,是以一个字节为单位向DS18B20进行传输,字节的读或者写是从低位开始的

(3) 读数据时序

图4-5-8 读数据时序图

上面的时序图是从DS18B20读取数据的时序图,该图分为两部分展示,左边部分是读取数据0时,总线电平变化过程,右边部分是读取数据1时,总线电平的变化过程。

根据时序图提示(右边部分),每次读取数据之前(不管是数据0还是数据1),总线都需要由主机拉低至少1us,然后再释放总线(拉高);

?随后需要等待15us的时间,才可以读取总线数据。DS18B20会在随后的45us内维持总线的电平,这段时间内读取总线的数据都是有效数据。

注意:?再总线拉低1us之后,必须等待15us之后才可以读取总线数据,这样才能保证总线数据是准确的。

在通信过程中,DS18B20输出的数据是从低位开始传输的

4.5.6 读取温度的步骤

总线上只有单只DS18B20的情景(读取一次DS18B20的温度)

1. ?向总线发送复位脉冲并检测DS18B20的响应信号(可以确保DS18B20硬件没有问题)

2. ?发送指令跳过ROM编号检查 (指令0xCC)

3. ?发送温度转换命令(指令0x44)

(DS18B20在转换温度的过程中,总线会一直保持高电平状态,不会响应总线命令)

4. ?向总线发送复位脉冲并检测DS18B20的响应信号

5. ?发送指令跳过ROM编号检查 (指令0xCC)

6. ?发送读取温度的指令(指令?0xBE)

7. ?接着读取温度数据低8位

8. ?接着读取温度数据高8位

4.5.7 读取DS18B20温度示例代码(单只DS18B20情景)

下面代码演示了循环读取DS18B20温度的过程,在主函数里1秒的间隔读取一次温度。

在编写DS18B20时序代码时,要注意时间的把控。

当前实验板的环境:采用STC90C516RD单片机,晶振是12MHZ,工作在12T模式下,代码中执行一条i++语句大概消耗的时间是12us。 程序中的延时时间,都是通过该时间推算的,如果程序要移植到其他单片机上,要注意时间的问题。

(硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

示例代码:

#include?<reg51.h>
/*DS18B20硬件接口:?P3.5*/
sbit?DS18B20_GPIO=P3^7;
int?DS18B20_ReadTemp(void);
/*
说明:?在12MHZ晶振下,12T模式下,i++消耗的时间差不多是12us
*/
/*
函数名称:u8?DS18B20_Init(void)
函数功能:向DS18B20发送复位脉冲,并检测应答信号
返?回?值:1表示失败,0表示成功
说明:?51单片机IO口默认输出高电平
*/
u8?DS18B20_ResetSignal(void)
{
????u8?i=0;
????//1.?发送复位信号
????DS18B20_GPIO=0;//将总线拉低480us
????i=50;???
????while(i--){}???//延时600us?,最少480us
????i=0;
????DS18B20_GPIO=1;//然后释放(拉高)总线,如果DS18B20做出反应会将在15us~60us后总线拉低
????//2.?等待DS18B20拉低总线
????while(DS18B20_GPIO)
????{
????????i++;
????????if(i>10)return?1;//失败?,大概120us
????}
????//3.?等待DS18B20释放总线
????i=0;
????while(DS18B20_GPIO==0)?//60us~240us
????{
????????i++;
????????if(i>20)return?1;//失败,大概240us
????}
????return?0;//初始化成功
}
/*
函数名称:u8?DS18B20_WriteByte(void)
函数功能:向DS18B20写入一个字节的数据
函数形参:写入的字节数据
*/
void?DS18B20_WriteByte(u8?byte)
{
????u16?i=0,j=0;
????for(j=0;j<8;j++)
????{
????????DS18B20_GPIO=0;//每写入一位数据之前先把总线拉低1us
????????i++;?//+1消耗的时间是12us
????????DS18B20_GPIO=byte&0x01;//然后写入一个数据,从最低位开始
????????i=6;
????????while(i--){}//持续时间最少60us,这里大概72us
????????DS18B20_GPIO=1;//然后释放总线
????????byte>>=1;//继续发送
????}
}
/*
函数名称:u8?DS18B20_ReadByte(void)
函数功能:从DS18B20读取一个字节的数据
返?回?值:读到的数据
*/
u8?DS18B20_ReadByte(void)
{
????u8?byte=0;
????u16?i=0,j=0;????
????for(j=0;j<8;j++)
????{
????????DS18B20_GPIO=0;//先将总线拉低1us
????????i++;//+1消耗的时间是12us
????????DS18B20_GPIO=1;//然后释放总线
????????i++;?
????????i++;//至少等待15us的时间,在读取数据
????????byte>>=1;?//先从低位开始接收数据
????????if(DS18B20_GPIO)byte|=0x80;???????????????????
????????i=4;?//读取完之后等待48us再接着读取下一个数据
????????while(i--){}
????}???????????????
????return?byte;
}
/*
函数名称:u16?DS18B20_ReadTemp(void)
函数功能:读取一次DS18B20的温度数据
返?回?值:读取的温度值
注意:?返回值要使用有符号的数据类型,因为温度可以返回负数。
*/
int?DS18B20_ReadTemp(void)
{
????int?temp=0;//存放温度数据
????u8?TH,TL;
????//第一步:?启动温度转换
????DS18B20_ResetSignal();?//发送复位脉冲并检测应答信号
????DS18B20_WriteByte(0xcc);//跳过ROM操作命令??????
????DS18B20_WriteByte(0x44);//温度转换命令
????
????//第二步:?读取温度
????DS18B20_ResetSignal();//发送复位脉冲并检测应答信号
????DS18B20_WriteByte(0xcc);//跳过ROM操作命令
????DS18B20_WriteByte(0xbe);//发送读取温度命令
????TL=DS18B20_ReadByte();//读取温度值共16位,先读低字节
????TH=DS18B20_ReadByte();//再读高字节
????temp=TH<<8|TL;?//合并成16位
????return?temp;
}
int?main()
{
????int?temp=0;
????UART_Init();????????//初始化串口波特率为4800
????while(1)
????{
????????temp=DS18B20_ReadTemp();
????????if(temp<0)?//如果温度是负数
????????{
????????????temp=temp-1;
????????????temp=~temp;
????????????printf("DS18b20=-%d.%d\r\n",temp>>4,temp&0xF);
????????}
????????else
????????{
????????????printf("DS18b20=%d.%d\r\n",temp>>4,temp&0xF);
????????}
????????DelayMs(1000);
}
}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-23 12:31:43  更:2021-11-23 12:31:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:37:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码