本文是關(guān)于溫度傳感器的相關(guān)內(nèi)容海渊。
一、 DS18B20數(shù)字溫度傳感器介紹
DS18B20是 DALLAS半導體公司推出的一種“一線總線(單總線)”接口的溫度傳感器星虹。與傳統(tǒng)的熱敏電阻等測溫元件相比驱富,DS18B20是一種新型的、體積小猎拨、使用電壓寬膀藐、與微處理器接口簡單的數(shù)字化溫度傳感器屠阻。
1.1、 DS18B20溫度傳感器的特點
DS18B20溫度傳感器具有如下特點:
1额各、使用電壓范圍更寬国觉,電壓范圍:3.0V ~ 5.5V
,在寄生電源方式下可由數(shù)據(jù)線供電虾啦。
2麻诀、獨特的單線接口方式,DS18B20在與微處理器連接時僅需要一條口線即可實現(xiàn)微處理器與DS18B20的雙向通訊傲醉。
3蝇闭、DS18B20支持多點組網(wǎng)功能,多個DS18B20可以并聯(lián)在唯一的三線上硬毕,實現(xiàn)組網(wǎng)多點測溫呻引。
4、DS18B20在使用中不需要任何外圍元件吐咳,全部傳感器元件及轉(zhuǎn)換電路集成在一只形如三極管的集成電路內(nèi)逻悠。
5、溫度范圍支持-55°C~+125°C
韭脊,在-10 ~ +85°C時精度為±0.5°C童谒。
6、可編程的分辨率為9 ~ 12位沪羔,對應的可分辨溫度分別為0.5°C饥伊、0.25°C、0.125°C和0.0625°C蔫饰,可實現(xiàn)高精度測溫琅豆。
7、在9位分辨率時最多在93.75ms內(nèi)把溫度轉(zhuǎn)換為數(shù)字死嗦,12位分辨率時最多在750ms內(nèi)把溫度值轉(zhuǎn)換為數(shù)字趋距,速度更快。
8越除、測量結(jié)果直接輸出數(shù)字溫度信號节腐,以“一根總線”串行傳送給CPU,同時可傳送CRC校驗碼摘盆,具有極強的抗干擾糾錯能力翼雀。
9、負壓特性:電源極性接反時孩擂,芯片不會因發(fā)熱而燒毀狼渊,但不能正常工作。
1.2、DA18B20內(nèi)部結(jié)構(gòu)
DS18B20外觀實物如下圖所示:
從上圖中可以看出來狈邑,當正對傳感器切面(上圖中間)時圣絮,傳感器的管腳順序從左到右排列:管腳1為GND淑履,管腳2為數(shù)據(jù)DQ振峻,管腳3為VDD忍啸。如果傳感器插反,電源將短路蘸嘶,傳感器會發(fā)燙良瞧,容易損壞。
通常在開發(fā)板上會標出傳感器的凸起處训唱,所以只需要把傳感器凸起的方向?qū)χ_發(fā)板凸起方向插入即可褥蚯。
DS18B20內(nèi)部結(jié)構(gòu)如下圖所示:
- ROM中的64位序列號是出廠前被光刻好的,可以看作是該DS18B20的地址序列號况增。64位光刻ROM的排列是:開始8位(28H)是產(chǎn)品類型標號赞庶,接著的48位是該DS18B20自身的序列號,最后8位是前面56位的循環(huán)冗余校驗碼巡通。光刻ROM的作用是使每一個DS18B20都各不相同尘执,這樣就可以實現(xiàn)一根總線上掛接多個DS18B20。當接多個DS18B20時宴凉,通過64位的序列號可以確定使用的是哪個溫度傳感器。
64位光刻ROM組成如下:
8位CRC | 48位序列號 | 8位類型標號(28H) |
---|
1.3表悬、 DS18B20的溫度轉(zhuǎn)換規(guī)則
DS18B20的核心功能是它可以直接讀出數(shù)字的溫度數(shù)值弥锄。
溫度傳感器的精度是用戶可編程功能的9、10蟆沫、11或12位籽暇,精度分別為0.5、0.25饭庞、0.125戒悠、0.0625,單位°C舟山。
上電狀態(tài)下默認精度是12位绸狐。
DS18B20啟動后保持低功耗等待狀態(tài),當需要執(zhí)行溫度測量和AD轉(zhuǎn)換時累盗,總線控制器必須發(fā)出[44h]命令寒矿。轉(zhuǎn)換完以后,產(chǎn)生的溫度數(shù)據(jù)以兩個字節(jié)的形式被存儲到告訴暫存器的溫度寄存器中若债,DS18B20繼續(xù)保持等待狀態(tài)符相。讀取溫度寄存器中的數(shù)據(jù),再根據(jù)精度就可以得到當前測得的溫度蠢琳。
1.4啊终、 DS18B20的ROM指令表
指令 | 約定代碼 | 功能 |
---|---|---|
讀ROM | 33H | 讀DS18B20溫度傳感器ROM中的編碼镜豹,即64位序列號 |
符合ROM | 55H | 發(fā)出此命令之后,接著發(fā)出64位ROM編碼蓝牲,訪問單總線上與該編碼相對應的DS18B20使之做出響應趟脂,為下一步對DS18B20的讀寫作準備 |
搜索ROM | 0F0H | 用于確定掛接在同一總線上DS18B20的個數(shù)和識別64位ROM地址,為操作各器件做好準備 |
跳過ROM | 0CCH | 忽略64位ROM地址搞旭,直接向DS18B20發(fā)送溫度變換命令散怖,適用于單片機工作 |
告警搜索命令 | 0ECH | 執(zhí)行后只有溫度超過設定值上限或下限才做出響應 |
1.5、 DS18B20的RAM指令表
指令 | 約定代碼 | 功能 |
---|---|---|
溫度變換 | 44H | 啟動DS18B20進行溫度轉(zhuǎn)換肄渗,12位轉(zhuǎn)換時最長為750ms镇眷,結(jié)果存入內(nèi)部9字節(jié)RAM中 |
讀暫存器 | 0BEH | 讀內(nèi)部RAM中9字節(jié)的內(nèi)容 |
寫暫存器 | 4EH | 發(fā)出向內(nèi)部RAM的3、4字節(jié)寫上翎嫡、下限溫度數(shù)據(jù)命令欠动,緊跟該命令之后,是傳送兩字節(jié)的數(shù)據(jù)惑申。 |
復制暫存器 | 48H | 將RAM中第3具伍、4字節(jié)的內(nèi)容復制到EEPROM中 |
重調(diào)EEPROM | 0B8H | 將EEPROM中內(nèi)容恢復到RAM中的第3、4字節(jié) |
讀供電方式 | 0B4H | 讀DS18B20的供電模式圈驼,寄生供電時DS18B20發(fā)送0人芽,外接電源供電DS18B20發(fā)送1 |
1.6、 計算溫度
DS19B20溫度傳感器的內(nèi)部存儲器包括一個高速的暫存器RAM和一個非易失性的可電擦除的EEPROM绩脆,后者存放高溫度和低溫度觸發(fā)器TH萤厅、TL和結(jié)構(gòu)寄存器。
配置寄存器是配置不同的位數(shù)來確定溫度和數(shù)字的轉(zhuǎn)化靴迫,配置寄存器結(jié)構(gòu)如下:
TM | R1 | R0 | 1 | 1 | 1 | 1 | 1 |
---|
低五位是1
惕味。
TM是測試模式位,用于設置DS18B20在工作模式還是在測試模式玉锌。DS18B20出廠時該位被設置為0名挥,用戶不需要去改動。
R1和R0用來設置DS18B20的精度(分辨率)主守,可設置為9禀倔、10、11或12位丸逸,對應的分辨率溫度是0.5°C蹋艺、0.25°C、0.125°C和0.0625°C黄刚。R0和R1配置如下:
R1 | R0 | 精度 | 最大轉(zhuǎn)換時間 | |
---|---|---|---|---|
0 | 0 | 9-bit | 93.75ms | |
0 | 1 | 10-bit | 187.5ms | |
1 | 0 | 11-bit | 375ms | |
1 | 1 | 12-bit | 750ms |
初始狀態(tài)默認精度是12位捎谨,即R1R0=11。
高速暫存存儲器由9個字節(jié)組成,分配如下:
寄存器內(nèi)容 | 字節(jié)地址 |
---|---|
溫度值低位(LS Byte) | 0 |
溫度值高位(MS Byte) | 1 |
高溫限值(TH) | 2 |
低溫限值(TL) | 3 |
配置寄存器 | 4 |
保留 | 5 |
保留 | 6 |
保留 | 7 |
CRC校驗位 | 8 |
當溫度轉(zhuǎn)換命令(44H)發(fā)布后涛救,經(jīng)轉(zhuǎn)換所得的溫度值以二字節(jié)補碼形式存放在高速暫存存儲器的第0和第1個字節(jié)畏邢。存儲的兩個字節(jié),高字節(jié)的前5位是符號S检吆,單片機可通過單線接口讀到該數(shù)據(jù)舒萎,讀取時低位在前,高位在后蹭沛,數(shù)據(jù)格式如下:
寄存器 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
LS Byte | ||||||||
MS Byte | S | S | S | S | S |
如果測得的溫度大于0臂寝,符號位S=0,將測試得到的數(shù)值乘以0.0625(默認精度)即可得到實際溫度摊灭;
如果測得的溫度小于0咆贬,符號位S=1,將測到的數(shù)據(jù)取反加1再乘以0.0625即可得到實際溫度帚呼。
溫度與數(shù)據(jù)對應關(guān)系如下:
溫度°C | 數(shù)據(jù)輸出(二進制) | 數(shù)據(jù)輸出(十六進制) |
---|---|---|
+125 | 0000 0111 1101 0000 | 07D0H |
+85 | 0000 0101 0101 0000 | 0550H |
+25.0625 | 0000 0001 1001 0001 | 0191H |
+10.125 | 0000 0000 1010 0010 | 00A2H |
+0.5 | 0000 0000 0000 1000 | 0008H |
0 | 0000 0000 0000 0000 | 0000H |
-0.5 | 1111 1111 1111 1000 | FFF8H |
-10.125 | 1111 1111 0101 1110 | FF5EH |
-25.0625 | 1111 1110 0110 1111 | FE6EH |
-55 | 1111 1100 1001 0000 | FC90H |
上電復位時溫度寄存器默認值為+85°C掏缎。
比如測試到的數(shù)據(jù)為0x0550,高5位是0表示測試到的溫度是正溫度煤杀,0x0550十進制是1360眷蜈,將1360乘以0.0625等于85就是得到的溫度值,即0x0550對應的是85°C沈自。
1.7酌儒、 讀寫時序
由于DS18B20是單總線器件,所有的單總線器件都要求采用嚴格的信號時序枯途,以保證數(shù)據(jù)的完整性今豆。
DS18B20時序包括:初始化時序、寫(0和1)時序柔袁、讀(0和1)時序。
DS18B20發(fā)送所有的命令和數(shù)據(jù)都是字節(jié)的低位在前异逐。
(1) 初始化時序
單總線上的所有通信都是以初始化序列開始的捶索。
主機輸出低電平,保持低電平時間至少480us(該時間的時間范圍可以從480到960us)灰瞻,以產(chǎn)生復位脈沖腥例。
接著主機釋放總線,外部的上拉電阻將單總線拉高酝润,延時15~60us燎竖,并進入接收模式。
接著DS18B20拉低總線60~240us要销,以產(chǎn)生低電平應答脈沖构回,若為低電平,還要做延時,其延時時間從外部上拉電阻將單總線拉高算起算起最少要480us纤掸。
初始化時序圖如下:
① 數(shù)據(jù)線拉到低電平0脐供;
②延時480us;
③ 數(shù)據(jù)線拉到高電平1借跪;
④ 延時等待80us政己,如果初始化成功則在15~60us內(nèi)產(chǎn)生一個由DS18B20返回的低電平,根據(jù)該狀態(tài)可以確定它存在掏愁;
⑤ 如果CPU讀到了數(shù)據(jù)線上的低電平0后歇由,還要延時,其延時時間從發(fā)出的高電平算起(第③步)的時間算起果港,最少要480us沦泌。
根據(jù)上述時序,可以編寫對應的初始化代碼京腥,如下:
/*************************************************************************
* 函數(shù)名: DS18B20Init
* 函數(shù)功能: DS18B20溫度傳感器初始化
* 輸入: void
* 輸出: 初始化成功返回1赦肃,失敗返回0
**************************************************************************/
uchar DS18B20Init()
{
uchar i;
DSPORT=0; // 數(shù)據(jù)線拉低
i=80;
while(i--); // 延時480us
DSPORT=1; // 數(shù)據(jù)線拉高
i=0;
while(DSPORT)
{
delay1ms(1); // 數(shù)據(jù)線拉高后延時至少480us
i++;
if(i>5)
{
return 1;
}
}
return 0;
}
其中DSPORT
定義如下:
sbit DSPORT = P3^7; // DS18B20的數(shù)據(jù)線連接到P3.7口
(2) 寫時序
寫時序包括寫0時序和寫1時序。
所有寫時序至少需要60us公浪,且在2次獨立的寫時序之間至少需要1us的恢復時間他宛,兩種寫時序均起始于主機拉低總線。
寫1時序:主機輸出低電平欠气,延時2us厅各,然后釋放總線,延時60us预柒。
寫0時序:主機輸出低電平队塘,延時60us,然后釋放總線宜鸯,延時2us憔古。
寫時序圖如下:
① 數(shù)據(jù)線先置低電平0;
② 延時15us淋袖;
③ 按從低位到高位的順序發(fā)送數(shù)據(jù)(一次只發(fā)送一位)鸿市;
④ 延時60us;
⑤ 將數(shù)據(jù)線拉到高電平即碗。
⑥ 重復1~5步驟焰情,直到發(fā)送完整的字節(jié);
⑦ 最后將數(shù)據(jù)線拉高剥懒。
根據(jù)上述時序編寫出DS18B20寫數(shù)據(jù)的代碼内舟,如下:
/*************************************************************************
* 函數(shù)名: DS18B20WriteByte
* 函數(shù)功能: DS18B20按照時序?qū)懸粋€字節(jié)
* 輸入: dat:寫入的數(shù)據(jù)
* 輸出: void
**************************************************************************/
void DS18B20WriteByte(uchar dat)
{
uchar i, j;
j=0;
for(i=0;i<8;i++)
{
DSPORT=0; // 數(shù)據(jù)線拉低
j++; // 延時15us
j++;
DSPORT=dat&0x01;
j=10; // 延時60us
while(j--);
DSPORT=1;
dat=dat>>1;
}
}
(3) 讀時序
單總線器件僅在主機發(fā)出讀時序時,才向主機傳輸數(shù)據(jù)初橘,所以充岛,在主機發(fā)出讀數(shù)據(jù)命令后批狱,必須馬上產(chǎn)生讀時序,以便從機能夠傳輸數(shù)據(jù)炒俱。
所有讀時序至少需要60us,且在2次讀時序之間至少需要1us的恢復時間权悟。
每個讀時序都由主機發(fā)起,至少拉低總線1us推盛。主機在讀時序期間必須釋放總線峦阁,并且在時序起始后的15us內(nèi)采樣總線狀態(tài)。
讀時序圖如下:
① 將數(shù)據(jù)線拉低0耘成;
② 延時1us榔昔;
③ 將數(shù)據(jù)線拉高1,釋放總線準備讀數(shù)據(jù)瘪菌;
④ 延時10us撒会;
⑤ 讀數(shù)據(jù)線的狀態(tài)得到1個狀態(tài)位,并進行數(shù)據(jù)處理师妙;
⑥ 延時45us诵肛;
⑦ 重復1~6步驟,直到讀完一個字節(jié)默穴。
根據(jù)上述時序可以編寫DS18B20讀數(shù)據(jù)的時序怔檩,如下:
/*************************************************************************
* 函數(shù)名: DS18B20ReadByte
* 函數(shù)功能: DS18B20按照時序讀一個字節(jié)
* 輸入: void
* 輸出: 返回讀取到的一個字節(jié)的數(shù)據(jù)
**************************************************************************/
uchar DS18B20ReadByte()
{
uchar i, j;
uchar bi, dat;
j=0;
dat=0;
for(i=0;i<8;i++)
{
DSPORT=0; // 數(shù)據(jù)線拉低
j++; // 延時1us
DSPORT=1;
j++; // 延時10us
j++;
bi=DSPORT;
dat= (dat>>1)|(bi<<7);
j=7;
while(j--);
}
return dat;
}
(4) DS18B20讀取溫度
根據(jù)ROM指令表,當總線上只有一個DS18B20時蓄诽,首先發(fā)送CCH指令薛训,然后發(fā)送RAM溫度轉(zhuǎn)換指令44H,
那么如果總線上只掛接了一個DS18B20仑氛,那么DS18B20典型溫度讀取過程為:復位→發(fā)SKIP ROM命令(0xCC)→發(fā)開始轉(zhuǎn)換命令(0x44)→延時→復位→發(fā)送SKIP ROM命令(0xCC)→發(fā)讀存儲器命令(0xBE)→連續(xù)讀出兩個字節(jié)數(shù)據(jù)(即溫度)→結(jié)束许蓖。
二、DS18B20使用示例
本示例實現(xiàn)的功能為:系統(tǒng)運行時调衰,插上DS18B20溫度傳感器,數(shù)碼管顯示檢測的溫度值自阱。用到的資源包括數(shù)碼管和DS18B20嚎莉,proteus設計如下:
根據(jù)上面介紹的時序及讀溫度流程,DS18B20讀取溫度代碼如下:
// DS18B20轉(zhuǎn)換溫度沛豌,復位->發(fā)送0xcc跳過ROM命令->發(fā)送0x44溫度轉(zhuǎn)換命令
void DS18B20ChangeTemp()
{
DS18B20Init();
delay1ms(1);
DS18B20WriteByte(0xcc); // 發(fā)送0xcc命令
DS18B20WriteByte(0x44); // 發(fā)送0x44命令
}
// DS18B20發(fā)送讀取溫度命令趋箩,復位->發(fā)送0xcc跳過ROM命令->發(fā)送0xBE讀存儲器命令
void DS18B20ReadTempCom()
{
DS18B20Init();
delay1ms(1);
DS18B20WriteByte(0xcc); // 發(fā)送0xcc命令
DS18B20WriteByte(0xBE); // 發(fā)送0xBE命令
}
// DS18B20讀取檢測到的溫度赃额,溫度轉(zhuǎn)換->發(fā)送讀溫度命令->讀取數(shù)據(jù)
int DS18B20ReadTemp()
{
int temp;
uchar tmH, tmL;
DS18B20ChangeTemp();
DS18B20ReadTempCom();
tmL=DS18B20ReadByte();
tmH=DS18B20ReadByte();
temp=tmH;
temp = (temp<<8)|tmL;
return temp;
}
主函數(shù)main.c
如下:
/*
實現(xiàn)功能:使用DS18B20溫度傳感器檢測當前溫度,并將結(jié)果顯示到數(shù)碼管中
[2023-12-25] zoya
*/
#include <reg52.h>
#include "TempDS18B20.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define GPIO_LED P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smg[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
u8 display[6];
// 延時函數(shù)
void delay(u16 i)
{
while(i--);
}
// 數(shù)碼管顯示函數(shù)
void DigDisplay()
{
u8 i;
for(i=0;i<6;i++)
{
switch(i)
{
case 0: LSA=1; LSB=1; LSC=1; break; // Y7
case 1: LSA=0; LSB=1; LSC=1; break; // Y6
case 2: LSA=1; LSB=0; LSC=1; break; // Y5
case 3: LSA=0; LSB=0; LSC=1; break; // Y4
case 4: LSA=1; LSB=1; LSC=0; break; // Y3
case 5: LSA=0; LSB=1; LSC=0; break; // Y2
case 6: LSA=1; LSB=0; LSC=0; break; // Y1
case 7: LSA=0; LSB=0; LSC=0; break; // Y0
}
GPIO_LED=display[i];
delay(500);
GPIO_LED=0x00;
}
}
// 溫度處理函數(shù)
void TempPros(int temp)
{
float tp;
if(temp<0)
{
display[0]=0x40; // -
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
}
else
{
display[0]=0x00;
tp=temp;
temp=tp*0.0625*100+0.5;
}
display[1]=smg[temp%10000/1000];
display[2]=smg[temp%1000/100]|0x80; // |0x80顯示小數(shù)點
display[3]=smg[temp%100/10];
display[4]=smg[temp%10/1];
display[5]=0x39;
}
void main()
{
while(1)
{
TempPros(DS18B20ReadTemp());
DigDisplay();
}
}
仿真結(jié)果叫确,DS18B20默認溫度是85°跳芳,所以系統(tǒng)初始運行時顯示85度飞盆。