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