<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

EEPW首頁(yè) > 安全與國防 > 設計應用 > 1-Wire總線(xiàn)與DS18B20應用仿真(圖)

1-Wire總線(xiàn)與DS18B20應用仿真(圖)

作者: 時(shí)間:2008-07-16 來(lái)源:網(wǎng)絡(luò ) 收藏

  作為一種單主機多從機的,在一條1-Wire總線(xiàn)上可掛接的從數量幾乎不受限制。為了不引起邏輯上的沖突,所有從的1-Wire都是漏極開(kāi)路的,因此在使用時(shí)必須對總線(xiàn)外加上拉電阻(一般取5kΩ左右)。主機對1-Wire總線(xiàn)的基本操作分為復位、讀和寫(xiě)三種,其中所有的讀寫(xiě)操作均為低位在前高位在后。復位、讀和寫(xiě)是1-Wire總線(xiàn)通信的基礎,下面通過(guò)具體程序詳細介紹這3種操作的時(shí)序要求。(程序中DQ代表1-Wire總線(xiàn),定義為P1.0,uchar定義為unsigned char)

  1 1-Wire總線(xiàn)的復位

  復位是1-Wire總線(xiàn)通信中最為重要的一種操作,在每次總線(xiàn)通信之前主機必須首先發(fā)送復位信號。如程序1.1所示,產(chǎn)生復位信號時(shí)主機首先將總線(xiàn)拉低480~960μs然后釋放,由于上拉電阻的存在,此時(shí)總線(xiàn)變?yōu)楦唠娖健?-Wire總線(xiàn)在接收到有效跳變的15~60μs內會(huì )將總線(xiàn)拉低60~240μs,在此期間主機可以通過(guò)對DQ采樣來(lái)判斷是否有從器件掛接在當前總線(xiàn)上。函數Reset()的返回值為0表示有器件掛接在總線(xiàn)上,返回值為1表示沒(méi)有器件掛接在總線(xiàn)上。

  程序1.1 總線(xiàn)復位

  uchar Reset(void)

  {

  uchar tdq;

  DQ=0; //主機拉低總線(xiàn)

  delay480μs(); //等待480μs

  DQ=1; //主機釋放總線(xiàn)

  delay60μs(); //等待60μs

  tdq=DQ; //主機對總線(xiàn)采樣

  delay480μs(); //等待復位結束

  return tdq; //返回采樣值

  }

  2 1-Wire總線(xiàn)的寫(xiě)操作

  由于只有一條I/O線(xiàn),主機1-Wire總線(xiàn)的寫(xiě)操作只能逐位進(jìn)行,連續寫(xiě)8次即可寫(xiě)入總線(xiàn)一個(gè)字節。如程序1.2所示,當MCS-51單片機的時(shí)鐘頻率為12MHz時(shí),程序中的語(yǔ)句_nop_();可以產(chǎn)生1μs的延時(shí),調用此函數時(shí)需包含頭文件“intrins.h”。向1-Wire總線(xiàn)寫(xiě)1bit至少需要60μs,同時(shí)還要保證兩次連續的寫(xiě)操作有1μs以上的間隔。若待寫(xiě)位wbit為0則主機拉低總線(xiàn)60μs然后釋放,寫(xiě)0操作完成。若待寫(xiě)位wbit為1,則主機拉低總線(xiàn)并在1~15μs內釋放,然后等待60μs,寫(xiě)1操作完成。

  程序1.2 向總線(xiàn)寫(xiě)1bit

  void Writebit(uchar wbit)

  {

  _nop_();

  //保證兩次寫(xiě)操作間隔1μs以上

  DQ=0;

  _nop_();

  //保證主機拉低總線(xiàn)1μs以上

  if(wbit)

  {

  //向總線(xiàn)寫(xiě)1

  DQ=1;

  delay60μs();

  }

  else

  {

  //向總線(xiàn)寫(xiě)0

  delay60μs();

  DQ=1;

  }

  }

  3 1-Wire總線(xiàn)的讀操作

  與寫(xiě)操作類(lèi)似,主機對1-Wire總線(xiàn)的讀操作也只能逐位進(jìn)行,連續讀8次,即可讀入主機一個(gè)字節。從1-Wire總線(xiàn)讀取1bit同樣至少需要60μs,同時(shí)也要保證兩次連續的讀操作間隔1μs以上。如程序1.3所示,從總線(xiàn)讀數據時(shí),主機首先拉低總線(xiàn)1μs以上然后釋放,在釋放總線(xiàn)后的1~15μs內主機對總線(xiàn)的采樣值即為讀取到的數據。

  程序1.3 從總線(xiàn)讀1bit

  uchar Readbit()

  {

  uchar tdq;

  _nop_();

  //保證兩次連續寫(xiě)操作間隔1μs以上

  DQ=0;

  _nop_();

  //保證拉低總線(xiàn)的時(shí)間不少于1μs

  DQ=1;

  _nop_();

  tdq=DQ;

  //主機對總線(xiàn)采樣

  delay60μs();

  //等待讀操作結束

  return tdq;

  //返回讀取到的數據

  }

  DS18B20

  1 DS18B20的基本特性

  ● 采用1-Wire,可以方便實(shí)現。

  ● 與主機連接方便,除5kΩ的總線(xiàn)上拉電阻外無(wú)須其他額外器件。

  ● 電源電壓范圍為3.0~5.5V,與3.3V和5V數字系統均可很好地兼容。

  ● 測量范圍為-55~+125℃,分辨率為9~12位可編程。

  ● 通過(guò)編程可設置溫度報警上下限,設置值掉電不丟失。

  ● 內部集成了用于器件尋址的64bit光刻編碼。

  2 DS18B20中的存儲器

  在DS18B20中共有三種存儲器,分別是、RAM、EEP,每種存儲器都有其特定的功能,可查閱相關(guān)資料。

  3 1-Wire總線(xiàn)ROM功能命令

  在DS18B20內部光刻了一個(gè)長(cháng)度為64bit的ROM編碼,這個(gè)編碼是器件的身份識別標志。當總線(xiàn)上掛接著(zhù)多個(gè)DS18B20時(shí)可以通過(guò)ROM編碼對特定器件進(jìn)行操作。ROM功能命令是針對器件的ROM編碼進(jìn)行操作的命令,共有5個(gè),長(cháng)度均為8bit(1Byte)。

 ?、僮xROM(33H)

  當掛接在總線(xiàn)上的1-Wire總線(xiàn)器件接收到此命令時(shí),會(huì )在主機讀操作的配合下將自身的ROM編碼按由低位到高位的順序依次發(fā)送給主機??偩€(xiàn)上掛接有多個(gè)DS18B20時(shí),此命令會(huì )使所有器件同時(shí)向主機傳送自身的ROM編碼,這將導致數據的沖突。

 ?、谄ヅ銻OM(55H)

  主機在發(fā)送完此命令后,必須緊接著(zhù)發(fā)送一個(gè)64bit的ROM編碼,與此ROM編碼匹配的從器件會(huì )響應主機的后續命令,而其他從器件則處于等待狀態(tài)。該命令主要用于選擇總線(xiàn)上的特定器件進(jìn)行訪(fǎng)問(wèn)。

 ?、厶^(guò)ROM(CCH)

  發(fā)送此命令后,主機不必提供ROM編碼即可對從器件進(jìn)行訪(fǎng)問(wèn)。與讀ROM命令類(lèi)似,該命令同樣只適用于單節點(diǎn)的1-Wire,當總線(xiàn)上有多個(gè)器件掛接時(shí)會(huì )引起數據的沖突。

 ?、懿檎襌OM(F0H)

  當主機不知道總線(xiàn)上器件的ROM編碼時(shí),可以使用此命令并配合特定的算法查找出總線(xiàn)上從器件的數量和各個(gè)從器件的ROM編碼。

 ?、輬缶檎?ECH)

  此命令用于查找總線(xiàn)上滿(mǎn)足報警條件的DS18B20,通過(guò)報警查找命令并配合特定的查找算法,可以查找出總線(xiàn)上滿(mǎn)足報警條件的器件數目和各個(gè)器件的ROM編碼。

  4 DS18B20器件功能命令

  與1-Wire總線(xiàn)相關(guān)的命令分為ROM功能命令和器件功能命令兩種,ROM功能命令具有通用性,不僅適用于DS18B20也適用于其他具有1-Wire的器件,主要用于器件的識別與尋址;器件功能命令具有專(zhuān)用性,它們與器件的具體功能緊密相關(guān)。下面是DS18B20的器件功能命令。

 ?、賳?dòng)溫度轉換(44H)

  該命令發(fā)送完成后,主機可以通過(guò)調用Readbit()函數判斷溫度轉換是否完成,若Readbit()的返回值為0則表示轉換正在進(jìn)行,若Readbit()的返回值為1則表示轉換完成。

 ?、谧xRAM(BEH)

  該命令發(fā)送完成后,主機可以通過(guò)調用Readbit()函數將DS18B20中RAM的內容從低位到高位依次讀出。

 ?、蹖?xiě)RAM(4EH)

  該命令發(fā)出后,主機隨后寫(xiě)入1-Wire總線(xiàn)的3字節將依次被存儲到DS18B20的報警上限、報警下限和中。

 ?、軓椭芌AM(48H)

  該命令會(huì )將DS18B20的報警上限、報警下限和中的內容復制到EEPROM中。該命令發(fā)出后,主機可以通過(guò)調用Readbit()函數判斷復制操作是否完成,若Readbit()的返回值為1,則表示復制操作完成。

 ?、莼刈xEEPROM(B8H)

  該命令會(huì )將存儲在EEPROM中的報警上限、報警下限和配置寄器的內容回讀到RAM中,主機可以通過(guò)調用Readbit()函數判斷回讀操作是否完成,若Readbit()的返回值為1則表示回讀操作完成。DS18B20在上電時(shí)會(huì )自動(dòng)進(jìn)行一次回讀操作。

  

  

  圖1 主機與DS18B20的通信流程圖

  5 主機與DS18B20的通信流程

  如圖1所示,主機通過(guò)1-Wire總線(xiàn)接口對DS18B20的每次訪(fǎng)問(wèn)都以復位信號和ROM功能命令開(kāi)始,訪(fǎng)問(wèn)的結束位置是不確定的,這與具體的功能命令相關(guān)。圖中圓角矩形中的操作與主機發(fā)送的功能命令相對應,隨著(zhù)功能命令的不同圓角矩形中的操作有時(shí)可以被省略。對總線(xiàn)上的DS18B20來(lái)說(shuō),復位信號意味著(zhù)又一次通信的開(kāi)始,器件對此的響應是拉低總線(xiàn)以告知主機自身的存在,然后準備接收ROM功能命令。

  系統仿真實(shí)例

  DS18B20是一種比較廉價(jià)的溫度傳感器,其封封裝形式如圖2所示。在Proteus中包含有DS18B20的仿真模型,這使得相關(guān)程序的調試變得簡(jiǎn)單方便。下面以一個(gè)實(shí)例介紹用Proteus仿真系統的步驟。

  

  

  圖2 DS18B20封裝形式

 ?、?繪制仿真原理圖

  如圖3所示,在本實(shí)例中以單片機AT89C52和8個(gè)DS18B20構成了一個(gè)多點(diǎn)測溫系統。為了有足夠的空間存儲各個(gè)DS18B20的ROM編碼和溫度值,在實(shí)例中用一片8KB的SRAM芯片6116對單片機的RAM進(jìn)行了擴展。

 ?、谠O置DS18B20仿真模型的屬性

  首先右擊選中編輯區中的DS18B20仿真模型然后再左擊,此時(shí)彈出如圖4所示的屬性設置對話(huà)框。其中,Family Code是器件的家族碼,對于DS18B20來(lái)說(shuō)是28H。ROM Serial Number對應于器件的48bit序列號,格式為十六進(jìn)制,在填寫(xiě)過(guò)程中要保證同一條1-Wire總線(xiàn)上所有仿真模型的ROM Serial Number都不相同。Automatic Serialization設置為No時(shí)仿真模型將使用ROM Serial Number中的序列號,設置為Yes時(shí)模型的序列號將由仿真環(huán)境自動(dòng)生成,在此設置為Yes,這樣可以免去手動(dòng)修改ROM Serial Number的麻煩。Current Value中是仿真模型當前的溫度值。Cranularity中是單擊仿真模型的溫度值增減按鈕時(shí)溫度值的改變量,在此設置為1.1。其他選項保持默認即可。單擊按鈕,設置完成。

  

  

  圖3 多點(diǎn)測溫系統仿真原理圖

 ?、劬幹圃闯绦?/P>

  主機是通過(guò)Reset()、Readbit()、Writebit()三種基本操作與1-Wire總線(xiàn)進(jìn)行通信的,只要這三個(gè)函數的時(shí)序準確,那么對于有一定C語(yǔ)言編程基礎的用戶(hù)來(lái)說(shuō)程序其他部分的編寫(xiě)將不是難事,按照前面介紹的流程向總線(xiàn)發(fā)送功能命令并進(jìn)行相應讀寫(xiě)操作即可。多點(diǎn)測溫系統編程的難點(diǎn)在于器件的查找,系統上電時(shí)主機首先要查找總線(xiàn)上掛接著(zhù)多少個(gè)1-Wire器件并將各個(gè)器件的ROM編碼讀入單片機的RAM中,這需要一套復雜的算法,限于篇幅關(guān)于此算法在此不再詳述。本仿真實(shí)例大體工作過(guò)程如圖3右下角注釋部分所示,“查找總線(xiàn)上所有器件的ROM編碼并存儲”這一步可以由uchar B20ReadROM(uchar B20ROM[]函數完成,該函數的返回值是查找到的器件數目,各個(gè)器件的ROM編碼將存儲在二維數組B20ROM[]中。

  

  

  圖4 DS18B20仿真模型屬性設置

  “統一開(kāi)始溫度轉換”的通信流程為:發(fā)送復位信號;發(fā)送跳過(guò)ROM(CCH)命令;發(fā)送啟動(dòng)溫度轉換(44H)命令。

  “逐器件讀取溫度值”的通信流程為:發(fā)送復位信號;發(fā)送匹配ROM(55H)命令;發(fā)送第i(i=0~7)個(gè)器件的ROM編碼;發(fā)送讀RAM(BEH)命令;讀取2字節,其中低字節在前,高字節在后,讀取到的值符合溫度值數據格式。

 ?、茉赑roteus中添加監視變量

  為了檢驗程序運行的正確與否,通常的做法是將運行結果通過(guò)單片機的UART接口輸出到虛擬終端上,這種方法的缺點(diǎn)是會(huì )占用一定的單片機資源,在此介紹另外一種程序調試技巧——監視變量。在Proteus的運行狀態(tài)下點(diǎn)擊Debug→Watch Window會(huì )彈出監視窗口(Watch Window),然后按下Alt+A鍵會(huì )彈出如圖5所示的添加存儲器條目對話(huà)框(Add Memory Item)。所謂監視變量也就是監視相應存儲單元中的內容,圖5中

  

  

  圖5 添加存儲器條目對話(huà)框

  

  Memory用于選擇待監視變量所在的存儲器;Name用于填寫(xiě)變量名稱(chēng),為了含義清晰該名稱(chēng)最好與源程序中定義的變量名稱(chēng)一致;Address用于填寫(xiě)待監視變量的地址;Data Type和Display Fomat用于設置數據格式和顯示格式。設置完成后單擊Add按鈕即可添加一個(gè)監視變量。在本實(shí)例中將測量到的溫度值轉化成碼字符串的格式存儲在二維數組TempBuffer中,因此Data Type選擇為ASCLLZ String,Watch Window的最終結果如圖6所示。Value一欄中顯示的即為8個(gè)DS18B20測量到的溫度值,單擊仿真模型的溫度增減按鈕溫度值的改變會(huì )自動(dòng)映射在Watch Window中。

  

  

  圖6 監視窗口

  圖6中TempBuffer[i](i=0~7)的地址在Keil中可以按以下步驟得到:

  ● 單擊Keil工具欄中的按鈕,進(jìn)入調試狀態(tài)。

  ● 通過(guò)View→Output Window菜單調出Keil的Output Window,并選中Command標簽。

  ● 在Output Window的命令輸入區輸入TempBuffer[i]然后回車(chē)即可得到TempBuffer[i]的地址,在本實(shí)例中i=0~7。對于非數組類(lèi)型的變量在輸入時(shí)需要在變量名前加取地址符號,如圖7所示。

51單片機相關(guān)文章:51單片機教程


存儲器相關(guān)文章:存儲器原理




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>