初始化操作方法:单片机先给总线一个高电平,稍微延时,然后拉低总线,至少延时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;
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/260314.html