国产精品久久久久久久久免费,高潮迭起av乳颜射后入,国产对白老熟女正在播放,国产精品igao视频网网址,丰满人妻熟妇乱又伦精品

機電之家資源網(wǎng)
單片機首頁|單片機基礎|單片機應用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
一種快速查詢多點DS18B20溫度的方法
一種快速查詢多點DS18B20溫度的方法
 更新時間:2009-12-23 16:52:21  點擊數(shù):0
【字體: 字體顏色

引言
    為了滿足實時性要求較高系統(tǒng)的設計需求,針對串聯(lián)多個器件在一線制總線上的結構導致的在查詢多點溫度時速度緩慢的問題,北京銘正同創(chuàng)科技有限公司提出了一種快速查詢多點溫度的解決方案。本方案以Dallas公司開發(fā)的一線制數(shù)字溫度傳感器DS18B20為核心,通過采用每個并行端口上連接一個DS18B20器件,實現(xiàn)同時對多個DS18B20進行同步操作的方法。本方案可廣泛應用于各種工業(yè)控制、儀器儀表產品中。
關鍵字快速多點溫度查詢 工業(yè)控制 儀器儀表 銘正同創(chuàng)

1 技術概述
    Dallas公司開發(fā)的一線制數(shù)字溫度傳感器DS18B20是一款性能優(yōu)異的數(shù)字式傳感器,廣泛應用于各種工業(yè)控制、儀器儀表產品當中。DS18B20與傳統(tǒng)的熱敏電阻溫度傳感器相比,能夠直接讀出被測溫度,并且根據(jù)實際要求通過簡單的編程可設置9~12位的分辨率,可以在750ms內將溫度轉化為12位的數(shù)字量,具有多種可選的封裝方式。因而使用DS18B20可使系統(tǒng)結構更加簡單,可靠性更高。DS18B20器件具體的封裝形式如下圖所示:

GND 接地
DQ 一線制總線(輸入/輸出)
VD 供電電源而DS18B20的一線制總線獨特而經(jīng)濟的特點,使用戶可輕松地組建傳感器網(wǎng)絡,為測量系統(tǒng)的

在一線制總線上串接多個DS18B20器件時,實現(xiàn)對其中一個DS18B20器件進行一次溫度轉換和讀取操作主要包括以下13個步驟(所有的操作都是通過DQ線進行信號傳輸?shù)模?BR>1 主機MCU發(fā)復位脈沖
2 DS18B20發(fā)應答脈沖(即MCU接收該應答信號,以確認器件在總線上)
3 主機發(fā)匹配ROM命令
4 主機發(fā)64位器件序列號(器件序列號與總線上的某個DS18B20器件一一對應)
5 主機發(fā)溫度轉換指令
6 總線保持高電平50ms
7 主機發(fā)復位命令
8 DS18B20發(fā)應答脈沖
9 主機發(fā)匹配ROM命令
10 主機發(fā)64位器件代碼
11 主機發(fā)讀數(shù)據(jù)寄存器指令
12 主機接收數(shù)據(jù)
13 主機發(fā)復位脈沖
參考DS18B20的數(shù)據(jù)手冊可知,當DS18B20的精度設置為12位精度表示時,依據(jù)上面的步驟完成對一個器件的測溫、讀取溫度值的過程,大概會消耗掉1秒鐘的時間。而如果總線上存在8個DS18B20器件的話,完成一次8個器件的查詢需要8秒的時間,這不還沒計算在系統(tǒng)初始化時,對總線上的器件序列號進行初始化過程所消耗的時間。
針對所述利用多個DS18B20器件串接在一線制總線上進行多點溫度查詢時速度慢的原因,做進一步分析如下。
DS18B20器件在進行一線制總線操作時,僅有一根DQ線用于雙向的數(shù)據(jù)傳輸,每一個操作最小的細分至每一個的讀寫過程,即一個位的讀寫操作為一線制總線操作的最小單位,可以參考DS18B20的手冊,了解到每一次最小單位的總線操作利用了規(guī)定時間內MCU驅動DQ線的高低電平來決定讀/寫的操作,然后在其后的規(guī)定時間內完成讀/寫一個位數(shù)據(jù)的操作。這樣,就決定了每一次操作的過程中,要傳輸?shù)臄?shù)據(jù)位數(shù)越多,每一次的操作耗時越長。而DS18B20的一線制總線的操作對時序的要求很嚴格,一般在設計MCU對其總線操作的程序時,都是利用延時去保證每個讀寫周期的時間準確性,即說明這些時間內CPU必然是閑置的。如下圖示意了一個寫0和1操作的時序:

另外,在多個器件串接在一線制總線上時,為了區(qū)分每次操作是針對總線上哪一個器件,DS18B20器件在內部提供了每個器件獨有的64位ROM序列號,也就是說每一次操作都要首先在對DS18B20器件的ROM序列號進行匹配后,方可對其中的某一個器件進行測溫/讀取溫度值的操作?梢怨浪愠,每一次序列號的匹配操作,差不多需要4ms的時間,完成一次完整的測溫/讀取溫度值操作,就需要進行兩次序列號匹配,即消耗掉大概8個ms的時間。
多個器件串接在總線上時,對所有的器件的查詢操作,需要一個一個來,完成一次全部器件的查詢需要成倍的操作時間,整個系統(tǒng)把大量時間消耗在時序所要求的延時上。
此外,當采用多個器件串接在一線制總線的系統(tǒng)時,還需要在系統(tǒng)的初始化其間花銷較長的時間來進行煩瑣的總線上器件的序列號查詢,并以此獲知總線上的每個器件的序列號。
如前所述,可以總結出,影響查詢多點DS18B20溫度速度的最主要因素有如下幾個:
1.每次操作都需要附加兩次對64位序列號的匹配過程;
2.多個器件串接,完成全部的查詢就需要與器件個數(shù)成倍增長的耗時。

這樣的應用在一些對實時性要求相對較高的系統(tǒng)當中,是非常占用資源的(雖然省掉了端口資源,但CPU不得不等待N長時間后方可獲取多點的溫度值),所以使用起來總會有些遺憾。下面,介紹一種快速查詢多點DS18B20溫度的方法,包括硬件的連線構成以及軟件的編程思路。
2 解決方案
由于一般都會將對DS18B20器件的溫度查詢放置在中斷當中實現(xiàn)或者是在程序的主循環(huán)當中采用定時查詢的方法實現(xiàn),所以這就要求每次對DS18B20的操作都能快速的完成,盡快退出來進行其它的處理。所以為了解決串聯(lián)多個器件在一線制總線上的結構導致的在查詢多點溫度時速度緩慢的問題,本設計提出一種解決方案,具體說是通過修改硬件連接來實現(xiàn)方便快捷的查詢多點DS18B20器件溫度的方法。
2.1 快速查詢多點DS18B20溫度的方法簡述
當一線制總線上僅有一個DS18B20器件時,可以用skip ROM操作(即跳過ROM匹配)命令來代替64位序列號的匹配過程,這點也是使用單個DS18B20器件的系統(tǒng)常用的方法。所以,要想節(jié)省掉64位序列號匹配的時間開銷,就必需設計成一個一線制總線上僅有一個DS18B20器件的系統(tǒng)。
DS18B20的一線制總線在時序上的嚴格要求,也從另一方面意味著在一定的彈性范圍內,不同DS18B20器件的時序細節(jié)上的一致性應該是非常好,所以可以將系統(tǒng)設計成利用MCU的并行端口同時對多個DS18B20進行統(tǒng)一的操作,不過這時候并行端口上的每一個端口連接著一個DS18B20器件而已。
本文所述的解決方案正是以端口的消耗為代價,換取對多點DS18B20溫度查詢的速度,并在程序結構的設計上采用一些巧妙的處理方法,使得系統(tǒng)對DS18B20的操作上花更少的時間。此外,采用本設計實現(xiàn)的快速多點溫度查詢系統(tǒng),可以省掉煩瑣的總線上器件序列號的查詢操作,并可節(jié)省大量的存儲空間(原用于存儲總線上器件的序列號所用的空間)。
從理論上分析,本設計方案的采用,查詢多個DS18B20器件操作所消耗的時間與查詢一個DS18B20器件操作所消耗的時間是等量的。
下面以查詢8個DS18B20器件為例詳細分析此方法的設計思想。
2.2 系統(tǒng)硬件連接
本系統(tǒng)方案8個DS18B20器件連接在MCU的一組端口的8個I/O口上,連線示意圖如下所示:

當然,上圖中的示意圖并沒有考慮諸如端口驅動能力、抗干擾處理等,僅表明一個邏輯的連接示意,具體在產品級的設計時會根據(jù)產品的應用做必要的處理,比如增加一些必要的電路等,此處不作為討論的重點。
從上圖可見,每個端口連接有一個DS18B20器件,也即一條一線制總線上僅有一個DS18B20器件,符合了前面所述的解決方法。實際在對DS18B20器件進行操作時,只需統(tǒng)一地對這一組并行端口進行操作(每個端口在同一時間輸出相同的電平狀態(tài))即可。
一個端口對應一個DS18B20器件,也就表示每組端口的某一個位的讀回數(shù)據(jù)狀態(tài)也就是該端口所對應的器件的輸出狀態(tài),所以,這樣的系統(tǒng)里面是不需要進行每個器件的序列號搜索、匹配的操作的?芍,在對DS18B20器件進行操作時,可以使用skip ROM命令來跳過ROM序列號匹配的操作,也即在所有的DS18B20器件的ROM操作時可以使用相同的端口輸出時序。
2.3 軟件設計思路
總結前面所介紹的電路示意圖,下面詳細介紹程序設計思想。
在接下來的軟件介紹中,會以C語言的例子介紹具體的編程思路,但這些代碼并非就是實際中所使用的代碼,僅作為邏輯性的參考,以便大家理解。這些代碼是從一個產品的應用當中摘出的,而程序設計的結構也是從具體的設計當中分解出來的,供大家參考。
軟件設計從最底層的與DS18B20時序相關的驅動,到與一線制總線器件處理過程控制/協(xié)議的接口函數(shù),再上升到應用API接口函數(shù)的關系如下圖所示:

在對連在一組8位端口上的8個DS18B20操作時,是同時對該組端口進行操作,也即同時對8個DS18B20器件進行同步的操作。
范例程序是根據(jù)筆者的項目當中的功能需求而設計的,不一定會適合所有人的使用方法,但程序設計思想是可以參考的,這點請使用者在參考本文時對這里的范例進行一定的取舍。下面詳細介紹一個以MCS51系列單片機的應用為例的范例程序,其中約定與8個DS18B20器件進行連接的是P1端口。
2.3.1 底層時序驅動
底層時序驅動程序與DS18B20的一線制總線的協(xié)議保持一致,根據(jù)一線制總線時序的特點,設計了四個基本的函數(shù):
總線寫1時序控制函數(shù):
void DS18B20_Write_1(void)
{
P1 = 0x00; //8個DQ 線全部設置為低電平
Delay_1us(10); //延時10us左右
P1 = 0xff; //8個DQ線全部輸出高電平
Delay_1us(30); //延時30us左右
}
總線寫0時序控制函數(shù):
void DS18B20_Write_0(void)
{
P1 = 0x00; //8個DQ 線全部設置為低電平
Delay_1us(40); //延時
P1 = 0xff; //端口恢復高電平
Delay_1us(1);
}
總線讀取一個數(shù)據(jù)位時序控制函數(shù):
unsigned char DS18B20_ReadDQ(void)
{
unsigned char DQ_S=0;
P1 = 0x00; //8個DQ 線全部設置為低電平
Delay_1us(10);
P1 = 0xff; //端口置1,準備讀取
Delay_1us(1); //延時待總線準備好數(shù)據(jù)
DQ_S = P1; //一次性讀取8條DQ線的數(shù)據(jù)狀態(tài)
P1 = 0xff; //恢復端口電平
Delay_1us(30); //延時
return DQ_S; //返回讀取的值
}
在讀取一個總線狀態(tài)數(shù)據(jù)位的函數(shù)中,將會返回一個byte的數(shù)據(jù),該數(shù)據(jù)的8個位正好與連接在P2端口上的8個I/O口對應,如下圖所示:

總線復位時序控制函數(shù):
void DS18B20_Reset(void)
{
unsigned char Error_Counter=0;
P1 = 0x00; //8個DQ 線全部設置為低電平
Delay_1us(500); //保持總線低電平500us
P1 = 0xff;
Delay_1us(100);
if(P1!=0x00) B20_Error = P1;//如檢測到DS18B20總線響應了回復信號,則讀取當前8條
//總線的狀態(tài)
Delay_1us(50);
P1 = 0xff;
for(Error_Counter=0;Error_Counter<200;Error_Counter++)
{
if((P1&(~B20_Error))==(~B20_Error)) break; //如檢測到總線的回復信號結
//束,則退出循環(huán)
Delay_1us(1);
}
P1 = 0xff; //恢復端口電平
Delay_1us(200); //延時 200us~~~
}
在復位時序控制的函數(shù)中,使用了B20_Error全局變量,它將會傳遞給上一層的數(shù)據(jù)處理函數(shù)作為判斷當前8個I/O口所接的DS18B20是否正常工作,或者是否在各自的總線上。
2.3.2 操作協(xié)議相關的函數(shù)
分析DS18B20的一線制總線控制命令,可以提煉出兩個最基本的操作函數(shù),一個是寫一個byte數(shù)據(jù)至DS18B20器件,另一為讀取DS18B20器件的數(shù)據(jù)。而在本文的范例程序當中,僅僅為了提取DS18B20器件的轉換完后的溫度值,所以在讀取DS18B20的數(shù)據(jù)時,僅讀取存放在數(shù)據(jù)地址前兩個字節(jié)的溫度數(shù)據(jù),而不讀取其它字節(jié)的數(shù)據(jù),包括CRC校驗值也沒有進行讀取,供參考。
寫字節(jié)操作函數(shù):
void DS18B20_WriteByte(unsigned char Com)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(Com&0x01)
DS18B20_Write_1();
else
DS18B20_Write_0();
Com = Com>>1;
}
}
調用DS18B20_WriteByte函數(shù),連在8個I/O口上的一線制總線上的8個DS18B20器件,將都會接收到同樣的一個字節(jié)的數(shù)據(jù):Com。
讀數(shù)據(jù)操作函數(shù):
unsigned char Read_buf_8ch[16]; //buffer of Read DS18B20
void DS18B20_Read2Byte(void)
{
unsigned int i;
for(i=0;i<16;i++)
{
Read_buf_8ch = DS18B20_ReadDQ();
}
}
前面已經(jīng)介紹過了,在本范例中,只讀取位到DS18B20內部數(shù)據(jù)區(qū)域的前兩節(jié)字的溫度值數(shù)據(jù),所以數(shù)據(jù)讀取函數(shù)設計成讀取兩個字節(jié)的函數(shù),即需要連續(xù)讀取16個位(對應于每一個DS18B20器件來說是連續(xù)的16個位)。而將讀回的數(shù)據(jù)保存于一個Read_buf_8ch(簡寫:Rb)的數(shù)組中,可以根據(jù)系統(tǒng)的接線圖對讀回的16個字節(jié)的數(shù)據(jù)進行分析,如下圖所示:

讀取DS18B20的數(shù)據(jù)時,先讀高位再讀低位;所以可以從上圖看到,以TM2的DS18B20的數(shù)據(jù)為例,TM2的兩個字節(jié)的數(shù)據(jù)由Read_buf_8ch數(shù)組的16個字節(jié)數(shù)據(jù)中的每個字節(jié)的bit2位組成。可知,完成一次數(shù)據(jù)讀取的操作后,可以同時讀回8個DS18B20器件的數(shù)據(jù),在數(shù)據(jù)處理時,只需針對上圖的數(shù)據(jù)結構對Read_buf_8ch數(shù)組的數(shù)據(jù)進行處理即可得到每個DS18B20器件的測溫值。
2.3.3 API功能函數(shù):
供上層應用程序直接調用的函數(shù)相對來說,是與系統(tǒng)的具體硬件接法沒有太多的關系,只需要依照DS18B20器件的操作流程進行操作即可。在此,提供兩個API的范例,分別是啟動溫度轉換控制函數(shù)和讀取溫度值函數(shù)。
啟動溫度轉換控制函數(shù):
void DS18B20_Conver(void)
{
DS18B20_Reset();
DS18B20_WriteByte(0xcc); //Skip ROM
DS18B20_WriteByte(0x44); //啟動測溫
}
讀取溫度值函數(shù):
void DS18B20_ReadTemp(void)
{
DS18B20_Reset();
DS18B20_WriteByte(0xcc); //Skip ROM
DS18B20_WriteByte(0xbe); //送入讀取數(shù)據(jù)命令
DS18B20_Read2Byte();
}
調用讀取溫度值函數(shù)后,8個DS18B20器件的測溫數(shù)據(jù)將保存在數(shù)組Read_buf_8ch的16個字節(jié)單元當中,還有待進行下一步的處理,方可得到對應每個DS18B20器件的測溫值。下面介紹簡單的處理代碼片斷:
char i,j;
unsigned int uiData[8];
unsigned char Mask;
//OS the resoult of Temperature
for(i=15;i>=0;i--)
{
Mask = 0x01;
for(j=0;j<8;j++)
{
uiData[j] = uiData[j]<<1;
if(Read_buf_8ch&Mask) uiData[j]++;
Mask = Mask<<1;
}
}
經(jīng)過上述簡單的處理,8個DS18B20器件的測溫數(shù)據(jù)將保存在數(shù)組uiData當中的8個單元里,就可以根據(jù)自身程序設計的需求來對這些數(shù)據(jù)進行具體的處理了。

3 結語
本文介紹的快速查詢多點DS18B20溫度的設計方案,解決了串聯(lián)多個器件在一線制總線上的結構導致的在查詢多點溫度時速度緩慢的問題,基本的設計思想是:將系統(tǒng)設計為在每個并行端口上連接一個DS18B20器件,利用MCU的并行端口同時對多個DS18B20進行統(tǒng)一的操作,實現(xiàn)操作多個DS18B20器件的時間等同于操作單個DS18B20器件的時間。本設計思想,可以大大減少在查詢多個DS18B20測溫值的時間開銷,滿足了實時性要求較高的系統(tǒng)的設計需求;同時,也省掉了煩瑣的總線上多個器件序列號搜索的代碼的步驟,并且節(jié)省了用于存儲這些器件的序列號的存儲單元,使得利用DS18B20進行多點測溫的操作變得更方便、容易。
雖然本文介紹的方法是以犧牲端口資源為代價,但具體在進行系統(tǒng)設計時,也可以通過一些擴展端口、串轉并端口、多路模擬開關等硬件電路設計來彌補這些端口資源的消耗,也可通過這些硬件電路來擴展更多的DS18B20器件(如果有必要的話)。
本文所介紹的方法已經(jīng)在筆者參與設計的大型恒溫系統(tǒng)當中應用,目前系統(tǒng)運行穩(wěn)定、可靠

  • 上一篇: 嵌入式Linux操作系統(tǒng)學習規(guī)劃
  • 下一篇: 沒有了
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網(wǎng)友評論:(只顯示最新5條。)
    關于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1