微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机写DS18B20的驱动

51单片机写DS18B20的驱动

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

初始化操作方法:单片机先给总线一个高电平,略微延时,然后拉低总线,至少延时480us(我们取600us),然后拉高总线,等待15~60us的时间(我们取80us),此后DS18B20如果响应,则会发出0,拉低总线,否则为1,单片机检测是否响应的时间在60~240us之内,之后释放总线,程序如下:
bit DS18B20_init()//初始化

{
uchar i;
bit flag_response=0;
DQ=1;
_nop_();_nop_();
DQ=0;
delay_us(90); //延时600us
DQ=1;
delay_us(10); //延时80us
for(i=0;i<15;i++)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
if(!DQ)
{
flag_response=1;
break;
}
}
delay_us(63);//延时420us
DQ=1;//释放总线
return(flag_response);
}

写操作方法:由于是单总线,读写操作都分为写0和写1,从一个字节的最低位逐次往DS18B20里写,先使总线产生一个由1到0的跳变,等待15us(我们取13us),然后判断要写的那位是1还是0,如果是1,则拉高总线,0则不去操作总线(因为总线开始产生跳变时已被拉低),等待45us(我们取64us)以后释放总线(这段时间DS18B20会采样,如上图所示),程序如下:

void DS18B20_write(uchar dat)//写1个字节
{
uchar i;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();_nop_();
DQ=0;
delay_us(1);//延时13us
if(dat&0x01)
DQ=1;
delay_us(8);//延时64us
DQ=1;//释放总线
dat>>=1;
}
}

读操作方法:使总线产生一个由1到0的跳变,等待1us,马上拉高总线,等待大约12个us(datasheet推荐的采样时间是快接近15us的时候,我们略微提前),单片机采样,如果总线被拉低,则读出的是0,否则就读出1,然后延时45us以上(我们取55us)释放总线;注意,读也是从最低位开始的,这里读出的0,1加到字节最高位,读完后,最高位被移到最低位,实际上是右移了7次

uchar DS18B20_read()//读1个字节
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
dat>>=1;
DQ=1;
_nop_();_nop_();
DQ=0;
_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//按datasheet上的推荐时序,略微提前
if(DQ)
dat|=0x80;
delay_us(7); //延时55us
DQ=1;
}
return dat;
}

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

网站地图

Top