Me.lblTemp1(i).BackColor=vbCyan'背景变青色
Else'温度正常
Me.lblTemp1(i).BackColor=vbGreen'背景变绿色
EndIf
Nexti
EndSub
8.绘制曲线
(1)放置按钮“开始绘图”,命名为cmdDraw,输入下列代码:
PrivateSubcmdDraw_Click()
Me.tmrDraw.Enabled=NotMe.tmrDraw.Enabled'每单击一次,切换一次定时器启动/停止命令
IfMe.tmrDraw.Enabled=TrueThenMe.cmdDraw.Caption="暂停绘图"ElseMe.cmdDraw.Caption="开始绘图"
EndSub
(2)在frmMain窗体上放置图片框控件picturebox,设置背景为深蓝,命名为picD,在图片框左侧和下侧放置lablel控件,作为坐标刻度指示。
,界面如图所示
(3)在frmMain窗体代码窗口创建一个初始化坐标系的过程,如下所示
SubInitDraw(XminAsSingle,XmaxAsSingle,YminAsSingle,YmaxAsSingle)'自变量x,函数值y,min-max:
围
Me.picD.AutoRedraw=True'自动重绘
Me.picD.Cls'清屏
Me.picD.Scale(Xmin,Ymax)-(Xmax,Ymin)'定义坐标系(左上角x,左上角y)-(右下角x,右下角y)
Me.picD.DrawWidth=1'画线宽度为1
'画垂直网格
Fori=1To6:
Me.picD.Line((Xmax-Xmin)/6*i+Xmin,Ymin)-((Xmax-Xmin)/6*i+Xmin,Ymax),vbWhite:
Nexti
'画水平网格
Fori=1To10:
Me.picD.Line(Xmin,(Ymax-Ymin)/10*i+Ymin)-(Xmax,(Ymax-Ymin)/10*i+Ymin),vbWhite:
Nexti
Me.picD.CurrentX=Xmin:
Me.picD.CurrentY=Ymin'光标回原点
Me.picD.DrawWidth=2'画线宽度为2
EndSub
(4)放置一个定时器,命名为:
tmrDraw,其Ennabled属性设为false,并设Interval属性为100,双击定时器,完成代码如下所示
PrivateSubtmrDraw_Timer()'绘制曲线定时器
StaticTAsInteger'定义静态变量
T=T+1'累加
IfT=60Then'到60次
T=0'回到0
CallInitDraw(0,60,0,100)重新初始化坐标系
EndIf
Me.picD.Line-(T,mD
(1).T
(1)),vbYellow'画线,由上次光标位置画到指定坐标,光标也更新
EndSub
(5)双击frmMain窗体,在其Load事件中调用初始化坐标系的过程,如下:
PrivateSubForm_Load()
CallInitDraw(0,60,0,100)'初始化坐标系
EndSub
9.数据记录
(1)在frmMain窗体上放置两个按钮“开始记录”和停止记录,命名为cmdStart和cmdStop,放置一个定时器命名为tmrRecord,其定时间隔设为1000
(2)在程序所在文件夹建一个Excel文件,另存为97-2003兼容模式,名为“数据模板.xls”如图所示:
(3)在frmMain代码窗口创建如下过程
SubOpenExcel()
DimsFileNameAsString'文件名
sFileName=sAppPath&"\"&Month(Now)&"-"&Day(Now)&"-"&Hour(Time)&"-"&Minute(Time)&"-"&Second(Time)'“月-日-时-分-秒”作文件名
CallGetExcel'获取可用的Excel文件
sXLSName=sFileName&".xls":
sModelName=sAppPath&"\数据模板.xls"
IfDir(sXLSName)<>""ThenKillsXLSName'如果欲保存的Excel文件已存在,则先删除
SetxlApp=GetObject(sModelName)'打开模扳文件
xlApp.Parent.Windows
(1).Visible=True'使父窗体可见
SetxlSheet=xlApp.Application.Worksheets
(1)'当前工作簿的第一页
EndSub
(4)为“开始记录”按钮添加代码:
PrivateSubcmdStart_Click()
OpenExcel'打开Excel文件
xlSheet.Cells(1,5)=Month(Now)&"月"&Day(Now)&"日采集的数据"
xlSheet.Cells(2,1)="序号":
xlSheet.Cells(2,2)="时间"
Fori=1To8:
xlSheet.Cells(2,i+2)=i&"#温度":
xlSheet.Cells(2,i+2+8)=i&"#湿度":
Nexti
Me.tmrRecord.Enabled=True'开始记录
Me.cmdStop.Enabled=True:
Me.cmdStart.Enabled=False'使能“停止记录”按钮,禁止“开始记录”按钮
EndSub
(5)为“停止记录”按钮添加代码:
PrivateSubcmdStop_Click()
Me.tmrRecord.Enabled=False'停止记录数据
xlSheet.SaveAssXLSName'Excel表格另存
xlApp.Application.Quit'退出Excel
Me.cmdExit.Enabled=True'保存完Excel后才能退出系统
Me.cmdStart.Enabled=True:
Me.cmdStop.Enabled=False'使能“开始记录”按钮,禁止“停止记录”按钮
EndSub
(6)为定时器tmrRecord按钮添加代码:
PrivateSubtmrRecord_Timer()'数据记录定时器,定时保存到Excel表格
StatickAsLong
k=k+1
If(kMod5)=0Then'定时器中断5次(即5秒)执行一次
SaveToExcel'数据记录到Excel文件
EndIf
EndSub
(7)在frmMain代码窗口创建SaveToExcel过程,如下所示:
PrivateSubSaveToExcel()
StatickAsLong'K为行号
k=k+1
Ifk>32767Thenk=0'Excel最大行不能超过32768
xlSheet.Cells(k+2,1)=Time:
xlSheet.Cells(k+2,2)=k'表头
xlSheet.Cells(k+2,3)=Format(mD
(1).T
(1),"#0.0")&"℃":
xlSheet.Cells(k+2,4)=Format(mD
(1).T
(2),"#0.0")&"℃"
xlSheet.Cells(k+2,5)=Format(mD
(2).T
(1),"#0.0")&"℃":
xlSheet.Cells(k+2,6)=Format(mD
(2).T
(2),"#0.0")&"℃"
xlSheet.Cells(k+2,7)=Format(mD(3).T
(1),"#0.0")&"℃":
xlSheet.Cells(k+2,8)=Format(mD(3).T
(2),"#0.0")&"℃"
xlSheet.Cells(k+2,9)=Format(mD(4).T
(1),"#0.0")&"℃":
xlSheet.Cells(k+2,10)=Format(mD(4).T
(2),"#0.0")&"℃"
xlSheet.Cells(k+2,11)=Format(mD
(1).RH
(1),"#0")&"%":
xlSheet.Cells(k+2,12)=Format(mD
(1).RH
(2),"#0")&"%"
xlSheet.Cells(k+2,13)=Format(mD
(2).RH
(1),"#0")&"%":
xlSheet.Cells(k+2,14)=Format(mD
(2).RH
(2),"#0")&"%"
xlSheet.Cells(k+2,15)=Format(mD(3).RH
(1),"#0")&"%":
xlSheet.Cells(k+2,16)=Format(mD(3).RH
(2),"#0")&"%"
xlSheet.Cells(k+2,17)=Format(mD(4).RH
(1),"#0")&"%":
xlSheet.Cells(k+2,18)=Format(mD(4).RH
(2),"#0")&"%"
EndSub
10.使用ADO访问数据库
(1)创建数据库(DB)
①使用“可视化数据管理器”创建一个数据库文件:
执行菜单命令“外接程序\可视化数据管理器”,在打开的对话框中执行如下菜单命令,数据库文件命名为“数据”,保存
②在数据库窗口中,点右键,选“新建表”,表名称为“数据表”,按如下表格添加字段
名称
类型
大小
必要的
顺序位置
缺省值
序号
Long
4
√
0
时间
Date/time
8
1
00:
00:
01
温度1
Single
4
2
0
温度2
Single
4
2
0
温度3
Single
4
2
0
温度4
Single
4
2
0
湿度1
Single
4
2
0
湿度2
Single
4
2
0
湿度3
Single
4
2
0
湿度4
Single
4
2
0
添加完后,点击“生成表”
③双击“数据表”,点“添加”,输入数据,每输入完一条记录就点击“更新”,如果出现下列错误提示,点“否”
输入4~5行数据即可,关闭“可视化数据管理器”
(2)创建数据库访问程序
①在frmMain窗体上放置一个按钮,外形:
,名称:
cmdDB
②新建一个窗体,按下表设置属性
属性名
名称
Caption
Width
Height
MaxButton
MinButton
属性值
frmDB
数据访问窗口
15000
9000
False
False
③在frmDB窗体下方放置两个按钮外形:
,分别命名为cmdQuery和cmdQuit。
④在frmDB窗体上,执行菜单命令“工程/部件”,按下图选择ADO控件(ActiveXDataObjects)和DataGrid控件。
点击“确定”,可以看到左侧的工具箱多了两个工具图标:
⑤在frmDB窗体上放置一个DataGrid控件,设置其宽度(Width)为14000,高度(Height)为7000,其背景色(BackColor)为黄色。
右键单击该控件,选“属性”,打开其属性窗口,设置下列其字体属性
⑥切换到frmDB的代码窗口,定义访问数据库必须的变量:
DimnAsNewConnection,RstAsNewADODB.Recordset
⑦生成数据库连接字符串:
在frmDB窗体上放置一个ADO控件,右键单击它,如下图选ADODC属性
打开ADO控件的属性页:
点“生成”,得到下图,如图中所示选第二项
点“下一步”,得到下图
点击图中位置,找到数据库文件“数据.mdb”,如下图
点“测试连接”,显示
,点确定,复制属性页第一页中“使用连接字符串”下面文本框中的容。
⑧删除frmDB窗体上的ADO控件,双击“查询”按钮,输入如下代码
PrivateSubcmdQuery_Click()
'连接数据库并实现所要求的查询
n.CursorLocation=adUseClient
n.Open"Provider=Microsoft.Jet.OLEDB.4.0;PersistSecurityInfo=False;DataSource=E:
\软件技术基础\TR\数据.mdb"'此处粘贴刚刚生成的连接字符串
'Rst.Open"select序号,时间,温度1,湿度1,from数据where温度1>30",n,adOpenStatic,adLockBatchOptimistic,adCmdText
Rst.Open"select*from数据表",n,adOpenStatic,adLockBatchOptimistic,adCmdText
Debug.PrintRst.RecordCount
'若无满足要求的记录,则提前退出
IfRst.RecordCount<1Then'若无符合条件的记录,则
SetMe.DataGrid1.DataSource=Rst'更新查询结果显
ExitSub
EndIf
Rst.Sort="时间"'排序
SetMe.DataGrid1.DataSource=Rst'显示于表格中
Fori=0To9:
Me.DataGrid1.Columns(i).Width=Me.DataGrid1.Width/10:
Nexti
Me.DataGrid1.Caption="查询到的数据"
EndSub
(3)完成数据访问窗体,双击“返回按钮”,输入下面代码:
PrivateSubcmdQuit_Click()
Rst.Close'关闭视图
n.Close'断开数据库连接
UnloadMe'关闭窗体
EndSub
11.给采集到的数据添加滤波功能
(1)添加模块module2,在其代码窗口中输入下面函数:
'中位平均法滤波函数,数组x中去掉TrimN个最大的和最小的,剩余数据取平均值
PublicFunctionMidLvBo(x()AsSingle,TrimNAsInteger)AsSingle
DimL,U:
L=LBound(x):
U=UBound(x)'取数据源数组下标的下限和上限
Dimb()AsSingle:
ReDimb(LToU)'定义用于排序的数组
Fori=LToU:
b(i)=x(i):
Nexti'数组另存
'以下为冒泡法排序
Fori=LToU-1
Forj=i+1ToU
If(b(i)>b(j))Then
DimtAsSingle
t=b(i):
b(i)=b(j):
b(j)=t'交换
EndIf
Nextj
Nexti
DimsumAsSingle,nAsInteger:
sum=0'sum为求和数,n为最终留下的数据个数
Fori=L+TrimNToU-TrimN:
sum=sum+b(i):
Nexti'中间数求和
n=U-L-2*TrimN+1'留下的数据个数
Ifn<=0ThenMidLvBo=0ElseMidLvBo=sum/n'异常处理
EndFunction
(2)在frmMain窗体空白处放置按钮,
,命名为cmdLvBo,双击它,添加下面的代码:
PrivateSubcmdLvBo_Click()
Dimx(1To6)AsSingle,TrimNAsInteger,yAsSingle
Fori=1To6
x(i)=CSng(InputBox("请输入6个数据,当前是第"