AVR
单片机学习笔记--基于慧净
HJ-2G AVR
开发板
第
14
章
DS18B20
.
14.1
概念.
这一章是关于
DS18B20
实时温度传感器。相信有学过
c51
单片机的朋友½对他不陌生
吧。我恰恰也学习过,不过½初并没有掌握½。学习板搭配的
DS18B20,一般上给人的
感觉有点像三极管,其实
DS18B20
的内部结构与原理也挺猥琐的,½是我们½用也是
为了实现温度传感的功½而已,基本上不会介绍过度深入。
14.2 DS18B20
介绍
DS18B20
有三只引脚,VCC,DQ,和
VDD。
而
HJ-2G
板子上,采用了外部供电的链接方式,而总线必须链接上拉电阻。这一目的告
诉我们,一线总线在空½状态时,½是一直处于高电平。
DS18B20
的 内 部 有
64
½ 的
ROM
单元,
9
字节的暂存器
和
单 元 。
64
½
ROM
包 含 了 ,
DS18B20
唯一的序列号(唯一
的名字)
。
AVR
单片机学习笔记--基于慧净
HJ-2G AVR
开发板
以上是内部
9
个字节的暂存单元(包括
EEPROM)
。
字节
0~1
是½换½的温度。
字节
2~3
是用户用来设½最高报警和最½报警值。这个可以用½件来实现。
字节
4
是用来配½½换精度,9~12 ½。
字节
5~8
就不用看了。
14.3
字节
0~1 :
½换½的温度
DS18B20
的温度操½是½用
16
½,
也就是说分辨率是
0.0625。
BIT15~BIT11
是符号½,
为了就是表示½换的值是正数还是负数。看看数据手册给出的例子吧。
AVR
单片机学习笔记--基于慧净
HJ-2G AVR
开发板
要求出正数的十进制值,必须将读取到的
LSB
字节,
MSB
字节进行整合处理,然后乘
以
0.0625
即可。
Eg:假设从,字节 0
读取到
0xD0
赋值于
Temp1,而字节 1
读取到
0x07
赋值于
Temp2,
然后求出十进制值。
unsigned int Temp1,Temp2,Temperature;
Temp1=0xD0;
Temp2=0x07;
//½八½
//高八½
Temperature = ((Temp2<<8 ) | Temp1 ) * 0.0625;
//又或者
Temperature = (Temp1 + Temp2 *256) * 0.0625;
//Temperature=125
在这里我们遇见了一个问题,就是如½求出负数的值呢?很遗憾的,单片机不像人脑那
样会心算,我们必须判断
BIT11~15
是否是
1,然后人为½一负数标志。
Eg.
假设从,字节
0
读取到
0x90
赋值于
Temp1,而字节 1
读取到
0xFC
赋值于
Temp2,
然后求出该值是不是负数,和½换成十进制值。
unsigned int Temp1,Temp2,Temperature;
unsigned char Minus_Flag=0;
Temp1=0x90;
Temp2=0xFC;
//½八½
//
高八½
//Temperature=64656
//很明显不是我们想要的答案
//Temperature = (Temp1 + Temp2 *256) * 0.0625;
if(Temp2&0xFC)
//判断符号½是否为 1
{
Minus_Flag=1;
Temperature = ((Temp2<<8 ) | Temp1 )
Temperature= ((~Temperature)+1);
Temperature*= 0.0625;
}
else
{
Minus_Flag=0;
Temperature = ((Temp2<<8 ) | Temp1 ) * 0.0625;
}
//负数标志½一
//高八½第八½进行整合
//求反,补一
//求出十进制
//Temperature=55;
那个人为的负数标志,
是真的很有用处的。
这个要看½½自己的想象力了,如½去利用它。
AVR
单片机学习笔记--基于慧净
HJ-2G AVR
开发板
继续继续,以上我们是求出没有小数点的正数。如果我要求出小数点的值的话,那么我
应该这样做。
Eg:假设从,字节 0
读取到
0xA2
赋值于
Temp1,而字节 1
读取到
0x00
赋值于
Temp2,
然后求出十进制值,要求连同小数点也求出。
unsigned int Temp1,Temp2,Temperature;
Temp1=0x90;
Temp2=0xFC;
//½八½
//高八½
//
实际值为
10.125
//10,无小数点
//101
,一½小数点
//1012,二½小数点
//Temperature = ((Temp2<<8 ) | Temp1 ) * 0.0625;
Temperature = ((Temp2<<8 ) | Temp1 ) * (0.0625 * 10) ;
//Temperature = ((Temp2<<8 ) | Temp1 ) * (0.0625 * 100) ;
如以上的例题,我们可以先将
0.0625
乘以
10
,然后再乘以整合后的
Temperature
变量,
就可以求出后面一个小数点的值(求出更多的小数点,方法½是以此类推 )
。得出的结
果是
101,然后再利用简单的算法,求出每一½的值。
unsinged char Ten,One,Dot1
Ten=Temperature/100;
One=Temperature%100/10;
Dot1=%10;
//1
//0
//1
求出负数的思路也一样,只不过多出人为½一负数标志,求反补一的动½而已。自己发
挥想象力吧。
14.4
字节
2~3 TH
和
TL
配½
2~3:TH
TH
与
TL
就是所谓的温度最高界限,和温度最½界限的配½。其实这些可以½用½件
来试验,所以就无视了。
14.5
字节
4
:配½寄存器
BIT7
出厂的时候就已经设½为
0,用户不建议去更改。而 R1
与
R0
½组合了四个不同
的½换精度,00 为
9
½½换精度而½换时间是
93.75ms,01
为
10
½½换精度而½换时
间是
187.5ms,10
为
11
½½换精度而½换时间是
375ms,11
为
12
½½换精度而½换时
间是
750ms
(默认)
。该寄存器还是留默认的½,毕竟½换精度表示了½换的质量。
AVR
单片机学习笔记--基于慧净
HJ-2G AVR
开发板
14.6
字节
5~7
,
8
:保留½,
CRC
无视,无视吧。
14.7
单片机访问
DS18B20
DS18B20
一般½是充½从机的角色,而单片机就是主机。单片机通过一线总线访问
DS18B20
的话,需要经过以下几个步骤:
1.DS18B20
复½。
2.执行 ROM
指令。
3.
执行
DS18B20
功½指令(
RAM
指令)
。
补充一下。一般上我们½是½用单点,也就是说单线总线上仅有一个
DS18B20
存在而
已。所以我们无需刻意读取
ROM
里边的序列号来,然后匹配 那个
DS18B20?而是更
直接的,跳过
ROM
指令,然后直接执行
DS18B20
功½指令。
DS18B20
复½,在某种意义上就是一次访问
DS18B20
的开始,或者可说成是开始信号。
ROM
指令,也就是访问,搜索,匹配,DS18B20 个别的
64
½序列号的动½。在单点情
况下,可以直接跳过
ROM
指令。而跳过
ROM
指令的字节是
0xCC。
DS18B20
功½指令有很多种,我就不一一的介绍了,数据手册里有更详细的介绍。这里
仅列出比较常用的几个
DS18B20
功½指令。
0x44:开始½换温度。½换½的温度会储存到暂存器字节
0
和
1。
0xEE
:读暂存指令。读暂存指令,会从暂存器
0
到
9
,一个一个字节读取,如果要停止
的话,必须写下
DS18B20
复½。
14.8 DS18B20
复½
DS18B20
的复½时序如下:
1.单片机拉½总线 480us~950us,
然后释放总线(拉高电平)
。
2.这时 DS18B20
会拉½信号,大约
60~240us
表示应答。
3.DS18B20
拉½电平的
60~240us
之间,
单片机读取总线的电平,
如果是½电平,
那么表示复½成功。
4.DS18B20
拉½电平
60~240us
之后,会释放总线。
评论