初步认识51单片机-2.3单片机控制DS18B20温度传感器模块
可见单片机与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);
51单片机单片机控制DS18B20温度传感 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)