基于RS485和VB的遠(yuǎn)程溫度采集系統(tǒng)_第1頁
基于RS485和VB的遠(yuǎn)程溫度采集系統(tǒng)_第2頁
基于RS485和VB的遠(yuǎn)程溫度采集系統(tǒng)_第3頁
基于RS485和VB的遠(yuǎn)程溫度采集系統(tǒng)_第4頁
基于RS485和VB的遠(yuǎn)程溫度采集系統(tǒng)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

基于RS485和VB的遠(yuǎn)程溫度采集系統(tǒng)信息工程學(xué)院生醫(yī)0701摘要:本系統(tǒng)以RS485總線和VB上位機(jī)控制臺(tái)為核心,構(gòu)成了一個(gè)可遠(yuǎn)達(dá)1200M范圍內(nèi)的遠(yuǎn)程溫度采集網(wǎng)絡(luò)。系統(tǒng)通過雙絞線作為信號(hào)傳輸媒介,引入RS485總線信號(hào)傳輸?shù)囊恍┨幚泶胧?,具有良好的信息傳輸?zhǔn)確性和系統(tǒng)抗干擾性。另外,本系統(tǒng)可以在RS485總線上掛接最多由51單片機(jī)和DS18B20構(gòu)成的32個(gè)溫度采集節(jié)點(diǎn),并且系統(tǒng)密切與RS485總線的“輪詢〞思想和VB上位機(jī)控制臺(tái)相結(jié)合,因此可以說是構(gòu)成了真正意義上的遠(yuǎn)程智能溫度采集網(wǎng)絡(luò)!該系統(tǒng)可以廣泛應(yīng)用在需要對(duì)溫度進(jìn)行實(shí)時(shí)和全天候觀察的各種場(chǎng)合,具有較高的實(shí)際應(yīng)用價(jià)值!關(guān)鍵詞:RS485總線輪詢VB上位機(jī)51單片機(jī)DS18B20正文RS485總線接口做為多點(diǎn)、差分?jǐn)?shù)據(jù)傳輸?shù)臉?biāo)準(zhǔn),現(xiàn)已成為業(yè)界應(yīng)用較為廣泛的標(biāo)準(zhǔn)通信接口之一。RS485標(biāo)準(zhǔn)只對(duì)接口的電氣特性做出了規(guī)定,而不涉及接插件、電纜或協(xié)議,因此,用戶可在此根底上建立自己的高層通信協(xié)議。在工業(yè)自動(dòng)控制中,計(jì)算機(jī)通過串口與單片機(jī)系統(tǒng)之間進(jìn)行通信的應(yīng)用越來越廣泛。一般情況下,控制系統(tǒng)需要一個(gè)高級(jí)語言開發(fā)的相當(dāng)于控制臺(tái)的用戶界面,用來進(jìn)行參數(shù)設(shè)置,發(fā)送指令和系統(tǒng)檢測(cè),VB在這一領(lǐng)域用著很強(qiáng)的優(yōu)勢(shì)。從控制臺(tái)發(fā)出的指令經(jīng)過計(jì)算機(jī)串口傳送給單片機(jī)系統(tǒng),此時(shí)VB攜帶的通信控件MSComm起到了橋梁作用,給編程者帶來了極大的方便。DALLAS公司生產(chǎn)的DS18B20可組網(wǎng)數(shù)字溫度傳感器具有“一線總線〞接口、測(cè)溫范圍-55℃~+125℃、固有測(cè)溫分辨率0.5℃、體積小、耐磨耐碰等特點(diǎn),非常適合與傳統(tǒng)的51單片機(jī)構(gòu)成溫度采集節(jié)點(diǎn)。將RS485總線及“輪詢思想〞、VB上位機(jī)控制臺(tái)、51單片機(jī)和DS18B20構(gòu)成的溫度采集節(jié)點(diǎn)有機(jī)的結(jié)合起來就可以構(gòu)成一個(gè)遠(yuǎn)程的智能溫度采集系統(tǒng)。RS485總線1.1RS485總線介紹電子工業(yè)協(xié)會(huì)〔EIA〕于1983年制訂并發(fā)布RS-485標(biāo)準(zhǔn),并經(jīng)通訊工業(yè)協(xié)會(huì)〔TIA〕修訂后命名為TIA/EIA-485-A,習(xí)慣地稱之為RS-485標(biāo)準(zhǔn)。RS-485標(biāo)準(zhǔn)是為彌補(bǔ)RS-232通信距離短、速率低等缺點(diǎn)而產(chǎn)生的。RS-485標(biāo)準(zhǔn)只規(guī)定了平衡發(fā)送器和接收器的電特性,而沒有規(guī)定接插件、傳輸電纜和應(yīng)用層通信協(xié)議。1.2RS485總線獨(dú)特之處RS-485標(biāo)準(zhǔn)與RS-232不一樣,數(shù)據(jù)信號(hào)采用差分傳輸方式〔DifferentialDriverMode〕,也稱作平衡傳輸,它使用一對(duì)雙絞線,將其中一線定義為A,另一線定義為B,如圖1-1所示。圖1-1通常情況下,發(fā)送發(fā)送器A、B之間的正電平在+2~+6V,是一個(gè)邏輯狀態(tài);負(fù)電平在-2~-6V,是另一個(gè)邏輯狀態(tài)。另有一個(gè)信號(hào)地C。在RS-485器件中,一般還有一個(gè)“使能〞控制信號(hào)?!笆鼓塄曅盘?hào)用于控制發(fā)送器與傳輸線的切斷與連接,當(dāng)“使能〞端起作用時(shí),發(fā)送發(fā)送器處于高阻狀態(tài),稱作“第三態(tài)〞,它是有別于邏輯“1〞與“0〞的第三種狀態(tài)。 對(duì)于接收發(fā)送器,也作出與發(fā)送發(fā)送器相對(duì)的規(guī)定,收、發(fā)端通過平衡雙絞線將A-A與B-B對(duì)應(yīng)相連。當(dāng)在接收端A-B之間有大于+200mV的電平時(shí),輸出為正邏輯電平;小于-200mV時(shí),輸出為負(fù)邏輯電平。在接收發(fā)送器的接收平衡線上,電平范圍通常在200mV至6V之間。參見圖1-2所示。圖1-2定義邏輯1〔正邏輯電平〕為B>A的狀態(tài),邏輯0〔負(fù)邏輯電平〕為A>B的狀態(tài),A、B之間的壓差不小于200mV。TIA/EIA-485串行通訊標(biāo)準(zhǔn)的性能如表格1-2所示:規(guī)格TIA/EIA-485傳輸模式平衡電纜長(zhǎng)度@90Kbps4000ft〔1200m〕電纜長(zhǎng)度@10Mbps50ft〔15m〕數(shù)據(jù)傳輸速度10Mbps昀大差動(dòng)輸出±6V昀小差動(dòng)輸出±1.5V接收器敏感度±0.2V發(fā)送器負(fù)載〔歐姆〕60Ω昀大發(fā)送器數(shù)量32單位負(fù)載昀大接收器數(shù)量32單位負(fù)載 RS-485標(biāo)準(zhǔn)的最大傳輸距離約為1219米,最大傳輸速率為10Mbps。通常,RS-485網(wǎng)絡(luò)采用平衡雙絞線作為傳輸媒體。平衡雙絞線的長(zhǎng)度與傳輸速率成反比,只有在20kbps速率以下,才可能使用規(guī)定昀長(zhǎng)的電纜長(zhǎng)度。只有在很短的距離下才能獲得昀高速率傳輸。一般來說,15米長(zhǎng)雙絞線昀大傳輸速率僅為1Mbps。RS-485網(wǎng)絡(luò)采用直線拓樸結(jié)構(gòu),需要安裝2個(gè)終端匹配電阻,其阻值要求等于傳輸電纜的特性阻抗〔一般取值為120Ω〕。在矩距離、或低波特率波數(shù)據(jù)傳輸時(shí)可不需終端匹配。RS485轉(zhuǎn)換器及RS-485網(wǎng)絡(luò)直線拓?fù)浣Y(jié)構(gòu)1.3.1RS485轉(zhuǎn)換器外形圖1.3.2RS485轉(zhuǎn)換器內(nèi)部電路圖1.3.3RS-485網(wǎng)絡(luò)直線拓?fù)浣Y(jié)構(gòu)下位機(jī)RS485通信接口電路較為理想的下位機(jī)RS485通信接口電路本電路采用MAX485作為RS485總線的驅(qū)動(dòng)芯片,如圖1-3所示,將/RE和DE短接,由MCS-51的P1^0端口經(jīng)反相器控制半雙工通信時(shí)接收和發(fā)送的狀態(tài)切換。三極管Q1及電阻R1、R2構(gòu)成反向電路;R3、R4為總線空閑時(shí)的上拉電阻,抗隨機(jī)干擾作用;R7為阻抗匹配電阻,以減小信號(hào)反射;R5、R6及四個(gè)快恢復(fù)穩(wěn)壓管D1~D4均為保護(hù)和抗干擾作用。圖1-3實(shí)驗(yàn)室用下位機(jī)RS485通信接口電路在環(huán)境不是十分惡劣的現(xiàn)場(chǎng)中,可以采用圖1-4中的RS485通信接口電路,圖1-4實(shí)際上就是圖1-3的精簡(jiǎn)版。圖1-4RS485總線軟件設(shè)計(jì)8051串行口的控制存放器SCON是一個(gè)特殊功能存放器,用以設(shè)定串行口的工作方式、接收/發(fā)送控制以及設(shè)置狀態(tài)標(biāo)志:M0和SM1為工作方式選擇位,可選擇四種工作方式:SM2,多機(jī)通信控制位,主要用于方式2和方式3。當(dāng)接收機(jī)的SM2=1時(shí)可以利用收到的RB8來控制是否激活RI〔RB8=0時(shí)不激活RI,收到的信息丟棄;RB8=1時(shí)收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI,進(jìn)而在中斷效勞中將數(shù)據(jù)從SBUF讀走〕。當(dāng)SM2=0時(shí),不管收到的RB8為0和1,均可以使收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI〔即此時(shí)RB8不具有控制RI激活的功能〕。通過控制SM2,可以實(shí)現(xiàn)多機(jī)通信。TB8/RB8在方式2或方式3中,是發(fā)送數(shù)據(jù)的第九位,在多機(jī)通信中,作為地址幀/數(shù)據(jù)幀的標(biāo)志位。RS485總線的程序?qū)崿F(xiàn)流程所有從機(jī)的SM2位置1,處于接收地址幀狀態(tài)。主機(jī)發(fā)送一地址幀,其中8位是地址,第9位為地址/數(shù)據(jù)的區(qū)分標(biāo)志,該位置1表示該幀為地址幀。所有從機(jī)收到地址幀后,都將接收的地址與本機(jī)的地址比擬。對(duì)于地址相符的從機(jī),使自己的SM2位置0〔以接收主機(jī)隨后發(fā)來的數(shù)據(jù)幀〕,并把本站地址發(fā)回主機(jī)作為應(yīng)答;對(duì)于地址不符的從機(jī),仍保持SM2=1,對(duì)主機(jī)隨后發(fā)來的數(shù)據(jù)幀不予理睬。主機(jī)收到從機(jī)應(yīng)答地址后,確認(rèn)地址是否相符,如果地址不符,發(fā)復(fù)位信號(hào)〔數(shù)據(jù)幀中TB8=1〕;如果地址相符,那么清TB8,開始發(fā)送數(shù)據(jù).在前一步的根底上,如果從機(jī)收到的是復(fù)位命令那么回到監(jiān)聽地址狀態(tài)〔SM2=1〕。否那么開始接收數(shù)據(jù)和命令,并相應(yīng)的向上位機(jī)傳送數(shù)據(jù)!從機(jī)發(fā)送數(shù)據(jù)結(jié)束后,置第9位〔TB8〕為1,再發(fā)送一幀校驗(yàn)和給上位機(jī),作為從機(jī)數(shù)據(jù)傳送結(jié)束的標(biāo)志。(可以忽略)主機(jī)接收數(shù)據(jù)時(shí)先判斷數(shù)據(jù)接收標(biāo)志〔RB8〕,假設(shè)RB8=1,表示數(shù)據(jù)傳送結(jié)束,并比擬此幀校驗(yàn)和,假設(shè)正確那么回送正確信號(hào)00H,此信號(hào)命令該從機(jī)復(fù)位〔即重新等待地址幀〕;假設(shè)校驗(yàn)和出錯(cuò),那么發(fā)送FFH,命令該從機(jī)重發(fā)數(shù)據(jù)。假設(shè)接收幀的RB8=0,那么存數(shù)據(jù)到緩沖區(qū),并準(zhǔn)備接收下幀信息?!部梢院雎浴硰臋C(jī)發(fā)送或接收完畢后置SM2=1,繼續(xù)地址偵聽。主機(jī)發(fā)送或接收完畢后修改MSComm的Settings屬性為〞9600,M,8,1〞,并退出本次通信。發(fā)送另一從機(jī)地址幀準(zhǔn)備進(jìn)行一次通信。RS485總線接口程序清單#include<reg51.h>#include<absacc.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitRT=P2^0;//MAX485收發(fā)控制位,低--接收,高---發(fā)送ucharqian,bai,shi,ge,data_crc;uintflag; //flag為從機(jī)地址驗(yàn)證正確標(biāo)志位voiddelay(uintz){ uintx,y; for(x=0;x<z;x++) for(y=0;y<110;y++) ;}/***************************************************串行口中斷子程序****************************************************/voidserial(void)interrupt4using1{ RI=0; ES=0;//一進(jìn)入中斷就把ES=0,這好似是比擬合理的方式---出自CNKI的優(yōu)質(zhì)PDF if(SBUF==0x04)//地址驗(yàn)證 { TB8=1;//**其實(shí)從機(jī)的第九位似乎根本起不到什么作用! /***********************************************************************這里要想讓發(fā)送的數(shù)據(jù)在上位機(jī)上正常顯示的話,必須使TB8=1,但是有些情況那么必須使TB8=0,以后我們可以兩種情況都試一下以保證數(shù)據(jù)的正常顯示;〔這好似于上位機(jī)軟件的工作方式有關(guān)〕當(dāng)上位機(jī)接收界面出現(xiàn)"???"時(shí),我們可以馬上更改TB8位的值,以期到達(dá)正確顯示的目的! **********************************************************************/ P1=0xfe;//從機(jī)與主機(jī)建立連接的標(biāo)志 SM2=0;//以后就可以直接接收主機(jī)發(fā)來的命令 flag=1; RT=1;//下面局部為向上位機(jī)返回自己的地址 SBUF=48; while(TI!=1);TI=0; SBUF=48+4; while(TI!=1);TI=0; RT=0; TB8=0; } if(flag==1) { if(SBUF==0x21)//要求從機(jī)發(fā)送數(shù)據(jù)的功能指令 { TB8=0;RT=1; data_crc=(qian+bai+shi+ge)%10; SBUF=48+qian;//向主機(jī)發(fā)送信息 while(TI!=1);TI=0; SBUF=48+data_crc;//JIAOYAN---->Thesecondbitwhile(TI!=1);TI=0; SBUF=48+bai;//向主機(jī)發(fā)送信息 while(TI!=1);TI=0; SBUF=48+shi;//向主機(jī)發(fā)送信息 while(TI!=1);TI=0; SBUF=48+ge;//向主機(jī)發(fā)送信息 while(TI!=1);TI=0; SBUF='';//向主機(jī)發(fā)送信息 while(TI!=1);TI=0; RT=0; TB8=0; } if(SBUF==0x30)//預(yù)定的結(jié)束通信指令 { TB8=0;//其實(shí)這里我們可以不管TB8,因?yàn)槌跏蓟臅r(shí)候TB8=0; RT=0; SM2=1; flag=0; P1=0xff; } } ES=1; }/**********************主程序局部************************************/voidmain(void){ TMOD=0x20; TL1=0xfd; TH1=0xfd;PCON=0x00; //SCON=0xf0; SM0=1;SM1=1; SM2=1; REN=1; EA=1; ES=1;TR1=1; RT=0;//接收/發(fā)送數(shù)據(jù)控制位,初始化為接收while(1) {}}VB上位機(jī)控制臺(tái)AT89S52與電腦的通信接口芯片比擬:綜合觀察比擬,我們可以利用“校驗(yàn)位〞模擬單片機(jī)的TB8/RB8.具體就是發(fā)送地址的時(shí)候校驗(yàn)位設(shè)定為〞M〞(值為1),發(fā)送指令的時(shí)候校驗(yàn)位設(shè)定為〞S〞〔值為0〕;VBMSComm通信控件的屬性及參數(shù)設(shè)置Commport設(shè)置翻開端口號(hào)位1或2,3,4;Handshaking=0時(shí)無握手協(xié)議;InBufferSize=1024,接收緩沖區(qū)中字節(jié)數(shù);InputLen=1,設(shè)置一次接收緩沖字節(jié)數(shù)位1;InputMode=0表示數(shù)據(jù)通過Input屬性以文本形式取回,為1表示數(shù)據(jù)通過Input屬性以二進(jìn)制形式取回;OutBufferSize=512,設(shè)置并返回傳輸緩沖區(qū)的大??;Rhtreshold=1,在發(fā)生接收事件后并觸發(fā)OnComm事件之前,設(shè)置并返回要接收的字節(jié)數(shù)。即接收緩沖區(qū)收到每一個(gè)字節(jié)后都會(huì)使MSComm控件產(chǎn)生OnComm事件。RTSEnable=False,假設(shè)設(shè)為True那么會(huì)發(fā)送信息到調(diào)制解調(diào)器,而不是通過串口通信;Setting=〞9600,N,8,1〞,設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位參數(shù)。9600,N,8,1即波特率為9600,無奇偶校驗(yàn),8個(gè)數(shù)據(jù)位,1個(gè)停止位;Sthreshold=0(缺省值),數(shù)據(jù)傳輸事件不會(huì)產(chǎn)生OnComm事件。假設(shè)設(shè)置Sthreshold屬性為1,當(dāng)傳輸緩沖區(qū)完全為空時(shí),MSComm控件產(chǎn)生OnComm事件。主從式多機(jī)通信中,必須為每個(gè)從機(jī)分配不同的地址,主機(jī)通過發(fā)送地址與從機(jī)取得聯(lián)絡(luò)后再與該從機(jī)進(jìn)行數(shù)據(jù)幀或命令幀的交互,MCS-51中可通過靈活地控制串行口控制器SCON的SM2位和發(fā)送/接收的第9位TB8/RB8來區(qū)分地址或數(shù)據(jù)信息。本系統(tǒng)中以PC機(jī)為主機(jī),使用VB6.0的MSComm控件與單片機(jī)通信,PC機(jī)要區(qū)分下發(fā)的是地址信息還是數(shù)據(jù)信息,是通過設(shè)置MSComm控件Settings屬性中的奇偶校驗(yàn)位來巧妙實(shí)現(xiàn)的。發(fā)送地址時(shí)設(shè)置為M,即Settings=“9600,M,8,1〞,那么主機(jī)發(fā)送地址時(shí)置發(fā)送的第9位為1;發(fā)送數(shù)據(jù)時(shí),設(shè)置為S,那么主機(jī)在每個(gè)字節(jié)數(shù)據(jù)時(shí)置發(fā)送的第9位為0;由于上位機(jī)中數(shù)據(jù)的發(fā)送和接收涉及到的情形比擬多,因此在這里不詳加介紹。關(guān)于這方面比擬好的論文有深圳職業(yè)技術(shù)學(xué)院溫曉軍的《VB在串行通信中的應(yīng)用》,當(dāng)然該論文講得比擬淺顯,如果想要更深入的了解學(xué)習(xí)必須參看更多其它相關(guān)資料。VB上位機(jī)控制臺(tái)及軟件特色用VB6.0編寫的上位機(jī)控制臺(tái)如圖1-5所示。圖1-5軟件特色解析:“通信設(shè)置〞區(qū)域該區(qū)域可進(jìn)行串口號(hào)、波特率、數(shù)據(jù)位數(shù)、停止位數(shù)以及地址/數(shù)據(jù)幀設(shè)置。這些是通過MSComm控件的Settings屬性來實(shí)現(xiàn)的。通常,在某些情況下我們會(huì)結(jié)合下位機(jī)進(jìn)行波特率的修改,其它幾個(gè)參數(shù)保持不變?!肮?jié)點(diǎn)檢測(cè)〞區(qū)域該區(qū)域可進(jìn)行下位機(jī)節(jié)點(diǎn)是否正常性檢查,做為后面節(jié)點(diǎn)選擇的依據(jù)。在實(shí)際操作的時(shí)候是這樣實(shí)現(xiàn)的:上位機(jī)發(fā)送從機(jī)地址并開啟一個(gè)定時(shí)器,如果在500ms內(nèi)收到了從機(jī)的應(yīng)答地址那么彈出提示框“正常工作!〞,否那么彈出提示框“非正常工作!〞?!跋挛粰C(jī)節(jié)點(diǎn)〞區(qū)域該區(qū)域可進(jìn)行下位機(jī)節(jié)點(diǎn)選擇、“輪詢〞時(shí)間間隔設(shè)置和目標(biāo)數(shù)據(jù)以Excel保存的名稱和位置設(shè)置。在這里可以將所選擇的下位機(jī)節(jié)點(diǎn)一天24小時(shí)所采集的溫度數(shù)據(jù)連續(xù)保存在所指定的Excel表格中,以供后續(xù)的數(shù)據(jù)分析。該區(qū)域功能的實(shí)現(xiàn)主要通過數(shù)組及相應(yīng)算法、定時(shí)器、VB調(diào)用Excel表格的靈活組合應(yīng)用來完成的。實(shí)現(xiàn)效果如圖1-6、圖1-7所示。圖1-6圖1-7(4) “節(jié)點(diǎn)顯示單元〞區(qū)域通過該區(qū)域可以實(shí)時(shí)的觀察所選擇節(jié)點(diǎn)的溫度數(shù)據(jù)。(5) 其它特性該上位機(jī)軟件還具有端口開閉檢測(cè)能力和突發(fā)事件處理能力。這里著重介紹一下突發(fā)事件處理能力。該上位機(jī)軟件的突發(fā)事件處理能力表達(dá)在中選擇的某一個(gè)下位機(jī)節(jié)點(diǎn)出現(xiàn)崩潰的時(shí)候可以很好的進(jìn)行應(yīng)急處理,從而防止對(duì)整個(gè)系統(tǒng)造成影響。該功能同樣是通過定時(shí)器的靈活應(yīng)用來實(shí)現(xiàn)的。下位機(jī)溫度采集節(jié)點(diǎn)微處理器目前微處理器領(lǐng)域最火爆的莫過于32位的ARM,但出于本系統(tǒng)對(duì)微處理要求不高和性價(jià)比的考慮,因此選擇傳統(tǒng)的8051單片機(jī).。本系統(tǒng)選擇國產(chǎn)宏晶STC89C52RC,不選擇AT89S52是因?yàn)閮烧咝阅芨疽粯?,但STC價(jià)格廉價(jià)一半。STC89C52具有如下特點(diǎn):40個(gè)引腳,8kBytesFlash片內(nèi)程序存儲(chǔ)器,512bytes的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器〔RAM〕,32個(gè)外部雙向輸入/輸出〔I/O〕口,5個(gè)中斷優(yōu)先級(jí)2層中斷嵌套中斷,3個(gè)16位可編程定時(shí)計(jì)數(shù)器,2個(gè)全雙工串行通信口,看門狗〔WDT〕電路,片內(nèi)時(shí)鐘振蕩器??梢钥闯鯯TC89C52完全滿足系統(tǒng)對(duì)微處理的要求。DS18B20DS18B20特性簡(jiǎn)介DALLAS半導(dǎo)體公司的數(shù)字化溫度傳感器DS1820是世界上第一片支持“一線總線〞接口的溫度傳感器。一線總線獨(dú)特而且經(jīng)濟(jì)的特點(diǎn),使用戶可以輕松的組建傳感器網(wǎng)絡(luò),為測(cè)量系統(tǒng)的構(gòu)建引入全新概念?,F(xiàn)在新一代DS18B20體積更小、更經(jīng)濟(jì)、更靈活,使你可以充分發(fā)揮“一線總線〞的長(zhǎng)處。DS18B20的具體特性如下:獨(dú)特的單線接口僅需一個(gè)端口引腳進(jìn)行通訊簡(jiǎn)單的多點(diǎn)分布應(yīng)用無需外部器件可通過數(shù)據(jù)線供電零待機(jī)功耗測(cè)溫范圍-55~+125攝氏度,以0.5攝氏度遞增9~12位可選分辨率溫度數(shù)字量轉(zhuǎn)換時(shí)間200ms(典型值)用戶可定義的非易失性溫度報(bào)警設(shè)置應(yīng)用包括溫度控制、工業(yè)系統(tǒng)、消費(fèi)品、溫度計(jì)或任何熱感測(cè)系統(tǒng)DS18B20典型應(yīng)用電路 上圖是通過VDD引腳引入一個(gè)外部電源,這樣做的好處是I/O線上不需要加強(qiáng)上拉,而且總線控制器不用在溫度轉(zhuǎn)換期間總保持高電平。這樣在轉(zhuǎn)換期間可以允許在單線總線上進(jìn)行其它數(shù)據(jù)往來。另外,在單線總線上可以掛任意多片DS18B20,并且如果它們使用外部電源的話,就可以先發(fā)一個(gè)SkipROM命令,再接一個(gè)ConvertT命令,讓它們同時(shí)進(jìn)行溫度轉(zhuǎn)化。注意當(dāng)加上外部電源時(shí),GND引腳不能懸空。51單片機(jī)驅(qū)動(dòng)DS18B20溫度轉(zhuǎn)化流程圖51單片機(jī)和DS18B20溫度采集局部程序清單#include<reg51.h>#include<intrins.h>#include<stdio.h>#include<math.h>#defineucharunsignedchar#defineuintunsignedintsbitDS=P3^2;//DS18b20的數(shù)據(jù)線端口sbitkey=P3^3;ucharcodetable0[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0到9與“-〞編碼ucharcodetable3[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E,0xff};//共陽帶小數(shù)點(diǎn)段選ucharcodetable1[8]={0x28,0x1e,0x45,0xe9,0x00,0x00,0x00,0xb7};//兩1820的ROM編碼,可在單個(gè)時(shí)用readrom讀出ucharcodetable2[8]={0x28,0x87,0x3f,0x08,0x02,0x00,0x00,0xc9};ucharzf_flag=0,temph,templ,ge,shi,bai,qian;ucharchoose=0;//1-wire總線,尋訪不同1820的標(biāo)志位inttemper;//溫度真實(shí)值/********************************************************函數(shù)名稱:delay_us(uintt)入口參數(shù):t出口參數(shù):無注備:此程序是為了1wire總線寫時(shí)的us級(jí)延時(shí)而寫的; 其中在外部晶振為11.0592MHz時(shí),每次進(jìn)入函數(shù) 大約要18us左右,每次循環(huán)大約13us左右********************************************************/voiddelay_us(uintt) { uinti; for(i=0;i<t;i++); }/********************************************************函數(shù)名稱:delay_nms(uintt)入口參數(shù):t出口參數(shù):無注 備:毫秒級(jí)軟件延時(shí)********************************************************/voiddelay_nms(uintt) { uinti; ucharj; for(i=0;i<t;i++) for(j=0;j<110;j++); }/********************************************************函數(shù)名稱:reset_1820()入口參數(shù):無出口參數(shù):bit一位數(shù):返回1,初始化成功;返回0,初始化失敗注 備:這里主要要注意的是延時(shí)的問題********************************************************/bitresert_1820() { DS=1; _nop_();//MCU將DS拉低后,要保持至少大于1us,數(shù)據(jù)手冊(cè)上說的。 _nop_();//這里為確保穩(wěn)定延時(shí)2us左右 DS=0; delay_us(55);//這里延時(shí)大約750us左右 DS=1; // delay_us(2);//這里大約50us左右---********適當(dāng)調(diào)整! delay_us(3); if(!DS){delay_us(50);//這個(gè)延時(shí)很重要?。。?50us!!*****可能有點(diǎn)偏長(zhǎng)!DS=1; //一定要在初始化完成后將DS置1,以釋放總線return1;} else return0; }/********************************************************函數(shù)名稱:write_bit(bitwei)入口參數(shù):bitwei出口參數(shù):無注 備:********************************************************/voidwrite_bit(bitwei) { DS=1; DS=0; _nop_(); //MCU將DS拉低后,要保持至少大于1us,數(shù)據(jù)手冊(cè)上說的。 _nop_(); //這里為確保穩(wěn)定延時(shí)2us左右 if(wei) DS=1; elseDS=0; delay_us(6);//*************大概81us DS=1; _nop_(); }/********************************************************函數(shù)名稱:read_bit()入口參數(shù):無出口參數(shù):bit一位注 備:********************************************************/bitread_bit()//初期寫程序出問題處?。。。。。。。。?{ DS=1; DS=0; _nop_();_nop_();//MCU將DS拉低后,要保持至少大于1us,數(shù)據(jù)手冊(cè)上說的。//這里為確保穩(wěn)定延時(shí)2us左右DS=1; //這里必須拉高:讓MCU釋放總線,好讓DS18B20利用總線回送數(shù)據(jù) _nop_();_nop_();//等待一定時(shí)間,讓DS18B20回送的數(shù)據(jù)穩(wěn)定_nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); returnDS; }/********************************************************函數(shù)名稱:write_byte(ucharbyte)入口參數(shù):byte出口參數(shù):無注備:DB18B20寫入數(shù)據(jù)或讀出數(shù)據(jù)都是從最低位開始的********************************************************/voidwrite_byte(ucharbyte){ bitflag1; uchari,temp;temp=byte; for(i=0;i<8;i++) { temp=(temp>>1);//DB18B20寫入數(shù)據(jù)或讀出數(shù)據(jù)都是從最低位開始的 flag1=CY; /***********這種方式還是不錯(cuò)的!*/ write_bit(flag1); } }/********************************************************函數(shù)名稱:read_byte()入口參數(shù):無出口參數(shù):byte型注備:DB18B20寫入數(shù)據(jù)或讀出數(shù)據(jù)都是從最低位開始的********************************************************/ucharread_byte() { bitflag2; uchari,j,temp; for(i=0;i<8;i++) { temp=(temp>>1); flag2=read_bit(); if(flag2)/*******中間變量對(duì)一個(gè)位進(jìn)行操作!*/ j=0x80; else j=0x00; temp=temp|j; } returntemp; }/********************************************************函數(shù)名稱:uint conversion(ucharh_byte,ucharl_byte)入口參數(shù):ucharh_byte,ucharl_byte出口參數(shù):uint型注備:將DB18B20讀出的數(shù)據(jù)轉(zhuǎn)化為真正的溫度值********************************************************/uintconversion(ucharh_byte,ucharl_byte){ intwendu; floattt;//注意數(shù)據(jù)類型對(duì)運(yùn)算的影響?。。。。。。。?! if(h_byte<7||h_byte==7) { zf_flag=0; //溫度正負(fù)標(biāo)志位:1,為負(fù);0,為正 wendu=h_byte; //將讀入的帶字符的高字節(jié)放入int型溫度變量中 wendu=wendu<<8; //將其左移八位,讓其進(jìn)入高字節(jié) wendu=wendu|l_byte; //并與溫度的低字節(jié)相或,湊成整型值 tt=wendu*0.0625; //乘

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論