数控原理实验A.docx
- 文档编号:17508680
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:183
- 大小:2.06MB
数控原理实验A.docx
《数控原理实验A.docx》由会员分享,可在线阅读,更多相关《数控原理实验A.docx(183页珍藏版)》请在冰点文库上搜索。
数控原理实验A
实验一逐点比较法直线插补
1.实验目的
通过本实验进一步理解和掌握逐点比较法直线插补原理。
学会程序设计方法和程序调试方法。
2.实验的内容
本实验可以使用C语言或汇编语言实现逐点比较法直线插补。
为了使程序运行结果直观、简单且易于理解,本实验在PC机上进行,直接在屏幕上显示程序执行结果。
3.程序实现原理
插补程序中直线的终点坐标通过键盘输入。
数据输入后进入图形显示方式,分辨率为640×480,坐标原点设在屏幕中间,终点判别时用X、Y两个方向的总步数作为计数长度。
坐标进给时修改屏幕坐标点并在屏幕上显示出来。
程序可以用纯C语言编制,也可在C语言中嵌入汇编语言编制插补函数。
用C语言显示坐标点时调用函数putpixel(x,y,n),其中x,y是被显示点的坐标值,n是颜色值。
用汇编语言显示坐标点时将被显示点的x坐标送cx,y坐标送dx,将0ch送ah,用中断调用int10h进行显示。
4.程序流程图
逐点比较法第一象限直线插补程序流程图如图1-1所示。
图1-1逐点比较法第一象限直线插补程序流程图
5.程序调试过程
在PC机上单步运行程序,在观察窗口中显示插补偏差fi,动点坐标x、y,和计数长度jsh值,分析结果的正确性。
如果单步运行若干步的结果正确则可连续运行程序。
6.程序清单
这里给出不同语言编制的参考程序。
参考程序1逐点比较法C语言第一象限直线插补
#include
#include
#include
#include
voidmain()//主函数
{intgd=DETECT,gm;//定义图形显示模式
intfi,xe,ye,x,y,jsh;//fi为偏差,xe、ye为终点坐标,jsh为计数长度x、y用于显示
intdelay1,delay2;//delay1,delay2用于延时控制运动速度
charsig;
again:
clrscr();//清屏
printf("L1Pleaseinputxe,ye:
");//提示输入终点坐标
scanf("%d,%d",&xe,&ye);//输入终点坐标
if(xe<0||ye<0){printf("inputerror,enteranycontinue.");//判断是否为第一象限
getch();gotoagain;}//不是第一象限重新输入
x=320;y=240;jsh=xe+ye;//计算计数长度,坐标原点在屏幕中间
initgraph(&gd,&gm,"");//置图形显示方式
fi=0;//初始偏差置0
while(jsh!
=0)//终点判别
{if(fi>=0)
{x++;fi-=ye;}//fi>=0正X方向进给一步,计算新的偏差
else{y--;fi+=xe;}//fi<0负Y方向进给一步,计算新的偏差
putpixel(x,y,15);//显示坐标值
jsh--;//计数长度减1
delay1=0x0200;
while(delay1!
=0){delay2=65535;while(delay2!
=0)delay2--;delay1--;}
if(kbhit())//以下是在插补过程中扫描键盘
{sig=getch();//如果有键按下,取键值
if(sig=='s'||sig=='S')//是S键显示按q健或Q键退出
{gotoxy(10,23);//按其它键继续
printf("enterqkeyexit;otherkeycontinue");
sig=getch();//按下s或S键后再扫描键盘
gotoxy(10,23);//清显示
printf("");
if(sig=='q'||sig=='Q')//如果是Q键退出
jsh=0;//计数长度为0
}
}
}//延时,不同的计算机用不同的常数
gotoxy(10,24);printf("xe=%d,ye=%d",xe,ye);//在24行10列处显示终点坐标
gotoxy(10,25);
printf("pressanykey:
");//在25行10列处显示按任意键
getch();//等待按键
restorecrtmode();//恢复文本方式,程序结束
}
参考程序2逐点比较法汇编语言第一象限直线插补
#include
#include
#include
#include
voidzxcb(int,int,int,int,int,int);//声明汇编语言插补函数
voidmain()//主函数
{intgd=DETECT,gm;//定义图形显示模式
intfi,xe,ye,x,y,jsh;//fi为偏差,xe、ye为终点坐标,jsh为计数长度x、y用于显示
intdelay1,delay2;//delay1,delay2用于延时控制运动速度
again:
clrscr();//清屏
printf("L1Pleaseinputxe,ye:
");//提示输入终点坐标
scanf("%d,%d",&xe,&ye);//输入终点坐标
if(xe<0||ye<0){printf("inputerror,enteranycontinue.");//判断是否为第一象限
getch();gotoagain;}//不是第一象限重新输入
x=320;y=240;jsh=xe+ye;//计算计数长度,坐标原点在屏幕中间
initgraph(&gd,&gm,"");//置图形显示方式
fi=0;//初始偏差置0
zxcb(xe,ye,x,y,fi,jsh);//调用插补函数
gotoxy(10,24);printf("xe=%d,ye=%d",xe,ye);//在24行10列处显示终点坐标
gotoxy(10,25);
printf("pressanykey:
");//在25行10列处显示按任意键
getch();//等待按键
restorecrtmode();//恢复文本方式,程序结束
}
voidzxcb(intxe,intye,intx,inty,intfi,intjsh)
{asmmovcx,x//显示坐标原点
asmmovdx,y
asmmovah,0ch
asmmoval,2
asmint10h
loop1:
asmmovax,fi//取偏差值
asmtestax,8000h//fi>=0?
asmjnznext//fi<0下转
asmmovcx,x//fi>=0修改显示坐标
asmmovdx,y
asminccx//fi>=0正x方向进给一步
asmmovx,cx//保存X坐标值
asmmovah,0ch
asmmoval,2
asmint10h//显示坐标值
asmmovax,fi//计算并保存新的偏差
asmsubax,ye
asmmovfi,ax
asmjmpnext1
next:
asmmovcx,x//fi<0修改显示坐标
asmmovdx,y
asmdecdx//正y方向进给一步
asmmovy,dx//保存y值
asmmovah,0ch
asmmoval,2
asmint10h//显示坐标值
asmmovax,fi//计算新的偏差
asmaddax,xe
asmmovfi,ax
next1:
asmmovdx,0800h//延时,控制速度
next1a:
asmmovcx,0ffffh
next1b:
asmdeccx
asmjnznext1b
asmdecdx
asmjnznext1a
asmmovax,jsh//取计数长度
asmdecax//计数长度减1
asmmovjsh,ax//保存计数长度
asmjnzloop1//计数长度不为0继续
}
参考程序3逐点比较法C语言四个象限直线插补
逐点比较法C语言四个象限直线插补程序流程图如图1-2所示。
程序清单如下。
#include
#include
#include
#include
#include
voidmain()//主函数
{intgd=DETECT,gm,lxy;//定义图形显示模式,lxy为象限号
intfi,xe,ye,x,y,js;//fi为偏差,xe、ye为终点坐标,js为计数长度x、y用于显示
intdelay1,delay2;//delay1,delay2用于延时控制运动速度
clrscr();//清屏
printf("L1_L4Pleaseinputxe,ye:
");//提示输入终点坐标
scanf("%d,%d",&xe,&ye);//输入终点坐标
x=320;y=240;js=abs(xe)+abs(ye);//计算计数长度,坐标原点在屏幕中间
initgraph(&gd,&gm,"");//置图形显示方式
if(xe==0&&ye>0)lxy=2;//终点为第2象限
if(xe==0&&ye<0)lxy=4;//终点为第4象限
if(ye==0&&xe>0)lxy=1;//终点为第一象限
if(ye==0&&xe<0)lxy=3;//终点为第3象限
if(xe>0&&ye>0)lxy=1;//终点为第一象限
if(xe>0&&ye<0)lxy=4;//终点为第4象限
if(xe<0&&ye>0)lxy=2;//终点为第2象限
if(xe<0&&ye<0)lxy=3;//终点为第3象限
fi=0;//初始偏差置0
图1-2逐点比较法四个象限直线插补流程图
while(js!
=0)//终点判别
{if(fi>=0)
{fi-=abs(ye);//fi>=0,X方向进给,计算新偏差
switch(lxy)
{case1:
x++;break;//第一象限,正X方向
case2:
x--;break;//第2象限,负X方向
case3:
x--;break;//第3象限,负X方向
case4:
x++;break;//第4象限,正X方向
}
}
else{fi+=abs(xe);//fi<0,Y方向进给
switch(lxy)
{case1:
y--;break;//第一象限,正Y方向
case2:
y--;break;//第2象限,负Y方向
case3:
y++;break;//第3象限,负Y方向
case4:
y++;break;//第4象限,正Y方向
}
}
putpixel(x,y,15);//显示坐标值
js--;//计数长度减1
delay1=0x0100;
while(delay1!
=0){delay2=65535;while(delay2!
=0)delay2--;delay1--;}
}//延时,不同的计算机用不同的常数
gotoxy(10,24);printf("xe=%d,ye=%d",xe,ye);//在24行10列处显示终点坐标
gotoxy(10,25);
printf("pressanykey:
");//在25行10列处显示按任意键
getch();//等待按键
restorecrtmode();//恢复文本方式,程序结束
}
参考程序4逐点比较法汇编语言四个象限直线插补
逐点比较法汇编语言四个象限直线插补程序流程图如图1-2所示。
程序清单如下。
#include
#include
#include
#include
voidzxcb1(int,int,int,int,int,int);//第一象限插补函数
voidzxcb2(int,int,int,int,int,int);//第2象限插补函数
voidzxcb3(int,int,int,int,int,int);//第3象限插补函数
voidzxcb4(int,int,int,int,int,int);//第4象限插补函数
voidmain()//主函数
{intgd=DETECT,gm;//定义显示方式
intxe,ye,xs,ys,fi,jsh,lxy;
/*xe、ye为终点坐标,xs、ys为显示坐标,fi为偏差,jsh为计数长度,lxy为象限号*/
clrscr();//清屏
printf("L1_L4:
Pleaseinputxe,ye:
");//提示输入坐标值
scanf("%d,%d",&xe,&ye);//等待键盘输入
xs=320;ys=240;jsh=abs(xe)+abs(ye);//设置坐标原点,计算计数长度
initgraph(&gd,&gm,"");//置图形显示方式
if(xe==0&&ye>0)lxy=2;//终点为第2象限
if(xe==0&&ye<0)lxy=4;//终点为第4象限
if(ye==0&&xe>0)lxy=1;//终点为第一象限
if(ye==0&&xe<0)lxy=3;//终点为第3象限
if(xe>0&&ye>0)lxy=1;//终点为第一象限
if(xe>0&&ye<0)lxy=4;//终点为第4象限
if(xe<0&&ye>0)lxy=2;//终点为第2象限
if(xe<0&&ye<0)lxy=3;//终点为第3象限
fi=0;//初始偏差置0
switch(lxy)
{case1:
zxcb1(xe,ye,xs,ys,fi,jsh);break;//第一象限
case2:
zxcb2(xe,ye,xs,ys,fi,jsh);break;//第2象限
case3:
zxcb3(xe,ye,xs,ys,fi,jsh);break;//第3象限
case4:
zxcb3(xe,ye,xs,ys,fi,jsh);break;//第4象限
}
gotoxy(10,24);printf("L%d:
xe=%d,ye=%d",lxy,xe,ye);//显示象限号和终点坐标
gotoxy(10,25);printf("pressanykey:
");//提示按任意键
getch();//等待按键
restorecrtmode();//恢复文本方式
}
voidzxcb1(intxe,intye,intxs,intys,intfi,intjsh)
{asmmovcx,xs//显示原点
asmmovdx,ys
asmmovah,0ch
asmmoval,2
asmint10h
loop1:
asmmovax,fi
asmtestax,8000h
asmjnznext
asmmovcx,xs//fi>=0正X方向进给
asmmovdx,ys
asminccx
asmmovxs,cx
asmmovah,0ch
asmmoval,2
asmint10h//显示坐标点
asmmovax,fi//计算新的偏差
asmsubax,ye
asmmovfi,ax
asmjmpnext1
next:
asmmovcx,xs//fi<0正Y方向进给一步
asmmovdx,ys
asmdecdx
asmmovys,dx
asmmovah,0ch
asmmoval,2
asmint10h//显示坐标点
asmmovax,fi//计算新的偏差
asmaddax,xe
asmmovfi,ax
next1:
asmmovdx,0400h//延时控制速度
next1a:
asmmovcx,0ffffh
next1b:
asmdeccx
asmjnznext1b
asmdecdx
asmjnznext1a
asmmovax,jsh//取计数长度
asmdecax//计数长度减1
asmmovjsh,ax//保存计数长度
asmjnzloop1//计数长度不为0继续插补
}
voidzxcb2(intxe,intye,intxs,intys,intfi,intjsh)
{asmmovcx,xs//显示原点
asmmovdx,ys
asmmovah,0ch
asmmoval,2
asmint10h
loop1:
asmmovax,fi
asmtestax,8000h
asmjnznext
asmmovcx,xs//fi>=0负X方向进给
asmmovdx,ys
asmdeccx
asmmovxs,cx
asmmovah,0ch
asmmoval,2
asmint10h//显示坐标点
asmmovax,fi//计算新的偏差
asmsubax,ye
asmmovfi,ax
asmjmpnext1
next:
asmmovcx,xs//fi<0正Y方向进给一步
asmmovdx,ys
asmdecdx
asmmovys,dx
asmmovah,0ch
asmmoval,2
asmint10h//显示坐标点
asmmovax,fi
asmsubax,xe
asmmovfi,ax
next1:
asmmovdx,0400h//延时,控制速度
next1a:
asmmovcx,0ffffh
next1b:
asmdeccx
asmjnznext1b
asmdecdx
asmjnznext1a
asmmovax,jsh//取计数长度
asmdecax//计数长度减1
asmmovjsh,ax//保存计数长度
asmjnzloop1//计数长度不为0继续
}
voidzxcb3(intxe,intye,intxs,intys,intfi,intjsh)
{asmmovcx,xs//显示原点
asmmovdx,ys
asmmovah,0ch
asmmoval,2
asmint10h
loop1:
asmmovax,fi//fi>=0?
asmtestax,8000h
asmjnznext
asmmovcx,xs//fi>=0负X方向进给
asmmovdx,ys
asmdeccx
asmmovxs,cx
asmmovah,0ch
asmmoval,2
asmint10h//显示坐标点
asmmovax,fi//计算新的偏差
asmaddax,ye
asmmovfi,ax
asmjmpnext1
next:
asmmovcx,xs//fi<0负Y方向进给
asmmovdx,ys
asmincdx
asmmovys,dx
asmmovah,0ch
asmmoval,2
asmint10h//显示坐标点
asmmovax,fi//计算新的偏差
asmsubax,xe
asmmovfi,ax
next1:
asmmovdx,0400h//延时,控制速度
next1a:
asmmovcx,0ffffh
next1b:
asmdeccx
asmjnznext1b
asmdecdx
asmjnznext1a
asmmovax,jsh//取计数长度
asmdecax//计数长度减1
asmmovjsh,ax//保存计数长度
asmjnzloop1//计数长度不为0继续
}
voidzxcb4(intxe,intye,intxs,intys,intfi,intjsh)
{asmmovcx,xs//显示原点
asmmovdx,ys
asmmovah,0ch
asmmoval,2
asmint10h
loop1:
asmmovax,fi//fi>=0?
asmtestax,8000h
asmjnznext
asmmovcx,xs//fi>=0正X方向进给
asmmovdx,ys
asminccx
asmmovxs,cx
asmmovah,0ch
asmmoval,2
asmint10h//显示坐标点
asmmovax,fi//计算新的偏差
asmaddax,ye
asmmovfi,ax
asmjmpnext1
next:
asmmovcx,xs//fi<0负Y方向进给
asmmovdx,ys
asmincdx
asmmo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数控 原理 实验
![提示](https://static.bingdoc.com/images/bang_tan.gif)