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

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

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

DQ=1;

}

mycom>>=1;

}

}

所以,如果你要发指令 ds18b20_com(0xcch)//skip rom,DS18B20就知道了要跳过读ROM,如果要发指令Convert T, ds18b20_com(0x44h),DS18B20就开始温度转换,并存储在ScratchPad中的前两个字节。

当转换完成后,数据存储在Byte0和Byte1中,下面的任务就是去读Byte0和Byte1了。这里需要注意的是,再单片机每发一次指令之前都要: 初始化->ROM指令->功能指令。这个是芯片手册上规定的。因此在读Byte0和Byte1之前要再初始化一次,Skip ROM([CCh]), 就可以读Byte0和Byte1了。之后将Byte0和Byte1合并,然后转换成温度就可以了。

现在我们来看看如何读DS18B20,同样查看芯片手册,找到读的时序图

DS18B20要把数据发送给单片机,那么DS18B20怎么知道单片机什么时候开始要数据呢?这里同样有个规则,当单片机将DQ拉低,延时1Us,然后释放DQ。此时,DS18B20就知道了,哦,单片机开始要数据了。如果此时DS18B20要给0,就把DQ拉低,相反,如果要写1就让DQ维持高的状态。从单片机发出读数据信息,DS18B20给数据,单片机采集数据,这个过程要在15Us完成,之后需要延时45Us,为保险,我们这里取65Us。两个读之间,至少要有1Us的间隔。因此很容易得出单片机读DS18B20的代码:

unsigned int ds18b20_read(void)

{

unsigned char temp1=0;

unsigned int temp2=0;

unsigned int temp=0;

unsigned char i;

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

{

temp1>>=1;

DQ=0;

_nop_();

_nop_();

DQ=1;

if(DQ==1)

temp1 |=0x80;

delayUs(35);

}

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

{

temp2>>=1;

DQ=0;

_nop_();

_nop_();

DQ=1;

if(DQ==1)

temp2 |=0x80;

delayUs(35);

}

temp2 <=8;

temp=temp1+temp2;

return temp;

}

通过LCD1602和DS18B20两个例子可以看出,对这两个模块的控制,其实只用了单片机的引脚控制和延时程序。重点和难点其实在理解各模块的控制规则。其实这些只需要通过仔细阅读对应的芯片手册就能找到。而单片机引脚的控制和延时部分与LED的操作并无区别,难怪有人说,如果你把操作LED的过程真正搞懂了,单片机你就学会了一半。后面我们会反复的使用LED作为例子,讲解单片机其它相关内容。

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

网站地图

Top