18b20復位函數(shù):
bitds18b20_reset(void){bitbitbuf;ds18b20=1;//10usTH0=0xff;TL0=0xf6;TF0=0;while(!TF0);ds18b20=0;//設置1-wire總線為低電平(占領總線)//延遲480us-960us,盡可能選小值(480us)//這里我們選490usTH0=0xfe;TL0=0x3c;TF0=0;while(!TF0);ds18b20=1;//設置1-wire總線為高電平(釋放總線)//最佳時間:60us+7.5us//這里我們選68usTH0=0xff;TL0=0xc1;TF0=0;while(!TF0);ds18b20=1;//探測總線上是否有器件if(ds18b20==1)bitbuf=1;//沒有器件在線elsebitbuf=0;//有器件在線//保證DS18B20釋放總線的時間//490-68=422usTH0=0xfe;TL0=0x7b;TF0=0;while(!TF0);return(bitbuf);}
18b20寫字節(jié)函數(shù):
voidds18b20_write(unsignedcharval){unsignedchari;for(i=0;i<8;i++)//{ds18b20=0;//設置1-wire總線為低電平//2usTH0=0xff;TL0=0xfe;TF0=0;while(!TF0);ds18b20=val&0x01;//最低位移出val=val>>1;//右移一位//60us~120us(實際不能到120us,因為其它語句也用時間了!)//這里我們選62usTH0=0xff;TL0=0xc6;TF0=0;while(!TF0);ds18b20=1;}}
18b20讀字節(jié)函數(shù):
unsignedchards18b20_read(void){unsignedchari;unsignedcharvalue=0;for(i=0;i<8;i++){//從總線拉低到讀總線狀態(tài),不能大于15us!ds18b20=0;//2usTH0=0xff;TL0=0xfe;TF0=0;while(!TF0);ds18b20=1;//4usTH0=0xff;TL0=0xfc;TF0=0;while(!TF0);value>>=1;if(ds18b20)value|=0x80;//62us,必須大于60usTH0=0xff;TL0=0xc6;TF0=0;while(!TF0);}ds18b20=1;return(value);}
啟動18b20溫度轉換:
voidconvert_T(void){if(ds18b20_reset()==0)//如果復位成功{ds18b20_write(0xcc);//跳過多器件識別ds18b20_write(0x44);//啟動溫度轉換}}
讀18b20溫度函數(shù):
voidread_T(void){unsignedcharLsb,Msb;if(ds18b20_reset()==0)//如果復位成功{ds18b20_write(0xcc);//跳過多器件識別ds18b20_write(0xbe);//讀暫存器Lsb=ds18b20_read();//低字節(jié)Msb=ds18b20_read();//高字節(jié)temp2=Lsb&0x0f;temp1=(Lsb>>4)|(Msb<<4);}}