微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 用VB6.0数字示波单片机实时监测数据的一种方法

用VB6.0数字示波单片机实时监测数据的一种方法

时间:03-29 来源:互联网 点击:

一.引言

单片机实时监测数据的图形显示一般都借助于数据处理能力强大的上位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)中的数。每次有新数据移入并且有原数据移出时,先清屏再复原背景显示数据,造成数据平移视觉效果。

设计时波形一定要从界面最左端入,从最右端出,这样动态平移视觉效果才好。窗体的AutoRedraw属性要设为True.

四.软件设计源程序(波形参见图4、图5)
'定义所用变量
Dim a(11) As Single
Dim d As Integer
Dim n As Integer
Dim m As Integer
Dim Buffer As Variant
Private Sub Form_Load()
'一屏显示的12个数赋初值0
For i = 0 To 11
a(i) = 0
Next i
'定义坐标原点
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)
For i = 0 To 220 Step 20
CurrentX = i: CurrentY = 3: Line -(i, 0)
If i = 200 Then CurrentX = i - 7 Else CurrentX = i - 12
CurrentY = 0: Print i Mod 19
Next i
For i = 0 To 210 Step 20
If i > 0 Then
CurrentX = -14: CurrentY = i: Print i / 10
CurrentX = 230: CurrentY = i: Line -(0, i)
End If
Next i
'mscomm控件初始化
MSComm1.CommPort = 1
MSComm1.Settings = 9600,n,8,1
MSComm1.InputMode = comInputModeBinary
MSComm1.InputLen = 0
MSComm1.RThreshold = 0
End Sub
'接收并显示数据
Private Sub Command1_Click()
'无条件循环接收数据
Do

接收数据
Do Until MSComm1.InBufferCount = 1
Loop
Buffer = MSComm1.Input
For i = LBound(Buffer) To UBound(Buffer)
d = Buffer(i)
Next i
'判是否第一屏12个数据,设标志量m
If m 12 Then
m = m + 1
End If
'12个数据放a 数组,a(0)是最新数据,原a(11)中的数移出
For i = 11 To 1 Step -1
a(i) = a(i - 1)
Next i
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)
For i = 0 To 220 Step 20
CurrentX = i: CurrentY = 3: Line -(i, 0)
If i = 200 Then CurrentX = i - 7 Else CurrentX = i - 12
CurrentY = 0: Print i Mod 19
Next i
For i = 0 To 210 Step 20
If i > 0 Then
CurrentX = -14: CurrentY = i: Print i / 10
CurrentX = 230: CurrentY = i: Line -(0, i)
End If
Next i
'连点成波形
For i = 0 To m - 2
Line (20 * i, 230 * a(i) / 20)-(20 * (i + 1), 230 * a(i + 1) / 20), RGB(240, 0, 0)
Next I
Loop
End Sub

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top