📄 buoxunt.frm
字号:
VERSION 5.00
Object = "{648A5603-2C6E-101B-82B6-000000000014}#1.1#0"; "MSCOMM32.OCX"
Begin VB.Form Form1
BorderStyle = 1 'Fixed Single
Caption = "虚拟示波器"
ClientHeight = 8625
ClientLeft = 45
ClientTop = 330
ClientWidth = 11910
ControlBox = 0 'False
DrawStyle = 5 'Transparent
LinkTopic = "Form1"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 8625
ScaleWidth = 11910
Begin VB.ComboBox Combo3
BackColor = &H00C0FFFF&
Height = 300
ItemData = "buoxunt.frx":0000
Left = 8520
List = "buoxunt.frx":0010
Style = 2 'Dropdown List
TabIndex = 8
Top = 7440
Width = 975
End
Begin VB.OptionButton Option1
BackColor = &H008080FF&
Caption = "暂停"
Height = 495
Left = 1680
Style = 1 'Graphical
TabIndex = 7
Top = 7320
Width = 495
End
Begin VB.OptionButton Option2
BackColor = &H0000FF00&
Caption = "测量"
Height = 495
Left = 960
Style = 1 'Graphical
TabIndex = 6
Top = 7320
Width = 495
End
Begin VB.CommandButton Command1
BackColor = &H00FFC0C0&
Caption = "结束"
Height = 495
Left = 2400
Style = 1 'Graphical
TabIndex = 5
Top = 7320
Width = 495
End
Begin VB.PictureBox Picture1
BackColor = &H00FFFFFF&
Height = 1935
Left = 960
ScaleHeight = 1875
ScaleWidth = 4275
TabIndex = 4
Top = 600
Width = 4335
End
Begin MSCommLib.MSComm MSComm1
Left = 3120
Top = 7320
_ExtentX = 1005
_ExtentY = 1005
_Version = 393216
DTREnable = 0 'False
InBufferSize = 512
OutBufferSize = 0
BaudRate = 1200
InputMode = 1
End
Begin VB.ComboBox Combo2
BackColor = &H00FFFFC0&
Height = 300
ItemData = "buoxunt.frx":002A
Left = 6120
List = "buoxunt.frx":003D
Style = 2 'Dropdown List
TabIndex = 1
Top = 7440
Width = 855
End
Begin VB.ComboBox Combo1
BackColor = &H00FFC0FF&
Height = 300
ItemData = "buoxunt.frx":0058
Left = 4800
List = "buoxunt.frx":0068
Style = 2 'Dropdown List
TabIndex = 0
Top = 7440
Width = 855
End
Begin VB.Label Label3
Caption = "采样间隔(μs)"
Height = 375
Left = 8520
TabIndex = 9
Top = 7200
Width = 1215
End
Begin VB.Label Label2
Alignment = 2 'Center
Caption = "V/div"
Height = 255
Left = 6120
TabIndex = 3
Top = 7200
Width = 855
End
Begin VB.Label Label1
Alignment = 2 'Center
Caption = "ms/div"
ForeColor = &H00404040&
Height = 255
Left = 4800
TabIndex = 2
Top = 7200
Width = 855
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'声明通用变量
Public oldx As Single, oldy As Single
Private y() As Single
'绘制波形(拉格郎日三点插值,多点时分段)
Private Sub buo()
Dim n As Integer, i As Integer, j As Integer
Dim j1 As Integer, j2 As Integer, t As Single
Dim tm As Single, tm2 As Single
Dim tm3 As Single, u As Single
lp:
If Option2.Value = True Then '按下"测量"时绘制波形
Picture1.AutoRedraw = False '绘制的波形可被清除
Picture1.Cls '清除上次绘制的波形
tm = Val(Combo3.Text) / 1000 '采样间隔μs转换为ms
tm2 = tm ^ 2
tm3 = tm / 1000
n = UBound(y) '引用y()数组上界
If n >= 3 Then '测量数据3个以上时才绘制波形
n = Int((n - 1) / 2) '分组插值组数
For i = 1 To n '建立n个插值函数绘制波形
j = 2 * (i - 1) + 1
j1 = j + 1: j2 = j + 2
t0 = (j - 1) * tm: t1 = j * tm: t2 = (j + 1) * tm
For t = t0 To t2 Step tm3 '建立第i个插值函数绘波形
u = (t - t1) * (t - t2) * y(j) * 0.5
u = u - (t - t0) * (t - t2) * y(j1)
u = u + (t - t0) * (t - t1) * y(j2) * 0.5
u = u / tm2
Picture1.PSet (t / Val(Combo1.Text) + oldx, _
oldy - u / Val(Combo2.Text)), QBColor(9)
DoEvents '可响应其它控件发生的事件
Next t
Next i
GoTo lp
Else
Picture1.Print "无测量数据"
Exit Sub
End If
End If
End Sub
Private Sub Combo1_Click()
Call buo '改变横轴值/div时,重绘制波形
End Sub
Private Sub Combo2_Click()
Call buo '改变纵轴值/div时,重绘制波形
End Sub
Private Sub Combo3_Click()
Dim out(0) As Byte, fa As Single
fa = Val(Combo3.Text)
Select Case fa
Case 10 '采样间隔为10微秒时发送1
out(0) = &H1
Case 100 '采样间隔为100微秒时发送2
out(0) = &H2
Case 1000 '采样间隔为1000微秒时发送4
out(0) = &H4
Case 10000 '采样间隔为10000微秒时发送8
out(0) = &H8
End Select
MSComm1.Output = out '向单片机发送信息
End Sub
Private Sub Command1_Click()
End '停止测量
End Sub
'初始化
Private Sub Form_Load()
With MSComm1 '串口初始化
.InBufferSize = 1024 '接收缓冲区1024字节
.OutBufferSize = 512 '输出缓冲区512字节
.CommPort = 1 '串口1
.Settings = "1200,n,8,1" '波特率1200,1个停止位,无校验
.Handshaking = comNone '无协议
.InputLen = 0 '获得接收缓冲区的所有内容
.InputMode = comInputModeBinary '以二进制格式访问
.RThreshold = 7 '接收缓冲区可接收的字节数
.SThreshold = 1 '不发送
.PortOpen = True '打开串口
End With
ReDim y(0) '定义y()动态数组
Combo1.Text = 1 '纵横轴初值
Combo2.Text = 1
Combo3.Text = 100 '采样间隔初值
'调试程序时使用
Dim yy() As Byte, n As Integer '定义yy()数组
k = 8 '串口接收的字节数送K
ReDim y(0), yy(7)
yy(0) = 1
yy(1) = &H0 'yy()数组内容(三角波)
yy(2) = &H80
yy(3) = &HFF
yy(4) = &H80
yy(5) = &H0
yy(6) = &H80
yy(7) = &HFF
y(0) = yy(0) '取出被测摸拟量被衰减的倍数
For i = 2 To k
n = UBound(y) '当前y()数组上界
ReDim Preserve y(n + 1) '数组y()增加1个元素
y(n + 1) = yy(i - 1) '把Byte型数据转换为Sigle型
y(n + 1) = -y(0) * (y(n + 1) / 128 - 1) * 5 '标度变换
Next
End Sub
'建立图片框内的坐标系统
Private Sub Form_Paint()
With Picture1 '使图片框大小随窗体尺寸自动改变
.Top = 200
.Left = 300
.Width = Me.ScaleWidth - 600
.Height = Me.ScaleHeight - 1800
.ScaleMode = 7 '以厘米为单位
oldx = .ScaleWidth / 2 '图片框中心坐标
oldy = .ScaleHeight / 2
.AutoRedraw = True '使坐标系不被CLS清除
Picture1.Line (oldx, 0)-(oldx, .ScaleHeight), _
RGB(255, 0, 0) '画纵轴
Picture1.Line (0, oldy)-(.ScaleWidth, oldy), _
RGB(255, 0, 0) '画横轴
End With
For xt = -14 To 14 '画横轴厘米刻度线
If xt <> 0 Then
Picture1.Line (oldx + xt, oldy - 0.2)-(oldx _
+ xt, oldy), RGB(255, 0, 0)
End If
Next
For xt = -14 To 14 Step 0.1 '画横轴毫米刻度线
If xt <> 0 Then
Picture1.Line (oldx + xt, oldy - 0.1)-(oldx + _
xt, oldy), RGB(255, 0, 0)
End If
Next
For yt = -9 To 9 '画纵轴厘米刻度线
If yt <> 0 Then
Picture1.Line (oldx, oldy + yt)-(oldx + 0.2, _
oldy + yt), RGB(255, 0, 0)
End If
Next
For yt = -9 To 9 Step 0.1 '画纵轴毫米刻度线
If yt <> 0 Then
Picture1.CurrentX = oldx - 0.4
Picture1.CurrentY = oldy + st - 0.1
Picture1.Line (oldx, oldy + yt)-(oldx + 0.1, _
oldy + yt), RGB(255, 0, 0)
End If
Next
End Sub
'把串口接收的数据送y()数组
Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = comEvReceive Then
Dim yy() As Byte, n As Integer
k = MSComm1.InBufferCount '串口接收的字节数送K
Debug.Print k
yy = MSComm1.Input '把串口接收的所有字节(K个)送yy()
ReDim y(0)
y(0) = yy(0) '取出被测摸拟量被衰减的倍数
For i = 2 To k
n = UBound(y) '当前y()数组上界
ReDim Preserve y(n + 1) '数组y()增加1个元素
y(n + 1) = yy(i - 1) '把Byte型数据转换为Sigle型
y(n + 1) = -y(0) * (y(n + 1) / 128 - 1) * 5 '标度变换
Debug.Print y(n + 1)
Next
End If
End Sub
Private Sub Option1_Click()
'Form1.PrintForm
End Sub
'"测量"画波形
Private Sub Option2_Click()
Call buo '调画波形过程
End Sub
'计算、显示波形上任一点的值
Private Sub Picture1_MouseDown(Button As Integer, _
Shift As Integer, x As Single, y As Single)
x = (x - oldx) * Val(Combo1.Text) '计算单击处的值
y = (oldy - y) * Val(Combo2.Text)
Picture1.Line (0, 0)-(3, 2), _
Picture1.BackColor, BF '清除该矩形区
Picture1.CurrentX = 0 '移动光标
Picture1.CurrentY = 0
Picture1.Print "该点数据:"
Picture1.Print "t="; x; "ms" '显示t值
Picture1.Print "u="; y; "v" '显示u值
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -