单片机课程设计:八路温度巡回检测系统 - 图文 联系客服

发布时间 : 星期六 文章单片机课程设计:八路温度巡回检测系统 - 图文更新完毕开始阅读53025fc8d5bbfd0a795673d5

PEIE=0X1; //使能外部中断

8.2 上位机介绍

上位机利用Visual Basic 6.0编程。用VB6.0开发串行通信程序有两种法,一种是利用Windows的API函数;另一种是采用VB6.0的通信控件MSComm。利用API函数编写串行通信程序较为复杂,需要掌握大量的通信知识,其优点是可实现的功能更丰富、应用面更广泛,适合于编写较为复杂的低层次通信程序。而VB6.0的MSComm通信控件提供了标准的事件处理函数、事件、方法,并通过控件属性对串口参数进行设置,比较容易地解决了串口通信问题。

MSComm是VB6.0提供的ActiveX控件,使用前需将该控件添加到VB工具栏。MSComm控件具有功能完善的串口数据发送和接受功能,有两种处理通信的方式,即事件驱动方式和查询方式,事件驱动方式是利用MSComm控件的OnComm事件捕获并处理通信错误事件,是处理串行端口交互作用的一种非常有效的方法;查询方式是通过检查CommEvent属性的值来判断事件和错误。

图 8.2 上位机监控界面

下面VB上位机完整程序:

Declare Function GetTickCount Lib \Sub TimeDelay(t As Long)

'时间延迟子程序,单位是毫秒(ms) Dim TT&

TT = GetTickCount() Do

DoEvents

Loop Until GetTickCount() - TT >= t End Sub

'等待RS字符串返回,或是时间到达 'Comm是通信控件名称

'RS是欲等待的字符 'DT是最长的等待时间

'正常时返回值是所得的完整字符串,不正常时返回值是空字符串

Function WaitRS(Comm As MSComm, RS As String, DT As Long) As String Dim Buf$, TT As Long Buf = \

TT = GetTickCount Do

Buf = Buf & Comm.Input

Loop Until InStr(1, Buf, RS) > 0 Or GetTickCount - TT >= DT If InStr(1, Buf, RS) > 0 Then WaitRS = Buf Else

WaitRS = \ End If End Function

Option Explicit

Dim NowX As Integer '现在的X轴位置 Dim MaxPlotNo As Long '最长的X轴范围 Dim PreValue As Single '前一个测量值

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '当选择通信端口的Combo控件被选中后激活此事件 '若用户改变通信端口时,关闭通信端口

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub cmbCOM_Click()

'若通信端口号码和现在的选择一样时就不必理会,直接跳出此子程序 If cmbCOM.ListIndex + 1 = MSComm1.CommPort Then Exit Sub Timer1.Enabled = False '关闭定时器 TimeDelay 100

If MSComm1.PortOpen Then

MSComm1.PortOpen = False '关闭通信端口 End If

lblMsg.Caption = \已停止检测并关闭通讯端口\

cmdOpenCOM.Enabled = True '允许使用【打开通信端口】按钮 End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '单击【结束】按钮后激活此事件 '使用End命令将系统结束

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub cmdEnd_Click()

MSComm1.PortOpen = False '关闭通信端口

End End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '单击【打开通信端口】按钮后激活此事件 '将MSComm控件的参数设置好,并打开 '激活【开始检测】按钮

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub cmdOpenCOM_Click() '判断端口号码是否落在1--16之间

If cmbCOM.ListIndex >= 0 And cmbCOM.ListIndex <= 16 Then MSComm1.CommPort = cmbCOM.ListIndex + 1 Else

MsgBox \指定通信端口时发生错误!\系统信息\

Exit Sub End If

'激活错误检测机制 On Error GoTo comErr

MSComm1.Settings = \设定通信参数 MSComm1.PortOpen = True '打开通信端口

cmdOpenCOM.Enabled = False '将此按钮设为禁用状态 cmdStart.Enabled = True '激活【开始检测】按钮

lblMsg.Caption = \可单击【开始检测】按钮,执行检测的工作。\ Exit Sub comErr:

MsgBox \打开通信端口时发生错误!请确定通信端口存在且正常。\vbCritical + vbOKOnly, \系统信息\End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '单击【开始检测】按钮后激活此事件

'将定时器激活或关闭,并显示对应的文字在按钮上,以指示用户操作 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub cmdStart_Click()

Timer1.Enabled = Not Timer1.Enabled If Timer1.Enabled Then

cmdStart.Caption = \停止检测\ Else

cmdStart.Caption = \开始检测\ lblMsg.Caption = \已停止检测\ End If End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'窗体的Load事件

'输入图形暂时设为灰色,表示无状态信息进入

'将通讯端口号码及站号填入Combo控件;并默认二者的选项是第一个 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub Form_Load() Dim i%

MaxPlotNo = 100 cmbCOM.Clear

cmbCOM.AddItem \ cmbCOM.AddItem \

cmbCOM.AddItem \ cmbCOM.AddItem \ cmbCOM.AddItem \ cmbCOM.AddItem \ cmbCOM.AddItem \ cmbCOM.AddItem \ cmbCOM.AddItem \ cmbCOM.AddItem \ cmbCOM.AddItem \ cmbCOM.AddItem \ cmbCOM.AddItem \ cmbCOM.AddItem \ cmbCOM.AddItem \ cmbCOM.AddItem \ cmbCOM.ListIndex = 0 cmdStart.Enabled = False

'以下设定绘图范围,(Xmin,YMax)-(XMax,YMin) picVoltage.Scale (0, 50)-(MaxPlotNo, 0)

picVoltage.DrawWidth = 2 '使用两个像素宽度的画笔 End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '定时器的Timer事件引发后,就不断地执行其中的程序。 '将模拟读值命令送出,再取得返回字符串并判断。 '

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub Timer1_Timer()

Dim Buf$, ValueStr As Single, Pos1% Buf$ = Buf$ + MSComm1.Input '读取变量 TimeDelay 2150

ValueStr = Val(Mid(Buf, Pos1 + 1, 7)) '分离出正号以后的数值 lblValue.Caption = \清空上一次数据

lblValue.Caption = Format(ValueStr, \℃\显示在画面上 If NowX = 0 Then

picVoltage.Cls '清除图形