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