技术文章

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

来源:仪表网

2012/3/29 17:18:59 919
  一.引言
  
  单片机实时监测数据的图形显示一般都借助于数据处理能力*的上位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

猜你喜欢

您的留言已提交成功~

采购或询价产品,请直接拨打电话联系

联系人:

联系方式:
当前客户在线交流已关闭
请电话联系他 :