中国石油大学计算机测控技术实践程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/ *fifth1* /
#include
#include
#include
#include
#include
#define Pi 3.1415926535697932
int CJ_AD();
int TRL_01();
int DRW_01();
int f;
int data_v[600];
Double data[600];

main()
{ int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,""); /* 画图需要这俩个语句*/
printf("input f\n"); /*输入延时时间,在CJ-AD子函数中使用此变量*/
scanf("%d",&f);
CJ_AD(); /*AD转换*/
TRL_01(); /*转换子函数*/
DRW_01();/*画图*/
getch();
closegraph();
}

int CJ_AD()
{ int i,base=0x100,ch=1,dl,dh; /*ch=1,实验时使用ch1通道*/
inportb(base+0x3); /*清零*/
outportb(base+0x0,ch); 送入采集通道
for(i=0;i<600;i++)
{outportb(base+0x1,0); 启动AD
for( ; ; )if(inportb(base+0x2)<0x80)break; 查询
dh=inportb(base+0x2); 高四位
dl=inportb(base+0x3); 低八位
data_v[i]=256*dh+dl;
delay(f); 延时,此处的延时和输入的信号频率相配合,得到完美波形
}
}

int TRL_01()
{ int i;
for(i=0;i<600;i++)
data[i]=data_v[i]*10.0/4096.0-5.0; 转换,公式参照书的第八页
}

int PRW_01()
{ int i,x0=38,y0=240,xm=600,ym=180;
double kx,ky,x,y;
char c[40],d[40];
kx=1.0*xm/600; 比例系数
ky=1.0*ym/5.0;
line(x0,y0,x0+xm,y0); 画横轴
line(x0,y0-ym,x0,y0+ym); 画纵轴
for(y=-5.0;y<5.0;y+=1.0)
{line(x0,y0-ky*y,x0+4,y0-ky*y); 画纵轴刻度线
sprinf(c,"%4.1f",y ); 整型数据转换到字符型
outtextxy(x0-34,y0-ky*y-4,c); 写刻度
}
for(x=1.0;x<=6.0;x+=1.0)
{line(x0+kx*x*100,y0,x0+kx*x*100,y0-4); 同上
sprintf(d,"%4.1f",x);
outtextxy(x0+kx*x*100-16,y0+4,d);
}
outtextxy(x0-3,y0-ym,"^"); 画向上箭头
outtextxy(x0+4,y0-ym,"U/v"); 写单位
setcolor(14); 设置曲线颜色
for(i=0;i<600;i++)
{ if(i==0)moveto(x0+ky*i,y0-ky*data[i]); 画曲线,如正弦波等
else lineto(x0+kx*i,y0-ky*data[i]);
setcolor(12);
}
}

/ *fifth2* /
#include
#include
#include
#include
#include
#define N 600
#define pi 3.1415926
int data_v[N];
double data[N];
int a=100;
float b=5.0;
int key,ch=1;
int zxb(int a,float b);
int fb(int a,float b);
int sjb(int a,float b);
int DRW()'
int ZH_DA();

main()
{ int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
for( ; ; )
{if(bioskey(1)!=0)
{key=bioskey(0);
if(key==0x11b) break; ESC键表示退出
if(key==0x4b00) {a-=5;key=0;} <—周期减少
if(key==0x4d00) {a+=5;key=0;} —>周期增大
if(key==0x4800) {b+=0.5;key=0;} ^ 幅值增大
if(key==0x5000) {b-=0.5;key=0;} 向下箭头键 幅值减少
if(key==0x3920) {ch+=1;key=0;} 空格键转换波形
if(a>=1000) a=1000; 保证周期和幅值在正常范围内
if(a<=0) a=0;

if(b>=50.0) b=50.0;
if(b<=0) b=0;
if(ch>=4)ch=1;
if(ch==1)zxb(a,b); ch=1,调出正弦波
if(ch==2)fb(a,b); ch=2 ,调出方波
if(ch==3)sjb(a,b); ch=3,调出三角波
cleardevice();
DRW(); 画图
}
ZH_DA(); DA转换
}
getch();
closegraph();
}

int DRW()
{int i;
char c[40],d[40];
setcolor(7);
line(40,240,605,240);
line(40,40,40,439);
for(i=0;i<15;i++)
{ sprintf(c,"%d";,i);
line(40+i*40,240,40+i*40,235);
if(i!=0) outtextxy(40+i*40-7,240+7,c);
if(i<7)
{ sprintf(d,"%d",-i);
line(40,240-i*30,45,240-i*30);
if(i!=0) outtextxy(24,240+i*30-4,d);
}
}
setcolor(12);
for(i=0;i<600;i++)
{ if(i==0) moveto(40,240+30*data[i]);
else lineto(40+i,240+data[i]*30);
}
}

int zxb(int a,float b);
{int i,n=N,f=a;
float b;
for(i=0;idata[i]=m*sin(2.0*pi*i/f);
return(0);
}

int fb(int a,float b)
{ int i,k,f=a,n=N;
float m=b;
for(i=0;i{ k=i%f; 确定点位于周期哪个位置
if(k<(f/2) data[i]=m); 小于半个周期的点,赋予高电平
else data[i]=-1*m; 另半个周期,赋予低电平
}
return(0);
}
int sjb(int a,float b);
{ int k,i;
float P,Q;
for(i=0;i{ k=i%a;
P=0.25*a; 这个不好解释,可当面问我
Q=0.75*a;
if((k<=p)&&(k>=0)) data[i]=k/p*b;
else if((k>=p)&&(k<=Q))data[i]=(-k/p+2)*b;
else data[i]=(k/p-4)*b;
}
return(0);
}

int ZH_DA()
{ int i,f,dl,dh,base;
base=0x100;
for(i=0;i<2*a;i++)
{data_v[i]=4095.0*(data[i]+5.0/10.0); 转换
dh=(data_v[i]>>4&0xff; 高八位
dl=(data_v[i]&0xf1<<4; 低四位
outportb(base+0x6,dh); 置数,6,7说明使用了DA2通道
outportb(base+0x7,dl);
inportb(base+0x0); 输出
delay(10);
}
}

/*fifth3.c*/
#include
#include
#include
#include
#include
#define base 0x100
int n_time=800;
int zhengzhuan();
int fanzhuan();

main()
{ int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
setfillstyle(SOLLD_FILL,7);
bar(0,0,639,479);
outtextxy(400,120,"<- stand for fast");
outtextxy(400,180,"-> stand for slow");
outtextxy(400,240,"ESC stand for stop");
outtextxy(400,300,"^ stand for fzhuan");
inportb(base+0x3); 清零
zhengzhuan(); 调用正转子函数
getch();
closegraph();
}

int zhengzhuan()
{ int key;
printf(" Z_Z\n");
outportb(base+0xf,0x80); 控制信号
for( ; ; )
{outportb(base+0xd,0x04); 四路分别循环输入高电平,
delay(n_time);
outportb(base+0xd,0x20);
delay(n_time);
outportb(base+0xd,0x40);
delay(n_time);
outportb(base+0xd,0x80);
delay(n_time);
if(bioskey(1)!=0)
{ key=bioskey(0);
if(key==0x4b00) n_time=n_time-30; 左键加速
if(key==0x4d00) n_time=n_time+30

; 右键减速
if(key==0x4800) fanzhuan(); 上键改变转向
if(key==0x11b)
{ inportb(base+0x3);break;} ESC键退出
if(n_time>=30000) n_time=30000; 保证延时时间在整数范围内
if(n_time<=-1) n_time=0;
}
}
}

int fanzhuan() 原理与正转相同
{ int key;
printf(" F_Z\n");
outportb(base+0xf,0x80);
for( ; ; )
{ outportb(base+0xd,0x80);
delay(n_time);
outportb(base+0xd,0x40);
delay(n_time);
outportb(base+0xd,0x20);
delay(n_time);
outportb(base+0xd,0x04);
delay(n_time);
if(bioskey(1)!=0)
{ key=bioskey(0);
if(key==0x4b00)n_time=n_time-30;
if(key==0x4d00)n_time=n_time+30;
if(key==0x4800)zhengzhuan();
if(key==0x411b){inportb(base+0x3);
break;
if(n_time>=30000)n_time=30000;
if(n_time<=-1)n_time=0
}
}
}
fifth4
#include
#include
#include
#include
#include
#define base 0x100
#define N 20000
int n_time=0;
float t=0.5;
int zhuandong();


main()
{ int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
setfillstyle(SOLLD_FILL,7);
bar(0,0,639,479);
outtextxy(400,120,"<- stand for fast");
outtextxy(400,180,"-> stand for slow");
outtextxy(400,240,"ESC stand for stop");
outtextxy(400,300,"kong ge stand for pause");
inportb(base+0x3); 清零
zhuandong();
getch();
closegraph();
}

int zhuandong()
{ int key,i;
outportb(base+0xf,0x80); 控制信号
for( ; ; )
{ if (key==0x3920) outportb(base+0xd,0x00); 空格赋予低电平,暂停
else
{ for(i=0;iif (ielse {outportb(base+0xd,0x00); delay(n_time);} 赋予低电平
}
if(key==0x11b) {inportb(base+0x3);break;} ESC键退出
if(bioskey(1)!=0)
{ key=bioskey(0);
if(key==0x4b00) t=t-0.1; 左键加速
if(key==0x4d00) t=t+0.1; 右键减速
if(t>=1) t=1;
if(t<=0) t=0;
}
}
}



相关文档
最新文档