一、DS18B20的初始化
?。?) 先將數(shù)據(jù)線置高電平“1”。
?。?) 延時(shí)(該時(shí)間要求的不是很嚴(yán)格,但是盡可能的短一點(diǎn))
?。?) 數(shù)據(jù)線拉到低電平“0”。
?。?) 延時(shí)750微秒(該時(shí)間的時(shí)間范圍可以從480到960微秒)。
?。?) 數(shù)據(jù)線拉到高電平“1”。
?。?) 延時(shí)等待(如果初始化成功則在15到60毫秒時(shí)間之內(nèi)產(chǎn)生一個(gè)由DS18B20所返回的低電平“0”。據(jù)該狀態(tài)可以來確定它的存在,但是應(yīng)注意不能無限的進(jìn)行等待,不然會(huì)使程序進(jìn)入死循環(huán),所以要進(jìn)行超時(shí)控制)。
(7) 若CPU讀到了數(shù)據(jù)線上的低電平“0”后,還要做延時(shí),其延時(shí)的時(shí)間從發(fā)出的高電平算起(第(5)步的時(shí)間算起)最少要480微秒。
(8) 將數(shù)據(jù)線再次拉高到高電平“1”后結(jié)束。
二、 DS18B20的寫操作
?。?) 數(shù)據(jù)線先置低電平“0”。
(2) 延時(shí)確定的時(shí)間為15微秒。
(3) 按從低位到高位的順序發(fā)送字節(jié)(一次只發(fā)送一位)。
?。?) 延時(shí)時(shí)間為45微秒。
?。?) 將數(shù)據(jù)線拉到高電平。
?。?) 重復(fù)上(1)到(6)的操作直到所有的字節(jié)全部發(fā)送完為止。
?。?) 最后將數(shù)據(jù)線拉高。
三、DS18B20的讀操作
(1)將數(shù)據(jù)線拉高“1”。
?。?)延時(shí)2微秒。
(3)將數(shù)據(jù)線拉低“0”。
?。?)延時(shí)15微秒。
?。?)將數(shù)據(jù)線拉高“1”。
?。?)延時(shí)15微秒。
?。?)讀數(shù)據(jù)線的狀態(tài)得到1個(gè)狀態(tài)位,并進(jìn)行數(shù)據(jù)處理。
?。?)延時(shí)30微秒。
四、DS18B20讀寫操作程序
//----------------------------------------------------------
// 模塊名稱:DS18B20.h
// 模塊功能:DS18B20 讀寫操作
//----------------------------------------------------------
sbit DS = P1^0;
//----------------------------------------------------------
// 函數(shù)名稱:void DelayTmp(unsigned int count)
// 函數(shù)功能:延時(shí)
//----------------------------------------------------------
void DelayTmp(unsigned int count)
{
unsigned int i;
while(count)
{
i=200;while(i》0)i--;
count--;
}
}
//----------------------------------------------------------
// 函數(shù)名稱:void DsReset(void)
// 函數(shù)功能:復(fù)位
//----------------------------------------------------------
void DsReset(void)
{
unsigned int i;
DS=0;
i=103; while(i》0)i--;
DS=1;
i=4;while(i》0)i--;
}
//----------------------------------------------------------
// 函數(shù)名稱:bit TmpReadBit(void)
// 函數(shù)功能:讀取一位
//----------------------------------------------------------
bit TmpReadBit(void)
{
unsigned int i;
bit dat;
DS=0;i++;
DS=1;i++;i++;
dat=DS;
i=8;while(i》0)i--;
return (dat);
}
//----------------------------------------------------------
// 函數(shù)名稱:unsigned char TmpRead(void)
// 函數(shù)功能:讀取一字節(jié)
//----------------------------------------------------------
unsigned char TmpRead(void)
{
unsigned char i,j,dat;
dat=0;
for(i=1;i《=8;i++)
{j=TmpReadBit();
dat=(j《《7)|(dat》》1); }
return(dat);
}
//----------------------------------------------------------
// 函數(shù)名稱:void TmpWriteByte(unsigned char dat)
// 函數(shù)功能:寫入一字節(jié)
//----------------------------------------------------------
void TmpWriteByte(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit testb;
for(j=1;j《=8;j++)
{
testb=dat&0x01;
dat=dat》》1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i》0)i--;
}
else
{
DS=0; //write 0
i=8;while(i》0)i--;
DS=1;
i++;i++;
}
}
}
//----------------------------------------------------------
// 函數(shù)名稱:void TmpChange(void)
// 函數(shù)功能:溫度轉(zhuǎn)換
//----------------------------------------------------------
void TmpChange(void)
{
DsReset();
DelayTmp(1);
TmpWriteByte(0xcc);
TmpWriteByte(0x44);
}
//----------------------------------------------------------
// 函數(shù)名稱:unsigned int Tmp()
// 函數(shù)功能:獲取溫度
//----------------------------------------------------------
unsigned int Tmp()
{
float tt;
unsigned char a,b;
unsigned int temp;
DsReset();
DelayTmp(1);
TmpWriteByte(0xcc);
TmpWriteByte(0xbe);
a=TmpRead();
b=TmpRead();
temp=b;
temp《《=8;
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
//----------------------------------------------------------
// 函數(shù)名稱:void RefreshTmp()
// 函數(shù)功能:刷新溫度
//----------------------------------------------------------
void RefreshTmp()
{
TmpChange();
DisplayTmp(Tmp());
}