基于vb的上位机智能仪表监控程序设计
毕业设计题目。老师要求用单片机和pc连一起,监视远程的电压 电流表的数值,还要波形图,再用excel显示出来。但是vb编程老师出现错误。属性里的控件不齐全。麻烦大神们帮我看看。Dim myexcel As Excel.Application ' 定义 Application 对象变量
Dim mybook As Excel.Workbook ' 定义工作薄对象变量
Dim mysheet As Excel.Worksheet ' 定义工作表对象变量
Dim n As Integer ' 定义电子表格中已有内容的行数变量
'
程序代码:
"开始采集"程序代码: Private Sub Command1_Click() Timer1.Enabled = True Timer2.Enabled = True Call draw Set myexcel = Excel.Application ' 启动 Excel 应用软件 Set mybook = myexcel.Workbooks.Open(" e:/meter.xls ") ' 打开 E 盘工作薄文件" Set mysheet = mybook.Worksheets(1) 'mysheet指向工作薄中的第 1 张工作表 myexcel.Visible = True ' 显示 Excel 应用环境 (工作表可视) n = mysheet.UsedRange.Rows.Count ' 获取电子表格中已有内容的行数 End SubPrivate Sub Command2_Click() Timer1.Enabled = False ' 不允许 Timer1 计时 mybook.Save ' 保存工作薄 myexcel.Quit ' 关闭 Excel 应用软件 End Sub
程序代码:
'注意:在程序开始之前,必须清空发送和接收缓冲区,以免出错。 Private Sub Form_Load() MSComm1.Settings = "9600,n,8,1" ' 设置波特率和发送字符格式 = 1 ' 设置通讯串口 MSComm1.InputLen = 0 ' 设置或返回一次从接收缓冲区中读取字节数,0表示一次读取所有数据 MSComm1.InBufferSize = 512 ' 设置接收缓冲区512Byte MSComm1.InBufferCount = 0 MSComm1.OutBufferSize = 512 ' 设置发送缓冲区512Byte MSComm1.OutBufferCount = 0 MSComm1.RThreshold = 6 ' 每个字符到接收缓冲区都触发接收事件 MSComm1.SThreshold = 1 End Sub' 接收单片机发送的数据,并显示 Private Sub MSComm1_OnComm() Dim inth() As Byte ' 存放输入的 Byte 型采样数据 Dim th(5) As Single ' 存放 Byte 型转为 Single型数据 Dim vol, cur As Single ' 电压、电流值 If = comEvReceive Then inth = MSComm1.Input ' 输入 Byte 型数据存入inth For i = 0 To 5 th(i) = inth(i) ' 把 Byte 型转换为 Single 型存入 t h Next i If (inth(0) Xor inth(1) Xor inth(2) Xor inth(3) Xor inth(4)) = inth(5) Then ' 异或校验正确时: vol = th(2) * 256 + th(1) ' 计算电压采样值(二进制变十进制) vol = 50 * vol / 1024 ' 计算电压测量值 vol = Format$(vol, "0.0") cur = th(4) * 256 + th(3) ' 计算电流采样值(二进制变十进制) cur = 100 * cur / 1024 ' 计算电流测量值 cur = Format$(cur, "0.0") If th(0) = 1 Then Text1t.Text = vol & " V" ' 文本框显示 1 号表测量值 Text1h.Text = cur & " I" n = n + 1 ' 电子表格中已有内容的行数 +1(即指向首个空行) mysheet.Cells(n, 1).Value = Time ' 当前时间存入单元格 mysheet.Cells(n, 2).Value = vol '1 号表电压值存入第 n 行 2 列单元格 mysheet.Cells(n, 3).Value = cur '1 号表电流值存入第 n 行 2 列单元格 End If If th(0) = 2 Then Text2t.Text = vol & " V" ' 文本框显示2 号表测量值 Text2h.Text = cur & " I" mysheet.Cells(n, 4).Value = Time ' 当前时间存入第 n 行 4 列单元格 mysheet.Cells(n, 5).Value = vol ' 2 号表电压值存入第 n 行 5 列单元格 mysheet.Cells(n, 6).Value = cur '2 号表电流值存入第 n 行 6 列单元格 End If End If mybook.Save ' 保存工作薄(读 1 次表保存 1 次) End If Select Case ' 设置oncomm事件,读取片机内存的值 Case comEvReceive Inputsignal = MSComm1.Input Text2.Text = Asc(Inputsignal) ' 单片机内存的值用Text2显示出 Case Else End Select End Sub' 绘制坐标系子函数 Private Sub Picture1_Paint() '绘制坐标系 Dim x As Integer Dim y As Integer Picture1.Scale (-100, 70)-(1600, -10) '定义坐标系'画坐标系 Picture1.ForeColor = RGB(200, 5, 200) Picture1.DrawWidth = 1 Picture1.Line (0, 0)-(0, 65) Picture1.Line (0, 0)-(1550, 0) '画电压坐标点(以10v为1个单位) Picture1.ForeColor = RGB(0, 0, 255) Picture1.DrawWidth = 4 For y = 0 To 60 Step 10 Picture1.PSet (0, y) Next y '画电压坐标点(以1v为1个单位) Picture1.ForeColor = RGB(0, 0, 255) Picture1.DrawWidth = 2 For y = 1 To 59 Picture1.PSet (0, y) Next x '画时间坐标点(以1小时为1个单位) For x = 0 To 1440 Step 60 Picture1.PSet (x, 0) Next x '画时间坐标点(以6小时为1个单位) Picture1.ForeColor = RGB(0, 0, 255) Picture1.DrawWidth = 4 Picture1.PSet (720, 0) Picture1.PSet (360, 0) Picture1.PSet (1080, 0) Picture1.PSet (1440, 0) End SubPrivate Sub Time1_Timer() Dim out(2) As Byte ' 定义向仪表发送读指令的数组 No = No + 1 ' 改变仪表地址(No 在通用声明中定义) If No = 1 Then out(0) = &H1 '1 号仪表地址 1 存入 out(0) out(1) = &H0 ' 读控制字 0 存入 out(1) out(2) = out(0) Xor out(1) ' 异或校验存入 out(2) MSComm1.Output = out ' 发送 1 号仪表的读数指令 End If If No = 2 Then out(0) = &H2 '2 号仪表地址 2 存入 out(0) out(1) = &H0 ' 读控制字 0 存入 out(1) out(2) = out(0) Xor out(1) ' 异或校验存入 out(2) MSComm1.Output = out ' 发送 2 号仪表的读数指令 End If If No = 2 Then ' 若测量系统只有两只仪表时 No = 0 ' 表地址变量清 0(从第 1 只表开始) End If End SubPrivate Sub Time2_Timer() '用来实时提取串口数据并实时绘图。测电压可每分钟提取一次数据 Dim t As Single t = Val(Text2.Text) '绘制电压实时变化曲线 '绘制电压实时变化曲线 Picture1.ForeColor = RGB(0, 0, 255) Picture1.DrawWidth = 3 x = x + 1 Picture1.PSet (x, t) If x > 1440 Then Picture1.Cls x = 0 '刷新坐标系 Call Paint End Sub