微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 初步认识51单片机-2.3单片机控制DS18B20温度传感器模块

初步认识51单片机-2.3单片机控制DS18B20温度传感器模块

时间:11-21 来源:互联网 点击:

可见单片机与DS18B20的沟通只能靠这一根线了,另外这一根线上可以同时接很多个DS18B20. 那么单片机是如何通过这一根线准确的与多个DS18B20沟通的呢?单片机是不知道DQ线上有没有DS18B20的,或者有多个,或者有但是坏了。与人的沟通方式一样,当你不知道屋里情况的时候,会先打个招呼,问下有人没。同样,单片机也一样,先来个初始化,打个招呼,看看DQ线上有没有18B20。怎么样打招呼呢,与前面讲LCD1602一样,当然按照DS18B20的规则。单片机先要把DQ拉低至少480μS, 然后释放DQ,大约在15-60μS后,如果线上有DS18B20并能正常工作,那么DS18B20将DQ拉低并维持60-240μS. 单片机通过检查这个信号,从而判断线上是否有能正常工作的DS18B20,有多少个信号就挂着多少个DS18B20,这个就是DS18B20的规则,具体如下,

初始化后之后就可以与DS18B20沟通了?线上如果有多个DS18B20,你到底是要与哪个沟通呢?因此沟通之前要先来个确定对象。这里我们取最简单一个DS18B20,搞懂了一个,自然会做控制多个DS18B20了。我们来看看初始化代码如何写,

step1:首先DQ拉低,要维持至少480Us,这里我们取500Us保险一点

step2:释放总线(DQ=1),大约等待15-60Us后,DS18B20会把DQ拉低。那么这里到底是选15Us,还是60Us?

step3:此时DS18B20把DQ拉低信号(L_DQ)能持续60-240Us.那么到底选60Us还是240Us?

注意我们这里的目的是要检测出DS18B20是否拉低DQ的信号(L_DQ)。那么在step2中,释放总线(DQ=1)后,我们到底要延时多长时间(Tdelay),去读DQ是否等于0的信号?

我们来个极端假设,最小值和最大值

(1)在step2中, 单片机释放总线(DQ=1),等待15Us(最小值)后,DS18B20把DQ拉低,在step3中,DQ拉低持续了60Us(最小值)

在这种情况下,如果Tdelay>75Us,你就不能检测到L_DQ信号了。因此Tdelay要小于75Us.

(2)在step2中, 单片机释放总线(DQ=1),等待60Us(最大值)后,DS18B20把DQ拉低,在step3中,DQ拉低持续了60/240Us(两种情况)

在这种情况下,如果Tdelay<60Us,你就检测不到L_DQ信号了。比如你设置Tdelay=50Us然后去读DQ,此时DQ仍然为1,为什么?因为60Us后

DS18B20才把DQ拉低。因此Tdelay>60Us.

综上所述,保险时间为:75Us>Tdelay>60Us,代码如下:

void ds18b20_init(void)

{

DQ=0;//总线拉低

delayUs(240); //延时526Us

DQ=1;//释放总线

delayUs(28);//延时66Us(60-75Us之间)

if(DQ==0)

{

LED1=0;//(设置一个LED,如果检测到DQ=0,就把LED1点亮)

}

else

{

LED2=0;

}

delayUs(240);//注意读完DQ后要继续延时480Us

}

DS18B20的ID信号在ROM中,因此这里我们可以跳过读ROM(Skip ROM[CCh]).

接下来就到了与DS18B20沟通的部分了。DS18B20一上电的时候是钝态的,就是说它是被动的,没有指令它就不干活。所以,单片机给DS18B20的第一个指令就是让它开始测量温度(Convert T [44h]). 当DS18B20收到这条指令后干什么呢?这里就要回到前面的我们讲的图1,DS18B20开始感知周围温度并把温度高低转成数字信号存储在ScratchPad中的Byte0和Byte1中。从这里我们知道,我们仅仅通过一条指令Convert T,就让DS18B20开始温度测量并存储,至于这个过程怎么发生的我们并不关心。从这里我们看到,其实控制DS18B20模块与LCD1602模块没有本质上区别,我们要做的事情仅仅是去读懂规则,这些规则来源与它们的芯片手册,那么简单的讲就是阅读理解芯片手册。这一点其实被很多初学者忽略了,不愿意或者不习惯查看芯片手册。DS18B20把温度信号转成数字信号需要一定的时间,因此在发布下一条指令前,我们这里需要检测DS18B20是否仍处于工作之中,如果你想简化,来个延时也行。转换完成后,DS18B20又处于钝态了,这个转换过程不是持续的,因此你想让它再转换,那么就必须再发一次Convert T指令。

那么怎么发指令呢?这个就涉及到‘DS18B20写’的部分了。参考数据手册,找到‘写时序

首先看单片机如何往DS18B20中写0和1,

(1)写0:DQ拉低,维持至少60Us,在大约15-60Us的时候,DS18B20开始接受数据

(2)写1: DQ拉低,延时2Us,然后释放DQ,此时,上拉电阻会把DQ拉高,延时至少60Us,在15-60Us的时候,DS18B20开始接受数据

因此写指令的代码如下

void ds18b20_com(unsigned char mycom)

{

unsigned char temp;

unsigned char i;

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

{

temp=mycom & 0x01;

if (temp==1)

{

DQ=0;

_nop_();

_nop_();

DQ=1;

delayUs(35);

}

else

{

DQ=0;

delayUs(35);

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top