【文章內容簡介】
e 為字符串表達式,說明通信端口的設置值。Value 由四個設置值組成,格式如下: “BBBB,P,D,S” BBBB為波特率,P為奇偶校檢,D為數據位數,S為停止位數。Value默認值為“9600,N,8,1”。 通常與下位機通信采用默認值即可,因為單片機有效處理的數據位也是8位,波特率也可以設置為9600。 在MSComm控件設置CommEvent屬性為EvReceive并產生OnComm之前,RThreshold屬性設置并返回的要接收的字符數,即只有當接收到了等于Rthreshold屬性值個數的字符才能產生OnComm事件。Rthreshold屬性值為0時,不產生OnComm事件。因此需將Rthreshold屬性值設置為有效的整數值。本系統(tǒng)僅僅只接受單片機發(fā)送的兩位數據溫度值,所以Rthreshold屬性值設置為2。 計時器Timer控件計時器控件可以每隔一個時間間隔自動觸發(fā)一個計時器事件,計時器控件在設計時顯示為一時鐘圖標,大小可變,運行時不可見。由于本系統(tǒng)實現對空調的控制需發(fā)送一連串控制命令,故通過Timer控件定時發(fā)送,可以有效的提高數據發(fā)送的正確性,有利于和下位機接收速度相匹配。Timer控件有兩個重要屬性,分別為Enable屬性和interval屬性前者決定計時器是否開始計時,后者設置兩次計時器事件之間的時間間隔,以毫秒為單位,值的范圍是0~65536,當internal屬性值為0時,計時器無效,若把internal屬性值設置為1000,則表示每秒鐘觸發(fā)一次計時器事件。由此可得,若想在一秒鐘內執(zhí)行n此計時器事件,則必須將internal屬性值設置為1000/n才可實現。本系統(tǒng)用到了兩個Timer控件,一個作為發(fā)送命令字符串所用,當命令發(fā)送完后由軟件關閉計時器。另一個作為對所有空調定時監(jiān)控,設置計時間隔為1S, 每隔一秒換一臺空調進行監(jiān)控,如此循環(huán)下去,直到用戶關閉監(jiān)控,即關閉計時器。兩個計時器運行代碼如下:Private Sub Timer2_Timer()/*****發(fā)送命令字符串*****/ = Mid$(, i, 1)i = i + 1If i = j + 1 Then = FalseEnd IfEnd SubPrivate Sub Timer1_Timer()/*****對所有空調輪流監(jiān)控*****/ = CStr(addr)addr = addr + 1If addr 2 Then addr = 1 = SIf windtype2 = C Then If Val(temperature) = Val(temper) Then = K Else = R End IfElseIf windtype = C Then If Val(temperature) = Val() Then = K Else = R End IfElseIf windtype2 = H Then If Val(temperature) = Val(temper) Then = K Else = R End If Else If Val(temperature) = () Then = K Else = R End IfEnd IfEnd Sub CommandButton控件CommandButton控件在VB設計的人機交互界面中經常用到,對于一些基本操作都必須通過CommandButton來完成。該控件最為重要的的一個事件就是Click事件,當用戶按下Command就可以觸發(fā)該事件,完成相應的操作。本設計用到了多個CommandButton控件,具體代碼如下:Private Sub Command1_Click()/***開啟計時器1開始對所有空調輪流監(jiān)控***/addr = 1 = TrueEnd SubPrivate Sub Command2_Click()/****關閉計時器1停止對對空調的監(jiān)控***/ = FalseEnd SubPrivate Sub Command3_Click()/***開啟計時器2將控制命令字符串發(fā)送**/ = amp。 controlcode amp。 windtype amp。 i = 1j = Len() = TrueEnd SubPrivate Sub Command4_Click()/***開啟所有空調使其正常工作***/ = 1 amp。 D amp。 windtype2 amp。 temperi = 1j = Len() = TrueEnd SubPrivate Sub Command5_Click()/***關閉所有空調停止工作***/ = 1 amp。 Gi = 1j = Len() = TrueEnd SubPrivate Sub Command6_Click()/***關閉通信串口退出控制界面***/ = FalseEndEnd Sub TextBox控件 TextBox控件用于顯示或者輸入文本信息,比如要輸入一串字符串就必須在TextBox文本框中輸入。VB串口通信的數據發(fā)送分為兩種,分別為文本數據發(fā)送和二進制數據發(fā)送。若選擇文本數據發(fā)送,一般就要用到TextBox控件,將所發(fā)文本信息統(tǒng)一寫到文本框中,通過計時器定時依次發(fā)送出去。當打開一個文本文件并需要顯示出來時就要用到TextBox控件。本系統(tǒng)用了兩個TextBox控件,一個為輸入溫度值文本框,另一個為存放控制命令字符串。具體代碼如下: = amp。 controlcode amp。 windtype amp。 = Mid$(, i, 1)/** **/ 單片機串口通信 AT89S51芯片內部有一個全雙工的串行口,與外部數據交換僅需兩根口現,分別為RXD和TXD。RXD為讀數據口,TXD為寫數據口。串行通信一般分為同步和異步兩種方式,51單片機通常采用的是異步通信,它通常以字符或者字節(jié)為單位,組成字符幀來傳送,它不需要信號線來傳送數據的時鐘,通信雙方均使用自己的時鐘來控制數據的發(fā)送和接收,不是同步進行的。換句話說,甲方開始發(fā)送一位,乙方并不是開始接受這一位,而是等甲方發(fā)送萬一幀數據后,乙方才開始接受。 51單片機串行口控制寄存器51單片機的串行口由串行口控制寄存器SCON,PCON。發(fā)送接收緩沖器SBUF。其中SUBF的功能是:當發(fā)送數據時,先將數據移到累加器ACC,然后在從ACC移到SBUF中,然后通過TXD腳一位位發(fā)送出去。當接受數據時,則在接收中斷程序中把SBUF的數據取出,若采用查詢中斷標志法時,則當串口中斷標志RI置位時,把SBUF的數據取出。S BUF雖然只有一個入口地址(99H)但實際上對SBUF的讀寫并不是一個寄存器,這樣才可以使單片機能夠同時進行收發(fā)工作。PCON寄存器在串口通信中只用到了其最高位SMOD,它是數據傳輸率選擇位。在模式1,2,3中,串行通信數據傳輸率在SMOD為1時提高一倍。SCON寄存器是串口通信中最為重要的寄存器,其各個比特位的的定義如表2所示 表 2 SCON寄存器比特位定義 串口工作模式 51單片機串口有四種工作模式:模式0(SM0=0,SM1=0),表示為同步移位寄存器的工作方式;模式1(SM0=0,SM1=1)表示10位異步收發(fā)模式;模式2(SM0=1,SM1=0)表示11位異步收發(fā)模式;模式3(SM0=1,SM1=1)為11位異步收發(fā)模式。其中模式1常用于單機通信,即點對點通信。模式3用于多機通信,單片機多機通信或者PC機與單片機多機通信。本系統(tǒng)采用模式3,通過控制SM2來區(qū)別PC機發(fā)送的是地址還是數據,以此來實現多機通信 串口通信數據傳輸率在模式0下,串口數據傳輸率是固定的,它的值為單片機晶振頻率的1/12。在模式2下,當SMOD=0時,串口數據傳輸率為經晶振頻率的1/64;SMOD=1時,數據傳輸率為晶振頻率的1/32。在模式1和模式3下,通信數據傳輸率是由定時器T1的溢出頻率來決定的,相應的公式為:數據傳輸率=其中 定時器T1在模式2工作, X為定時器T1的初值。本系統(tǒng)為了和上位機波特率相匹配,選用波特率為9600bit/s 。此時X=250 fosc= 通信協(xié)議 通信雙方實現數據收發(fā),必須有統(tǒng)一規(guī)定的通信協(xié)議。本系統(tǒng)根據對空調的實際控制,規(guī)定的協(xié)議如下:1. 波特率上位機與下位機都設置為9600bit/s。2. 一幀有效數據傳輸位數為8位。3. 下位機地址編號為1,2(假設只對兩臺