一.DS18B20特點
DS18B20 數(shù)字溫度計提供12位(二進制)溫度讀數(shù)的數(shù)字型傳感器。傳感器僅需要單總線接口與CPU連接,實現(xiàn)信號送入 DS18B20 或從 DS18B20 送出。傳感器內(nèi)部框圖如下:
DS18B20內(nèi)部框圖
- DS18B20的電源可以由數(shù)據(jù)線本身提供(如框圖所示),可不需要再接外部電源,因此從CPU到DS18B20僅需一條數(shù)據(jù)線和地線。
- 內(nèi)部的64位ROM 只讀存儲器,用于存放DS18B20 ID編碼,其前8位是單線系列編碼(DS18B20的編碼是19H),后面48位是芯片唯一的序列號,最后8位是以上56位的CRC碼(冗余校驗)。數(shù)據(jù)在出產(chǎn)時廠家已設(shè)置好,用戶不可更改。
- RAM 數(shù)據(jù)暫存器,用于內(nèi)部計算和數(shù)據(jù)存取,數(shù)據(jù)在掉電后丟失,DS18B20共9個字節(jié)RAM,每個字節(jié)為8位。
DS18B20內(nèi)部RAM圖
第1、2個字節(jié)是溫度轉(zhuǎn)換后的數(shù)據(jù)值信息,第3、4個字節(jié)是用戶EEPROM(常用于溫度報警值儲存)的鏡像。在上電復位時其值將被刷新。第5個字節(jié)則是用戶第3個EEPROM的鏡像。第6、7、8個字節(jié)為計數(shù)寄存器,是為了讓用戶得到更高的溫度分辨率而設(shè)計的,同樣也是內(nèi)部溫度轉(zhuǎn)換、計算的暫存單元。第9個字節(jié)為前8個字節(jié)的CRC碼。EEPROM 非易失性記憶體,用于存放長期需要保存的數(shù)據(jù),上下限溫度報警值和校驗數(shù)據(jù),DS18B20共3位EEPROM,并在RAM都存在鏡像,以方便用戶操作。
二.DS18B20連接圖
DS18B20電源連接方式有兩種,可通過數(shù)據(jù)線供電或者電源引腳直接供電;此外,無論哪種連接方式,數(shù)據(jù)線都需要外置4.7k的上拉電阻。
數(shù)據(jù)線供電的連接方式
外部電源供電的連接方式
三.DS18B20控制時序分析
1.復位時序
時序見圖,主機總線發(fā)送一復位脈沖(最短為 480us,最長960us的低電平信號);接著主機將總線拉到高電平,釋放總線并進入引腳接收狀態(tài);DS18B20 在檢測到總線的上升沿之后等待15-60us,接著DS18B20發(fā)出存在脈沖(低電平持續(xù) 60-240 us) 。主機總線檢測到低電平時間在140us內(nèi),則檢測到DS18B20的應答。
//復位DS18B20
void DS18B20_Rst(void)
{
DS18B20_IO_OUT(); //SET IO OUTPUT
DS18B20_DQ_OUT=0; //拉低DQ
delay_us(750); //拉低750us
DS18B20_DQ_OUT=1; //DQ=1
delay_us(15); //15US
}
//等待DS18B20的回應
//返回1:未檢測到DS18B20的存在
//返回0:存在
u8 DS18B20_Check(void)
{
u8 retry=0;
DS18B20_IO_IN();//SET PA0 INPUT
while (DS18B20_DQ_IN&&retry< 200)
{
retry++;
delay_us(1);
};
if(retry >=200)return 1;
else retry=0;
while (!DS18B20_DQ_IN&&retry< 240)
{
retry++;
delay_us(1);
};
if(retry >=240)return 1;
return 0;
}
2.寫時序
當主機總線從高拉至低電平時就產(chǎn)生寫時間隙,見圖時序圖,從下降沿開始15us之內(nèi)應將所需寫的位送到總線上,DS18B20在15-60us間對總線采樣,若低電平寫入的位是0,若高電平,則寫入的位是1,連續(xù)寫入位數(shù)的間隙應大于1us。
//寫一個字節(jié)到DS18B20
//dat:要寫入的字節(jié)
void DS18B20_Write_Byte(u8 dat)
{
u8 j;
u8 testb;
DS18B20_IO_OUT();//SET IO OUTPUT;
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat >>1;
if (testb)
{
DS18B20_DQ_OUT=0;// 寫入1
delay_us(2);
DS18B20_DQ_OUT=1;
delay_us(60);
}
else
{
DS18B20_DQ_OUT=0;// 寫入0
delay_us(60);
DS18B20_DQ_OUT=1;
delay_us(2);
}
}
}
3.讀時序
主機總線從高拉至低電平時,總線只須保持低電平1us以上后,將總線拉高,產(chǎn)生讀時間隙,如圖:
讀時間在Trc后到15us內(nèi)有效,也就是說 t z 時刻前主機必須完成讀位,并在 Tinit后的 60us ~ 120 us內(nèi)釋放總線。主機引腳讀取總線狀態(tài),若低電平讀取的位是0,若高電平,則讀取的位是1,連續(xù)讀取位數(shù)的間隙應大于1us。
//從DS18B20讀取一個位
//返回值:1/0
u8 DS18B20_Read_Bit(void) // read one bit
{
u8 data;
DS18B20_IO_OUT();//SET IO OUTPUT
DS18B20_DQ_OUT=0;
delay_us(2);
DS18B20_DQ_OUT=1;
DS18B20_IO_IN();//SET IO INPUT
delay_us(12);
if(DS18B20_DQ_IN)data=1;
else data=0;
delay_us(50);
return data;
}
//從DS18B20讀取一個字節(jié)
//返回值:讀到的數(shù)據(jù)
u8 DS18B20_Read_Byte(void) // read one byte
{
u8 i,j,dat;
dat=0;
for (i=1;i<=8;i++)
{
j=DS18B20_Read_Bit();
dat=(j< 7)|(dat >>1);
}
return dat;
}
4.讀取DS18B20溫度值
DS18B20讀取溫度值步驟如下,其中單個傳感器無需匹配ROM,所以程序中跳過匹配ROM。
//從ds18b20得到溫度值
//精度:0.1C
//返回值:溫度值 (-550~1250)
short DS18B20_Get_Temp(void)
{
u8 temp;
u8 TL,TH;
short tem;
DS18B20_Start (); // ds1820 開始轉(zhuǎn)換
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// 跳過匹配ROM
DS18B20_Write_Byte(0xbe);// 轉(zhuǎn)換
TL=DS18B20_Read_Byte(); // LSB
TH=DS18B20_Read_Byte(); // MSB
if(TH >7)
{
TH=~TH;
TL=~TL;
temp=0;//溫度為負
}else temp=1;//溫度為正
tem=TH; //獲得高八位
tem< <=8;
tem+=TL;//獲得底八位
tem=(float)tem*0.625;//轉(zhuǎn)換
if(temp)return tem; //返回溫度值
else return -tem;
}
-
電源
+關(guān)注
關(guān)注
184文章
17704瀏覽量
249958 -
存儲器
+關(guān)注
關(guān)注
38文章
7484瀏覽量
163762 -
數(shù)據(jù)線
+關(guān)注
關(guān)注
8文章
283瀏覽量
37718 -
DS18B20
+關(guān)注
關(guān)注
10文章
779瀏覽量
80822 -
數(shù)字溫度計
+關(guān)注
關(guān)注
3文章
108瀏覽量
21720
發(fā)布評論請先 登錄
相關(guān)推薦
評論