
初始化操作方法:單片機先給總線一個高電平,略微延時,然后拉低總線,至少延時480us(我們取600us),然后拉高總線,等待15~60us的時間(我們取80us),此后DS18B20如果響應,則會發出0,拉低總線,否則為1,單片機檢測是否響應的時間在60~240us之內,之后釋放總線,程序如下:
bit DS18B20_init()//初始化
本文引用地址:http://www.104case.com/article/201611/320856.htm{
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;
}
評論