基于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頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 基于RS485和VB的遠(yuǎn)程溫度采集系統(tǒng) 信息工程學(xué)院生醫(yī)0701摘要:本系統(tǒng)以RS485總線和VB上位機控制臺為核心,構(gòu)成了一個可遠(yuǎn)達(dá)1200M范圍內(nèi)的遠(yuǎn)程溫度采集網(wǎng)絡(luò)。系統(tǒng)通過雙絞線作為信號傳輸媒介,引入RS485總線信號傳輸?shù)囊恍┨幚泶胧?,具有良好的信息傳輸?zhǔn)確性和系統(tǒng)抗干擾性。另外,本系統(tǒng)可以在RS485總線上掛接最多由51單片機和DS18B20構(gòu)成的32個溫度采集節(jié)點,并且系統(tǒng)密切與RS485總線的“輪詢”思想和VB上位機控制臺相結(jié)合,因此可以說是構(gòu)成了真正意義上的遠(yuǎn)程智能溫度采集網(wǎng)絡(luò)!該系統(tǒng)可以廣泛應(yīng)用在需要對溫度進(jìn)行實時和全天候觀察的各種場合,具有較高的實際應(yīng)用價值!關(guān)鍵詞:RS

2、485總線 輪詢 VB上位機 51單片機 DS18B20 正文 RS485總線接口做為多點、差分?jǐn)?shù)據(jù)傳輸?shù)囊?guī)范,現(xiàn)已成為業(yè)界應(yīng)用較為廣泛的標(biāo)準(zhǔn)通信接口之一。RS485標(biāo)準(zhǔn)只對接口的電氣特性做出了規(guī)定,而不涉及接插件、電纜或協(xié)議,因此,用戶可在此基礎(chǔ)上建立自己的高層通信協(xié)議。在工業(yè)自動控制中,計算機通過串口與單片機系統(tǒng)之間進(jìn)行通信的應(yīng)用越來越廣泛。一般情況下,控制系統(tǒng)需要一個高級語言開發(fā)的相當(dāng)于控制臺的用戶界面,用來進(jìn)行參數(shù)設(shè)置,發(fā)送指令和系統(tǒng)檢測,VB在這一領(lǐng)域用著很強的優(yōu)勢。從控制臺發(fā)出的指令經(jīng)過計算機串口傳送給單片機系統(tǒng),此時VB攜帶的通信控件MSComm起到了橋梁作用,給編程者帶來了極大

3、的方便。DALLAS公司生產(chǎn)的 DS18B20可組網(wǎng)數(shù)字溫度傳感器具有“一線總線”接口、測溫范圍 55125、固有測溫分辨率0.5、體積小、耐磨耐碰等特點,非常適合與傳統(tǒng)的51單片機構(gòu)成溫度采集節(jié)點。將RS485總線及“輪詢思想”、VB上位機控制臺、51單片機和DS18B20構(gòu)成的溫度采集節(jié)點有機的結(jié)合起來就可以構(gòu)成一個遠(yuǎn)程的智能溫度采集系統(tǒng)。RS485總線1.1 RS485總線介紹電子工業(yè)協(xié)會 (EIA) 于 1983年制訂并發(fā)布 RS-485 標(biāo)準(zhǔn),并經(jīng)通訊工業(yè)協(xié)會( TIA)修訂后命名為 TIA/EIA-485-A,習(xí)慣地稱之為 RS-485標(biāo)準(zhǔn)。RS-485標(biāo)準(zhǔn)是為彌補 RS-232

4、通信距離短、速率低等缺點而產(chǎn)生的。 RS-485標(biāo)準(zhǔn)只規(guī)定了平衡發(fā)送器和接收器的電特性,而沒有規(guī)定接插件、傳輸電纜和應(yīng)用層通信協(xié)議。1.2 RS485總線獨特之處RS-485標(biāo)準(zhǔn)與 RS-232不一樣,數(shù)據(jù)信號采用差分傳輸方式( Differential Driver Mode),也稱作平衡傳輸,它使用一對雙絞線,將其中一線定義為 A,另一線定義為 B,如圖1-1所示。 圖 1-1通常情況下,發(fā)送發(fā)送器 A、B之間的正電平在+2+6V,是一個邏輯狀態(tài);負(fù)電平在 -2-6V,是另一個邏輯狀態(tài)。另有一個信號地 C。在 RS-485器件中,一般還有一個“使能”控制信號?!笆鼓堋毙盘栍糜诳刂瓢l(fā)送器與傳

5、輸線的切斷與連接,當(dāng)“使能”端起作用時,發(fā)送發(fā)送器處于高阻狀態(tài),稱作“第三態(tài)”,它是有別于邏輯“ 1”與“ 0”的第三種狀態(tài)。 對于接收發(fā)送器,也作出與發(fā)送發(fā)送器相對的規(guī)定,收、發(fā)端通過平衡雙絞線將 A-A與 B-B對應(yīng)相連。當(dāng)在接收端 A-B之間有大于+200mV的電平時,輸出為正邏輯電平;小于-200mV時,輸出為負(fù)邏輯電平。在接收發(fā)送器的接收平衡線上,電平范圍通常在 200mV至 6V之間。參見圖 1-2所示。 圖1-2定義邏輯 1(正邏輯電平)為 BA的狀態(tài),邏輯 0(負(fù)邏輯電平)為 AB的狀態(tài), A、B之間的壓差不小于 200mV。 TIA/EIA-485串行通訊標(biāo)準(zhǔn)的性能如表格 1

6、-2所示:規(guī)格 TIA/EIA-485 傳輸模式 平衡 電纜長度90Kbps 4000 ft(1200m) 電纜長度10Mbps 50 ft(15m) 數(shù)據(jù)傳輸速度 10 Mbps 昀大差動輸出 6V 昀小差動輸出 1.5V 接收器敏感度 0.2 V 發(fā)送器負(fù)載(歐姆) 60 昀大發(fā)送器數(shù)量 32 單位負(fù)載 昀大接收器數(shù)量 32 單位負(fù)載 RS-485標(biāo)準(zhǔn)的最大傳輸距離約為 1219米,最大傳輸速率為 10Mbps。通常,RS-485網(wǎng)絡(luò)采用平衡雙絞線作為傳輸媒體。平衡雙絞線的長度與傳輸速率成反比,只有在 20kbps速率以下,才可能使用規(guī)定昀長的電纜長度。只有在很短的距離下才能獲得昀高速率傳

7、輸。一般來說,15米長雙絞線昀大傳輸速率僅為 1Mbps。RS-485網(wǎng)絡(luò)采用直線拓樸結(jié)構(gòu),需要安裝 2個終端匹配電阻,其阻值要求等于傳輸電纜的特性阻抗(一般取值為 120)。在矩距離、或低波特率波數(shù)據(jù)傳輸時可不需終端匹配。 RS485轉(zhuǎn)換器及RS-485網(wǎng)絡(luò)直線拓?fù)浣Y(jié)構(gòu)1.3.1 RS485轉(zhuǎn)換器外形圖1.3.2 RS485轉(zhuǎn)換器內(nèi)部電路圖1.3.3 RS-485網(wǎng)絡(luò)直線拓?fù)浣Y(jié)構(gòu)下位機RS485通信接口電路較為理想的下位機RS485通信接口電路本電路采用 MAX485作為 RS485總線的驅(qū)動芯片,如圖1-3所示,將/RE和DE短接,由MCS-51的P10端口經(jīng)反相器控制半雙工通信時接收和發(fā)

8、送的狀態(tài)切換。三極管Q1及電阻R1、R2構(gòu)成反向電路;R3、R4為總線空閑時的上拉電阻,抗隨機干擾作用;R7為阻抗匹配電阻,以減小信號反射;R5、R6及四個快恢復(fù)穩(wěn)壓管D1D4均為保護(hù)和抗干擾作用。 圖1-3實驗室用下位機RS485通信接口電路在環(huán)境不是十分惡劣的現(xiàn)場中,可以采用圖1-4中的RS485通信接口電路,圖1-4實際上就是圖1-3的精簡版。圖1-4RS485總線軟件設(shè)計8051串行口的控制寄存器SCON 是一個特殊功能寄存器,用以設(shè)定串行口的工作方式、接收/發(fā)送控制以及設(shè)置狀態(tài)標(biāo)志:M0和SM1為工作方式選擇位,可選擇四種工作方式:SM2,多機通信控制位,主要用于方式2和方式3。當(dāng)接

9、收機的SM2=1時可以利用收到的RB8來控制是否激活RI(RB80時不激活RI,收到的信息丟棄;RB81時收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI,進(jìn)而在中斷服務(wù)中將數(shù)據(jù)從SBUF讀走)。當(dāng)SM2=0時,不論收到的RB8為0和1,均可以使收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI(即此時RB8不具有控制RI激活的功能)。通過控制SM2,可以實現(xiàn)多機通信。TB8/RB8在方式2或方式3中,是發(fā)送數(shù)據(jù)的第九位,在多機通信中,作為地址幀/數(shù)據(jù)幀的標(biāo)志位。RS485總線的程序?qū)崿F(xiàn)流程所有從機的SM2位置1,處于接收地址幀狀態(tài)。主機發(fā)送一地址幀,其中8位是地址,第9位為地址/數(shù)據(jù)的區(qū)分標(biāo)志,該位置1表示該幀為地址幀。

10、所有從機收到地址幀后,都將接收的地址與本機的地址比較。對于地址相符的從機,使自己的SM2位置0(以接收主機隨后發(fā)來的數(shù)據(jù)幀),并把本站地址發(fā)回主機作為應(yīng)答;對于地址不符的從機,仍保持SM2=1,對主機隨后發(fā)來的數(shù)據(jù)幀不予理睬。主機收到從機應(yīng)答地址后,確認(rèn)地址是否相符,如果地址不符,發(fā)復(fù)位信號(數(shù)據(jù)幀中TB8=1);如果地址相符,則清TB8,開始發(fā)送數(shù)據(jù).在前一步的基礎(chǔ)上,如果從機收到的是復(fù)位命令則回到監(jiān)聽地址狀態(tài)(SM2=1)。否則開始接收數(shù)據(jù)和命令,并相應(yīng)的向上位機傳送數(shù)據(jù)!從機發(fā)送數(shù)據(jù)結(jié)束后,置第9位(TB8)為1,再發(fā)送一幀校驗和給上位機,作為從機數(shù)據(jù)傳送結(jié)束的標(biāo)志。 (可以忽略)主機接

11、收數(shù)據(jù)時先判斷數(shù)據(jù)接收標(biāo)志(RB8),若RB8=1,表示數(shù)據(jù)傳送結(jié)束,并比較此幀校驗和,若正確則回送正確信號00H,此信號命令該從機復(fù)位(即重新等待地址幀);若校驗和出錯,則發(fā)送FFH,命令該從機重發(fā)數(shù)據(jù)。若接收幀的RB8=0,則存數(shù)據(jù)到緩沖區(qū),并準(zhǔn)備接收下幀信息。(可以忽略)從機發(fā)送或接收完畢后置SM2=1,繼續(xù)地址偵聽。主機發(fā)送或接收完畢后修改MSComm的Settings屬性為”9600,M,8,1”,并退出本次通信。發(fā)送另一從機地址幀準(zhǔn)備進(jìn)行一次通信。RS485總線接口程序清單#include#include#include#define uchar unsigned char#def

12、ine uint unsigned intsbit RT=P20; / MAX485收發(fā)控制位,低-接收,高發(fā)送 uchar qian,bai,shi,ge,data_crc; uint flag; /flag為從機地址驗證正確標(biāo)志位 void delay(uint z) uint x,y;for(x=0;xz;x+) for(y=0;yThe second bitwhile(TI!=1);TI=0;SBUF=48+bai;/向主機發(fā)送信息 while(TI!=1);TI=0;SBUF=48+shi;/向主機發(fā)送信息 while(TI!=1);TI=0;SBUF=48+ge;/向主機發(fā)送信息

13、while(TI!=1);TI=0;SBUF= ;/向主機發(fā)送信息 while(TI!=1);TI=0;RT=0;TB8=0; if(SBUF=0 x30) /預(yù)定的結(jié)束通信指令 TB8=0; /其實這里我們可以不管TB8,因為初始化的時候TB8=0;RT=0;SM2=1; flag=0;P1=0 xff; ES=1; /*主程序部分*/void main(void) TMOD=0 x20; TL1=0 xfd; TH1=0 xfd; PCON=0 x00; /SCON=0 xf0; SM0=1 ; SM1=1; SM2=1; REN=1; EA=1; ES=1; TR1=1; RT=0; /

14、 接收/發(fā)送數(shù)據(jù)控制位,初始化為接收 while(1) VB上位機控制臺AT89S52與電腦的通信接口芯片比較:綜合觀察比較,我們可以利用“校驗位”模擬單片機的TB8/RB8.具體就是發(fā)送地址的時候校驗位設(shè)定為”M”(值為1),發(fā)送指令的時候校驗位設(shè)定為”S”(值為0);VB MSComm通信控件的屬性及參數(shù)設(shè)置Commport設(shè)置打開端口號位1或2,3,4;Handshaking=0時無握手協(xié)議;InBufferSize=1024,接收緩沖區(qū)中字節(jié)數(shù);InputLen=1,設(shè)置一次接收緩沖字節(jié)數(shù)位1;InputMode=0表示數(shù)據(jù)通過Input屬性以文本形式取回,為1表示數(shù)據(jù)通過Input屬

15、性以二進(jìn)制形式取回;OutBufferSize=512,設(shè)置并返回傳輸緩沖區(qū)的大??;Rhtreshold=1,在發(fā)生接收事件后并觸發(fā)OnComm事件之前,設(shè)置并返回要接收的字節(jié)數(shù)。即接收緩沖區(qū)收到每一個字節(jié)后都會使MSComm控件產(chǎn)生OnComm事件。RTSEnable=False,若設(shè)為True則會發(fā)送信息到調(diào)制解調(diào)器,而不是通過串口通信;Setting=”9600,N,8,1”,設(shè)置并返回波特率、奇偶校驗、數(shù)據(jù)位、停止位參數(shù)。9600,N,8,1即波特率為9600,無奇偶校驗,8個數(shù)據(jù)位,1個停止位;Sthreshold=0( 缺省值),數(shù)據(jù)傳輸事件不會產(chǎn)生OnComm事件。若設(shè)置Sthr

16、eshold屬性為1,當(dāng)傳輸緩沖區(qū)完全為空時,MSComm控件產(chǎn)生OnComm事件。主從式多機通信中,必須為每個從機分配不同的地址,主機通過發(fā)送地址與從機取得聯(lián)絡(luò)后再與該從機進(jìn)行數(shù)據(jù)幀或命令幀的交互,MCS-51中可通過靈活地控制串行口控制器 SCON的 SM2位和發(fā)送/接收的第 9位 TB8/RB8來區(qū)分地址或數(shù)據(jù)信息。本系統(tǒng)中以 PC機為主機,使用 VB6.0的 MSComm控件與單片機通信,PC機要區(qū)分下發(fā)的是地址信息還是數(shù)據(jù)信息,是通過設(shè)置 MSComm控件Settings屬性中的奇偶校驗位來巧妙實現(xiàn)的。發(fā)送地址時設(shè)置為 M,即 Settings =“9600,M, 8,1”,則主機發(fā)

17、送地址時置發(fā)送的第 9位為 1;發(fā)送數(shù)據(jù)時,設(shè)置為 S,則主機在每個字節(jié)數(shù)據(jù)時置發(fā)送的第 9位為 0;由于上位機中數(shù)據(jù)的發(fā)送和接收涉及到的情形比較多,因此在這里不詳加介紹。關(guān)于這方面比較好的論文有深圳職業(yè)技術(shù)學(xué)院溫曉軍的VB在串行通信中的應(yīng)用,當(dāng)然該論文講得比較淺顯,如果想要更深入的了解學(xué)習(xí)必須參看更多其它相關(guān)資料。VB上位機控制臺及軟件特色用VB6.0編寫的上位機控制臺如圖1-5所示。 圖1-5軟件特色解析:“通信設(shè)置”區(qū)域該區(qū)域可進(jìn)行串口號、波特率、數(shù)據(jù)位數(shù)、停止位數(shù)以及地址/數(shù)據(jù)幀設(shè)置。這些是通過MSComm控件的Settings屬性來實現(xiàn)的。通常,在某些情況下我們會結(jié)合下位機進(jìn)行波特率

18、的修改,其它幾個參數(shù)保持不變?!肮?jié)點檢測”區(qū)域該區(qū)域可進(jìn)行下位機節(jié)點是否正常性檢查,做為后面節(jié)點選擇的依據(jù)。在實際操作的時候是這樣實現(xiàn)的:上位機發(fā)送從機地址并開啟一個定時器,如果在500ms內(nèi)收到了從機的應(yīng)答地址則彈出提示框“正常工作!”,否則彈出提示框“非正常工作!”?!跋挛粰C節(jié)點”區(qū)域該區(qū)域可進(jìn)行下位機節(jié)點選擇、“輪詢”時間間隔設(shè)置和目標(biāo)數(shù)據(jù)以Excel保存的名稱和位置設(shè)置。在這里可以將所選擇的下位機節(jié)點一天24小時所采集的溫度數(shù)據(jù)連續(xù)保存在所指定的Excel表格中,以供后續(xù)的數(shù)據(jù)分析。該區(qū)域功能的實現(xiàn)主要通過數(shù)組及相應(yīng)算法、定時器、VB調(diào)用Excel表格的靈活組合應(yīng)用來完成的。實現(xiàn)效果如

19、圖1-6、圖1-7所示。圖1-6圖1-7(4)“節(jié)點顯示單元”區(qū)域通過該區(qū)域可以實時的觀察所選擇節(jié)點的溫度數(shù)據(jù)。(5)其它特性該上位機軟件還具有端口開閉檢測能力和突發(fā)事件處理能力。這里著重介紹一下突發(fā)事件處理能力。該上位機軟件的突發(fā)事件處理能力體現(xiàn)在當(dāng)選擇的某一個下位機節(jié)點出現(xiàn)崩潰的時候可以很好的進(jìn)行應(yīng)急處理,從而避免對整個系統(tǒng)造成影響。該功能同樣是通過定時器的靈活應(yīng)用來實現(xiàn)的。下位機溫度采集節(jié)點微處理器目前微處理器領(lǐng)域最火爆的莫過于32位的ARM,但出于本系統(tǒng)對微處理要求不高和性價比的考慮,因此選擇傳統(tǒng)的8051單片機.。本系統(tǒng)選擇國產(chǎn)宏晶STC89C52RC,不選擇AT89S52是因為兩者

20、性能基本一樣,但STC價格便宜一半。STC89C52具有如下特點:40個引腳,8k Bytes Flash片內(nèi)程序存儲器,512 bytes的隨機存取數(shù)據(jù)存儲器(RAM),32個外部雙向輸入/輸出(I/O)口,5個中斷優(yōu)先級2層中斷嵌套中斷,3個16位可編程定時計數(shù)器,2個全雙工串行通信口,看門狗(WDT)電路,片內(nèi)時鐘振蕩器??梢钥闯鯯TC89C52完全滿足系統(tǒng)對微處理的要求。DS18B20DS18B20特性簡介DALLAS半導(dǎo)體公司的數(shù)字化溫度傳感器DS1820是世界上第一片支持“一線總線”接口的溫度傳感器。一線總線獨特而且經(jīng)濟(jì)的特點,使用戶可以輕松的組建傳感器網(wǎng)絡(luò),為測量系統(tǒng)的構(gòu)建引入全

21、新概念?,F(xiàn)在新一代DS18B20體積更小、更經(jīng)濟(jì)、更靈活,使你可以充分發(fā)揮“一線總線”的長處。DS18B20的具體特性如下:獨特的單線接口僅需一個端口引腳進(jìn)行通訊簡單的多點分布應(yīng)用無需外部器件可通過數(shù)據(jù)線供電零待機功耗測溫范圍-55+125攝氏度,以0.5攝氏度遞增912位可選分辨率溫度數(shù)字量轉(zhuǎn)換時間200ms(典型值)用戶可定義的非易失性溫度報警設(shè)置應(yīng)用包括溫度控制、工業(yè)系統(tǒng)、消費品、溫度計或任何熱感測系統(tǒng)DS18B20典型應(yīng)用電路上圖是通過VDD引腳引入一個外部電源,這樣做的好處是I/O線上不需要加強上拉,而且總線控制器不用在溫度轉(zhuǎn)換期間總保持高電平。這樣在轉(zhuǎn)換期間可以允許在單線總線上進(jìn)行

22、其它數(shù)據(jù)往來。另外,在單線總線上可以掛任意多片DS18B20,并且如果它們使用外部電源的話,就可以先發(fā)一個Skip ROM命令,再接一個Convert T命令,讓它們同時進(jìn)行溫度轉(zhuǎn)化。注意當(dāng)加上外部電源時,GND引腳不能懸空。51單片機驅(qū)動DS18B20溫度轉(zhuǎn)化流程圖51單片機和DS18B20溫度采集部分程序清單#include #include #include #include #define uchar unsigned char#define uint unsigned intsbit DS = P32;/DS18b20的數(shù)據(jù)線端口sbit key = P33;uchar code t

23、able0=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xbf;/ 0到9與“-”編碼 uchar code table3= 0 x40, 0 x79, 0 x24, 0 x30,0 x19,0 x12,0 x02,0 x78,0 x00,0 x10, 0 x08, 0 x03, 0 x46, 0 x21,0 x06,0 x0E,0 xff;/共陽帶小數(shù)點段選 uchar code table18=0 x28,0 x1e,0 x45,0 xe9,0 x00,0 x00,0 x00,0 xb7;/兩1820的ROM編

24、碼,可在單個時用read rom讀出uchar code table28=0 x28,0 x87,0 x3f,0 x08,0 x02,0 x00,0 x00,0 xc9;uchar zf_flag=0,temph,templ,ge,shi,bai,qian;uchar choose=0;/1-wire總線,尋訪不同1820的標(biāo)志位int temper;/溫度真實值/*函數(shù)名稱:delay_us(uint t)入口參數(shù): t出口參數(shù):無注備:此程序是為了1wire總線寫時的us級延時而寫的;其中在外部晶振為11.0592MHz時,每次進(jìn)入函數(shù)大約要18us左右,每次循環(huán)大約13us左右*/voi

25、d delay_us(uint t)uint i;for(i=0;it;i+);/*函數(shù)名稱:delay_nms(uint t)入口參數(shù): t出口參數(shù):無注備: 毫秒級軟件延時*/void delay_nms(uint t)uint i;uchar j;for(i=0;it;i+)for(j=0;j110;j+);/*函數(shù)名稱:reset_1820()入口參數(shù):無出口參數(shù):bit一位數(shù): 返回1,初始化成功;返回0,初始化失敗注備:這里主要要注意的是延時的問題*/bit resert_1820()DS = 1;_nop_();/MCU將DS拉低后,要保持至少大于1us,數(shù)據(jù)手冊上說的。_nop

26、_();/這里為確保穩(wěn)定延時2us左右DS = 0;delay_us(55);/這里延時大約750us左右DS = 1;/delay_us(2);/這里大約50us左右 *適當(dāng)調(diào)整!delay_us(3);if(!DS)delay_us(50); /這個延時很重要!650us!*可能有點偏長!DS = 1; /一定要在初始化完成后將DS置1,以釋放總線return 1;elsereturn 0;/*函數(shù)名稱:write_bit(bit wei)入口參數(shù):bit wei出口參數(shù):無注備:*/void write_bit(bit wei)DS = 1;DS = 0;_nop_(); /MCU將DS

27、拉低后,要保持至少大于1us,數(shù)據(jù)手冊上說的。_nop_(); /這里為確保穩(wěn)定延時2us左右if(wei)DS = 1;elseDS = 0;delay_us(6); /*大概81usDS = 1;_nop_();/*函數(shù)名稱:read_bit()入口參數(shù):無出口參數(shù):bit 一位注備:*/bit read_bit()/初期寫程序出問題處!DS = 1;DS = 0; _nop_();_nop_();/MCU將DS拉低后,要保持至少大于1us,數(shù)據(jù)手冊上說的。 /這里為確保穩(wěn)定延時2us左右 DS=1; /這里必須拉高:讓MCU釋放總線,好讓DS18B20利用總線回送數(shù)據(jù)_nop_();_n

28、op_(); /等待一定時間,讓DS18B20回送的數(shù)據(jù)穩(wěn)定_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();return DS;/*函數(shù)名稱:write_byte(uchar byte)入口參數(shù):byte出口參數(shù):無注 備:DB18B20寫入數(shù)據(jù)或讀出數(shù)據(jù)都是從最低位開始的*/void write_byte(uchar byte)bit flag1;uchar i,temp;temp = byte;for(i=0;i1);/DB18B20寫入數(shù)據(jù)或讀出數(shù)據(jù)都是從最低位開始的flag1 = CY; /*這種方式還是不錯的!*/write_bit(

29、flag1);/*函數(shù)名稱:read_byte()入口參數(shù):無出口參數(shù):byte型注 備:DB18B20寫入數(shù)據(jù)或讀出數(shù)據(jù)都是從最低位開始的*/uchar read_byte()bit flag2;uchar i,j,temp;for(i=0;i1);flag2 = read_bit();if(flag2) /*中間變量對一個位進(jìn)行操作!*/j = 0 x80;else j = 0 x00;temp = temp|j;return temp;/*函數(shù)名稱:uintconversion(uchar h_byte,uchar l_byte)入口參數(shù):uchar h_byte,uchar l_byt

30、e出口參數(shù):uint型注 備:將DB18B20讀出的數(shù)據(jù)轉(zhuǎn)化為真正的溫度值*/uint conversion(uchar h_byte,uchar l_byte)int wendu;float tt;/注意數(shù)據(jù)類型對運算的影響!if(h_byte7|h_byte=7)zf_flag = 0;/溫度正負(fù)標(biāo)志位:1,為負(fù);0,為正wendu = h_byte;/將讀入的帶字符的高字節(jié)放入int型溫度變量中wendu = wendu8;/將其左移八位,讓其進(jìn)入高字節(jié)wendu = wendu|l_byte;/并與溫度的低字節(jié)相或,湊成整型值tt = wendu*0.0625;/乘以最小分辨率,獲得真

31、正溫度值wendu = tt*10+0.5;/為了能得到溫度的第一小數(shù)位,將其乘10,并加上0.5以四舍五入/近似操作elsezf_flag = 1;/溫度正負(fù)標(biāo)志位:1,為負(fù);0,為正wendu = h_byte;wendu = wendu8;wendu = wendu|l_byte;wendu = (wendu)+1;/因為從1820中讀出的是補碼,所以對于溫度值要取反加1,以獲得其絕對值tt = wendu*0.0625;/注意數(shù)據(jù)類型對運算的影響!wendu = tt*10+0.5;/教訓(xùn):我在這里原來寫的是:wendu=wendu*0.0625;return wendu;void m

32、ain()uchar i;while(1)resert_1820(); /初始化1820 write_byte(0 xCC); /單個1820,跳過匹配ROMwrite_byte(0 x44); /發(fā)送溫度轉(zhuǎn)化命令for(i=0;i20;i+) /這里要用數(shù)碼管顯示溫度,就干脆用來掃描數(shù)碼管show(qian,bai,shi,ge);resert_1820(); /初始化1820 write_byte(0 xCC); /單個1820,跳過匹配ROMwrite_byte(0 xBE); /讀暫存器中溫度的值templ = read_byte(); /讀暫存器中溫度的低字節(jié)temph = read

33、_byte(); /讀暫存器中溫度的帶符號的高字節(jié)temper=conversion(temph,templ);/將讀回來溫度的值轉(zhuǎn)化為實際真值qian= temper/1000; /千bai= temper%1000/100; /百shi = temper/100/10; /十 ge=temper%10; /個結(jié)束語本設(shè)計中的RS485總線接口和上位機控制臺被用于工廠現(xiàn)場中,實踐證明性能穩(wěn)定,通信可靠。因此,可直接移植于其它工業(yè)自動控制設(shè)計中。參考文獻(xiàn)(1)、Visual Basic 實用教程(第二版) 鄭阿齊 電子工業(yè)出版社 (2)、VB在串口通信中的應(yīng)用 溫曉軍 (3)、單片機原理及應(yīng)用

34、 姜志海 電子工業(yè)出版社 (4)、ATMEL89系列單片機的原理與開發(fā)實踐 歐陽文 中國電力出版社 (5)、RS485上下位機多機通信網(wǎng)絡(luò)系統(tǒng)設(shè)計 吳桂林 鄭建勇 (6)、基于RS485主從通信協(xié)議的實現(xiàn) 周紅嶺 (7)、基于RS485總線技術(shù)的PC機與單片機多機通訊設(shè)計 田擁軍附錄資料:不需要的可以自行刪除VB HOOK(鉤子)超級無敵詳細(xì)用法(介紹)hook是WINDOWS提供的一種消息處理機制,它使得程序員可以使用子過程來監(jiān)視系統(tǒng)消息,并在消息到達(dá)目標(biāo)過程前得到處理。 下面將介紹WINNDOWS HOOKS并且說明如何在WINDOWS 程序中使用它。關(guān)于HOOKS 使用HOOK 將會降低

35、系統(tǒng)效率,因為它增加了系統(tǒng)處量消息的工作量。建議在必要時才使用HOOK,并在消息處理完成后立即移去該HOOK。HOOK鏈 WINDOWS提供了幾種不同類型的HOOKS;不同的HOOK可以處理不同的消息。例如,WH_MOUSE HOOK用來監(jiān)視鼠標(biāo)消息。 WINDOWS為這幾種HOOKS維護(hù)著各自的HOOK鏈。HOOK鏈?zhǔn)且粋€由應(yīng)用程序定義的回調(diào)函數(shù)隊列,當(dāng)某種類型的消息發(fā)生時,WINDOWS向此種類型的HOOK鏈的第一個函數(shù)發(fā)送該消息,在第一函數(shù)處理完該消息后由該函數(shù)向鏈表中的下一個函數(shù)傳遞消息,依次向下。如果鏈中某個函數(shù)沒有向下傳送該消息,那么鏈表中后面的函數(shù)將得不到此消息。(對于某些類型的

36、HOOK,不管HOOK鏈中的函數(shù)是否向下傳遞消息,與此類型HOOK聯(lián)系的所有HOOK函數(shù)都會收到系統(tǒng)發(fā)送的消息)HOOK過程 為了攔截特定的消息,你可以使用SetWindowsHookEx函數(shù)在該類型的HOOK鏈中安裝你自己的HOOK函數(shù)。該函數(shù)語法如下: public function MyHook(nCode,wParam,iParam) as long 加入代碼 end function 其中MyHook可以隨便命名,其它不能變。該函數(shù)必須放在模塊段。nCode指定HOOK類型。wParam,iParam的取值隨nCode不同而不同,它代表了某種類型的HOOK的某個特定的動作。 SetW

37、indowsHookEx總是將你的HOOK函數(shù)放置在HOOK鏈的頂端。你可以使用CallNextHookEx函數(shù)將系統(tǒng)消息傳遞給HOOK鏈中的下一個函數(shù)。 注釋對于某些類型的HOOK,系統(tǒng)將向該類的所有HOOK函數(shù)發(fā)送消息,這時,HOOK函數(shù)中的CallNextHookEx語句將被忽略。 全局HOOK函數(shù)可以攔截系統(tǒng)中所有線程的某個特定的消息(此時該HOOK函數(shù)必須放置在DLL中),局部HOOK函數(shù)可以攔截指定線程的某特定消息(此時該HOOK函數(shù)可以放置在DLL中,也可以放置在應(yīng)用程序的模塊段)。 注釋 建議只在調(diào)試時使用全局HOOK函數(shù)。全局HOOK函數(shù)將降低系統(tǒng)效率,并且會同其它使用該類H

38、OOK的應(yīng)用程序產(chǎn)生沖突。HOOK類型 WH_CALLWNDPROC 和 WH_CALLWNDPROCRET HOOK WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以監(jiān)視SendMessage發(fā)送的消息。系統(tǒng)在向窗體過程發(fā)送消息前,將調(diào)用WH_CALLWNDPROC;在窗體過程處理完該消息后系統(tǒng)將調(diào)用WH_CALLWNDPROCRET。 WH_CALLWNDPROCRET HOOK會向HOOK過程傳送一個CWPRETSTRUCT結(jié)構(gòu)的地址。該結(jié)構(gòu)包含了窗體過程處理系統(tǒng)消息后的一些信息。 WH_CBT Hook 系統(tǒng)在激活,創(chuàng)建,消毀,最小化,最大化,移動,改

39、變窗體前;在完成一條系統(tǒng)命令前;在從系統(tǒng)消息隊列中移去鼠標(biāo)或鍵盤事件前;在設(shè)置輸入焦點前,或同步系統(tǒng)消息隊列前,將調(diào)用WH_CBT HOOK。你可以在你的HOOK 過程攔截該類HOOK,并返回一個值,告訴系統(tǒng),是否繼續(xù)執(zhí)行上面的操作。 WH_DEBUG HOOK 系統(tǒng)在調(diào)用與某種HOOK類型聯(lián)系的HOOK過程前,將調(diào)用WH_DEBUG ,應(yīng)用程序可以使用該HOOK決定是否讓系統(tǒng)執(zhí)行某種類型的HOOK。 WH_FOREGROUNDIDLE Hook 系統(tǒng)在空閑時調(diào)用該HOOK,在后臺執(zhí)行優(yōu)先權(quán)較低的應(yīng)用程序。 WH_GETMESSAGE Hook WH_GETMESSAGE Hook使應(yīng)用程序可

40、以攔截GetMessage 或 PeekMessage的消息。應(yīng)用程序使用WH_GETMESSAGE HOOK監(jiān)視鼠標(biāo)、鍵盤輸入和發(fā)送到隊列中的其它消息。 WH_JOURNALRECORD Hook WH_JOURNALRECORD Hook使應(yīng)用程序可以監(jiān)視輸入事件。典型地,應(yīng)用程序使用該HOOK記錄鼠標(biāo)、鍵盤輸入事件以供以后回放。該HOOK是全局HOOK,并且不能在指定線程中使用。 WH_JOURNALPLAYBACK Hook WH_JOURNALPLAYBACK Hook使應(yīng)用程序可以向系統(tǒng)消息隊列中插入消息。該HOOK可以回放以前由WH_JOURNALRECORD HOOK錄制的鼠標(biāo)

41、、鍵盤輸入事件。在WH_JOURNALPLAYBACK Hook安裝到系統(tǒng)時,鼠標(biāo)、鍵盤輸入事件將被屏蔽。該HOOK同樣是一個全局HOOK,不能在指定線程中使用。 WH_JOURNALPLAYBACK Hook返回一個時間暫停值,它告訴系統(tǒng),在處理當(dāng)前回放的消息時,系統(tǒng)等待百分之幾秒。這使得此HOOK可以控制在回放時的時間事件。 WH_KEYBOARD Hook WH_KEYBOARD Hook使應(yīng)用程序可以監(jiān)視由GetMessage和PeekMessage返回的WM_KEYDOWN 及WM_KEYUP消息。應(yīng)用程序使用該HOOK監(jiān)視發(fā)送到消息隊列中的鍵盤輸入。 WH_MOUSE Hook W

42、H_MOUSE Hook 使應(yīng)用程序可以監(jiān)視由GetMessage和PeekMessage返回的消息。應(yīng)用程序使用該HOOK監(jiān)視發(fā)送到消息隊列中的鼠標(biāo)輸入。 WH_MSGFILTER and WH_SYSMSGFILTER Hooks WH_MSGFILTER 和WH_SYSMSGFILTER Hooks使應(yīng)用程序可以監(jiān)視菜單、滾動條、消息框、對話框,當(dāng)用戶使用ALT+TAB或ALT+ESC來切換窗體時,該HOOK也可以攔截到消息。WH_MSGFILTER僅在應(yīng)用程序內(nèi)部監(jiān)視菜單、滾動條、消息框、對話框,而WH_SYSMSGFILTER則可以在系統(tǒng)內(nèi)監(jiān)視所有應(yīng)用程序的這些事件。 WH_SHEL

43、L Hook 一個SHELL程序可以使用WH_SHELL Hook來接收重要的信息。當(dāng)一個SHELL程序被激活前或當(dāng)前窗體被創(chuàng)建、消毀時,系統(tǒng)會調(diào)用WH_SHELL Hook過程。 使用HOOK 安裝、銷毀HOOK過程 監(jiān)視系統(tǒng)事件安裝、銷毀HOOK過程 使用SetWindowsHookEx函數(shù),指定一個HOOK類型,自己的HOOK過程是全局還是局部HOOK,同時給出HOOK過程的進(jìn)入點,就可以輕松的安裝你自己的HOOK過程。Declare Function SetWindowsHookEx Lib user32 Alias SetWindowsHookExA _ (ByVal idHook

44、As Long, _ ByVal lpfn As Long, _ ByVal hmod As Long, _ ByVal dwThreadId As Long) As LongidHook代表是何種Hook,有以下幾種 Public Const WH_CALLWNDPROC = 4 Public Const WH_CALLWNDPROCRET = 12 Public Const WH_CBT = 5 Public Const WH_DEBUG = 9 Public Const WH_FOREGROUNDIDLE = 11 Public Const WH_GETMESSAGE = 3 Publi

45、c Const WH_HARDWARE = 8 Public Const WH_JOURNALPLAYBACK = 1 Public Const WH_JOURNALRECORD = 0 Public Const WH_KEYBOARD = 2 Public Const WH_MOUSE = 7 Public Const WH_MSGFILTER = (-1) Public Const WH_SHELL = 10 Public Const WH_SYSMSGFILTER = 6lpfn代表Hook Function所在的Address,這是一個CallBack Fucnction,當(dāng)掛上某個H

46、ook時,我們便得定義一個Function來當(dāng)作某個訊息產(chǎn)生時,來處理它的Function,這個Hook Function有一定的叁數(shù)格式 Private Function HookFunc(ByVal nCode As Long, _ ByVal wParam As Long, _ ByVal lParam As Long ) As Long nCode 代表是什麼請況之下所產(chǎn)生的Hook,隨Hook的不同而有不同組的可能值。 wParam lParam 傳回值則隨Hook的種類和nCode的值之不同而不同。 因這個叁數(shù)是一個 Function的Address所以我們固定將Hook Func

47、tion放在.Bas中,并以AddressOf HookFunc傳入。至於Hook Function的名稱我們可以任意給定,不一定叫 HookFunchmod 代表.DLL的hInstance,如果是Local Hook,該值可以是Null(VB中可傳0進(jìn)去),而如果是Remote Hook,則可以使用GetModuleHandle(.dll名稱)來傳入。dwThreadId 代表執(zhí)行這個Hook的ThreadId,如果不設(shè)定是那個Thread來做,則傳0(所以一般來說,Remote Hook傳0進(jìn)去),而VB的Local Hook一般可傳App.ThreadId進(jìn)去。值回值 如果SetWin

48、dowsHookEx()成功,它會傳回一個值,代表目前的Hook的Handle,這個值要記錄下來。因為A程式可以有一個System Hook(Remote Hook),如KeyBoard Hook,而B程式也來設(shè)一個Remote的KeyBoard Hook,那麼到底KeyBoard的訊息誰所攔截?答案是,最後的那一個所攔截,也就是說A先做keyboard Hook,而後B才做,那訊息被B攔截,那A呢?就看B的Hook Function如何做。如果B想讓A的Hook Function也得這個訊息,那B就得呼叫CallNextHookEx()將這訊息Pass給A,於是產(chǎn)生Hook的一個連線。如果B

49、中不想Pass這訊息給A,那就不要呼叫CallNextHookEx()。Declare Function CallNextHookEx Lib user32 Alias CallNextHookEx _ (ByVal hHook As Long, _ ByVal ncode As Long, _ ByVal wParam As Long, _ lParam As Any) As LonghHook值是SetWindowsHookEx()的傳回值,nCode, wParam, lParam則是Hook Procedure中的三個叁數(shù)。最後是將這Hook去除掉,請呼叫UnHookWindowHoo

50、kEx()Declare Function UnhookWindowsHookEx Lib user32 Alias UnhookWindowsHookEx _ (ByVal hHook As Long) As LonghHook便是SetWindowsHookEx()的傳回值。此時,以上例來說,B程式結(jié)束Hook,則換A可以直接攔截訊息。KeyBoard Hook的范例Hook Function的三個叁數(shù)nCode wParam lParam 傳回值HC_ACTION表按鍵Virtual Key與WM_KEYDOWN同若訊息要被處理傳0或 反之傳1HC_NOREMOVEPublic hHoo

51、k as LongPublic Sub UnHookKBD ()If hnexthookproc 0 Then UnhookWindowsHookEx hHook hHook = 0End IfEnd SubPublic Function EnableKBDHook()If hHook 0 Then Exit FunctionEnd Ifhhook = SetWindowsHookEx(WH_KEYBOARD, AddressOf _ MyKBHFunc, App.hInstance, App.ThreadId)End FunctionPublic Function MyKBHFunc(ByV

52、al iCode As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long MyKBHfunc = 0 表示要處理這個訊息 If wParam = vbKeySnapshot Then 偵測 有沒有按到PrintScreen鍵 MyKBHFunc = 1 在這個Hook便吃掉這個訊息 End If Call CallNextHookEx(hHook, iCode, wParam, lParam) 傳給下一個HookEnd Function鼠標(biāo)鉤子的示例列下。(1)模塊中輸入:Public Const WM_MOUSEMOVE

53、= &H200Public Const WM_LBUTTONDOWN = &H201Public Const WM_LBUTTONUP = &H202Public Const WM_LBUTTONDBLCLK = &H203Public Const WM_RBUTTONDOWN = &H204Public Const WM_RBUTTONUP = &H205Public Const WM_RBUTTONDBLCLK = &H206Public Const WM_MBUTTONDOWN = &H207Public Const WM_MBUTTONUP = &H208Public Const WM

54、_MBUTTONDBLCLK = &H209Public Const WM_MOUSEACTIVATE = &H21Public Const WM_MOUSEFIRST = &H200Public Const WM_MOUSELAST = &H209Public Const WM_MOUSEWHEEL = &H20A 以上是鼠標(biāo)的各個值Private Declare Function CallNextHookEx Lib user32 (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lparam As Any)

55、As LongPublic Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lparam As Long) As Long If nCode 0 Then HookProc = CallNextHookEx(hHook, nCode, wParam, lparam) Exit Function End If If wParam = WM_RBUTTONDOWN Then MsgBox aa End IfEnd Function(2)窗體中輸入:Private Declare Function SetWindo

56、wsHookEx Lib user32 Alias SetWindowsHookExA (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As LongPrivate Declare Function UnhookWindowsHookEx Lib user32 (ByVal hHook As Long) As LongPrivate Const WH_MOUSE_LL As Long = 14Private Sub Form_Load() hHook = SetWindowsHookEx(WH_MOUSE_LL, Addres

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論