一.引言
单片机实时监测数据的图形显示一般都借助于数据处理能力*的上位PC机。VB6.0具有*的图形处理功能和良好的界面设计功能并且可以利用MsComm控件方便地实现和单片机的串行
数据通信。
本文介绍利用VB6.0的窗体对象、命令按钮控件对象、微软的MsComm控件对象、数组和用户自定义坐标系动态、连续、数字、波形地显示单片机实时检测数据的一种方法。
该显示方法的坐标系符合人们看图习惯,显示的实时波形随时间动态变化并从左向右平移,视觉效果好且数值显示、算法简单、实现容易。
二.所用对象介绍
1.窗体
窗体是所有控件的容器,是设计界面的载体,具有Print、Cls、Line、Scale等方法。
窗体容器有一个坐标系,窗体的ScaleTop、ScaleLeft两个属性值形成坐标原点且默认值为0和0,窗体默认坐标原点在窗体的左上角,向右和向下为坐标轴正方向,属性ScaleWidth的值和ScaleHeight的值确定窗体实际可用的宽度和高度(见图1)。
窗体的ScaleMode属性值决定窗体坐标的度量单位,共有八种单位形式,当值为0时表示是用户定义形式。默认形式为twip。窗体默认坐标系不符合人们习惯。
用Scale方法可以方便建立用户坐标系,语法格式为:
[窗体].Scale[(xLeft,yTop)-(xRight,yBottom)]
其中(xLeft,yTop)表示窗体左上角的坐标值,(xRight,yBottom)表示窗体右下角的坐标值,则窗体的下述属性值为:
ScaleLeft=xLeft
ScaleTop=yTop
ScaleWidth=xRight-xLeft
ScaleHeight=yBottom-yTop
若有语句:Form1.Scale(-10,250)-(220,-15),则用户自定义坐标系如下图2:
2.命令按钮控件
命令按钮可以接收Click事件。
3.MsComm控件
*的串行数据发送和接收控件。通过属性设置、事件驱动方式或查询方式完成数据通信。
三.软件设计思想(一个具体的例)
要求:单片机每1秒串行发送给PC一帧十位数据,VB6.0波形动态显示数据。
设计:通过窗体Load事件程序完成如图3所示界面设计,使得程序一运行即出现该界面,单击"接收数据"按钮,通过MsComm控件接收串行通信数据并波形动态显示。显示时一屏12个数据,每次接收了新数据后,数组中的数据依次后移,既a(0)(假设为数组a(11))放接收的数据,原a(11)中的数据被移出而移入原a(10)中的数。每次有新数据移入并且有原数据移出时,先清屏再复原背景显示数据,造成数据平移视觉效果。
设计时波形一定要从界面zui左端入,从zui右端出,这样动态平移视觉效果才好。窗体的AutoRedraw属性要设为True.
四.软件设计源程序(波形参见图4、图5)
'定义所用变量
Dima(11)AsSingle
DimdAsInteger
DimnAsInteger
DimmAsInteger
DimBufferAsVariant
PrivateSubForm_Load()
'一屏显示的12个数赋初值0
Fori=0To11
a(i)=0
Nexti
'定义坐标原点
Form1.Scale(-10,250)-(220,-15)
'画X、Y轴
Line(0,0)-(220,0)
Line(0,0)-(0,250)
'加坐标刻度和数值
CurrentX=200:CurrentY=13:Print"X(s)"
CurrentX=5:CurrentY=245:Print"Y(V)"
Fori=0To220Step20
CurrentX=i:CurrentY=3:Line-(i,0)
Ifi<=200ThenCurrentX=i-7ElseCurrentX=i-12
CurrentY=0:PrintiMod19
Nexti
Fori=0To210Step20
Ifi<>0Then
CurrentX=-14:CurrentY=i:Printi/10
CurrentX=230:CurrentY=i:Line-(0,i)
EndIf
Nexti
'mscomm控件初始化
MSComm1.CommPort=1
MSComm1.Settings="9600,n,8,1"
MSComm1.InputMode=comInputModeBinary
MSComm1.InputLen=0
MSComm1.RThreshold=0
EndSub
'接收并显示数据
PrivateSubCommand1_Click()
'无条件循环接收数据
Do
接收数据
DoUntilMSComm1.InBufferCount=1
Loop
Buffer=MSComm1.Input
Fori=LBound(Buffer)ToUBound(Buffer)
d=Buffer(i)
Nexti
'判是否*屏12个数据,设标志量m
Ifm<12Then
m=m+1
EndIf
'12个数据放a数组,a(0)是数据,原a(11)中的数移出
Fori=11To1Step-1
a(i)=a(i-1)
Nexti
a(0)=d
'清零窗体界面、数据
Form1.Cls
'复原窗体界面
Line(0,0)-(230,0)
Line(0,0)-(0,250)
CurrentX=200:CurrentY=13:Print"X(s)"
CurrentX=5:CurrentY=245:Print"Y(V)"
Fori=0To220Step20
CurrentX=i:CurrentY=3:Line-(i,0)
Ifi<=200ThenCurrentX=i-7ElseCurrentX=i-12
CurrentY=0:PrintiMod19
Nexti
Fori=0To210Step20
Ifi<>0Then
CurrentX=-14:CurrentY=i:Printi/10
CurrentX=230:CurrentY=i:Line-(0,i)
EndIf
Nexti
'连点成波形
Fori=0Tom-2
Line(20*i,230*a(i)/20)-(20*(i+1),230*a(i+1)/20),RGB(240,0,0)
NextI
Loop
EndSub