1、DS18B20多點(diǎn)測(cè)溫方案概述
DS18B20 單線數(shù)字溫度傳感器,多個(gè) DS18B20 可以并聯(lián)在惟一的單線上,實(shí)現(xiàn)多點(diǎn)測(cè)溫。具體方案主要是以下步驟:
- 寫一個(gè)獲取DS18B20的64位序列號(hào)的keil工程,獲取需要連接的DS18B20器件的序列號(hào)。
uint8_t rom[8];
void read_rom(void)
{
uint8_t index;
ds18b20_init();
ds18b20_write_byte(0x33);
for (index = 0;index < 8;index++)
{
rom[index] = ds18b20_read_byte();
}
}
- 將獲取到的DS18B20器件的序列號(hào)通過(guò)數(shù)組保存起來(lái),再新建一個(gè)獲取多點(diǎn)溫度的keil工程,發(fā)送匹配64位序列號(hào),獲取溫度即可。
uint8_t rom1[8]={0x28,0x0B,0xAC,0x79,0x97,0x16,0x03,0x39};
uint8_t rom2[8]={0x28,0xF2,0x80,0x79,0x97,0x15,0x03,0x51};
uint8_t rom3[8]={0x28,0xFF,0x64,0x79,0x97,0x16,0x03,0x8B};
uint8_t rom4[8]={0x28,0x6F,0x31,0x79,0x97,0x15,0x03,0x28};
uint8_t rom5[8]={0x28,0x1C,0x5C,0x79,0x97,0x15,0x03,0x14};
uint8_t rom6[8]={0x28,0xED,0xD8,0x79,0x97,0x16,0x03,0xD0};
uint8_t rom7[8]={0x28,0x94,0xB0,0x79,0x97,0x15,0x03,0xA4};
uint8_t rom8[8]={0x28,0xAE,0xD5,0x79,0x97,0x16,0x03,0x10};
uint8_t rom9[8]={0x28,0xC0,0xC2,0x79,0x97,0x16,0x03,0xED};
void DS18B20_Matrom(unsigned char a)
{
unsigned char j; //用于循環(huán)
ds18b20_init();
ds18b20_write_byte(0x55); //發(fā)送匹配ROM命令
if(a==1)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom1[j]);//發(fā)送18B20的序列號(hào),先發(fā)送低字節(jié)
}
}
if(a==2)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom2[j]);//發(fā)送18B20的序列號(hào),先發(fā)送低字節(jié)
}
}
if(a==3)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom3[j]);//發(fā)送18B20的序列號(hào),先發(fā)送低字節(jié)
}
}
if(a==4)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom4[j]);//發(fā)送18B20的序列號(hào),先發(fā)送低字節(jié)
}
}
if(a==5)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom5[j]);//發(fā)送18B20的序列號(hào),先發(fā)送低字節(jié)
}
}
if(a==6)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom6[j]);//發(fā)送18B20的序列號(hào),先發(fā)送低字節(jié)
}
}
if(a==7)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom7[j]);//發(fā)送18B20的序列號(hào),先發(fā)送低字節(jié)
}
}
if(a==8)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom8[j]);//發(fā)送18B20的序列號(hào),先發(fā)送低字節(jié)
}
}
if(a==9)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom9[j]);//發(fā)送18B20的序列號(hào),先發(fā)送低字節(jié)
}
}
}
int16_t read_temp(uint8_t rom) //啟動(dòng)溫度轉(zhuǎn)換,讀取溫度
{
u8 tl=0,th=0;
if(ds18b20_init())
return 0x7fff;
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0x44);//啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換
DS18B20_Matrom(rom);//匹配RAM,適用多個(gè)點(diǎn)的情況
ds18b20_write_byte(0xBE);//讀DS18B20內(nèi)部RAM中9字節(jié)的溫度數(shù)據(jù)
tl=ds18b20_read_byte();//讀低8位
th=ds18b20_read_byte();//讀高8位
return (th< 8)+tl;
}
float get_ntemp(uint8_t rom)
{
float temp=0;
temp = read_temp(rom);
temp = temp*0.0625;
return temp;
}
2、DS18B20簡(jiǎn)介
2.1、DS18B20特點(diǎn)
- 采用單總線的接口方式
- 測(cè)量溫度范圍寬,測(cè)量精度高 DS18B20 的測(cè)量范圍為 -55 ℃
+ 125 ℃ ; 在 -10+85°C范圍內(nèi),精度為 ± 0.5°C 。 - 供電方式靈活 DS18B20可以通過(guò)內(nèi)部寄生電路從數(shù)據(jù)線上獲取電源。因此,當(dāng)數(shù)據(jù)線上的時(shí)序滿足一定的要求時(shí),可以不接外部電源,從而使系統(tǒng)結(jié)構(gòu)更趨簡(jiǎn)單,可靠性更高。
- 測(cè)量參數(shù)可配置 DS18B20 的測(cè)量分辨率可通過(guò)程序設(shè)定 9~12 位。
- 負(fù)壓特性電源極性接反時(shí),溫度計(jì)不會(huì)因發(fā)熱而燒毀,但不能正常工作。
- 掉電保護(hù)功能 DS18B20 內(nèi)部含有 EEPROM,在系統(tǒng)掉電以后,它仍可保存分辨率及報(bào)警溫度的設(shè)定值。
- DS18B20具有體積更小、適用電壓更寬、更經(jīng)濟(jì)、可選更小的封裝方式,更寬的電壓適用范圍,適合于構(gòu)建自己的經(jīng)濟(jì)的測(cè)溫系統(tǒng),因此也就被設(shè)計(jì)者們所青睞。
2.2、總線掛接多個(gè)DS18B20的具體原因
DS18B20主要由4部分組成:
- 64 位ROM
- 溫度傳感器
- 非揮發(fā)的溫度報(bào)警觸發(fā)器TH和TL
- 配置寄存器
ROM中的64位序列號(hào)是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼,每個(gè)DS18B20的64位序列號(hào)均不相同。64位ROM的排的循環(huán)冗余校驗(yàn)碼(CRC=X^8+X^5+X^4+1)。
ROM
ROM的作用是使每一個(gè)DS18B20都各不相同,這樣就可以實(shí)現(xiàn)一根總線上掛接多個(gè)DS18B20的目的。
2.3、多個(gè)DS18B20的供電方式
在DS18B20溫度轉(zhuǎn)換期間通過(guò)寄生電源供電
寄生電源供電
用外部電源對(duì)DS18B20供電
外部電源供電
3、DS18B20工作時(shí)序詳解
主要以下四個(gè)方面:
- 初始化時(shí)序
- 寫時(shí)序
- 讀時(shí)序
- 獲取溫度
詳細(xì)解析如下。
3.1、初始化時(shí)序
初始化時(shí)序
主機(jī)首先發(fā)出一個(gè)480-960微秒的低電平脈沖,然后釋放總線變?yōu)楦唠娖剑⒃陔S后的480微秒時(shí)間內(nèi)對(duì)總線進(jìn)行檢測(cè),如果有低電平出現(xiàn)說(shuō)明總線上有器件已做出應(yīng)答。若無(wú)低電平出現(xiàn)一直都是高電平說(shuō)明總線上無(wú)器件應(yīng)答。
uint8_t ds18b20_init(void)
{
uint8_t ack=1;
DS18B20_DQ_OUT();
DQ_L();
delay_us(500);
DQ_H();
delay_us(60);
DS18B20_DQ_IN();
ack=DQ_Read();
delay_us(180);
DQ_H();
return ack;
}
做為從器件的DS18B20在一上電后就一直在檢測(cè)總線上是否有480-960微秒的低電平出現(xiàn),如果有,在總線轉(zhuǎn)為高電平后等待15-60微秒后將總線電平拉低60-240微秒做出響應(yīng)存在脈沖,告訴主機(jī)本器件已做好準(zhǔn)備。若沒(méi)有檢測(cè)到就一直在檢測(cè)等待。
3.2、讀/寫時(shí)序
讀寫時(shí)序
寫周期最少為60微秒,最長(zhǎng)不超過(guò)120微秒。寫周期一開(kāi)始做為主機(jī)先把總線拉低1微秒表示寫周期開(kāi)始。隨后若主機(jī)想寫0,則繼續(xù)拉低電平最少60微秒直至寫周期結(jié)束,然后釋放總線為高電平。若主機(jī)想寫1,在一開(kāi)始拉低總線電平1微秒后就釋放總線為高電平,一直到寫周期結(jié)束。而做為從機(jī)的DS18B20則在檢測(cè)到總線被拉底后等待15微秒然后從15us到45us開(kāi)始對(duì)總線采樣,在采樣期內(nèi)總線為高電平則為1,若采樣期內(nèi)總線為低電平則為0。
static void ds18b20_write_byte(uint8_t byte)
{
uint8_t i;
DS18B20_DQ_OUT();
for(i=0 ; i< 8 ; i++)
{
if (byte&0x01)
{
DQ_L();// Write 1
delay_us(2);
DQ_H();
delay_us(60);
}
else
{
DQ_L();// Write 0
delay_us(60);
DQ_H();
delay_us(2);
}
byte=byte >>1;
}
}
對(duì)于讀數(shù)據(jù)操作時(shí)序也分為讀0時(shí)序和讀1時(shí)序兩個(gè)過(guò)程。讀時(shí)隙是從主機(jī)把單總線拉低之后,在1微秒之后就得釋放單總線為高電平,以讓DS18B20把數(shù)據(jù)傳輸?shù)絾慰偩€上。DS18B20在檢測(cè)到總線被拉低1微秒后,便開(kāi)始送出數(shù)據(jù),若是要送出0就把總線拉為低電平直到讀周期結(jié)束。若要送出1則釋放總線為高電平。主機(jī)在一開(kāi)始拉低總線1微秒后釋放總線,然后在包括前面的拉低總線電平1微秒在內(nèi)的15微秒時(shí)間內(nèi)完成對(duì)總線進(jìn)行采樣檢測(cè),采樣期內(nèi)總線為低電平則確認(rèn)為0。采樣期內(nèi)總線為高電平則確認(rèn)為1。完成一個(gè)讀時(shí)序過(guò)程,至少需要60us才能完成
static uint8_t ds18b20_read_byte()
{
uint8_t i;
uint8_t byte; //byte為要接收到的數(shù)據(jù)
for(i=0 ; i< 8 ; i++)
{
DS18B20_DQ_OUT();
DQ_L();
delay_us(2);
DQ_H();
DS18B20_DQ_IN();
delay_us(12);
byte > >= 1;
if(DQ_Read())
byte |= 0x80;
delay_us(50);
}
return byte;
}
-
傳感器
+關(guān)注
關(guān)注
2565文章
52995瀏覽量
767373 -
DS18B20
+關(guān)注
關(guān)注
10文章
782瀏覽量
82187 -
數(shù)字溫度傳感器
+關(guān)注
關(guān)注
0文章
196瀏覽量
15749 -
多點(diǎn)測(cè)溫
+關(guān)注
關(guān)注
0文章
7瀏覽量
6387
發(fā)布評(píng)論請(qǐng)先 登錄
基于DS18B20和LabVIEW的多點(diǎn)溫度測(cè)量系統(tǒng)
DS18B20測(cè)溫系統(tǒng)設(shè)計(jì)
我用PROTUS仿真ds18b20多點(diǎn)測(cè)溫,但是LCD1602沒(méi)有顯示,是怎么回事???
用DS18B20實(shí)現(xiàn)多點(diǎn)測(cè)溫
DS18B20多點(diǎn)測(cè)溫方法探討
DS18B20的特點(diǎn)是什么
一種新型多點(diǎn)測(cè)溫系統(tǒng)的設(shè)計(jì)(基于DS18B20設(shè)計(jì)的多點(diǎn)測(cè)溫

基于DS18B20測(cè)溫系統(tǒng)設(shè)計(jì)

DS18B20構(gòu)成測(cè)溫系統(tǒng)
ds18b20測(cè)溫程序詳解

評(píng)論