當(dāng)前位置:首頁(yè) > 工業(yè)控制 > 工業(yè)控制
[導(dǎo)讀]作為一種單主機(jī)多從機(jī)的總線系統(tǒng),在一條1-Wire總線上可掛接的從器件數(shù)量幾乎不受限制。為了不引起邏輯上的沖突,所有從器件的1-Wire總線接口都是漏極開路的,因此在使用時(shí)必須對(duì)總線外加上拉電阻(一般取5kΩ左右)。主機(jī)對(duì)1-Wire總線的基本操作分為復(fù)位、讀和寫三種,其中所有的讀寫操作均為低位在前高位在后。復(fù)位、讀和寫是1-Wire總線通信的基礎(chǔ),下面通過(guò)具體程序詳細(xì)介紹這3種操作的時(shí)序要求。(程序中DQ代表1-Wire總線,定義為P1.0,uchar定義為unsigned char)

1-Wire總線的基本通信協(xié)議


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


1 1-Wire總線的復(fù)位


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


程序1.1 總線復(fù)位


uchar Reset(void)

uchar tdq;
DQ=0;  //主機(jī)拉低總線
delay480μs(); //等待480μs
DQ=1; //主機(jī)釋放總線
delay60μs();  //等待60μs
tdq=DQ;  //主機(jī)對(duì)總線采樣
delay480μs();  //等待復(fù)位結(jié)束
return tdq;  //返回采樣值
}


2 1-Wire總線的寫操作


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


程序1.2 向總線寫1bit


void Writebit(uchar wbit)

 _nop_(); 
//保證兩次寫操作間隔1μs以上
 DQ=0;
 _nop_(); 
//保證主機(jī)拉低總線1μs以上
 if(wbit)
 {             
//向總線寫1
 DQ=1;
delay60μs();
 }
 else
 {             
//向總線寫0
 delay60μs();
 DQ=1;
 }
}


3 1-Wire總線的讀操作


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

程序1.3 從總線讀1bit


uchar Readbit()

 uchar tdq;
 _nop_(); 
//保證兩次連續(xù)寫操作間隔1μs以上
 DQ=0;
 _nop_();  
//保證拉低總線的時(shí)間不少于1μs
 DQ=1;
 _nop_();
 tdq=DQ;  
//主機(jī)對(duì)總線采樣
 delay60μs();
//等待讀操作結(jié)束
 return tdq; 
//返回讀取到的數(shù)據(jù)
}

數(shù)字溫度傳感器DS18B20


1 DS18B20的基本特性


● 采用1-Wire總線接口,可以方便實(shí)現(xiàn)多點(diǎn)測(cè)溫。
● 與主機(jī)連接方便,除5kΩ的總線上拉電阻外無(wú)須其他額外器件。
● 電源電壓范圍為3.0~5.5V,與3.3V和5V數(shù)字系統(tǒng)均可很好地兼容。
● 測(cè)量范圍為-55~+125℃,分辨率為9~12位可編程。
● 通過(guò)編程可設(shè)置溫度報(bào)警上下限,設(shè)置值掉電不丟失。
● 內(nèi)部集成了用于器件尋址的64bit光刻ROM編碼。


2 DS18B20中的存儲(chǔ)器


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


3 1-Wire總線ROM功能命令


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


①讀ROM(33H)


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


②匹配ROM(55H)


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


③跳過(guò)ROM(CCH)


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


④查找ROM(F0H)


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


⑤報(bào)警查找(ECH)


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


4 DS18B20器件功能命令


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


①啟動(dòng)溫度轉(zhuǎn)換(44H)


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


②讀RAM(BEH)


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


③寫RAM(4EH)


該命令發(fā)出后,主機(jī)隨后寫入1-Wire總線的3字節(jié)將依次被存儲(chǔ)到DS18B20的報(bào)警上限、報(bào)警下限和配置寄存器中。


④復(fù)制RAM(48H)


該命令會(huì)將DS18B20的報(bào)警上限、報(bào)警下限和配置寄存器中的內(nèi)容復(fù)制到EEPROM中。該命令發(fā)出后,主機(jī)可以通過(guò)調(diào)用Readbit()函數(shù)判斷復(fù)制操作是否完成,若Readbit()的返回值為1,則表示復(fù)制操作完成。


⑤回讀EEPROM(B8H)


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

 

圖1 主機(jī)與DS18B20的通信流程圖


5 主機(jī)與DS18B20的通信流程


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

多點(diǎn)測(cè)溫系統(tǒng)仿真實(shí)例


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

 

圖2 DS18B20封裝形式


① 繪制仿真原理圖


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


②設(shè)置DS18B20仿真模型的屬性


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

 

圖3 多點(diǎn)測(cè)溫系統(tǒng)仿真原理圖


③編制源程序


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

 

圖4 DS18B20仿真模型屬性設(shè)置


“統(tǒng)一開始溫度轉(zhuǎn)換”的通信流程為:發(fā)送復(fù)位信號(hào);發(fā)送跳過(guò)ROM(CCH)命令;發(fā)送啟動(dòng)溫度轉(zhuǎn)換(44H)命令。


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


④在Proteus中添加監(jiān)視變量


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

 

圖5 添加存儲(chǔ)器條目對(duì)話框

 

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

 

圖6 監(jiān)視窗口


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


● 單擊Keil工具欄中的按鈕,進(jìn)入調(diào)試狀態(tài)。
● 通過(guò)View→Output Window菜單調(diào)出Keil的Output Window,并選中Command標(biāo)簽。
● 在Output Window的命令輸入?yún)^(qū)輸入TempBuffer[i]然后回車即可得到TempBuffer[i]的地址,在本實(shí)例中i=0~7。對(duì)于非數(shù)組類型的變量在輸入時(shí)需要在變量名前加取地址符號(hào)&,如圖7所示。 

圖7 變量地址的獲取

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉