一. 概述
DS18B20數(shù)字溫度傳感器提供9-Bit到12-Bit的攝氏溫度測(cè)量精度和一個(gè)用戶可編程的非易失性且具有過(guò)溫和低溫觸發(fā)報(bào)警的報(bào)警功能。 DS18B20采用的1-Wire通信即僅采用一個(gè)數(shù)據(jù)線(以及地)與微控制器進(jìn)行通信,采集數(shù)據(jù)的精度為12bit。
該傳感器的溫度檢測(cè)范圍為-55℃至+125℃,并且在溫度范圍超過(guò)-10℃至85℃之外時(shí)還具有+-0.5℃的精度。 此外,DS18B20可以直接由數(shù)據(jù)線供電而不需要外部電源供電。
1.特點(diǎn)
- 供電電壓:3.0V-5.5V。
- 測(cè)量溫度范圍:-55~+125℃
- 精度:±0.5℃
- 數(shù)據(jù)傳輸:“一線總線”的數(shù)字方式傳輸
- 采集精度:可以由用戶自定義為9-Bits至12-Bits。
2.引腳說(shuō)明
3.參考電路圖
DS18B20供電一般采用外部供電方式,并且在數(shù)據(jù)線上并聯(lián)一個(gè)4.7k的上拉電阻,以增強(qiáng)數(shù)據(jù)的抗干擾能力。
三. 控制時(shí)序
1.初始化時(shí)序
與DS18B20所有的通信都是由初始化時(shí)序開(kāi)始的,該時(shí)序包括從主設(shè)備發(fā)出的復(fù)位脈沖及從DS18B20響應(yīng)的存在脈沖組成。 如圖所示。
當(dāng)DS18B20響應(yīng)復(fù)位信號(hào)的存在脈沖后,則其向主設(shè)備表明其在該總線上,并且已經(jīng)做好操作命令。
/*******************************************************************************
* 函 數(shù) 名 : Ds18b20Init
* 函數(shù)功能 : 初始化
* 輸 入 : 無(wú)
* 輸 出 : 初始化成功返回1,失敗返回0
*******************************************************************************/
uchar Ds18b20Init()
{
unsigned char x=0;
DSPORT = 1; //DQ復(fù)位
Delay_DS18B20(8); //稍做延時(shí)
DSPORT = 0; //單片機(jī)將DQ拉低
Delay_DS18B20(80); //精確延時(shí),大于480us
DSPORT = 1; //拉高總線
Delay_DS18B20(14);
x = DSPORT; //稍做
return x;//初始化成功
}
2.讀時(shí)序
寫(xiě)時(shí)段有兩種情況:“寫(xiě)1”時(shí)段和“寫(xiě)0”時(shí)段。 主設(shè)備通過(guò)寫(xiě)1時(shí)段來(lái)向DS18B20中寫(xiě)入邏輯1以及通過(guò)寫(xiě)0時(shí)段來(lái)向DS18B20中寫(xiě)入邏輯0。 每個(gè)寫(xiě)時(shí)段最小必須有60us的持續(xù)時(shí)間且獨(dú)立的寫(xiě)時(shí)段間至少有1us的恢復(fù)時(shí)間。 兩個(gè)寫(xiě)時(shí)段都是由主設(shè)備通過(guò)將1-Wire總線拉低來(lái)進(jìn)行初始化,如圖。
根據(jù)以上讀0及1的時(shí)序,便可實(shí)現(xiàn)讀取一個(gè)完整字節(jié)的函數(shù),如下:
/*******************************************************************************
* 函 數(shù) 名 : Ds18b20ReadByte
* 函數(shù)功能 : 讀取一個(gè)字節(jié)
* 輸 入 : 無(wú)
* 輸 出 : dat
*******************************************************************************/
uchar Ds18b20ReadByte()
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DSPORT = 0; // 給脈沖信號(hào)
dat>>=1;
DSPORT = 1; // 給脈沖信號(hào)
if(DSPORT)
dat|=0x80;
Delay_DS18B20(4);
}
return(dat);
}
3.寫(xiě)時(shí)序
僅在讀時(shí)段期間DS18B20才能向主設(shè)備傳送數(shù)據(jù)。 因此,主設(shè)備在執(zhí)行完讀暫存寄存器[BEh]或讀取供電模式[B4h]后,必須及時(shí)地生成讀時(shí)段,這樣DS18B20才能提供所需的數(shù)據(jù)。 此外,主設(shè)備可以在執(zhí)行完轉(zhuǎn)換溫度[指令:44h]或拷貝EEPROM[指令:B8h]命令后生成讀時(shí)段,以便獲得在“DS18B20功能命令”表中提到的操作信息。 時(shí)序如圖:
根據(jù)以上寫(xiě)0及1的時(shí)序,便可實(shí)現(xiàn)寫(xiě)入一個(gè)完整字節(jié)的函數(shù),如下:
/*******************************************************************************
* 函 數(shù) 名 : Ds18b20WriteByte
* 函數(shù)功能 : 向18B20寫(xiě)入一個(gè)字節(jié)
* 輸 入 : com
* 輸 出 : 無(wú)
*******************************************************************************/
void Ds18b20WriteByte(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DSPORT = 0;
DSPORT = dat&0x01;
Delay_DS18B20(5);
DSPORT = 1;
dat>>=1;
}
}
四. 控制程序
1.讀取溫度流程
要讀取一個(gè)完整的溫度值,需要根據(jù)以上流程進(jìn)行操作。 先對(duì)DS18B20進(jìn)行復(fù)位操作,再發(fā)送開(kāi)始轉(zhuǎn)換指令(指令值:0x44),再發(fā)送復(fù)位操作,等待DS18B20應(yīng)答后,發(fā)送讀取溫度指令,最后就可以讀取16位的數(shù)據(jù)(有限位最大為12位)。
2.讀取溫度程序
/*******************************************************************************
* 函 數(shù) 名 : Ds18b20ChangTemp
* 函數(shù)功能 : 讓18b20開(kāi)始轉(zhuǎn)換溫度
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void Ds18b20ChangTemp()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc); //跳過(guò)ROM操作命令
Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令
// Delay1ms(100); //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個(gè)延時(shí)了
}
/*******************************************************************************
* 函 數(shù) 名 : Ds18b20ReadTempCom
* 函數(shù)功能 : 發(fā)送讀取溫度命令
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void Ds18b20ReadTempCom()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc); //跳過(guò)ROM操作命令
Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令
}
/*******************************************************************************
* 函 數(shù) 名 : Ds18b20ReadTemp
* 函數(shù)功能 : 讀取溫度
* 輸 入 : 無(wú)
* 輸 出 : 溫度值
*******************************************************************************/
int Ds18b20ReadTemp()
{
int temp = 0;
uchar tmh, tml;
Ds18b20ChangTemp(); //先寫(xiě)入轉(zhuǎn)換命令
Ds18b20ReadTempCom(); //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
tml = Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節(jié)
tmh = Ds18b20ReadByte(); //再讀高字節(jié)
temp = tmh;
temp <<= 8;
temp |= tml;
return temp;
}
/*******************************************************************************
* 函 數(shù) 名 : GetTemp
* 函數(shù)功能 : 串口輸出溫度值
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
Void GetTemp(void)
{
int temp;
float tp;
ET0 = 0;
temp = Ds18b20ReadTemp();
ET0 = 1;
if(temp<= 0) //當(dāng)溫度值為負(fù)數(shù)
{
// temp=temp-1;
// temp=~temp;
// tp=temp;
// temp=tp*0.0625*100+0.5;
Uart_SendString("Overrate!\\r\\n"); //超過(guò)量程
}
else
{
tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
//如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
temp=tp*0.0625*100+0.5;
//留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)?a href="http://m.1cnz.cn/v/tag/1743/" target="_blank">C語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
//后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
//算加上0.5,還是在小數(shù)點(diǎn)后面。
}
Uart_SendString("The Current Temperature is: ");
Uart_SendByte((temp% 10000 / 1000) + 0x30);
Uart_SendByte((temp% 1000 / 100) + 0x30);
Uart_SendByte('.');
Uart_SendByte((temp% 100 / 10) + 0x30);
Uart_SendByte((temp% 10) + 0x30);
Uart_SendString("℃\\r\\n");
}
-
電源
+關(guān)注
關(guān)注
184文章
17766瀏覽量
250708 -
傳感器
+關(guān)注
關(guān)注
2551文章
51207瀏覽量
754536 -
DS18B20
+關(guān)注
關(guān)注
10文章
779瀏覽量
80943 -
時(shí)序
+關(guān)注
關(guān)注
5文章
389瀏覽量
37355 -
數(shù)字溫度傳感器
+關(guān)注
關(guān)注
0文章
188瀏覽量
15475
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論