分享

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

 共同成长888 2014-04-29

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

 

一.引言

  单片机实时监测数据的图形显示一般都借助于数据处理能力强大的上 位PC 机。VB6.0 具有强大的图形处理功能和良好的界面设计功能并且可以利用 MsComm 控件方便地实现和单片机的串行数据通信。

  本文介绍利用 VB6.0 的窗体对象、命令按钮控件对象、微软的MsComm 控件对象、数组和用户自定义坐标系动态、连续、数字、波形地显示单片机实时 检测数据的一种方法。 该显示方法的坐标系符合人们看图习惯,显示的实时波形随时间动态变 化并从左向右平移,视觉效果好且数值显示精确、算法简单、实现容易。

  二.所用对象介绍

  1.窗体

  窗体是所有控件的容器,是设计界面的载体,具有Print、Cls、Line、 Scale 等方法。 窗体容器有一个坐标系,窗体的ScaleTop、ScaleLeft 两个属性值形成坐标 原点且默认值为0 和0,窗体默认坐标原点在窗体的左上角,向右和向下为坐标 轴正方向,属性ScaleWidth 的值和ScaleHeight 的值确定窗体实际可用的宽度和 高度(见图1)。

用VB6.0数字示波单片机实时监测数据的一种方法 - 陈丙华 - 仪器仪表

  窗体的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:

用VB6.0数字示波单片机实时监测数据的一种方法 - 陈丙华 - 仪器仪表

  2.命令按钮控件

  命令按钮可以接收 Click 事件。

  3.MsComm 控件

  完善的串行数据发送和接收控件。通过属性设置、事件驱动方式或查询方式完成数据通信。

  三.软件设计思想(一个具体的例)

  要求:单片机每 1 秒串行发送给PC 一帧十位数据,VB6.0 波形动态显示数 据。 设计:通过窗体 Load 事件程序完成如图3 所示界面设计,使得程序一运行 即出现该界面,单击“接收数据”按钮,通过MsComm 控件接收串行通信数据 并波形动态显示。显示时一屏12 个数据,每次接收了新数据后,数组中的数据 依次后移,既a(0)(假设为数组a(11))放最新接收的数据,原a(11)中的数据被 移出而移入原a(10)中的数。

用VB6.0数字示波单片机实时监测数据的一种方法 - 陈丙华 - 仪器仪表

  每次有新数据移入并且有原数据移出时,先清屏再 复原背景显示数据,造成数据平移视觉效果。 设计时波形一定要从界面最左端入,从最右端出,这样动态平移视觉效果 才好。窗体的AutoRedraw 属性要设为True.

用VB6.0数字示波单片机实时监测数据的一种方法 - 陈丙华 - 仪器仪表

用VB6.0数字示波单片机实时监测数据的一种方法 - 陈丙华 - 仪器仪表

  四.软件设计源程序(波形参见图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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多