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