AD图形显示实验报告.docx
- 文档编号:23985453
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:17
- 大小:137.63KB
AD图形显示实验报告.docx
《AD图形显示实验报告.docx》由会员分享,可在线阅读,更多相关《AD图形显示实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
AD图形显示实验报告
AD&图形显示实验报告
实验的目的:
1.掌握定时器/计数器8254的工作原理与使用方法。
2.熟悉HY-1232A/D、D/A板的工作原理与使用方法。
3.掌握各种数据处理滤波的方法。
4.熟悉掌握C语言的绘图功能。
实验用设备:
1.具有8254硬件中断功能与HY-1232A/D、D/A板的PC系列微型计算机,操作系统使用DOS或Windows98。
实验要求:
1.
每12ms中断一次,每中断一次从A/D0通道采集一个数据,并实时的图形显示对应的电压值。
2.2.每12ms中断一次,每中断一次从A/D0通道采集一个数据,连续采样1024次,并将采样数据保存在文件中,用于离线处理:
(采用如下算法对数据进行处理,并对处理结果通过图显示;通过调整不同算法的参数,观察并分析参数的处理结果的影响):
(1)滑动平均滤波算法
(2)加权平均滤波算法
(3)数字低通滤波器
(4)具有快速响应的数字滤波器
设计和计算:
1、电压的计算:
value=(float)(dbyte-2047)*10/4096;
2、12ms中断计时器数值计算:
12ms*1193次/ms=14316≈0xEC37
低八位:
0x37
高八位:
0xEC
3、在屏幕中绘制网格:
(1)绘制外边框:
rectangle(70,125,570,375);
(2)绘制中线:
line(70,250,570,250);
(3)横轴每点的距离:
2
(4)横轴每屏显示点数:
250
(5)纵轴电压范围:
-5V~+5V
(6)纵轴1V的距离:
25
(7)电压u与屏幕上纵轴y的转化:
y=((-1)*u*25)+250
4、各种滤波器:
(略,详见《滤波器实验报告》)
程序框图:
实验1:
实验2:
程序清单和注释:
1.实验1:
#include
#include
#include
union
{struct
{
unsignedcharlow8;
unsignedcharhigh8;
}adlh;
struct
{
unsignedlow12:
12;
unsignedhigh4:
4;
}ad12;
}ad;
floatvalue;
voidinterrupt(*oldint)(void);
intx0=0,x1=0,y0=0,y1=0,num=1,clean=0;
voidinterruptmyint8(void);
voiddp_boot(void)/*绘制坐标平面*/
{
inti;
doubletemp;
charstr[50];
cleardevice();
setbkcolor(0);
setcolor(63);
rectangle(70,125,570,375);
line(70,250,570,250);
num--;
for(i=0;i<=5;i++)
{
line(70+i*100,365,70+i*100,375);
temp=(double)(num*50);
gcvt(temp,5,str);
outtextxy(60+i*100,385,str);
num++;
}
for(i=0;i<=10;i++)
{
line(60,125+i*25,70,125+i*25);
}
}
voidmain(void)
{
intdriver=DETECT,mode;
initgraph(&driver,&mode,"");
dp_boot();
disable();
outportb(0x43,0x36);
outportb(0x40,0xEC);
outportb(0x40,0x37);
oldint=getvect(0x08);
setvect(0x08,myint8);
enable();
while
(1)
{
if(clean==1)
{
dp_boot();
clean=0;
}
}
disable();
setvect(0x08,*oldint);
enable();
closegraph();
}
voidinterruptmyint8(void)
{
intdbyte;
outportb(0x280,0x00);
do
;
while(!
(inportb(0x285)&0x80));
ad.adlh.low8=inportb(0x281);
ad.adlh.high8=inportb(0x282);
dbyte=ad.ad12.low12;
y1=(int)(-1)*(((double)(dbyte-2047)*10/4096)*25)+250;//电压值转化成坐标中的点
if(x0!
=0)
{
x1=x0+2;
setcolor(62);
line(x0,y0,x1,y1);//绘制曲线
setcolor(63);
if(x1>=570)
{
x0=70;
clean=1;
}
elsex0=x1;
y0=y1;
}
else
{
x0=70;y0=y1;
}
outportb(0x20,0x20);
}
2.实验2:
#include
#include"graphics.h"
#include
union
{struct
{
unsignedcharlow8;
unsignedcharhigh8;
}adlh;
struct
{
unsignedlow12:
12;
unsignedhigh4:
4;
}ad12;
}ad;
doublevalue;
voidinterrupt(*oldint)(void);
intnum=1,fction,data_num=0;
doubledata[1024],data1[1024],data_handled[1024];
voidinterruptmyint8(void);
voiddelayms(intn)
{
inti,j;
for(i=0;i for(j=0;j<1000;j++); } voidwdisk(double*pw,intn)//保存数据至文件 { FILE*fp; if((fp=fopen("5-2.txt","wb"))==NULL) {printf("cannotopenthefile! \n"); exit(); } fwrite(pw,sizeof(double),n,fp); fclose(fp); } voidget_data() { disable(); outportb(0x43,0x36); outportb(0x40,0xEC);/*12ms*/ outportb(0x40,0x37); oldint=getvect(0x08); setvect(0x08,myint8); enable(); printf("\nSystemisgettingdata,pleasewaitaminute...\n"); while(data_num<1024); disable(); setvect(0x08,*oldint); enable(); wdisk(data,1024); } voiddp_boot(void)//绘制坐标平面 { inti; doubletemp; charstr[50]; cleardevice(); setbkcolor(0); setcolor(63); rectangle(70,125,570,375); line(70,250,570,250); num--; for(i=0;i<=5;i++) { line(70+i*100,365,70+i*100,375); temp=(double)(num*50); gcvt(temp,5,str); outtextxy(60+i*100,385,str); num++; } for(i=0;i<=10;i++) { line(60,125+i*25,70,125+i*25); } } voiddisplay(double*p,intn)//绘制曲线(处理后的数据) { inti; doublex=570; for(i=1;i { if(x>=570) { dp_boot(); setcolor(62); line(70,*(p+i-1),72,*(p+i)); setcolor(63); x=72; } else { setcolor(62); line(x,((-1)*(*(p+i-1)*25))+250,x+2,((-1)*(*(p+i)*25))+250); setcolor(63); x=x+2; } delayms(20); } } inthdpj(double*p,intn)//活动平均滤波器 { intit,i,j; doubletemp=0; printf("Pleaseinputthenumberofitems(0 "); scanf("%d",&it); get_data(); for(i=it-1;i { temp=0; for(j=i-it+1;j<=i;j++) { temp+=*(p+j); } data_handled[i-it+1]=temp/it; } returnn-it+1; } intjqpj(double*p,intn)//加权平均滤波器 { intit,i,j; doublea[20],temp=0; printf("Pleaseinputthenumberofitems(0 "); scanf("%d",&it); printf("Pleaseinputtheweightsofitems: "); for(i=0;i { scanf("%lf",&a[i]); temp+=a[i]; } for(i=0;i a[i]=a[i]/temp; get_data(); for(i=it-1;i { temp=0; for(j=i-it+1;j<=i;j++) { temp+=(*(p+j))*(a[j+it-i-1]); } data_handled[i-it+1]=temp; } returnn-it+1; } intszdt(double*p,intn)//数字低通滤波器 { doublehigh; inti; printf("PleaseinputtheMaximumlimit: "); scanf("%lf",&high); get_data(); for(i=0;i { if(*(p+i)-high>0.00001) data_handled[i]=high; elsedata_handled[i]=(*(p+i)); } returni; } intksxy(double*p,intn)//快速反应滤波器 { doublehigh; inti; printf("PleaseinputtheMaximumreflection: "); scanf("%lf",&high); get_data(); for(i=1;i<=n;i++) { if(abs((*(p+i))-(*(p+i-1))) { data_handled[i-1]=(*(p+i-1)); } else { data_handled[i-1]=(0.5*((*(p+i-1))+(*(p+i)))); } } returnn-1; } voidmain(void) { intdriver=DETECT,mode; inti,data_n; FILE*fp; initgraph(&driver,&mode,""); do { printf("***VariousAlgorithms&Filter***\n");/*选择滤波器*/ printf("1.MovingaverageFilter\n"); printf("2.WeightedAverageFilters\n"); printf("3.Digitallow-passFilter\n"); printf("4.DigitalFilterwithfastresponse\n"); printf("Pleasechooseafuction(1~4): "); scanf("%d",&fction); } while((fction<1)||(fction>4)); switch(fction) { case1: data_n=hdpj(data,1024);break; case2: data_n=jqpj(data,1024);break; case3: data_n=szdt(data,1024);break; case4: data_n=ksxy(data,1024);break; } display(data_handled,data_n); closegraph(); } voidinterruptmyint8(void) { intdbyte; doubletemp,value1,value2;; outportb(0x280,0x00); do ; while(! (inportb(0x285)&0x80)); ad.adlh.low8=inportb(0x281); ad.adlh.high8=inportb(0x282); dbyte=ad.ad12.low12; temp=(dbyte-2047)*10/4096; data[data_num]=temp; if((data_num>0)&(fction>3)) { value1=((float)data[data_num-1]-2047)*10/4096; value2=((float)data[data_num]-2047)*10/4096; data1[data_num]=(value2-value1)/0.12; } data_num++; outportb(0x20,0x20); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AD 图形 显示 实验 报告