基于單總線的溫度實時監(jiān)控系統(tǒng)_第1頁
基于單總線的溫度實時監(jiān)控系統(tǒng)_第2頁
基于單總線的溫度實時監(jiān)控系統(tǒng)_第3頁
基于單總線的溫度實時監(jiān)控系統(tǒng)_第4頁
基于單總線的溫度實時監(jiān)控系統(tǒng)_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

課程設(shè)計報告書課程名稱:專業(yè)綜合課程設(shè)計題目:基于單總線的溫度實時監(jiān)控系統(tǒng)系〔院〕:電子工程學(xué)院學(xué)期:11-12-1專業(yè)班級:電子姓名:學(xué)號:評語:成績:簽名:日期:選題意義隨著社會的開展,科技的進步,電子技術(shù)和微型計算機的迅速開展,以及測溫儀器在各個領(lǐng)域的應(yīng)用,智能化已是現(xiàn)代溫度監(jiān)控系統(tǒng)開展的主流方向。單片機在電子產(chǎn)品中的應(yīng)用已經(jīng)越來越廣泛。利用單片機對溫度進行控制的技術(shù)也隨之而生,并日益開展和完善,且越來越顯示出它的優(yōu)越性。單總線技術(shù)是美國Dallas半導(dǎo)體公司近年推出的新技術(shù)。它將地址線、數(shù)據(jù)線、控制線合為1根信號線,允許在這根信號線上掛接數(shù)百個單總線器件芯片。溫度是一個重要的物理量,它反映了物體冷熱的程度,與自然界中的各種物理和化學(xué)過程相聯(lián)系。在工、農(nóng)業(yè)生產(chǎn)和日常生活中,各個環(huán)節(jié)都與溫度緊密相聯(lián),溫度的準(zhǔn)確監(jiān)測及控制占據(jù)著極其重要地位。比方,發(fā)電廠鍋爐的溫度必須控制在一定的范圍之內(nèi);許多化學(xué)反響的工藝過程必須在適當(dāng)?shù)臏囟认虏拍苷_M行等。沒有適宜的溫度環(huán)境,許多電子設(shè)備就不能正常工作,糧倉的儲糧就會變質(zhì)霉?fàn)€,酒類的品質(zhì)就沒有保障??梢?,溫度的監(jiān)控是非常重要的。單總線技術(shù)是美國Dallas半導(dǎo)體公司近年推出的新技術(shù)。它將地址線、數(shù)據(jù)線、控制線合為1根信號線,允許在這根信號線上掛接數(shù)百個單總線器件芯片。單總線技術(shù)應(yīng)用于某些低速〔約100kbps以下的速率〕測控系統(tǒng)中,可以大大簡化線路結(jié)構(gòu)和減少硬件開銷,可以通過PC機串行口、并行口、USB總線或單片機直接進行測控,PC機的軟件開發(fā)也直觀、容易。本設(shè)計為基于單總線的溫度實時監(jiān)控系統(tǒng)。設(shè)計目的、要求及步驟概述2.1設(shè)計目的〔1〕對單總線設(shè)備的結(jié)構(gòu)特點和以單總線技術(shù)構(gòu)建起來的微型局域網(wǎng)的拓樸結(jié)構(gòu)、網(wǎng)絡(luò)結(jié)構(gòu)優(yōu)化以及設(shè)備與單總線的連接進行闡述和研究?!?〕設(shè)計基于單總線的溫度采集電路,單總線和PC機串行口的接口電路,在電路設(shè)計時重點考慮單總線設(shè)備的供電問題和數(shù)據(jù)的可靠采集?!?〕用自己熟悉的計算機語言編寫溫度實時監(jiān)控系統(tǒng)軟件,軟件的界面要友好、簡明、直觀。在軟件編寫時重點考慮溫度采集數(shù)據(jù)存儲、單總線設(shè)備中的CRC循環(huán)冗余碼的實現(xiàn)方法、從設(shè)備的“即時插即用〞的算法研究。2.2設(shè)計內(nèi)容及要求溫度測量范圍-50℃~+100℃。測溫分辨率不低于0.0625℃。數(shù)據(jù)傳輸距離不低于60米。溫度測量點不少于3。溫度采集間隔不底于10分鐘。能顯示一天實時溫度變化曲線。2.3設(shè)計步驟概述實習(xí)制作大概步驟如圖1準(zhǔn)備好要用的器件準(zhǔn)備好要用的器件進行焊接設(shè)計電路Delphi程序設(shè)計檢測完善電路完整調(diào)試完善研究課題的要求程序檢測完善圖1電路的設(shè)計3.1硬件電路設(shè)計在硬件電路設(shè)計時,應(yīng)著重考慮電子器件的供電方式,以及對器件的限壓和限流保護。因為本次設(shè)計要求利用單總線技術(shù),所以可以考慮使用寄生供電方式。設(shè)計的電路圖如下。圖2基于單總線的溫度實時監(jiān)控系統(tǒng)硬件電路總圖圖3基于單總線的溫度實時監(jiān)控系統(tǒng)硬件電路原理圖3.2軟件設(shè)計設(shè)計窗體本次設(shè)計要求軟件的可視化窗體中包含實時溫度顯示、數(shù)據(jù)記錄、存儲管理和ROM數(shù)據(jù),并且能將測得的數(shù)據(jù)保存到指定的數(shù)據(jù)庫中。窗體界面如下。圖4窗體界面實時溫度顯示中可以看到當(dāng)前室溫,并且可以顯示攝氏溫度和華氏溫度。數(shù)據(jù)記錄包含溫度曲線和溫度日志,可以顯示一天內(nèi)的溫度變化曲線。存儲管理和ROM數(shù)據(jù)用來對數(shù)據(jù)庫中已經(jīng)保存的溫度數(shù)據(jù)進行管理,如刪除、轉(zhuǎn)移等操作。軟件編程本系統(tǒng)軟件局部采用Delphi來實現(xiàn)初始化、數(shù)據(jù)采集處理、溫度報表管理,其主程序的流程圖見圖5。圖5主程序流程圖本系統(tǒng)軟件局部共分為3個局部,分別是:1〕初始化程序。a.設(shè)置串行通信波特率;b.串行通訊方式的初始化;c.對TO,T1兩個計數(shù)器的初始化;d.中斷控制程序的初始化。此外,還負責(zé)從E2PROM中調(diào)出以前的采樣參數(shù),使器件能夠以它采樣溫度數(shù)據(jù)。2〕當(dāng)監(jiān)控到ONTIME1和NTIME2標(biāo)記時作相應(yīng)溫度的存儲、轉(zhuǎn)換、發(fā)送處理。ONTIME1和NTIME2的標(biāo)記主要有定時電路決定,當(dāng)?shù)竭_采樣間隔時,做出相應(yīng)的處理。3〕采用動態(tài)顯示方式即時顯示溫度,以節(jié)省電路規(guī)模,使得整個系統(tǒng)的體積變小。元器件的選擇4.1主要元器件知識DS18B20DS18B20是DALLAS公司生產(chǎn)的一線式數(shù)字溫度傳感器,具有3引腳TO-92小體積封裝形式;溫度測量范圍為-55℃~+125℃,可編程為9位~12位A/D轉(zhuǎn)換精度,測溫分辨率可達0.0625℃,被測溫度用符號擴展的16位數(shù)字量方式串行輸出;其工作電源既可在遠端引入,也可采用寄生電源方式產(chǎn)生;多個DS18B20可以并聯(lián)到3根或2根線上,只需一根端口線就能與諸多DS18B20通信,占用微處理器的端口較少,可節(jié)省大量的引線和邏輯電路。以上特點使DS18B20非常適用于遠距離多點溫度檢測系統(tǒng)。DS18B20內(nèi)部結(jié)構(gòu)如圖5所示,主要由4局部組成:64位ROM、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器TH和TL、配置存放器。DS18B20的管腳排列如圖6所示,DQ為數(shù)字信號輸入/輸出端;GND為電源地;VDD為外接供電電源輸入端,在寄生電源接線方式時接地,見圖7。圖6DS18B20的內(nèi)部結(jié)構(gòu)圖7DS18B20的管腳排列ROM中的64位序列號是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼,每個DS18B20的64位序列號均不相同。64位ROM的排的循環(huán)冗余校驗碼〔CRC=X8+X5+X4+1〕。ROM的作用是使每一個DS18B20都各不相同,這樣就可以實現(xiàn)一根總線上掛接多個DS18B20的目的。DS18B20中的溫度傳感器完成對溫度的測量,用16位符號擴展的二進制補碼讀數(shù)形式提供,以0.0625℃/LSB形式表達,其中S為符號位。例如+125℃的數(shù)字輸出為07D0H,+25.0625℃的數(shù)字輸出為0191H,-25.0625℃的數(shù)字輸出為FF6FH,-55℃的數(shù)字輸出為FC90H。上下溫報警觸發(fā)器TH和TL、配置存放器均由一個字節(jié)的EEPROM組成,使用一個存儲器功能命令可對TH、TL或配置存放器寫入。其中配置存放器的格式如下:0R1R011111MSBLSBR1、R0決定溫度轉(zhuǎn)換的精度位數(shù):R1R0=“00”,9位精度,最大轉(zhuǎn)換時間為93.75ms;R1R0=“01”,10位精度,最大轉(zhuǎn)換時間為187.5ms;R1R0=“10”,11位精度,最大轉(zhuǎn)換時間為375ms;R1R0=“11”,12位精度,最大轉(zhuǎn)換時間為750ms;未編程時默認為12位精度。高速暫存器是一個9字節(jié)的存儲器。開始兩個字節(jié)包含被測溫度的數(shù)字量信息;第3、4、5字節(jié)分別是TH、TL、配置存放器的臨時拷貝,每一次上電復(fù)位時被刷新;第6、7、8字節(jié)未用,表現(xiàn)為全邏輯1;第9字節(jié)讀出的是前面所有8個字節(jié)的CRC碼,可用來保證通信正確。.2DS18B20的工作時序DS18B20的一線工作協(xié)議流程是:初始化→ROM操作指令→存儲器操作指令→數(shù)據(jù)傳輸。其工作時序包括初始化時序、寫時序和讀時序,如圖8〔a〕〔b〕〔c〕所示。〔a〕初始化時序〔b〕寫時序〔c〕讀時序圖8DS18B20的工作時序圖.3DS18B20與微處理器的連接DS18B20與微處理器的連接如下列圖9所示。〔a〕寄生電源工作方式〔b〕外接電源工作方式圖9DS18B20與微處理器的典型連接圖4.1.2 串口UART/RS232至單總線通信協(xié)議的轉(zhuǎn)接橋DS2480B.1DS2480B主要特性串口UART/RS232至單總線通信協(xié)議的轉(zhuǎn)接橋,可直接連到UART和5VRS232系統(tǒng)中,支持Dallas全系列單總線器件,如數(shù)字溫度傳感器DS18B20、A/D轉(zhuǎn)換器DS2450等;將主機從單總線時序控制中解脫出來,提供標(biāo)準(zhǔn)的、靈活的和強驅(qū)動的單總線定時;支持標(biāo)準(zhǔn)UART通信,支持9.6〔默認〕、19.2、57.6和115.2kbps速率;具有較強的總線驅(qū)動能力,通信距離可達300m;可編程下拉擺率控制和有源上拉,工作范圍5V,-40~+85℃,8引腳SOIC封裝。.2管腳圖及引腳說明 11234875RXDTXDPOLVPPGND1-WNCVDD圖10DS2480B的封裝和引腳DS2480B為8腳貼片式封裝,如圖10所示。引腳功能如表1所列:表1引腳功能說明引腳號引腳名稱引腳功能1GND地線21-W單總線輸入輸出端3NC懸空4VDD4.5~5.5V電壓5VPPEPROM編程電壓6POLRXD/TXD選擇端7TXD發(fā)送端8RXD接收端DS2480B工作原理框圖如圖11所示。圖11DS2480B工作原理框圖DS2480B與RS232的接口技術(shù)DS2480B與RS232的接口如圖12所示。圖12DS2480B與RS232的接口圖4.2元件清單表2元件清單序號元件個數(shù)1PC機串行口UART/RS2321個2轉(zhuǎn)接橋DS2480B1個3數(shù)字溫度傳感器DS18B201個4電容U07HF1個5穩(wěn)壓管2個6二極管M72個7電路板XF071個學(xué)習(xí)心得通過這次專業(yè)課程設(shè)計,我對本專業(yè)的理論知識和動手操作能力都有了大幅度的提高。首先從研究課題的要求和任務(wù)開始,剛拿到“基于單總線的溫度實時監(jiān)控系統(tǒng)〞這個設(shè)計題目時,完全是不知所措,不知道從那下手。經(jīng)過王老師和李老師的耐心講解后,才有點頭緒。課后通過自己查資料和老師所給的任務(wù)書與指導(dǎo)書才真正開始搞懂題目,并且去研究它。根據(jù)指導(dǎo)書上的要求和指示,我們小組設(shè)計出了基于單總線的溫度實時監(jiān)控系統(tǒng)硬件電路。接下來就要依據(jù)設(shè)計好的電路圖,進行硬件的焊接。說到焊接,我并不陌生,在大二的時候就焊接過收音機,在專業(yè)綜合實習(xí)時,又焊接過紅外線感應(yīng)開關(guān)。焊接最需要注意的是焊接的溫度和時間,焊接時要使電烙鐵的溫度高于焊錫,但是不能太高,以烙鐵接頭的松香剛剛冒煙為好,焊接的時間不能太短,因為那樣焊點的溫度太低,焊點融化不充分,焊點粗糙容易造成虛焊,而焊接時間長,焊錫容易流淌,使元件過熱,容易損壞,或者造成焊接短路現(xiàn)象。在軟件設(shè)計與編程的環(huán)節(jié),要求用自己熟悉的計算機語言編寫溫度實時監(jiān)控系統(tǒng)軟件。在設(shè)計之前我也考慮過關(guān)于選用什么語言的問題,在大學(xué)生涯中,我學(xué)過了C語言,Java語言和Delphi語言,在去年的計算機課程設(shè)計中,我曾用Delphi語言編寫過一個高校學(xué)生選課成績管理系統(tǒng),對Delphi言語的應(yīng)用相對靈活些,所以我決定用Delphi語言編寫程序。在本次課程設(shè)計的過程中,我還發(fā)現(xiàn)基于DS18B20數(shù)字溫度傳感器構(gòu)成的實時監(jiān)控系統(tǒng)確實具有精度高、抗干擾能力強、電路簡單等諸多優(yōu)點。相比之下,傳統(tǒng)的溫度檢測系統(tǒng)采用熱敏電阻等溫度敏感元件,熱敏電阻本錢低,但需要后續(xù)信號調(diào)理、AD轉(zhuǎn)換處理電路才能將溫度信號轉(zhuǎn)換成數(shù)字信號,不但電路復(fù)雜,而且熱敏電阻的可靠性相對較差,測量溫度的精度差,很難保證熱敏電阻的一致性和線性。通過對這個專業(yè)課程設(shè)計的學(xué)習(xí),為我們掌握單總線的溫度采集電路,單總線和PC機串行口的接口電路的開發(fā)打下了堅實的根底,還使我掌握了設(shè)計復(fù)雜電路和裝配技能,培養(yǎng)了我理論聯(lián)系實際的能力,提高了我分析問題和解決問題的能力,增強了獨立工作的能力。其中感觸最深的便是實踐聯(lián)系理論的重要性,當(dāng)遇到實際問題時,只要認真思考,用所學(xué)的知識,再一步一步探索,是完全可以解決遇到的一般問題的。在實習(xí)過成中,要時刻保持清醒的頭腦,出現(xiàn)錯誤,一定要認真的冷靜的去檢查分析錯誤,不能草草了事,這樣做出來的課程設(shè)計才能到達它真正的效果,為我們以后步入社會做好充分的準(zhǔn)備。參考文獻[1]DS18B20ProgrammableResolution1-WireDigitalThermometer[2]DS2480BSerial1-WireLineDriverwithLoadSensor[3]左冬紅,謝瑞和.實現(xiàn)單總線搜索ROM命令的一種算法[4]李朝青,單片機原理及接口技術(shù)(簡明修訂版)[M].1998[5]李廣弟.單片機根底[M].1994[6]沙占友等.智能化集成溫度傳感器原理與應(yīng)用.2002[7]閻石.數(shù)字電子技術(shù)根底〔第三版〕[M].1989附:源程序清單{------------------------------------------------------------------------------------------------------TEMPDL32:ThisutilityusesTMEXtoviewareadthetemperaturefromaDS18B20.Itrequiresthe32-BitWindowsTMEXdriverstobepresent.Compiler:BorlandDelphi5.0}procedureTForm1.FormCreate(Sender:Tobject;Var ztbuf:array[0..200]ofChar;Typebuf:array[0..200]ofChar;i,k,RetValue:smallint;RetStr:array[0..200]ofChar;SetupDone:Boolean;PortNum,PortType:smallint;begindieer:=false;SetupDone:=FALSE;{TMSetupnotdoneyet}Label4.Caption:='';{ReaddefaultPortNumberandPortTypefromregistry}RetValue:=TMReadDefaultPort(@PortNum,@PortType);if(RetValue<1)thenTMReadDefaultPort(@PortNum,@PortType)beginShowMessage('Pleasesetportfirst');Halt;endelsebegin{readthetmexversionandtypeversion}Get_Version(@ztbuf);Label1.Caption:=StrPas(ztbuf);TMGetTypeVersion(PortType,@Typebuf);Label2.Caption:=StrPas(Typebuf);{attemptogetasession}Done:=False;RepeatSHandle:=TMExtendedStartSession(PortNum,PortType,NIL);If(SHandle>0)Thenbeginif(TMSetup(SHandle)=1)then{ThedevicethatwillbefoundisTemperatureDeviceDS18B20,soFamilyTypeissetto$28}FindFirstFamily($28,SHandle)elsebeginTMEndSession(SHandle);ShowMessage('FailtosetupMicroLan!');Halt;end;endelsebeginif(SHandle<0)thenBeginShowMessage('TheDefaultPortTypedoesnothaveadriver!');Halt;end;end;{Releasecontrolbacktowindow}Application.ProcessMessages;until(Done);Done:=False;RepeatSHandle:=TMExtendedStartSession(PortNum,PortType,NIL);If(SHandle>0)Thenbeginif(TMSetup(SHandle)=1)then{ThedevicethatwillbefoundisTemperatureDeviceDS18B20,soFamilyTypeissetto$28}FindSecondFamily($28,SHandle)elsebeginTMEndSession(SHandle);ShowMessage('FailtosetupMicroLan!');Halt;end;endelsebeginif(SHandle<0)thenBeginShowMessage('TheDefaultPortTypedoesnothaveadriver!');Halt;end;end;{Releasecontrolbacktowindow}Application.ProcessMessages;until(Done);label18.Caption:=keke1;label19.caption:=keke2;table1.Active:=true;iftable1.CanModifythenbegintable1.Append;table1.Fields[0].AsDateTime:=now;table1.Fields[1].AsString:=floattostr(diwei1);table1.Fields[2].AsFloat:=shangxian1;table1.Fields[3].AsFloat:=xiaxian1;table1.Fields[4].AsString:=floattostr(diwei2);table1.Fields[5].AsFloat:=shangxian2;table1.Fields[6].AsFloat:=xiaxian2;table1.Post;end;end;end;procedureTForm1.FindFirstFamily(family:smallint;SHandle:longint);vari,flag:smallint;romstr:string;rom:array[0..8]ofsmallint;begin{Setuptofindthefirstdevicewiththefamily'family'}if(TMFamilySearchSetup(SHandle,@stateBuf,family)=1)thenbeginif(TMNext(SHandle,@stateBuf)=1)thenbegin{Readtheromnumberbysettingrom[0]to0forreadingandusingTMRom}rom[0]:=0;TMRom(SHandle,@stateBuf,@rom);{Checkifcorrecttype}romstr:='';if((familyand$7F)=(rom[0]and$7F))thenbeginfori:=7downto0doromstr:=romstr+IntToHex(ROM[i],2);Label3.caption:='SerialROMID1:'+romstr;ReadTemperature1(SHandle);endelsebeginShowMessage('ThereisnoTemperatureDeviceontheport');halt;end;endelsebeginTMEndSession(SHandle);ShowMessage('ThereisnoTemperatureDeviceontheport');halt;end;endelsebeginTMEndSession(SHandle);ShowMessage('ThereisnoTemperatureDeviceontheport');halt;end;end;procedureTForm1.ReadTemperature1(session_handle:longint);vartsht,i,tmp1:smallint;cr,cpc,tmpf,tmp:Extended;rbuf:array[0..9]ofsmallint;st:longint;CRCByte,xiaxianbyte:Byte;begintmp:=0.00;{accessthedevice}if(TMAccess(session_handle,@StateBuf)=1)thenbegin{SendtherecallE2command(bysetting$B8tooutbyteinTMTouchByte)makesureScratchiscorrect}TMTouchByte(session_handle,$B8);{SendthestartTcommand}if(TMAccess(session_handle,@StateBuf)=1)thenbegin{PreparethestrongpullupafternextTMTouchByte}TMOneWireLevel(session_handle,LEVEL_SET,LEVEL_STRONG_PULL_UP,PRIMED_BYTE);{Sendtheconversioncommand(bysetting$44tooutbyteinTMTouchByte)}TMTouchByte(session_handle,$44);{Sleepforasecond}st:=GetTickCount+1000;While(GetTickCount<st)doTMValidSession(Session_handle);{Disablethestrongpullup}TMOneWireLevel(session_handle,LEVEL_SET,LEVEL_NORMAL,PRIMED_NONE);{verifyconversioniscompletebysetting$01tooutbitinTMTouchBitandcheckthereturnvaluewith1}if(TMTouchBit(session_handle,$01)=$01)thenbegin{Accessdevice}If(TMAccess(session_handle,@StateBuf)=1)thenbegin{Sendreadscratchcommandbysetting$BEtooutbyteinTMTouchByte}TMTouchByte(session_handle,$BE);CRC8:=0;{Readscratch(setting$FFtooutbyteinTMTouchByte)andcheckcrcforeachbyte}fori:=0to7dobeginrbuf[i]:=TMTouchByte(session_handle,$FF);CRCByte:=Byte(rbuf[i]);{thebytetorunthroughCRC8routine}CRC8:=TMCRC(1,@CRCByte,CRC8,0);end;{Checkcrc}CRCByte:=Byte(TMTouchByte(session_handle,$FF));{thebytetorunthroughCRC8routine}CRC8:=TMCRC(1,@CRCByte,CRC8,0);if(CRC8=0)thenbegin{Calculatethetemperaruretsht:=rbuf[0];if((rbuf[1]and$01)=1)thentsht:=tshtor(-256);tmp1:=Round((tsht)/2);tmp:=tmp1;cr:=rbuf[6];cpc:=rbuf[7];if(rbuf[7]<>0)thentmp:=tmp-(0.25)+(cpc-cr)/cpc;}if((rbuf[1]and$F8)=$F8)thenBEGINENDELSEBEGINcase(rbuf[4]and$60)of$00:beginfenbianlv1:=9;tmp:=(rbuf[1]and$07)*16+(rbuf[0]and$f8)/16;diwei1:=(rbuf[0]and$f8)/16;end;$20:beginfenbianlv1:=10;tmp:=(rbuf[1]and$07)*16+(rbuf[0]and$fc)/16;diwei1:=(rbuf[0]and$fc)/16;end;$40:beginfenbianlv1:=11;tmp:=(rbuf[1]and$07)*16+(rbuf[0]and$fe)/16;diwei1:=(rbuf[0]and$fe)/16;end;$60:beginfenbianlv1:=12;tmp:=(rbuf[1]and$07)*16+rbuf[0]/16;diwei1:=rbuf[0]/16;end;end;END;tmpf:=(tmp*9)/5+32;label4.caption:='Currenttemp1:'+FormatFloat('0.0000',tmp)+'Cor'+FormatFloat('0.0000',tmpf)+'F';keke1:=FormatFloat('0.0000',tmp);yuanshi1:=rbuf[4];shangxian1:=rbuf[2]and$7f;xiaxianbyte:=rbuf[3]and$80;ifxiaxianbyte=1thenxiaxian1:=(rbuf[3]and$7f)*(-1)elsexiaxian1:=rbuf[3]and$7f;MessageBeep(0);TMEndSession(session_handle);Done:=True;end;end;end;end;end;end;procedureTForm1.FindSecondFamily(family:smallint;SHandle:longint);vari,flag:smallint;romstr:string;rom:array[0..8]ofsmallint;begin{Setuptofindthefirstdevicewiththefamily'family'}if(TMFamilySearchSetup(SHandle,@stateBuf,family)=1)thenbegin{Getfirstdevice}if(TMNext(SHandle,@stateBuf)=1)thenif(TMNext(SHandle,@stateBuf)=1)thenbegin{Readtheromnumberbysettingrom[0]to0forreadingandusingTMRom}rom[0]:=0;TMRom(SHandle,@stateBuf,@rom);{Checkifcorrecttype}romstr:='';if((familyand$7F)=(rom[0]and$7F))thenbeginfori:=7downto0doromstr:=romstr+IntToHex(ROM[i],2);Label10.caption:='SerialROMID2:'+romstr;ReadTemperature2(SHandle);endelsebeginShowMessage('ThereisnoTemperatureDeviceontheport');halt;end;endelsebeginTMEndSession(SHandle);ShowMessage('ThereisnoTemperatureDeviceontheport');halt;endelsebeginTMEndSession(SHandle);ShowMessage('ThereisnoTemperatureDeviceontheport');halt;end;endelsebeginTMEndSession(SHandle);ShowMessage('ThereisnoTemperatureDeviceontheport');halt;end;end;procedureTForm1.ReadTemperature2(session_handle:longint);vartsht,i,tmp1:smallint;cr,cpc,tmpf,tmp:Extended;rbuf:array[0..9]ofsmallint;st:longint;CRCByte,xiaxianbyte:Byte;begintmp:=0.00;{accessthedevice}if(TMAccess(session_handle,@StateBuf)=1)thenbegin{SendtherecallE2command(bysetting$B8tooutbyteinTMTouchByte)makesureScratchiscorrect}TMTouchByte(session_handle,$B8);{SendthestartTcommand}if(TMAccess(session_handle,@StateBuf)=1)thenbegin{PreparethestrongpullupafternextTMTouchByte}TMOneWireLevel(session_handle,LEVEL_SET,LEVEL_STRONG_PULL_UP,PRIMED_BYTE);{Sendtheconversioncommand(bysetting$44tooutbyteinTMTouchByte)}TMTouchByte(session_handle,$44);{Sleepforasecond}st:=GetTickCount+1000;While(GetTickCount<st)doTMValidSession(Session_handle);{Disablethestrongpullup}TMOneWireLevel(session_handle,LEVEL_SET,LEVEL_NORMAL,PRIMED_NONE);{verifyconversioniscompletebysetting$01tooutbitinTMTouchBitandcheckthereturnvaluewith1}if(TMTouchBit(session_handle,$01)=$01)thenbegin{Accessdevice}If(TMAccess(session_handle,@StateBuf)=1)thenbegin{Sendreadscratchcommandbysetting$BEtooutbyteinTMTouchByte}TMTouchByte(session_handle,$BE);CRC8:=0;{Readscratch(setting$FFtooutbyteinTMTouchByte)andcheckcrcforeachbyte}fori:=0to7dobeginrbuf[i]:=TMTouchByte(session_handle,$FF);CRCByte:=Byte(rbuf[i]);{thebytetorunthroughCRC8routine}CRC8:=TMCRC(1,@CRCByte,CRC8,0);end;{Checkcrc}CRCByte:=Byte(TMTouchByte(session_handle,$FF));{thebytetorunthroughCRC8routine}CRC8:=TMCRC(1,@CRCByte,CRC8,0);if(CRC8=0)thenbegin{Calculatethetemperaruretsht:=rbuf[0];if((rbuf[1]and$01)=1)thentsht:=tshtor(-256);tmp1:=Round((tsht)/2);tmp:=tmp1;cr:=rbuf[6];cpc:=rbuf[7];if(rbuf[7]<>0)thentmp:=tmp-(0.25)+(cpc-cr)/cpc;}if((rbuf[1]and$F8)=$F8)thenBEGINENDELSEBEGINcase(rbuf[4]and$60)of$00:begintmp:=(rbuf[1]and$07)*16+(rbuf[0]and$f8)/16;fenbianlv2:=9;diwei2:=(rbuf[0]and$f8)/16;end;$20:beginfenbianlv2:=10;tmp:=(rbuf[1]and$07)*16+(rbuf[0]and$fc)/16;diwei2:=(rbuf[0]and$fc)/16;end;$40:beginfenbianlv2:=11;tmp:=(rbuf[1]and$07)*16+(rbuf[0]and$fe)/16;//11位分辨率diwei2:=(rbuf[0]and$fe)/16;end;$60:beginfenbianlv2:=12;tmp:=(rbuf[1]and$07)*16+rbuf[0]/16;//12位分辨率diwei2:=rbuf[0]/16;end;end;END;tmpf:=(tmp*9)/5+32;label11.caption:='Currenttemp2:'+FormatFloat('0.0000',tmp)+'Cor'+FormatFloat('0.0000',tmpf)+'F';keke2:=FormatFloat('0.0000',tmp);yuanshi2:=rbuf[4];shangxian2:=rbuf[2]and$7f;xiaxianbyte:=rbuf[3]and$80;ifxiaxianbyte=1thenxiaxian2:=(rbuf[3]and$7f)*(-1)elsexiaxian2:=rbuf[3]and$7f;MessageBeep(0);TMEndSession(session_handle);Done:=True;end;end;end;end;end;end;procedureTForm1.Image1Click(Sender:TObject);begindieer:=true;//全局變量用來動態(tài)顯示溫度柱狀圖end;procedureTForm1.Button2Click(Sender:TObject);varRetValue,i:smallint;PortNum,PortType:smallint;beginif(radiobutton3.Checked)thenbeginedit9.Text:='';edit4.Text:='';edit5.Text:='';edit6.Text:='';edit7.Text:='';edit8.Text:='';RetValue:=TMReadDefaultPort(@PortNum,@PortType);SHandle:=TMExtendedStartSession(PortNum,PortType,NIL);FindFirstFamily($28,SHandle);edit9.Text:=inttostr(fenbianlv1);edit4.Text:=floattostr(gaowei1);edit5.Text:=floattostr(diwei1);edit6.Text:=floattostr(shangxian1);edit7.Text:=floattostr(xiaxian1);edit8.Text:=floattostr(yuanshi1);end;if(radiobutton4.Checked)thenbeginedit9.Text:='';edit4.Text:='';edit5.Text:='';edit6.Text:='';edit7.Text:='';edit8.Text:='';RetValue:=TMReadDefaultPort(@PortNum,@PortType);SHandle:=TMExtendedStartSession(PortNum,PortType,NIL);FindSecondFamily($28,SHandle);edit4.Text:=floattostr(gaowei2);edit9.Text:=floattostr(fenbianlv2);edit5.Text:=floattostr(diwei2);edit6.Text:=floattostr(shangxian2);edit7.Text:=floattostr(xiaxian2);edit8.Text:=floattostr(yuanshi2);end;end;procedureTForm1.Button3Click(Sender:TObject);varn,m,h:integer;o,p:single;a,b:string;beginh:=0;label24.Caption:='50';label25.Caption:='25';label23.Caption:='0';label22.Caption:='50';label26.Caption:='25';label6.Caption:='0';paintbox1.Canvas.Pixels[0,128]:=clBlack;paintbox1.Canvas.Pixels[1,127]:=clBlack;paintbox1.Canvas.Pixels[1,129]:=clBlack;paintbox1.Canvas.Pixels[2,127]:=clBlack;paintbox1.Canvas.Pixels[2,129]:=clBlack;paintbox1.Canvas.Pixels[2,128]:=clBlack;paintbox1.Canvas.MoveTo(0,45);paintbox1.Canvas.LineTo(0,230);paintbox1.Canvas.MoveTo(0,128);paintbox1.Canvas.LineTo(425,128);paintbox1.Canvas.MoveTo(0,230);paintbox1.Canvas.LineTo(425,230);paintbox1.Canvas.MoveTo(0,45);paintbox1.Canvas.LineTo(5,57);paintbox1.Canvas.MoveTo(0,135);paintbox1.Canvas.LineTo(5,147);paintbox1.Canvas.MoveTo(0,200);paintbox1.Canvas.LineTo(7,200);paintbox1.Canvas.MoveTo(0,98);paintbox1.Canvas.LineTo(7,98);paintbox1.Canvas.MoveTo(0,128);table1.Active:=true;table1.First;ifradiobutton5.Checkedthenbeginwhilenottable1.Eofdobegina:=table1.FieldValues['TempC1'];b:=table1.FieldValues['TempC2'];o:=strtofloat(a);p:=strtofloat(b);a:=FormatFloat('00',o);b:=FormatFloat('00',p);n:=128-strtoint(a);h:=h+5;Paintbox1.Canvas.LineTo(h,n);table1.Next;end;end;ifradiobutton6.Checkedthenbeginpaintbox1.Canvas.MoveTo(0,230);whilenottable1.Eofdobegina:=table1.FieldValues['TempC1'];b:=table1.FieldValues['TempC2'];o:=strtofloat(a);p:=strtofloat(b);a:=FormatFloat('00',o);b:=FormatFloat('00',p);m:=230-strtoint(b);h:=h+5;Paintbox1.Canvas.LineTo(h,m);table1.Next;end;end;end;procedureTForm1.Button1Click(Sender:TObject);varrbuf1:array[0..4]ofbyte;l,m,n:integer;o,p,q,z:smallint;RetValue,i:smallint;PortNum,PortType:smallint;rbuf:array[0..9]ofsmallint;CRCByte:Byte;st:longint;rom:array[0..8]ofsmallint;beginl:=strtoint(edit1.Text);m:=strtoint(edit2.Text);n:=strtoint(edit3.Text);ifn=9thenn:=31elseifn=10thenn:=63elseifn=11thenn:=95elseifn=12thenn:=127elsebeginshowmessage('errornumber,pleaseinputtherightnumber(9~12)');halt;end;RetValue:=TMReadDefaultPort(@PortNum,@PortType);//從這里開始不能改有關(guān)時序的問題,改了可能出錯SHandle:=TMExtendedStartSession(PortNum,PortType,NIL);If(SHandle>0)Thenbeginif(TMSetup(SHandle)=1)thenifradiobutton1.Checked=truethen//寫入第一個溫度傳感器 if(TMFirst(SHandle,@stateBuf)=1)then begin if(TMAccess(SHandle,@StateBuf)=1)then begin //i:=TMBlockStream(SHandle,@rbuf1,4); //ifi=4then//beginif(TMTouchByte(SHandle,$4E)>0)then///$4E是寫命令且判斷是否傳遞成功beginif(TMTouchByte(SHandle,l)<0)then//傳遞溫度上限且判斷是否傳遞成功halt;if(TMTouchByte(SHandle,m)=255)then//傳遞溫度下限且判斷是否傳遞成功halt;if(TMTouchByte(SHandle,n)<0)then//傳遞精度且判斷是否傳遞成功halt;end;TMAccess(SHandle,@StateBuf);TMTouchByte(SHandle,$48);//這里是寫道E2Rom里所以用上拉電壓TMOneWireLevel(SHandle,LEVEL_SET,LEVEL_STRONG_PULL_UP,PRIMED_BYTE);st:=GetTickCount+1000;while(GetTickCount<st)do;TMOneWireLevel(SHandle,LEVEL_SET,LEVEL_NORMAL,PRIMED_NONE); //恢復(fù)正常電壓//TMEndSession(SHandle);//ifi>=0then//begin//TMTouchByte(SHandle,$B8);TMAccess(SHandle,@StateBuf);TMTouchByte(SHandle,$BE);CRC8:=0;fori:=0to7dobeginrbuf[i]:=TMTouchByte(SHandle,$FF);//CRCByte:=Byte(rbuf[i]);{thebytetorunthroughCRC8routine}//CRC8:=TMCRC(1,@CRCByte,CRC8,0);end;//end//else//showmessage('errorTM$48');//end //else //showmessage('errortmBlock'); end else showmessage('errorTmAccess'); end else showmessage('errorTMnext');ifradiobutton2.Checked=truethen//寫入第二個溫度傳感器下面就是復(fù)制的代碼if(TMFirst(SHandle,@stateBuf)=1)thenif(TMNext(SHandle,@stateBuf)=1)then begin if(TMAccess(SHandle,@StateBuf)=1)then begin //i:=TMBlockStream(SHandle,@rbuf1,4); //ifi=4then//beginif(TMTouchByte(SHandle,$4E)>0)thenbeginif(TMTouchByte(SHandle,l)<0)thenhalt;if(TMTouchByte(SHandle,m)=255)thenhalt;if(TMTouchByte

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論