现在位置:范文先生网>理工论文>计算机信息技术>利用Delphi 3.0开发微机数据采集与处理软件系统

利用Delphi 3.0开发微机数据采集与处理软件系统

时间:2022-12-05 13:45:22 计算机信息技术 我要投稿
  • 相关推荐

利用Delphi 3.0开发微机数据采集与处理软件系统

  张建军(中国人民解放军合肥炮兵学院研究生系)
  
  摘要:结合开发“无线电话务模拟训练系统”Win32版软件的实例,本文详细介绍利用Delphi3.0开发微机数据采集与处理软件系统的方法。
  
  
  关键词:DelphiADCDAC
  
  微机数据采集与处理系统简介
  数据采集与处理是计算机应用的一个重要分支,主要研究信息数据的采集、存贮、处理及控制等内容。70年代以来,由于微机技术的快速发展及其在军、民用工程领域的广泛应用,尤其是适于通用微机(如IBMPC系列)使用的板卡级数据采集产品的大量出现,以微机为核心的可编程数据采集与处理技术得到迅速发展。现在的微机,只需在其扩展槽内插上一块数据采集板,并辅以应用软件,即可组成一套微机数据采集与处理系统,实现信息处理和实时控制功能。
  
  数据采集与数据处理
  
  
  数据采集与处理技术主要研究模数、数模转换(A/D、D/A)、数据处理等问题,需要计算机硬件电路和软件编程知识。
  
  数据采集:为对温度、压力、流量、速度、位移、振动、噪声等物理量进行测控,首先通过传感器把上述物理量转换成模拟电信号,而后由A/D—D/A板将模拟电信号转换成时间、数值上量化且离散的数字量输入计算机系统。数据采集的核心是A/D转换。
  
  数据处理:计算机根据被测控对象的需要,对采集到的数据进行数学分析运算,处理结果一方面送至显示器、打印机等外设,一方面由A/D—D/A板将数字量转换成模拟电信号输出,对外部物理量进行实时监控。数据处理的核心是数值处理和D/A转换。
  
  2、微机数据采集与处理系统硬件组成
  
  系统主要由被测控对象(设备)、A/D—D/A通道、开关量I/O通道、微机等组成,如图1所示。较复杂的系统包括单片机等多机系统。
  
  
  
  图1微机数据采集与处理系统硬件组成
  
  3、与IBMPC兼容的板卡级数据采集产品
  
  利用IBMPC系列微机及其兼容机I/O通道开放的设计特点,许多厂商已经设计出采用板卡级结构的数据采集产品。这类产品在一块印刷电路板上包括了模拟多路开关(MUX)、采样保持电路(S/H)、模数、数模转换器(ADC、DAC)等部件(有的板型还提供并行I/O接口8255,定时/计数器8254/8254等通用可编程芯片),采用IBMPC总线,可直接插入微机任一扩展槽。本文介绍台湾AXIOM公司生产的AX5412高速数据采集板,以及利用Delphi开发该产品A/D—D/A接口软件的方法。
  
  软件系统设计
  ㈠、预备知识
  
  软件开发工具的选择
  为开发基于Windows95/NT/98操作平台的32位数据采集与处理系统,软件设计应符合以下需求:
  
  ⑴具有在Windows下实时访问80x86CPUI/O端口、硬件中断调用等功能;
  
  ⑵支持32位编程;
  
  ⑶代码执行速度快、界面友好、使用方便;
  
  ⑷开发周期短、代码可重用性好、效费比高。
  
  综上所述,根据VC5.0、VB5.0、Delphi3.0(或其最新版Delphi4.0)三种流行RAD工具的不同特点,作者在开发Windows版“无线电话务模拟训练系统”软件过程中选择了Delphi3.0,利用Delphi的IDE环境编写VCL构件,结合虚拟设备驱动程序(.vxd)实现⑴的功能。
  
  2、VCL构件主要属性、方法、事件、过程介绍
  
  ⑴通用属性、方法、过程
  
  ·ActiveHW:Boolean:该属性只读且运行时有效,如果虚拟设备驱动程序正常工作,则ActiveHW为True,否则为False。
  
  ·OpenDriver:该方法加载虚拟设备驱动程序,为其分配内存,使程序具有直接访问系统硬件的能力。如果虚拟设备驱动程序加载成功,ActiveHW属性被设置为True,否则为False。
  
  ·CloseDriver:该方法关闭虚拟设备驱动程序,释放为其分配的内存。如果虚拟设备驱动程序关闭成功,ActiveHW被设置为False。
  
  ⑵I/O端口访问
  
  ·HardAccess:Boolean:该属性决定虚拟设备驱动程序采用何种方式访问I/O端口。如果HardAccess为False,I/O访问速度较快,但若指定I/O地址已被其它驱动程序占用,I/O访问可能失败;如果HardAccess为True,I/O访问速度稍慢,但能保证若指定I/O地址已被其它驱动程序占用,I/O访问仍能进行。
  
  ·Port[Index:Word]:Byte:该方法数据类型为Byte—字节。(读/写指定地址的I/O端口,参数Index为指定I/O端口地址,数据类型为Word—字,下同)
  
  ·PortW[Index:Word]:Word:该方法数据类型为Word—字。
  
  ·PortL[Index:Word]:dWord:该方法数据类型为DWord—双字。
  
  I/O读写代码实例:
  
  withmyPortdo
  
  begin
  
  {...}
  
  Port[$2F0]:=$47;//向地址为2F0H的I/O端口写一个字节的数据47H
  
  {...}
  
  myInpute:=Port[$2F9];//从地址为2F9H的I/O端口读一个字节的数据,并赋给变量
  
  //myInpute
  
  {...}
  
  end;
  
  ⑶硬件中断调用
  
  与DOS不同,在Windows操作系统中,硬件中断调用功能被隐藏或屏蔽起来,Windows一般不允许直接调用硬件中断。为此,需使用以下属性、事件、方法:
  
  ·OnHwInterrupt:TnotifyEvent:该事件通知系统一个硬件中断已经被调用。应将中断服务程序放在该事件中。
  
  ·IRQNumber:Byte:该属性指定欲调用的中断号(IRQ1—15),不支持0号中断(IRQ0—系统时钟)。
  
  ·SetIRQ:该方法将IRQNumber指定的中断分配给OnHwInterrrupt过程,并将IsIRQSet属性设置为True。
  
  ·UnmaskInterrupt:该方法解除Windows对IRQNumber指定中断的屏蔽,当中断产生时,将调用OnHWInterrupt事件,并将Masked属性设置为False。
  
  ·MaskInterrupt:该方法恢复Windows对IRQNumber指定中断的屏蔽,并将Masked属性设置为True。
  
  ·DestroyIRQ:该方法释放为解除屏蔽由IRQNumber指定中断分配的内存空间,并将IsIRQSet属性设置为False,Masked属性设置为True。
  
  ·IsIRQSet:Boolean:该属性只读,如果SetIRQ设置中断成功,IsIRQSet属性被设置为True,否则为False。
  
  ·Masked:Boolean:该属性只读,如果中断设置成功,Masked为False,否则为False。
  
  3、AX5412数据采集板性能简介
  
  与其它产品(如MS1215)相比,AX5412具有许多优越性能。限于篇幅,本文无法对产品特性、开关描述、用户连接、引脚功能、板上寄存器结构和格式等逐一介绍,仅简要介绍与接口编程有关的重要部分,以便阅读下文所述程序时理解。
  
  ⑴采用12位A/D转换器,A/D转换时间为9us。
  
  ⑵可编程增益控制。
  
  ⑶开关选择单端16通道模拟输入或差动8通道模拟输入(可抑制嗓声,得到高精度A/D转换结果)。
  
  ⑷占用16个连续I/O端口地址,通过板上基地址选择开关设置基地址,默认为300H。
  
  ⑸`定时器基频率选择开关(J3):AX5412自带一片8254计数/定时器,8254中的计数器1和计数器2在内部串联起来产生一个固定周期信号作为A/D转换的触发源。有两个基频率1MHZ或10MHZ通过J3选择,默认为1MHZ。级联定时器的频率由下式确定:
  
  除数1和除数2分别对应于8254计数器1和计数器2设定的计数值(2~65535,计数器是16位的)。计数器1和计数器2值串联相当于一个32位的计数器,可以用于时间很长的定时。
  
  ⑹A/D数据寄存器(基址+0和基址+1)
  
  ·基址+0(读):低4位说明进行A/D转换的通道号(0~15);高4位是A/D转换值的低4位。
  
  ·基址+0(写):写任意值即实施软件触发开始A/D转换。
  
  ·基址+1(读):A/D转换值的高8位。
  
  ⑺转换通道控制寄存器(基址+2,读/写):低4位表示多通道A/D转换的开始通道,高4位表示多通道A/D转换的结束通道。如低4位和高4位写入的值相同,表示单一通道连续采样。
  
  ⑻0通道D/A输出(基址+4和基址+5,写)
  
  ·基址+4:写该寄存器高4位输出D/A0低4位,该寄存器低4位无效。
  
  ·基址+5:写该寄存器8位输出D/A0高8位。
  
  ⑼1通道D/A输出(基址+6和基址+7,写)
  
  ·基址+6:写该寄存器高4位输出D/A1低4位,该寄存器低4位无效。
  
  ·基址+7:写该寄存器8位输出D/A1高8位。
  
  ⑽状态寄存器(基址+8)
  
  ·读:第7位(A/D转换完成位)EOC表示A/D转换是否完成。若EOC=0,A/D转换已完成,可以读取A/D转换数据;若EOC=1,A/D转换未完成。当开始读取数据,EOC被重新置1。
  
  ·写:向该寄存器写任何值清除中断请求。在实际中断服务程序中,在开中断前应先清中断,再利用控制寄存器(基址+9)开中断。
  
  ⑾控制寄存器(基址+9)
  
  ·0~1位:控制启动A/D的触发源。
  
  ·2位:为1,DMA方式有效;为0,DMA方式无效。
  
  ·4~6位:选择中断级别。(PC机8259中断控制器管理的中断中,中断2系统未用,一般选2级中断)
  
  ⑿定时器控制寄存器(基址+10,写)
  
  ·0位:若为1,表示AX5412板上8254计数器中由计数器1和计数器2串联成的定时器触发起作用;否则,不起作用。
  
  ⒀增益控制寄存器(基址+11,读/写):低4位组合表示增益。
  
  ㈡、编程实例
  
  以下程序均以AX5412为例。
  
  1、软件启动,查询管理
  
  ·A/D轮换:
  
  设有一模拟输入信号单端输入,输入10通道,现对其进行A/D转换,输入计算机。
  
  {...}
  
  var
  
  constBasea:Word=$300;//AX5412默认基地址为300H
  
  {...}
  
  procedureAdc:Integer;//A/D转换
  
  var
  
  state:Byte;//读取A/D转换完成位
  
  al:Byte;//A/D转换低4位
  
  ah:Byte;//A/D转换高8位
  
  adval:Integer;//A/D转换结果
  
  begin
  
  withmyPortdo
  
  begin
  
  Port[Basea+2]:=$AAH;//10通道单通道连续采样,170D=AAH
  
  Port[Basea+11]:=0;//增益为1
  
  Port[Basea+9]:=0;//软件启动A/D转换
  
  Port[Basea]:=0;//开始A/D转换
  
  repeat
  
  state:=Port[Basea+8];
  
  untilband$80=$80;//检测A/D转换完成情况
  
  al:=Port[Basea];//读A/D转换值低4位
  
  ah:=Port[Basea+1];//读A/D转换值高8位
  
  adval:=(al/16)or(ah*16);//计算12位A/D转换结果
  
  Adc:=adval;//返回值
  
  end;
  
  end;
  
  ·D/A转换:
  
  设将一模拟控制电压Volt从D/A1通道输出,控制某一对象。
  
  说明:AX5412数字量输出满量程(即12位均为1时,数字值为4095D)时输出的模拟电压为5伏。
  
  procedureDac(Volt:Float);//D/A转换
  
  var
  
  al:Integer;//D/A转换低4位
  
  ah:Integer;//D/A转换高8位
  
  daval:Float;
  
  begin
  
  daval:=4095/5*Volt;//将欲输出的模拟电压值近似为数字值
  
  ah:=Int(daval/16);//A/D转换高8位
  
  al:=Int(daval-ah*16)*16;//A/D转换低4位
  
  withmyPortdo
  
  begin
  
  Port[Basea+6]:=al;//取D/A通道1,输出D/A转换值低4位
  
  Port[Basea+7]:=ah;//输出D/A转换值高8位
  
  end;
  
  end;
  
  定时启动,中断管理
  设采样点数为1024,采样频率为3000HZ,32位定时器采用1MHZ基频率,连接PC机8259的2级中断。
  
  ⑴设定采样参数
  
  Point:=1024;//采样点数为1024
  
  Count:=1000000/3000;//采样频率为3000HZ,Count为计数器1和计数器2级联成的
  
  //定时器的计数值
  
  Count1:=2;//设定计数器1的计数值为2
  
  Count2:=Int(Count/2);//计算计数器1的计数值
  
  Low1:=2;//计数器1计数值的低字节
  
  High1:=0;//计数器1计数值的高字节
  
  Low2:=Count2mod256;//计数器2计数值的低字节
  
  High2:=Count2/256;//计数器2计数值的高字节
  
  withmyPortdo
  
  begin
  
  Port[Basea+11]:=0;//增益为1
  
  Port[Basea+2]:=$11H;//通道1单通道连续采样
  
  Port[Basea+15]:=$74H;//选择计数器1为工作计数器,按方式2工作,对计数器进
  
  //行2次读/写操作,先低字节,后高字节
  
  Port[Basea+13]:=Low1;//写计数器1计数值的低字节
  
  Port[Basea+13]:=High1;//写计数器1计数值的高字节
  
  Port[Basea+15]:=$B4H;//选择计数器1为工作计数器,按方式2工作,对计数器进
  
  //行2次读/写操作,先低字节,后高字节
  
  Port[Basea+13]:=Low2;//写计数器2计数值的低字节
  
  Port[Basea+13]:=High2;//写计数器2计数值的高字节
  
  end;
  
  ⑵编写中断服务程序
  
  procedureTForm1.myPortHwInterrupt(Sender:TObject);//中断服务程序
  
  {...}
  
  ImportHigh:=Port[Basea+1];//读A/D转换高8位
  
  ImportLow:=Port[Basea];//读A/D转换高8位
  
  Sample[i]:=ImportHigh*16orImportLow/16;//计算12位A/D转换结果,并赋值给采
  
  //样数组
  
  i:=i+1;
  
  Port[Basea+8]:=0;//清中断
  
  end;
  
  ⑶设置中断
  
  withmyPortdo
  
  begin
  
  ifActiveHWthenCloseDriver
  
  else
  
  begin
  
  OpenDriver;
  
  ifnotActiveHWthen
  
  begin
  
  MessageBeep(0);
  
  Application.MessageBox('系统发现指定I/O端口未能成功打开!',
  
  '请注意!',mb_OKormb_ICONHAND);
  
  end
  
  else
  
  begin
  
  IRQNumber:=2;
  
  SetIRQ;
  
  end;
  
  end;
  
  end;
  
  ⑷开中断,进行采样
  
  Port[Basea+9]:=$A3H;//选择定时器触发,连接PC机2级中断,开中断
  
  Port[Basea+8]:=1;//选择定时器触发
  
  i:=0;
  
  whilei<>Pointdo;//等待中断,每中断一次采样一个数据,直至采满Point个点
  
  ⑸退出系统前关闭中断
  
  procedureTForm1.FormClose(Sender:TObject;varAction:TCloseAction);
  
  begin
  
  {...}
  
  myPort.CloseDriver;
  
  {...}
  
  end;
  
  在实际工作中,读者应根据具体数据采集板的硬件特性,参考上述方法,编写数据采集、分析、输出代码。
  
  参考文献
  
  
  
  沈兰荪.数据采集技术.中国科学技术大学出版社.1990
  FrankEngo.使用Delphi3编程.电子工业出版社.1997
  一九九九年一月
  
  
  
  作者通信地址:(230031)安徽省合肥市炮兵学院研究生系97级张建军(收)
  
  作者电话:(0551)5560324(宿舍直拨)(0551)5562566转68750(研究生系值班室)
  
  
  
  
  

【利用Delphi 3.0开发微机数据采集与处理软件系统】相关文章:

利用ColdFire uClinux实现数据采集和传输08-06

具有故障保护功能的数据采集系统08-06

基于USB总线的高速数据采集系统08-06

基于USB接口的数据采集系统设计08-06

Windows 95下智能数据采集系统08-06

采用USBN9602的数据采集系统设计08-06

基于DSP的 USB 口数据采集分析系统08-06

基于Verilog HDL设计的自动数据采集系统04-12

基于DSP的USB口数据采集分析系统08-06