C语言测控系统程序设计实验报告.docx
《C语言测控系统程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《C语言测控系统程序设计实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
C语言测控系统程序设计实验报告
HarbinInstituteofTechnology
C语言测控系统程序设计
实验报告
专业:
自动化
班级:
1104103班
学号:
1111850105
姓名:
刘济鹏
设计时间:
2013年1月10日
实验一定时中断程序设计
实验的目的:
1.掌握定时器/计数器8254的工作原理与编程。
2.熟悉中断控制器8259A的工作原理与使用方法。
3.掌握硬件中断程序设计的原理与编程方法。
实验条件:
PC机,WinXP操作系统,TurboC2.0
程序设计要求:
程序运行首先提示输入中断服务的时间间隔T和中断服务次数N,正确输入后,回车,则每间隔指定的时间T会在屏幕上显示一些字符,显示N次后,则不再显示,如果N=0,则会无限显示下去,直到在键盘上按下指定的按键,才停止显示。
停止显示后,按任意键程序结束运行。
1.时间间隔T为以毫秒为单位浮点数,可处理范围至少要0.001毫秒到5000毫秒。
2.屏幕上的显示信息要有助于验证程序运行结果的正确。
3.输入错误信息要有提示,并允许重新输入。
4.编程时要尽量把具有独立功能的代码写成子程序。
5.注意变量的命名要清晰,代码的注释要丰富。
6.后面的三个实验均要在此程序基础上编程、添加代码,注意程序的结构。
设计思路
1.如何实现任意时间间隔?
(附程序流程图)
voidCalculate(doubleDT,int*IL,unsignedchar*ML8,unsignedchar*MH8)/*计算中短周期*/
{
doubleM=DT*1193;
intR;
IL[0]=M/65536;
R=M-65536*IL[0];
MH8[0]=R>>8;
ML8[0]=R&0x0FF;
}
2.如何设计显示信息便于验证定时的正确性?
(文字表述及必要的代码)
通过对输入的中断事件进行检测,如果时间是大于零的,则继续进行程序,如果时间是小于零的,则重新进行输入,知道输入的值大于零为止。
while(a==0)
{
printf("pleaseinputthetimeoftheinterrupt:
\n");
scanf("%le",&T);
if(T>0)
{
a=1;
}
}
3.如何实现错误提示?
(文字表述及必要的代码)
通过对输入的变量值进行检测,如果检测结果变量值符合条件,则继续进行程序运行,如果变量值不符合条件,则提示该变量值是错误的,并且要求重新输入。
while(a==0)
{
printf("pleaseinputthetimeoftheinterrupt:
\n");
scanf("%le",&T);
if(T>0)
{
a=1;
}
else
{
printf("yournumberiswrong!
\n");
}
}
while(b==0)
{
printf("pleaseinputthetimesoftheinterrupt:
\n");
scanf("%d",&N);
if(N>0)
{
b=1;
}
else
{
printf("yournumberiswrong!
\n");
}
}
while(c==0)
{
printf("choosetouseADDAornot(1foryes,0forno)\n");
scanf("%d",&Choose);
if((Choose==0)||(Choose==1))
{
c=1;
}
else
{
printf("yournumberiswrong!
\n");
}
}
printf("pleaseinputthedatafilename:
\n");
4.如何实现按键停止定时中断服务?
(文字表述及必要的代码)
设定变量,若有按键,则使变量赋值为1,通过检验该变量值来判断是否有按键,如果变量值是1,则停止定时中断服务。
if(kbhit())
{
End=1;
}
while(Nownumbs{
if(End==1)
{
break;
}
}
5.程序编写过程中遇到过的问题及解决办法。
对输入变量值的检测,需要通过循环语句来实现,对初始检测变量赋值为0,如果变量值不符合条件,则循环语句,如果变量值符合条件,则跳出语句继续执行下面的语句。
同时不能直接对输入的时间进行使用,要对其进行适当的计算后然后方可使用。
程序运行结果截图(不同运行参数条件下)
实验二数据处理与绘图程序设计
实验的目的:
1.掌握数据文件的建立、存储和读取方法。
2.掌握C语言绘图程序设计方法。
3.掌握DosBox的使用方法。
实验条件:
PC机,WinXP操作系统,TurboC2.0,DosBox
程序设计要求:
程序运行前,配置数据文件(包括中断服务的时间间隔T,中断服务次数N,正弦曲线的振幅、周期,坐标系在屏幕上的位置,横(时间)纵(幅度)坐标显示范围及刻度等),运行后,首先,在屏幕上设定位置绘制坐标系,然后每间隔指定的时间生成设定的正弦曲线上的一个点,保存到指定数据文件并绘制在坐标系里,超过横坐标显示范围后,会滚动显示,显示N个点后,则曲线停止,如果N=0,则会无限显示下去,直到在键盘上按下指定的按键,才停止显示。
停止显示后,按任意键程序结束运行。
1.横坐标标注为时间,纵坐标标注为幅度。
2.曲线动态显示
3.配置文件如有错误要能提示,不会造成程序运行报系统错误。
4.编程时要尽量把具有独立功能的代码写成子程序。
5.注意变量的命名要清晰,代码的注释要丰富。
6.后面的数据采集要在此程序基础上编程、添加代码,注意程序的结构。
设计思路
1.如何实现配置文件参数的读取?
(文字表述及必要的代码)
通过fscanf()和fprintf()函数可以实现对文件按格式的读/写操作。
VoidRead(void)/*从setup读取数据*/
{
FILE*fp1;
fp1=fopen("Setup.txt","r");
fscanf(fp1,"%d,%d,%d,%d\n",&X1,&X2,&Y1,&Y2);
fscanf(fp1,"%le,%le,%le,%le\n",&Xa,&Xb,&Ya,&Yb);
fscanf(fp1,"%le,%le\n",&Xstep,&Ystep);
fscanf(fp1,"%le\n",&Real);
fscanf(fp1,"%d\n",&I);
fclose(fp1);
}
2.如何编写绘制坐标系的子程序?
(文字表述及必要的代码)
通过绘制直线函数来绘制坐标系的直线。
通过定位字符串输入函数的使用,实现坐标系相关标度的标注。
voidDraw(intXx,intXd,intYx,intYd,doubleXMin,doubleXMax,doubleYMin,doubleYMax,doubleXStep,doubleYStep,doubleRefline,intGrid)/*绘制坐标系*/
{
charStt[10];
intWy;
intWd1;
intD;
inti;
setlinestyle(0,0,1);/*设线型为实线,3像素宽*/
setcolor(63);/*设置坐标线颜色白色*/
setbkcolor(3);/*设置背景颜色为青色*/
line(Xx,Yx,Xd,Yx);
line(Xx,Yx,Xx,Yd);
line(Xx,Yd,Xd,Yd);
line(Xd,Yx,Xd,Yd);
Wy=Yd-(Yd-Yx)/(YMax-YMin)*(Refline-YMin);
line(Xx,Wy,Xd,Wy);
gcvt(Refline,5,Stt);
outtextxy(Xd+1,Wy-2,Stt);
i=0;/*绘制横坐标*/
while
(1)
{
D=XMin+i*XStep;
Wd1=(Xd-Xx)/(XMax-XMin)*(D-XMin)+Xx;
if(Wd1>Xd)
{
break;
}
if(Grid==1)
{
line(Wd1,Yx,Wd1,Yd);
}
else
{
line(Wd1,Yd,Wd1,Yd-5);
}
gcvt(D,5,Stt);
outtextxy(Wd1-5,Yd+8,Stt);
i++;
}
i=0;/*绘制纵坐标*/
while
(1)
{
D=YMin+i*YStep;
Wd1=Yd-(Yd-Yx)/(YMax-YMin)*(D-YMin);
if(Wd1{
break;
}
if(Grid==1)
{
line(Xx,Wd1,Xd,Wd1);
}
else
{
line(Xx,Wd1,Xx+5,Wd1);
}
gcvt(D,5,Stt);
if(D<0)
{
outtextxy(Xx-30,Wd1-2,Stt);
}
else
{
outtextxy(Xx-20,Wd1-2,Stt);
}
i++;
}
}
3.如何保存数据文件,数据文件的格式?
(文字表述及必要的代码)
通过fwrite()函数可以实现对采样数据的写入,在输入文件名称时同时需要输入文件的后缀,以确定文件的格式。
fp=fopen(Data,"w");
free(Data);
if(fp==NULL)
{
printf("cantopenfile%s",Data);
return;
}
4.如何将生成的正弦数据动态显示成曲线?
(文字表述及必要的代码)
曲线是由line()一小段一小段逐渐画出来的,在绘制正弦曲线时,可以通过每画一小段中断一段时间来实现曲线的动画效果。
而在采集数据时,则通过采集一个点,绘制一个,来实现曲线的动态过程。
{
Wd1=(X2-X1)/(Xb-Xa)*(Time-Xa)+X1;
Wd2=Y2-(Y2-Y1)/(Yb-Ya)*(DData-Ya);
if(Lwdx{
line(Wd1,Wd2,Wd1,Wd2);
}
else
{
line(Wd1,Wd2,Lwdx,Lwdy);
}
Lwdx=Wd1;
Lwdy=Wd2;
}
5.如何实现滚动?
(文字表述及必要的代码)
当画满一个屏幕后,将该屏通过函数cleardevice()清屏,然后重新绘制坐标系,再对采集到的数据进行绘制。
if(Time>Xb)
{
Xr=Xb-Xa;
Xa=Xb;
Xb=Xa+Xr;
cleardevice();
Draw(X1,X2,Y1,Y2,Xa,Xb,Ya,Yb,Xstep,Ystep,Real,I);
Lwdx=X1-1;
}
程序运行结果截图(不同运行条件下)
实验三AD/DA数据采集与模拟量输出实验
实验的目的:
1.熟悉AD/DA卡的工作原理
2.掌握AD/DA卡的安装、配置及编程方法。
3.了解实时数据采集和模拟量输出的常用方案。
实验条件:
1.具有ISA总线插槽和USB接口的PC系列微型计算机,操作系统使用DOS或Windows98,装有TurboC2.0,DosBox。
2.超低频信号发生器。
3.超低频示波器。
4.HY1232模入/模出接口板。
程序设计要求:
程序运行前,配置数据文件,运行后,首先,在屏幕上设定位置绘制坐标系,然后每间隔指定的时间通过A/D采集信号发生器的输出信号,保存到指定数据文件、绘制在坐标系里、并通过D/A输出,
1.能通过配置文件来改变程序的运行模式,不必修改代码即可让程序在启动时或者工作于实验二方式或者工作于实验三方式。
2.曲线动态显示
3.配置文件如有错误要能提示,不会造成程序运行报系统错误。
4.编程时要尽量把具有独立功能的代码写成子程序。
5.注意变量的命名要清晰,代码的注释要丰富。
6.后面的数据采集要在此程序基础上编程、添加代码,注意程序的结构。
设计思路
1.如何实现对信号发生器的数据的采集?
(文字表述及必要的代码)
通过ADDA程序,实现数模信号的转换,从而实现将信号发生器中的信号采集后进行处理,实时绘制曲线。
{
outportb(0x280,0x00);/*AD*/
do
;
while(!
(inportb(0x285)&0x80));
IData=inportb(0x281)|((inportb(0x282)&0x0f)<<8);
DData=((IData-2047)/4096)*10.;
outportb(0x283,((IData+1)&0xff));/*DA*/
outportb(0x284,(((IData+1)>>8)&0x0f));
}
2.如何实现定时中断对数据进行采集?
(文字表述及必要的代码)
通过编写定时中断程序实现定时中断,并且对数据的采集。
voidinterrupt(*oldint8)(void)
voidinterruptmyint8(void)/*设置中断*/
{
if(L==0)
{
Process();
Nownumbs++;
}
elseif(L>0)
{
Nowtimes++;
if(Nowtimes{
;
}
elseif(Nowtimes==L)
{
outportb(0x40,L8);
outportb(0x40,H8);
}
else
{
outportb(0x40,0x00);
outportb(0x40,0x00);
Process();
Nowtimes=0;
Nownumbs++;
}
}
outportb(0x20,0x20);
}
3.程序运行结果截图