久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

51單片機DS18B20溫度測量

作者:劉山   來源:本站原創   點擊數:  更新時間:2013年11月13日   【字體:

    大家好,通過以前的學習,我們已經對51單片機綜合學習系統的使用方法及學習方式有所了解與熟悉,學會了步進電機控制的基本知識,體會到了綜合學習系統的易用性與易學性,這一期我們將一起學習數字溫度傳感器DS18B20的基本原理與使用方法。
      先看一下我們將要使用的51單片機綜合學習系統能完成哪些實驗與產品開發工作:分別有流水燈,數碼管顯示,液晶顯示,按鍵開關,蜂鳴器奏樂,繼電器控制,IIC總線,SPI總線,PS/2實驗,AD模數轉換,光耦實驗,串口通信,紅外線遙控,無線遙控,溫度傳感,步進電機控制等等。
     單總線溫度傳感器DS18B20簡介
     DS18B20是DALLAS公司生產的單總線式數字溫度傳感器,它具有微型化、低功耗、高性能、搞干擾能力強、易配處理器等優點,特別適用于構成多點溫度測控系統,可直接將溫度轉化成串行數字信號(提供9位二進制數字)給單片機處理,且在同一總線上可以掛接多個傳感器芯片。它具有3引腳TO-92小體積封裝形式,溫度測量范圍為-55℃~+125℃,可編程為9位~12位A/D轉換精度,測溫分辨率可達0.0625℃,被測溫度用符號擴展的16位數字量方式串行輸出,其工作電源既可在遠端引入,也可采用寄生電源方式產生,多個DS18B20可以并聯到3根或2根線上,CPU只需一根端口線就能與多個DS18B20通信,占用微處理器的端口較少,可節省大量的引線和邏輯電路。以上特點使DS18B20非常適用于遠距離多點溫度檢測系統。
    DS18B20外形及引腳說明
    在TO-92和SO-8的封裝中引腳有所不同,具體差別請查閱PDF手冊,在TO-92封裝中引腳分配如下:
    1(GND):地
    2(DQ):單線運用的數據輸入輸出引腳
    3(VDD):可選的電源引腳
    DS18B20工作過程及時序
    DS18B20內部的低溫度系數振蕩器是一個振蕩頻率隨溫度變化很小的振蕩器,為計數器1提供一頻率穩定的計數脈沖。
    高溫度系數振蕩器是一個振蕩頻率對溫度很敏感的振蕩器,為計數器2提供一個頻率隨溫度變化的計數脈沖。
    初始時,溫度寄存器被預置成-55℃,每當計數器1從預置數開始減計數到0時,溫度寄存器中寄存的溫度值就增加1℃,這個過程重復進行,直到計數器2計數到0時便停止。
    初始時,計數器1預置的是與-55℃相對應的一個預置值。以后計數器1每一個循環的預置數都由斜率累加器提供。為了補償振蕩器溫度特性的非線性性,斜率累加器提供的預置數也隨溫度相應變化。計數器1的預置數也就是在給定溫度處使溫度寄存器寄存值增加1℃計數器所需要的計數個數。
    DS18B20內部的比較器以四舍五入的量化方式確定溫度寄存器的最低有效位。在計數器2停止計數后,比較器將計數器1中的計數剩余值轉換為溫度值后與0.25℃進行比較,若低于0.25℃,溫度寄存器的最低位就置0;若高于0.25℃,最低位就置1;若高于0.75℃時,溫度寄存器的最低位就進位然后置0。這樣,經過比較后所得的溫度寄存器的值就是最終讀取的溫度值了,其最后位代表0.5℃,四舍五入最大量化誤差為±1/2LSB,即0.25℃。
    溫度寄存器中的溫度值以9位數據格式表示,最高位為符號位,其余8位以二進制補碼形式表示溫度值。測溫結束時,這9位數據轉存到暫存存儲器的前兩個字節中,符號位占用第一字節,8位溫度數據占據第二字節。
    DS18B20測量溫度時使用特有的溫度測量技術。DS18B20內部的低溫度系數振蕩器能產生穩定的頻率信號;同樣的,高溫度系數振蕩器則將被測溫度轉換成頻率信號。當計數門打開時,DS18B20進行計數,計數門開通時間由高溫度系數振蕩器決定。芯片內部還有斜率累加器,可對頻率的非線性度加以補償。測量結果存入溫度寄存器中。一般情況下的溫度值應該為9位,但因符號位擴展成高8位,所以最后以16位補碼形式讀出。
    DS18B20工作過程一般遵循以下協議:初始化——ROM操作命令——存儲器操作命令——處理數據
    ① 初始化
    單總線上的所有處理均從初始化序列開始。初始化序列包括總線主機發出一復位脈沖,接著由從屬器件送出存在脈沖。存在脈沖讓總線控制器知道DS1820 在總線上且已準備好操作。
   ② ROM操作命令
    一旦總線主機檢測到從屬器件的存在,它便可以發出器件ROM操作命令之一。所有ROM操作命令均為8位長。這些命令列表如下:
Read ROM(讀ROM)[33h]
    此命令允許總線主機讀DS18B20的8位產品系列編碼,唯一的48位序列號,以及8位的CRC。此命令只能在總線上僅有一個DS18B20的情況下可以使用。如果總線上存在多于一個的從屬器件,那么當所有從片企圖同時發送時將發生數據沖突的現象(漏極開路會產生線與的結果)。
    Match ROM( 符合ROM)[55h]
    此命令后繼以64位的ROM數據序列,允許總線主機對多點總線上特定的DS18B20尋址。只有與64位ROM序列嚴格相符的DS18B20才能對后繼的存貯器操作命令作出響應。所有與64位ROM序列不符的從片將等待復位脈沖。此命令在總線上有單個或多個器件的情況下均可使用。
    Skip ROM( 跳過ROM )[CCh]
    在單點總線系統中,此命令通過允許總線主機不提供64位ROM編碼而訪問存儲器操作來節省時間。如果在總線上存在多于一個的從屬器件而且在Skip ROM命令之后發出讀命令,那么由于多個從片同時發送數據,會在總線上發生數據沖突(漏極開路下拉會產生線與的效果)。
    Search ROM( 搜索ROM)[F0h]
    當系統開始工作時,總線主機可能不知道單線總線上的器件個數或者不知道其64位ROM編碼。搜索ROM命令允許總線控制器用排除法識別總線上的所有從機的64位編碼。
    Alarm Search(告警搜索)[ECh]
    此命令的流程與搜索ROM命令相同。但是,僅在最近一次溫度測量出現告警的情況下,DS18B20才對此命令作出響應。告警的條件定義為溫度高于TH 或低于TL。只要DS18B20一上電,告警條件就保持在設置狀態,直到另一次溫度測量顯示出非告警值或者改變TH或TL的設置,使得測量值再一次位于允許的范圍之內。貯存在EEPROM內的觸發器值用于告警。
    ③ 存儲器操作命令
    Write Scratchpad(寫暫存存儲器)[4Eh]
    這個命令向DS18B20的暫存器中寫入數據,開始位置在地址2。接下來寫入的兩個字節將被存到暫存器中的地址位置2和3?梢栽谌魏螘r刻發出復位命令來中止寫入。
    Read Scratchpad(讀暫存存儲器)[BEh]
    這個命令讀取暫存器的內容。讀取將從字節0開始,一直進行下去,直到第9(字節8,CRC)字節讀完。如果不想讀完所有字節,控制器可以在任何時間發出復位命令來中止讀取。
    Copy Scratchpad(復制暫存存儲器)[48h]
    這條命令把暫存器的內容拷貝到DS18B20的E2存儲器里,即把溫度報警觸發字節存入非易失性存儲器里。如果總線控制器在這條命令之后跟著發出讀時間隙,而DS18B20又正在忙于把暫存器拷貝到E2存儲器,DS18B20就會輸出一個“0”,如果拷貝結束的話,DS18B20 則輸出“1”。如果使用寄生電源,總線控制器必須在這條命令發出后立即起動強上拉并最少保持10ms。
    Convert T(溫度變換)[44h]
    這條命令啟動一次溫度轉換而無需其他數據。溫度轉換命令被執行,而后DS18B20保持等待狀態。如果總線控制器在這條命令之后跟著發出讀時間隙,而DS18B20又忙于做時間轉換的話,DS18B20將在總線上輸出“0”,若溫度轉換完成,則輸出“1”。如果使用寄生電源,總線控制器必須在發出這條命令后立即起動強上拉,并保持500ms。
    Recall E2(重新調整E2)[B8h]
    這條命令把貯存在E2中溫度觸發器的值重新調至暫存存儲器。這種重新調出的操作在對DS18B20上電時也自動發生,因此只要器件一上電,暫存存儲器內就有了有效的數據。在這條命令發出之后,對于所發出的第一個讀數據時間片,器件會輸出溫度轉換忙的標識:“0”=忙,“1”=準備就緒。
    Read Power Supply(讀電源)[B4h]
    對于在此命令發送至DS18B20之后所發出的第一讀數據的時間片,器件都會給出其電源方式的信號:“0”=寄生電源供電,“1”=外部電源供電。
    ④ 處理數據
    DS18B20的高速暫存存儲器由9個字節組成,其分配如圖3所示。當溫度轉換命令發布后,經轉換所得的溫度值以二字節補碼形式存放在高速暫存存儲器的第0和第1個字節。單片機可通過單線接口讀到該數據,讀取時低位在前,高位在后。
    DS18B20溫度數據表
    上表是DS18B20溫度采集轉化后得到的12位數據,存儲在DS18B20的兩個8比特的RAM中,二進制中的前面5位是符號位,如果測得的溫度大于或等于0,這5位為0,只要將測到的數值乘于0.0625即可得到實際溫度;如果溫度小于0,這5位為1,測到的數值需要取反加1再乘于0.0625即可得到實際溫度。
    溫度轉換計算方法舉例:
    例如當DS18B20采集到+125℃的實際溫度后,輸出為07D0H,則:
    實際溫度=07D0H╳0.0625=2000╳0.0625=1250C。
    例如當DS18B20采集到-55℃的實際溫度后,輸出為FC90H,則應先將11位數據位取反加1得370H(符號位不變,也不作為計算),則:
    實際溫度=370H╳0.0625=880╳0.0625=550C。
    DS18B20軟、硬件設計
    本實例介紹DS18B20與單片機之間的軟、硬件接口,通過單片機來讀取DS18B20的溫度值,并將溫度值通過數碼管顯示出來。在實驗中先要將功能選擇開關調到DS18B20位置上。
/***************************************************************************/
/*DS18B20演示程序 */
/*目標器件:AT89S51 */
/*晶振:11.0592MHZ */
/*編譯環境:Keil 7.50A */
/***************************************************************************/
/*********************************包含頭文件********************************/
#include <reg51.h>
/*******************************共陽LED段碼表*******************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/*********************************端口定義**********************************/
sbit DQ=P3^3; //數據傳輸線接單片機的相應的引腳
/*********************************定義全局變量******************************/
unsigned char tempL=0; //臨時變量低位
unsigned char tempH=0; //臨時變量高位
float temperature; //溫度值
/****************************************************************************
函數功能:延時子程序
入口參數:k
出口參數:
/****************************************************************************/
void delay(unsigned int k)
{
unsigned int n;
n=0;
while(n < k)
{n++;}
return;
}
/****************************************************************************
函數功能:數碼管掃描延時子程序
入口參數:
出口參數:
***************************************************************************/
void delay1(void)
{
int k;
for(k=0;k<400;k++);
}
/****************************************************************************
函數功能:數碼管顯示子程序
入口參數:k
出口參數:
/****************************************************************************/
void display(int k)
{
P2=0xfe;
P0=tab[k/1000];
delay1();
P2=0xfd;
P0=tab[k%1000/100];
delay1();
P2=0xfb;
P0=tab[k%100/10];
delay1();
P2=0xf7;
P0=tab[k%10];
delay1();
P2=0xff;
}
/****************************************************************************
函數功能:DS18B20初始化子程序
入口參數:
出口參數:
/****************************************************************************/
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ先置高
delay(8); //延時
DQ=0; //發送復位脈沖
delay(85); //延時(>480ms)
DQ=1; //拉高數據線
delay(14); //等待(15~60ms)
}
/****************************************************************************
函數功能:向DS18B20讀一字節數據
入口參數:
出口參數:dat
/****************************************************************************/
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
/****************************************************************************
函數功能:向DS18B20寫一字節數據
入口參數:dat
出口參數:
****************************************************************************/
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
/****************************************************************************
函數功能:向DS18B20讀溫度值
入口參數:
出口參數:temperature
****************************************************************************/
ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳過讀序列號的操作
WriteOneChar(0x44); //啟動溫度轉換
delay(125); //轉換需要一點時間,延時
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳過讀序列號的操作
WriteOneChar(0xbe); //讀溫度寄存器(頭兩個值分別為溫度的低位和高位)
tempL=ReadOneChar(); //讀出溫度的低位LSB
tempH=ReadOneChar(); //讀出溫度的高位MSB
//溫度轉換,把高低位做相應的運算轉化為實際溫度
temperature=((tempH*256)+tempL)*0.0625;
delay(200);
return(temperature);
}
/****************************************************************************
函數功能:主程序
入口參數:
出口參數:
****************************************************************************/
void main()
{
float i;
while(1)
{
i=ReadTemperature();
display(i);
}
}
相信看到這里,你應該可以理解DS18B20數字溫度傳感器的原理是怎么樣的了,你也可以根據自己的需要來寫一下溫度探測及相關控制的程序。由于篇幅有限,讀者朋友可以通過網站或電子郵件一起交流與學習

關閉窗口

相關文章

主站蜘蛛池模板: a毛片 | 激情a| 久久久亚洲一区 | 亚州精品天堂中文字幕 | 精品1区 | 国产精品视频在线播放 | 欧美日韩免费 | 日韩高清一区 | 亚洲一区| 免费国产一区二区视频 | 天天草夜夜骑 | 成人妇女免费播放久久久 | 色资源在线 | 性天堂网| 在线 丝袜 欧美 日韩 制服 | 毛片免费看| 狠狠骚 | 看片一区 | 久久久精品一区二区三区 | 欧美视频在线看 | 91精品国产综合久久婷婷香蕉 | 国产精久久久久久久妇剪断 | 综合天天久久 | 久久国| 精品国产一区二区三区日日嗨 | 久久99久久99久久 | 日本三级电影在线免费观看 | 中日韩欧美一级片 | 欧美日韩在线一区二区三区 | 成人在线中文字幕 | 日韩在线欧美 | 黄色国产 | 亚洲性视频在线 | 奇米影视首页 | 欧美男人天堂 | 国产精品国产成人国产三级 | 99国内精品久久久久久久 | 亚洲精品国产一区 | 久久久久久久成人 | 成人精品免费视频 | 久久精彩 |