📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, PCI8361, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
m_cardNO: Longint;
STxt_AD:array[0..7] of TStaticText;
m_timer1Finish: Boolean;
// m_initData : PLongArray;
m_floatData : PSingleArray;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
//生成控件数组
for i:=0 to 7 do
begin
STxt_AD[i] := TStaticText.create(self);
STxt_AD[i].Parent := form1;
STxt_AD[i].BorderStyle := sbsSunken;
STxt_AD[i].Visible := true;
STxt_AD[i].Width := 90;
STxt_AD[i].Height := 17;
STxt_AD[i].Left := 100 + (STxt_AD[i].Width+3)*((i-1) mod 8 );
STxt_AD[i].Top := 100 + (STxt_AD[i].Height+3)*((i-1) div 8 );
STxt_AD[i].AutoSize := false;
STxt_AD[i].Caption := 'AD' + inttostr(i+1);
end;
//打开设备
m_cardNO := 1;
if (ZT8361_OpenDevice(m_cardNO) <> 0) then
MessageBox(form1.Handle,'打开失败','',MB_OK)
else
//MessageBox(form1.Handle,'打开成功','',MB_OK);
form1.Caption := '打开成功';
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
// FreeLongArray(m_initData, 819200); //释放缓冲区
FreeSingleArray(m_floatData, 819200); //释放缓冲区
//关闭设备
//m_cardNO := 1;
if (ZT8361_CloseDevice(m_cardNO) <> 0) then
MessageBox(form1.Handle,'关闭失败','',MB_OK)
else
//MessageBox(form1.Handle,'关闭成功','',MB_OK);
form1.Caption := '关闭成功';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Longint;
ampArr : PLongArray;
begin
//打开中断,同时启动定时AD
CreateLongArray(ampArr, 8); //申请缓冲区
CreateSingleArray(m_floatData, 819200); //申请足够大的缓冲区
//如果缓冲区分配失败,退出
if (ampArr=nil) or (m_floatData=nil) then
begin
showMessage('缓冲区分配失败');
Exit;
end;
ZT8361_CloseIRQ(m_cardNO); //关闭中断
ZT8361_DisableAD(m_cardNO); //停止定时AD
ZT8361_ClearHFifo(m_cardNO, 1); //清空硬件FIFO(HFIFO)
ZT8361_ClearSFifo(m_cardNO, 1); //清空AD软件FIFO(SFIFO)
if ZT8361_GetSFifoSize(m_cardNO, 1) <> 400 then
begin
if ZT8361_SetSFifoSize(m_cardNO, 1, 400) <> 400 then
begin
MessageBox(form1.Handle,'未申请到足够的缓冲区','',MB_OK);
Exit;
end;
end;
//打开中断会死机
ZT8361_OpenIRQ( m_cardNO, 0, 0, 0, 0, 0 );
ZT8361_InitIRQ(m_cardNO, 1); //使能HFIFO半满中断
//设置AD方式控制字,同时清空FIFO
//通道1采集, 速率50K,定时方式, 1倍增益
for i:=0 to 8-1 do
begin
ampArr[i] := 0; //一倍增益
end;
ZT8361_AIinit(m_cardNO, 0, $100 + $1, 2, ampArr, 5, 47, 0, 0);
ZT8361_EnableAD(m_cardNO); //允许定时AD
Label1.Caption := '错误号:' + inttostr(ZT8361_GetLastErr); //返回函数执行的状态
m_timer1Finish := True;
Timer1.Interval := 100;
Timer1.Enabled := True; //False
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
//停止定时采集
m_timer1Finish := False;
Timer1.Enabled := False;
ZT8361_CloseIRQ(m_cardNO); //关闭中断
Label1.Caption := '错误号:' + inttostr(ZT8361_GetLastErr); //返回函数执行的状态
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
k: Longint;
i: Longint;
retCount, currCount, wantCnt: Longint;
sum:array[0..7] of real;
begin
//连续采集,每100毫秒种读一次SFIFO,每次读一批数
//每批数,每个通道,取前若干个数求平均值显示
if m_timer1Finish = False then Exit; //防止重入
m_timer1Finish := False;
//成批读数
wantCnt := 10000;
currCount := ZT8361_GetSFifoDataCount(m_cardNO, 1);
if currCount >= wantCnt then
begin
retCount := ZT8361_AISFifo(m_cardNO, 0, m_floatData, wantCnt);
if retCount<wantCnt then
begin
showMessage('读取数据失败');
Exit;
end;
form1.Caption := '当前SFIFO中数据个数: ' + inttostr(currCount);
Label1.Caption := '错误号:' + inttostr(ZT8361_GetLastErr); //返回当前错误号
//每批数,每个通道,取前2500个数求平均值显示
for k:=0 to 1-1 do
begin
sum[k] := 0;
for i:=0 to 1000-1 do
begin
sum[k] := sum[k] + m_floatData^[i * 1 + k];
end;
STxt_AD[k].Caption := FormatFloat('0.00', sum[k]/1000.0) + ' mV';
end;
end;
m_timer1Finish := True;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -