本次實驗我們在了解溫度傳感器的工作原理里同時可以初步了解如何下那個上位機發送數據并顯示出來。 DS18B20是一款常用的高精度的單總線數字溫度測量芯片。具有體積小,硬件開銷低,抗干擾能力強,精度高的特點
傳感器參數:
測溫范圍為-55℃到+125℃,在-10℃到+85℃范圍內誤差為±0.4°。返回16位二進制溫度數值。
主機和從機通信使用單總線,即使用單線進行數據的發送和接收
在使用中不需要任何外圍元件,獨立芯片即可完成工作。
掉電保護功能 DS18B20 內部含有 EEPROM ,通過配置寄存器可以設定數字轉換精度和報警溫度,在系統掉電以后,它仍可保存分辨率及報警溫度的設定值。
每個DS18B20都有獨立唯一的64位-ID,此特性決定了它可以將任意多的DS18b20掛載到一根總線上,通過ROM搜索讀取相應DS18B20的溫度值
寬電壓供電,電壓2.5V~5.5V
DS18B20返回的16位二進制數代表此刻探測的溫度值,其高五位代表正負。如果高五位全部為1,則代表返回的溫度值為負值。如果高五位全部為0,則代表返回的溫度值為正值。后面的11位數據代表溫度的絕對值,將其轉換為十進制數值之后,再乘以0.0625即可獲得此時的溫度值。
傳感器引腳及原理圖
DS18B20傳感器的引腳及封裝圖如下:
DS18B20一共有三個引腳,分別是:
GND:電源地線 DQ:數字信號輸入/輸出端。 VDD:外接供電電源輸入端。
單個DS18B20接線方式: VDD接到電源,DQ接單片機引腳,同時外加上拉電阻,GND接地
注意這個上拉電阻是必須的,就是DQ引腳必須要一個上拉電阻
總結:
開漏輸出只能輸出低電平,不能輸出高電平。漏極開路輸出高電平時必須在輸出端與正電源(VCC)間外接一個上拉電阻。否則只能輸出高阻態。
DS18B20 是單線通信,即接收和發送都是這個通信腳進行的。 其接收數據時為高電阻輸入,其發送數據時是開漏輸出,本身不具有輸出高電平的能力,即輸出0時通過MOS下拉為低電平,而輸出1時,則為高阻,需要外接上拉電阻將其拉為高電平。 因此,需要外接上拉電阻,否則無法輸出1。
外接上拉電阻阻值:
DS18B20的工作電流約為1mA,VCC一般為5V,則電阻R=5V/1mA=5KΩ,
所以正常選擇4.7K電阻,或者相近的電阻值。
DS18B20寄生電源
DSl8B20的另一個特點是不需要再外部供電下即可工作。當總線高電平時能量由單線上拉電阻經過DQ引腳獲得。高電平同時充電一個內部電容,當總線低電平時由此電容供應能量。這種供電方法被稱為“寄生電源”。另外一種選擇是DSl8B20由接在VDD的外部電源供電
DS18B20內部構成
主要由以下3部分組成: 64 位ROM,高速暫存器,存儲器
64 位ROM存儲獨有的序列號
ROM中的64位序列號是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼,每個DS18B20的64位序列號均不相同。這樣就可以實現一根總線上掛接多個DS18B20的目的。
高速暫存器包含:
溫度傳感器
一個字節的溫度上限和溫度下限報警觸發器(TH和TL)
配置寄存器允許用戶設定9位,10位,11位和12位的溫度分辨率,分別對應著溫度的分辨率為:0.5°C,0.25°C,0.125°C,0.0625°C,默認為12位分辨率,
存儲器:由一個高速的RAM和一個可擦除的EEPROM組成,EEPROM存儲高溫和低溫觸發器(TH和TL)以及配置寄存器的值,(就是存儲低溫和高溫報警值以及溫度分辨率)
DS18B20高速緩存器
高速暫存器由9個字節組成
字節0~1 是溫度存儲器,用來存儲轉換好的溫度。第0個字節存儲溫度低8位,第一個字節存儲溫度高8位
字節2~3 是用戶用來設置最高報警和最低報警值(TH和TL)。
字節4 是配置寄存器,用來配置轉換精度,可以設置為9~12 位。
字節5~7 保留位。芯片內部使用
字節8 CRC校驗位。是64位ROM中的前56位編碼的校驗碼。由CRC發生器產生。
DS18B20溫度讀取與計算
DS18B20采用16位補碼的形式來存儲溫度數據,溫度是攝氏度。當溫度轉換命令發布后,經轉換所得的溫度值以二字節補碼形式存放在高速暫存存儲器的第0和第1個字節。
高字節的五個S為符號位,溫度為正值時S=1,溫度為負值時S=0
剩下的11位為溫度數據位,對于12位分辨率,所有位全部有效,對于11位分辨率,位0(bit0)無定義,對于10位分辨率,位0和位1無定義,對于9位分辨率,位0,位1,和位2無定義
對應的溫度計算:
當五個符號位S=0時,溫度為正值,直接將后面的11位二進制轉換為十進制,再乘以0.0625(12位分辨率),就可以得到溫度值;
當五個符號位S=1時,溫度為負值,先將后面的11位二進制補碼變為原碼(符號位不變,數值位取反后加1),再計算十進制值。再乘以0.0625(12位分辨率),就可以得到溫度值;
例如:
+125℃的數字輸出07D0(00000111 11010000)
轉換成10進制是2000,對應攝氏度:0.0625x2000=125°C
-55℃的數字輸出為 FC90。
首先取反,然后+1,轉換成原碼為:11111011 01101111
數值位轉換成10進制是870,對應攝氏度:-0.0625x870=-55°C
代碼:
unsigned int Templ,Temp2,Temperature; //Templ低八位,Temp2高八位
unsigned char Minus Flag=0; //負溫度標志位
if(Tenp2&0xFC)//判斷符號位是否為1
{
Minus Flag=l; //負溫度標志位置1
Temperature=((Temp2<<8)|Temp1); //高八位第八位進行整合
Temperature=((Temperature)+1); //講補碼轉換為原碼,求反,補1
Temperature*=0.0625;//求出十進制
}
else //溫度為正值
{
Minus Flag=0; //負溫度標志位置0
Temperature =((Temp2<<8) |Temp1)*0.0625;
}
配置寄存器
在配置寄存器中,我們可以通過R0和R1設置DS18B20的轉換分辨率,DS18B20在上電后默認R0=1和R1=1(12分辨率),寄存器中的第7位和第0位到4位保留給設備內部使用。
單總線系統
在每個DS18B20內部都有一個唯一的64位長的序列號,這個序列號值就存在DS18B20內部的ROM中。開始的8位是產品類型編碼(DS18B20是10H),接著的48位是每個器件唯一的序號,最后的8位是CRC校驗碼。
一線總線系統使用單總線主控來控制一個或多個從機設備。每個DS18B20都有獨立唯一的64位-ID,此特性決定了它可以將任意多的DS18b20掛載到一根總線上,通過ROM搜索讀取相應DS18B20的溫度值。
DS18B20工作步驟
DS18B20的工作步驟可以分為三步:
1.初始化DS18B20
2.執行ROM指令
3.執行DS18B20功能指令
其中第二步執行ROM指令,也就是訪問每個DS18B20,搜索64位序列號,讀取匹配的序列號值,然后匹配對應的DS18B20,如果我們僅僅使用單個DS18B20,可以直接跳過ROM指令。而跳過ROM指令的字節是0xCC。
1.初始化DS18B20
任何器件想要使用,首先就是需要初始化,對于DS18B20單總線設備,首先初始化單總線為高電平,然后總線開始也需要檢測這條總線上是否存在DS18B20這個器件。如果這條總線上存在DS18B20,總線會根據時序要求返回一個低電平脈沖,如果不存在的話,也就不會返回脈沖,即總線保持為高電平。
初始化具體時序步驟如下:
1.單片機拉低總線至少480us,產生復位脈沖,然后釋放總線(拉高電平)。
2.這時DS8B20檢測到請求之后,會拉低信號,大約60~240us表示應答。
3.DS8B20拉低電平的60~240us之間,單片機讀取總線的電平,如果是低電平,那么表示初始化成功
4.DS18B20拉低電平60~240us之后,會釋放總線。
代碼如下:
/*****初始化DS18B20*****/
unsigned int Init_DS18B20(void)
{
unsigned int x=0;
DQ = 1; //DQ復位
delay(4); //稍做延時
DQ = 0; //單片機將DQ拉低
delay(60); //精確延時,大于480us
DQ = 1; //拉高總線
delay(8);
x = DQ; //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗
delay(4);
return x;
}
2.寫時序
總線控制器通過控制單總線高低電平持續時間從而把邏輯1或0寫DS18B20中。每次只傳輸1位數據
單片機想要給DS18B20寫入一個0時,需要將單片機引腳拉低,保持低電平時間要在60~120us之間,然后釋放總線;單片機想要給DS18B20寫入一個1時,需要將單片機引腳拉低,拉低時間需要大于1us,然后在15us內拉高總線。
在寫時序起始后15μs到60μs期間,DS18B20處于采樣單總線電平狀態。如果在此期間總線為高電平,則向DS18B20寫入1;如果總線為低電平,則向DSl8B20寫入0。
注意:2次寫周期之間至少間隔1us
/*****寫一個字節*****/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01; //與1按位與運算,dat最低位為1時DQ總線為1,dat最低位為0時DQ總線為0
delay(4);
DQ = 1;
dat>>=1;
}
delay(4);
}
DS18B20寫入的功能命令:
ROM指令:
采用多個DS18B20時,需要寫ROM指令來控制總線上的某個DS18B20
如果是單個DS18B20,直接寫跳過ROM指令0xCC即可
RAM指令,DS18B20的一些功能指令
常用的是:
溫度轉換 0x44
開啟溫度讀取轉換,讀取好的溫度會存儲在高速暫存器的第0個和第一個字節中
讀取溫度 0xBE
讀取高速暫存器存儲的數據
讀時序:讀時隙由主機拉低總線電平至少1μs然后再釋放總線,讀取DS18B20發送過來的1或者0
DS18B20在檢測到總線被拉低1微秒后,便開始送出數據,若是要送出0就把總線拉為低電平直到讀周期結束。若要送出1則釋放總線為高電平。
注意:所有讀時隙必須至少需要60us,且在兩次獨立的時隙之間至少需要1ps的恢復時間
同時注意:主機只有在發送讀暫存器命令(0xBE)或讀電源類型命令(0xB4)后,立即生成讀時隙指令,DS18B20才能向主機傳送數據。 也就是先發讀取指令,再發送讀時隙
最后一點: 寫時序注意是先寫命令的低字節,比如寫入跳過ROM指令0xCC(11001100),寫的順序是“零、零、壹、壹、零、零、壹、壹”,
讀時序時是先讀低字節,在讀高字節,也就是先讀取高速暫存器的第0個字節(溫度的低8位),在讀取高速暫存器的第1個字節(溫度的高8位) 我們正常使用DS18B20讀取溫度讀取兩個溫度字節即
全部資料51hei下載地址:
讀溫度值串口ds18b20.7z
(60 KB, 下載次數: 124)
2021-7-18 21:15 上傳
點擊文件名下載附件
|