1、DS18B20多點測溫方案概述
DS18B20 單線數字溫度傳感器,多個 DS18B20 可以并聯在惟一的單線上,實現多點測溫。具體方案主要是以下步驟:
- 寫一個獲取DS18B20的64位序列號的keil工程,獲取需要連接的DS18B20器件的序列號。
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器件的序列號通過數組保存起來,再新建一個獲取多點溫度的keil工程,發送匹配64位序列號,獲取溫度即可。
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; //用于循環
ds18b20_init();
ds18b20_write_byte(0x55); //發送匹配ROM命令
if(a==1)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom1[j]);//發送18B20的序列號,先發送低字節
}
}
if(a==2)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom2[j]);//發送18B20的序列號,先發送低字節
}
}
if(a==3)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom3[j]);//發送18B20的序列號,先發送低字節
}
}
if(a==4)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom4[j]);//發送18B20的序列號,先發送低字節
}
}
if(a==5)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom5[j]);//發送18B20的序列號,先發送低字節
}
}
if(a==6)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom6[j]);//發送18B20的序列號,先發送低字節
}
}
if(a==7)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom7[j]);//發送18B20的序列號,先發送低字節
}
}
if(a==8)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom8[j]);//發送18B20的序列號,先發送低字節
}
}
if(a==9)
{
for(j=0;j< 8;j++)
{
ds18b20_write_byte(rom9[j]);//發送18B20的序列號,先發送低字節
}
}
}
int16_t read_temp(uint8_t rom) //啟動溫度轉換,讀取溫度
{
u8 tl=0,th=0;
if(ds18b20_init())
return 0x7fff;
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0x44);//啟動DS18B20進行溫度轉換
DS18B20_Matrom(rom);//匹配RAM,適用多個點的情況
ds18b20_write_byte(0xBE);//讀DS18B20內部RAM中9字節的溫度數據
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簡介
2.1、DS18B20特點
- 采用單總線的接口方式
- 測量溫度范圍寬,測量精度高 DS18B20 的測量范圍為 -55 ℃
+ 125 ℃ ; 在 -10+85°C范圍內,精度為 ± 0.5°C 。 - 供電方式靈活 DS18B20可以通過內部寄生電路從數據線上獲取電源。因此,當數據線上的時序滿足一定的要求時,可以不接外部電源,從而使系統結構更趨簡單,可靠性更高。
- 測量參數可配置 DS18B20 的測量分辨率可通過程序設定 9~12 位。
- 負壓特性電源極性接反時,溫度計不會因發熱而燒毀,但不能正常工作。
- 掉電保護功能 DS18B20 內部含有 EEPROM,在系統掉電以后,它仍可保存分辨率及報警溫度的設定值。
- DS18B20具有體積更小、適用電壓更寬、更經濟、可選更小的封裝方式,更寬的電壓適用范圍,適合于構建自己的經濟的測溫系統,因此也就被設計者們所青睞。
2.2、總線掛接多個DS18B20的具體原因
DS18B20主要由4部分組成:
- 64 位ROM
- 溫度傳感器
- 非揮發的溫度報警觸發器TH和TL
- 配置寄存器
ROM中的64位序列號是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼,每個DS18B20的64位序列號均不相同。64位ROM的排的循環冗余校驗碼(CRC=X^8+X^5+X^4+1)。
ROM
ROM的作用是使每一個DS18B20都各不相同,這樣就可以實現一根總線上掛接多個DS18B20的目的。
2.3、多個DS18B20的供電方式
在DS18B20溫度轉換期間通過寄生電源供電
寄生電源供電
用外部電源對DS18B20供電
外部電源供電
3、DS18B20工作時序詳解
主要以下四個方面:
- 初始化時序
- 寫時序
- 讀時序
- 獲取溫度
詳細解析如下。
3.1、初始化時序
初始化時序
主機首先發出一個480-960微秒的低電平脈沖,然后釋放總線變為高電平,并在隨后的480微秒時間內對總線進行檢測,如果有低電平出現說明總線上有器件已做出應答。若無低電平出現一直都是高電平說明總線上無器件應答。
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在一上電后就一直在檢測總線上是否有480-960微秒的低電平出現,如果有,在總線轉為高電平后等待15-60微秒后將總線電平拉低60-240微秒做出響應存在脈沖,告訴主機本器件已做好準備。若沒有檢測到就一直在檢測等待。
3.2、讀/寫時序
讀寫時序
寫周期最少為60微秒,最長不超過120微秒。寫周期一開始做為主機先把總線拉低1微秒表示寫周期開始。隨后若主機想寫0,則繼續拉低電平最少60微秒直至寫周期結束,然后釋放總線為高電平。若主機想寫1,在一開始拉低總線電平1微秒后就釋放總線為高電平,一直到寫周期結束。而做為從機的DS18B20則在檢測到總線被拉底后等待15微秒然后從15us到45us開始對總線采樣,在采樣期內總線為高電平則為1,若采樣期內總線為低電平則為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;
}
}
對于讀數據操作時序也分為讀0時序和讀1時序兩個過程。讀時隙是從主機把單總線拉低之后,在1微秒之后就得釋放單總線為高電平,以讓DS18B20把數據傳輸到單總線上。DS18B20在檢測到總線被拉低1微秒后,便開始送出數據,若是要送出0就把總線拉為低電平直到讀周期結束。若要送出1則釋放總線為高電平。主機在一開始拉低總線1微秒后釋放總線,然后在包括前面的拉低總線電平1微秒在內的15微秒時間內完成對總線進行采樣檢測,采樣期內總線為低電平則確認為0。采樣期內總線為高電平則確認為1。完成一個讀時序過程,至少需要60us才能完成
static uint8_t ds18b20_read_byte()
{
uint8_t i;
uint8_t byte; //byte為要接收到的數據
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;
}
-
傳感器
+關注
關注
2548文章
50740瀏覽量
752138 -
DS18B20
+關注
關注
10文章
778瀏覽量
80716 -
數字溫度傳感器
+關注
關注
0文章
184瀏覽量
15444 -
多點測溫
+關注
關注
0文章
7瀏覽量
6315
發布評論請先 登錄
相關推薦
評論