DS18B20 介绍
DS18B20 有三只引脚,VCC,DQ,和 VDD。
而 HJ-2G 板子上,采用了外部供电的链接方式,而总线必须链接上拉电阻。这一目的告诉我们,一线总线在空置状态时,都是一直处于高电平。
DS18B20 的内 部有64位的ROM 单元,和 9 字节的暂存器单 元 。64位ROM包含了DS18B20 唯一的序列号(唯一的名字)。
以上是内部 9 个字节的暂存单元(包括 EEPROM)。
字节 0~1 是转换好的温度。
字节 2~3 是用户用来设置最高报警和最低报警值。这个可以用软件来实现。
字节 4 是用来配置转换精度,9~12 位。
字节 5~8 就不用看了。
字节 0~1 : 转换好的温度
DS18B20 的温度操作是使用 16 位,也就是说分辨率是 0.0625。BIT15~BIT11 是符号位 ,为了就是表示转换的值是正数还是负数。看看数据手册给出的例子吧。
要求出正数的十进制值,必须将读取到的LSB字节,MSB字节进行整合处理,然后乘以 0.0625 即可。
Eg:假设从,字节0读取到0xD0赋值于Temp1,而字节1读取到0x07赋值于Temp2,然后求出十进制值。
在这里我们遇见了一个问题,就是如何求出负数的值呢?很遗憾的,单片机不像人脑那样会心算,我们必须判断 BIT11~15 是否是 1,然后人为置一负数标志。
Eg. 假设从,字节 0 读取到 0x90 赋值于 Temp1,而字节 1 读取到 0xFC 赋值于 Temp2,然后求出该值是不是负数,和转换成十进制值。
Eg:假设从,字节 0 读取到 0xA2 赋值于 Temp1,而字节 1 读取到 0x00 赋值于 Temp2,
然后求出十进制值,要求连同小数点也求出。
如以上的例题,我们可以先将 0.0625 乘以 10,然后再乘以整合后的 Temperature 变量,
就可以求出后面一个小数点的值(求出更多的小数点,方法都是以此类推 )。得出的结
果是 101,然后再利用简单的算法,求出每一位的值。
求出负数的思路也一样,只不过多出人为置一负数标志,求反补一的动作而已。
字节 2~3:TH 和 TL 配置
TH 与 TL 就是所谓的温度最高界限,和温度最低界限的配置。其实这些可以使用软件
来试验,所以就无视了。
字节 4:配置寄存器
BIT7 出厂的时候就已经设置为 0,用户不建议去更改。而 R1 与 R0 位组合了四个不同的转换精度,00 为 9 位转换精度而转换时间是 93.75ms,01 为 10 位转换精度而转换时间是 187.5ms,10 为 11 位转换精度而转换时间是 375ms,11 为 12 位转换精度而转换时间是 750ms(默认)。该寄存器还是留默认的好,毕竟转换精度表示了转换的质量。
字节 5~7,8:保留位,CRC
单片机访问 DS18B20
DS18B20 一般都是充当从机的角色,而单片机就是主机。单片机通过一线总线访问DS18B20 的话,需要经过以下几个步骤:
(1)DS18B20 复位。
(2)执行 ROM 指令。
(3)执行 DS18B20 功能指令(RAM 指令)。
补充一下。一般上我们都是使用单点,也就是说单线总线上仅有一个 DS18B20 存在而已。所以我们无需刻意读取 ROM 里边的序列号来,然后匹配 那个 DS18B20而是更直接的,跳过 ROM 指令,然后直接执行 DS18B20 功能指令。
DS18B20 复位,在某种意义上就是一次访问 DS18B20 的开始,或者可说成是开始信号。
ROM 指令,也就是访问,搜索,匹配,DS18B20 个别的 64 位序列号的动作。在单点情况下,可以直接跳过 ROM 指令。而跳过 ROM 指令的字节是 0xCC。
0x44:开始转换温度。转换好的温度会储存到暂存器字节 0 和 1。
0xEE:读暂存指令。读暂存指令,会从暂存器 0 到 9,一个一个字节读取,如果要停止
的话,必须写下 DS18B20 复位。
DS18B20 复位
DS18B20 的复位时序如下:
(1)单片机拉低总线 480us~950us, 然后释放总线(拉高电平)。
(2)这 时 DS18B20 会拉低信号,大约 60~240us 表示应答。
(3)DS18B20 拉低电平的 60~240us 之间,单片机读取总线的电平,如果是低电平,那么表示复位成功。
(4)DS18B20 拉低电平 60~240us 之后,会释放总线。
DS18B20 读写逻辑 0 与 1
DS18B20 写逻辑 0 的步骤如下:
(1)单片机拉低电平大约 10~15us,。
(2)单片机持续拉低电平大约 20~45us 的时间。
(3)释放总线
DS18B20 写逻辑 1 的步骤如下:
(1)单片机拉低电平大约 10~15us,。
(2)单片机拉高电平大约 20~45us 的时间。
(3)释放总线
DS18B20 读逻辑 0 的步骤如下:
(1)在读取的时候单片机拉低电平大约 1us
(2)单片机释放总线,然后读取总线电平。
(3)这时候 DS18B20 会拉低电平。
(4)读取电平过后,延迟大约 40~45 微妙。
DS18B20 读逻辑 1 的步骤如下:
(1)在读取的时候单片机拉低电平大约 1us
(2)单片机释放总线,然后读取总线电平。
(3)这时候DS18B20 会拉高电平。
(4)读取电平过后,延迟大约 40~45 微秒。