基于stm32f103zet6之DS18B20的學(xué)習(xí)
任何一個DS18B20其內(nèi)部64位ROM用于存儲位移的芯片ID(這就為我們的多點采集提供了極大的方便),我使用3pin封裝的芯片,值得注意的是:DS18B20使用一根數(shù)據(jù)線一根地線也能正常工作,也就是VCC并不是必須的,什么原因呢?因為DS18B20在內(nèi)部有一個寄生電容,當我們的數(shù)據(jù)線的電壓范圍在3.3--5V之間的時候,他會轉(zhuǎn)存為power,所以當我們外部斷電之后,這個power就為IC提供了電源,這很好的起到了一個節(jié)能的作用。。
還有一些其他的特點總結(jié)如下:
--全數(shù)字溫度轉(zhuǎn)換及輸出。
-- 先進的單總線數(shù)據(jù)通信。
--最高12位分辨率,精度可達土0.5攝氏度。
--12位分辨率時的最大工作周期為750毫秒。
--可選擇寄生工作方式。
--檢測溫度范圍為–55°C ~+125°C (–67°F ~+257°F)
--內(nèi)置EEPROM,限溫報警功能。
--64位光刻ROM,內(nèi)置產(chǎn)品序列號,方便多機掛接。
--多樣封裝形式,適應(yīng)不同硬件系統(tǒng)。
一、硬件介紹
1、首先看一看DS13B20的整體框圖
總結(jié)一下我自己對這幾個部分的理解:
1、電源檢測用于檢測是外部提供電源還是使用數(shù)據(jù)線轉(zhuǎn)換的power
2、64為ROM用于讀取芯片ID
3、溫度靈敏元件用于DS18B20中的溫度傳感器可完成對溫度的測量,以12位轉(zhuǎn)化為例:用16位符號擴展的二進制補碼讀數(shù)形式提供,以0.0625℃/LSB形式表達,其中S為符號位
4、接下來就是高低溫觸發(fā)器了,
5、還有配置寄存器,配置寄存器是配置不同的位數(shù)來確定溫度和數(shù)字的轉(zhuǎn)化。配置寄存器的結(jié)構(gòu)格式如下
R1、R2與控制器分辨率關(guān)系如下:
測溫操作 DS18B20的核心功能是它的直接讀數(shù)字的溫度傳感器。溫度傳感器的精度為用戶可編程的9,10,11或12位,分別以0.5℃,0.25℃,0.125℃和0.0625℃增量遞增。在上電狀態(tài)下默認的精度為12位。
所以能夠很清楚的看到轉(zhuǎn)換位數(shù)和轉(zhuǎn)換時間之間的關(guān)系。
溫度寄存器的格式如下:
二、接下來看看如何控制這個芯片
a、協(xié)議:
單總線串行通信協(xié)議,這個與普通的spi協(xié)議有一點點區(qū)別
b、操作流程:一下操作流程是我參照網(wǎng)上的,寫的比較容易理解
1,復(fù)位:首先我們必須對DS18B20芯片進行復(fù)位,復(fù)位就是由控制器(單片機)給DS18B20單總線至少480uS的低電平信號。當18B20接到此復(fù)位信號后則會在15~60uS后回發(fā)一個芯片的存在脈沖。
2,存在脈沖:在復(fù)位電平結(jié)束之后,控制器應(yīng)該將數(shù)據(jù)單總線拉高,以便于在15~60uS后接收存在脈沖,存在脈沖為一個60~240uS的低電平信號。至此,通信雙方已經(jīng)達成了基本的協(xié)議,接下來將會是控制器與18B20間的數(shù)據(jù)通信。如果復(fù)位低電平的時間不足或是單總線的電路斷路都不會接到存在脈沖,在設(shè)計時要注意意外情況的處理。
3,控制器發(fā)送ROM指令:雙方打完了招呼之后最要將進行交流了,ROM指令共有5條,每一個工作周期只能發(fā)一條,ROM指令分別是讀ROM數(shù)據(jù)、指定匹配芯片、跳躍ROM、芯片搜索、報警芯片搜索。ROM指令為8位長度,功能是對片內(nèi)的64位光刻ROM進行操作。其主要目的是為了分辨一條總線上掛接的多個器件并作處理。誠然,單總線上可以同時掛接多個器件,并通過每個器件上所獨有的ID號來區(qū)別,一般只掛接單個18B20芯片時可以跳過ROM指令(注意:此處指的跳過ROM指令并非不發(fā)送ROM指令,而是用特有的一條“跳過指令”)。ROM指令在下文有詳細的介紹。
4,控制器發(fā)送存儲器操作指令:在ROM指令發(fā)送給18B20之后,緊接著(不間斷)就是發(fā)送存儲器操作指令了。操作指令同樣為8位,共6條,存儲器操作指令分別是寫RAM數(shù)據(jù)、讀RAM數(shù)據(jù)、將RAM數(shù)據(jù)復(fù)制到EEPROM、溫度轉(zhuǎn)換、將EEPROM中的報警值復(fù)制到RAM、工作方式切換。存儲器操作指令的功能是命令18B20作什么樣的工作,是芯片控制的關(guān)鍵。
5,執(zhí)行或數(shù)據(jù)讀寫:一個存儲器操作指令結(jié)束后則將進行指令執(zhí)行或數(shù)據(jù)的讀寫,這個操作要視存儲器操作指令而定。如執(zhí)行溫度轉(zhuǎn)換指令則控制器(單片機)必須等待18B20執(zhí)行其指令,一般轉(zhuǎn)換時間為500uS。如執(zhí)行數(shù)據(jù)讀寫指令則需要嚴格遵循18B20的讀寫時序來操作。數(shù)據(jù)的讀寫方法將有下文有詳細介紹。
若要讀出當前的溫度數(shù)據(jù)我們需要執(zhí)行兩次工作周期,第一個周期為復(fù)位、跳過ROM指令、執(zhí)行溫度轉(zhuǎn)換存儲器操作指令、等待500uS溫度轉(zhuǎn)換時間。緊接著執(zhí)行第二個周期為復(fù)位、跳過ROM指令、執(zhí)行讀RAM的存儲器操作指令、讀數(shù)據(jù)(最多為9個字節(jié),中途可停止,只讀簡單溫度值則讀前2個字節(jié)即可)。其它的操作流程也大同小異,在此不多介紹。
除此之外,還有一篇文章或許能夠解決你的一些關(guān)于DS13b20的疑惑,這是我在百度空間轉(zhuǎn)載過來的
http://blog.csdn.net/king_bingge/article/details/8808631好的,如果讀完了這篇文章,那么下面對代碼進行分析也不成問題了
三、代碼分析
1、首先是一段獲取溫度的主代碼
/**************************************************************************************
*名稱:DS18B20_Get_Temp
*功能:從ds18b20得到溫度值,精度:0.1C
*參數(shù):無
*返回值:溫度值(-550~1250)
**************************************************************************************/
shortDS18B20_Get_Temp(void)
{
u8temp;
u8TL,TH;
shorttem;//2bytes
DS18B20_Start();//ds1820startconvert
DS18b20_Reset();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);//skiprom
DS18B20_Write_Byte(0xbe);//convert
TL=DS18B20_Read_Byte();//LSB
TH=DS18B20_Read_Byte();//MSB
if(TH>7)//判斷正負
{
TH=~TH;
TL=~TL;
temp=0;//溫度為負
}elsetemp=1;//溫度為正
tem=TH;//獲得高八位
tem<<=8;
tem+=TL;//獲得低八位
tem=(float)tem*0.625;//轉(zhuǎn)換
if(temp)returntem;//返回溫度值
elsereturn-tem;
}
說道讀取溫度就得看看這個表了
下面的就是一個官方的示例表,說明了我們轉(zhuǎn)換的時候要注意的地方
注意精度上電默認的12位的。那么如何確定精度的呢?我問了我一個學(xué)長,是這樣解釋的,小數(shù)部分是4位,那么最小分辨率就是2的4次方分之一
也就是1/16. = 0.0625
2、開始信號
/**************************************************************************************
*名稱:DS18B20_Start
*功能:開始信號
*參數(shù):無
*返回值:無
**************************************************************************************/
voidDS18B20_Start(void)//ds1820startconvert
{
DS18b20_Reset();
DS18B20_Check();
DS18B20_