畢業設計畢業論文機床數控技術課程設計C語言_第1頁
畢業設計畢業論文機床數控技術課程設計C語言_第2頁
畢業設計畢業論文機床數控技術課程設計C語言_第3頁
畢業設計畢業論文機床數控技術課程設計C語言_第4頁
畢業設計畢業論文機床數控技術課程設計C語言_第5頁
已閱讀5頁,還剩11頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、機床數控技術課程設計說明書機電學院 機械工程及自動化專業 目 錄一、 設計任務-3二、 設計要求-3三、 程序設計流程圖-3四、 程序設計源程序-7五、 程序中有待改進的地方-16六、 課程設計感想-16一 設計任務1、直線插補:PL2逐點比較法插補第二象限直線;2、圓弧插補:DA32 DDA法插補第32象限逆圓?。?、撰寫設計說明書一份。二 設計要求1、具有數據輸入界面,如起點、終點、圓心、半徑及插補步長等;2、具有插補過程的動態顯示功能,如單步插補、連續插補;3、插補的步長可調;4、編程語言自定,建議使用C語言或VB。三 程序設計流程圖1、逐點比較法直線插補 逐點比較法的直線插補過程,每一

2、步都要經過四個步驟:偏差判別坐標進給偏差計算終點判別 第一象限逐點比較法的偏差判別公式為: Fi,j0時,Fi+1,j=Fi,j-ye; Fi,jx, |y2-y1|-y, E=(x+y)/step終點在起點右上方終點在起點左上方終點在起點左下方終點在起點右下方NF=0+X向走一步FF+x+X向走一步FF-yNF=0E=E-1E=0 ?+X向走一步FF-yYNF=0E=E-1E=0 ?NF=0-Y向走一步FF+x插補其他象限的直線,只需將終點相對起點的坐標差值去絕對值,然后改變進給方向即可。圖一 逐點比較法直線插補的程序流程圖NNN輸入直線起點坐標(x1,y1)、終點坐標(x2,y2)、步長s

3、tep。判斷直線的走向向|x2-x1|-x,|y2-y1|-y, 累加次數E-m,JRx-0,Jryx, |y2-y1|-y, 累加次數E-m,JRx0,Jry0; Exx,Eyy, JRxJRx+y , JRyJRy+xEx=0且Ey=0NY繪圖完畢輸入圓弧起點坐標(x1,y1)、終點坐標(x2,y2)、圓心坐標(x0,y0),步長step。第一象限逆時針順時針順、逆時針選擇象限判斷其他象限和第一象限處理方法相同。逆時針處理方法相同。圖三 DDA法圓弧插補的程序流程圖四 程序設計主要源程序本設計采用C語言設計。#include#include#includemain() void menu(

4、); /*菜單顯示函數聲明*/ void line_pcm(); /*逐點比較法直線插補函數聲明*/ void line_DDA(); /*DDA法直線插補函數聲明*/ circle_DDA(); /*DDA圓弧插補函數聲明*/ int n; int gdriver=DETECT,gmode; /*顯示適配器的圖形模式初始化*/ initgraph(&gdriver,&gmode,); do menu(); scanf(%d,&n); switch(n) /*函數功能的選擇*/ case 1:line_DDA(); system(pause); break; case 2:line_pcm()

5、; system(pause); break; case 3:circle_DDA(); system(pause); break; /* case 4:circle_pcm(); system(pause); break;*/ case 0:return; while(n!=0); /*菜單顯示函數*/void menu()system(cls); printf(nPlease make a choice:n); printf( 1 Draw a line using DDA method;n); printf( 2 Draw a line using Point-wise comparis

6、on method;n); printf( 3 Draw a circle suing DDA method;n); printf( 4 Draw a circle suing Point-wise comparison method;n); printf( 0 Quitn); printf(choice:); /*繪制坐標軸*/axis()int i; setcolor(RED); rectangle(150,100,550,400); line(350,100,350,400); line(150,250,550,250); for(i=160;i=540;i=i+10) putpixel

7、(i,250,2); for(i=110;iy) E=2*x; else E=2*y; moveto(x1+350,250-y1); if(ye=0) if(xe=0) /*ye=0,xe=0 為第一象限*/ for(i=0;i=E) JRx-=E; x1+=step; if(JRy=E) JRy-=E; y1+=step; lineto(x1+350,250-y1); else for(i=0;i=0,xe=E) JRx-=E; x1-=step; if(JRy=E) JRy-=E; y1+=step; lineto(x1+350,250-y1); else if(xe=0) /*ye=0

8、為第三象限*/ for(i=0;i=E) JRx-=E; x1-=step; if(JRy=E) JRy-=E; y1-=step; lineto(x1+350,250-y1); else for(i=0;iE/step;i+) /*ye0,xe=E) JRx-=E; x1+=step; if(JRy=E) JRy-=E; y1-=step; lineto(x1+350,250-y1); /*逐點比較法直線插補程序*/void line_pcm() int i; int x1,y1,x2,y2,step,xe,ye,x,y,E; float F=0.0; system(cls); printf

9、(n please input the first point:X1=); /*輸入直線的起點(x1,y1)、終點(x2,y2)、步長(step)*/ scanf(%d,&x1); printf(Y1=); scanf(%d,&y1); printf( please input the end point:X2=); scanf(%d,&x2); printf(Y2=); scanf(%d,&y2); printf( input step:nstep=); scanf(%d,&step); axis(); moveto(x2+350,250-y2); lineto(x1+350,250-y1)

10、; /*畫待插補的直線*/ xe=x2-x1;ye=y2-y1; /*xe為終點坐標與起點坐標x方向的差值,ye為終點坐標與起點坐標y方向的差值*/ x=abs(xe);y=abs(ye); /*x,y 為xe,ye 的絕對值*/ E=(x+y)/step; if(ye=0) if(xe=0) /*ye=0,xe=0 為第一象限*/ for(i=0;i=0) F=F-step*y; linerel(step,0); else F=F+step*x; linerel(0,-step); else for(i=0;i=0,xe=0) F=F-step*y; linerel(-step,0); el

11、se F=F+step*x; linerel(0,-step); else if(xe=0) /*ye=0 為第三象限*/ for(i=0;i=0) F=F-step*y; linerel(-step,0); else F=F+step*x; linerel(0,step); else for(i=0;iE;i+) /*ye0,xe=0) F=F-step*y; linerel(step,0); else F=F+step*x; linerel(0,step); int two(int E) /*確定寄存器位數*/ int reg; if(E=8&E=16&E=32&E=64&E=128&Ex

12、1)&(y2=y0) /*判斷圓弧終點是否在第一象限*/ ddaclockwise4(x0+r,y0,x2,y2,x0,y0,step); /*不在第一象限調用第四象限順時針插補函數*/ x2=x0+r; y2=y0; /*第一象限的終點的坐標確定*/ x=abs(x1-x0); y=abs(y1-y0); xe=x2-x1;ye=y2-y1; if(abs(xe)=abs(ye) E=two(abs(xe); else E=two(abs(ye); Ex=abs(xe)/step; Ey=abs(ye)/step; moveto(350+x1),(250-y1); while(Ex0|Ey0

13、) JRx+=y; JRy+=x; xi=0;yi=0; if(JRx=E) JRx-=E; x+=step; Ex-; xi=step; if(JRy=E) JRy-=E; y-=step; Ey-; yi=step; if(xi!=0|yi!=0) linerel(xi,yi); lineto(350+x2,250-y2);/*DDA法順時針插補起點在第二象限的圓弧*/ddaclockwise2(int x1,int y1,int x2,int y2,int x0,int y0,int step) int E,Ex,Ey,x,y,xe,ye,xi,yi,JRx=0,JRy=0; if(!(

14、x2y1) ddaclockwise1(x0,y0+r,x2,y2,x0,y0,step); x2=x0;y2=y0+r; x=abs(x1-x0); y=abs(y1-y0); xe=x2-x1;ye=y2-y1; if(abs(xe)=abs(ye) E=two(abs(xe); else E=two(abs(ye); Ex=abs(xe)/step; Ey=abs(ye)/step; moveto(350+x1),(250-y1); while(Ex0|Ey0) JRx+=y; xi=0;yi=0; if(JRx=E) JRx-=E; x-=step; Ex-; xi=step; JRy

15、+=x; if(JRy=E) JRy-=E; y+=step; Ey-; yi=-step; if(xi!=0|yi!=0) linerel(xi,yi); /*lineto(350+x2,250-y2);*/*DDA法順時針插補起點在第三象限的圓弧*/ddaclockwise3(int x1,int y1,int x2,int y2,int x0,int y0,int step) int E,Ex,Ey,x,y,xe,ye,xi,yi,JRx=0,JRy=0; if(!(x2x1&y2=abs(ye) E=two(abs(xe); else E=two(abs(ye); Ex=abs(xe)

16、/step; Ey=abs(ye)/step; moveto(350+x1),(250-y1); while(Ex0|Ey0) JRx+=y; xi=0;yi=0; if(JRx=E) JRx-=E; x+=step; Ex-; xi=-step; JRy+=x; if(JRy=E) JRy-=E; y-=step; Ey-; yi=-step; if(xi!=0|yi!=0) linerel(xi,yi); /*lineto(350+x2,250-y2);*/*DDA法順時針插補起點在第四象限的圓弧*/ddaclockwise4(int x1,int y1,int x2,int y2,int

17、 x0,int y0,int step) int E,Ex,Ey,x,y,xe,ye,xi,yi,JRx=0,JRy=0; printf(%d %d %d %d %d %d %d,x1,y2,x2,y2,x0,y0,step); if(!(x2=x0&y2=abs(ye) E=two(abs(ye); else E=two(abs(ye); Ex=abs(xe)/step; Ey=abs(ye)/step; moveto(350+x1),(250-y1); while(Ex0|Ey0) JRx+=y; xi=0;yi=0; if(JRx=E) JRx-=E; x-=step; Ex-; xi=

18、-step; JRy+=x; if(JRy=E) JRy-=E; y+=step; Ey-; yi=step; if(xi!=0|yi!=0) linerel(xi,yi); lineto(350+x2,250-y2);/*DDA法逆時針插補起點在第一象限的圓弧*/ddaanticlock1(int x1,int y1,int x2,int y2,int x0,int y0,int step) int E,Ex,Ey,x,y,xe,ye,xi,yi,JRx=0,JRy=0; /*E 寄存器數;Ex,Ey終點判別計數器;x,y相對坐標中瞬時坐標值;*/ /*xe,ye終點與起點的坐標差值;xi,

19、yi進給脈沖*/ if(!(y2y1)&(x2=x0) /*(x2x0|y2=x1&y1=y2) */ /*判斷圓弧終點是否在第一象限*/ ddaanticlock2(x0,y0+r,x2,y2,x0,y0,step); /*不在第一象限調用第四象限順時針插補函數*/ x2=x0;y2=y0+r; x=abs(x1-x0); y=abs(y1-y0); xe=x2-x1;ye=y2-y1; if(abs(xe)=abs(ye) E=two(abs(xe); else E=two(abs(ye); Ex=abs(xe)/step; Ey=abs(ye)/step; moveto(350+x1),

20、(250-y1); while(Ex0|Ey0) JRx+=y; JRy+=x; xi=0;yi=0; if(JRx=E) JRx-=E; x-=step; Ex-; xi=-step; if(JRy=E) JRy-=E; y+=step; Ey-; yi=-step; if(xi!=0|yi!=0) linerel(xi,yi); lineto(350+x2,250-y2);/*DDA法逆時針插補起點在第二象限的圓弧*/ddaanticlock2(int x1,int y1,int x2,int y2,int x0,int y0,int step) int E,Ex,Ey,x,y,xe,ye

21、,xi,yi,JRx=0,JRy=0; if(x2x0|y2=x1&y2=y1) ddaanticlock3(x0-r,y0,x2,y2,x0,y0,step); x2=x0-r;y2=y0; x=abs(x1-x0); y=abs(y1-y0); xe=x2-x1;ye=y2-y1; if(abs(xe)=abs(ye) E=two(abs(xe); else E=two(abs(ye); Ex=abs(xe)/step; Ey=abs(ye)/step; moveto(350+x1),(250-y1); while(Ex0|Ey0) JRx+=y; JRy+=x; xi=0;yi=0; i

22、f(JRx=E) JRx-=E; x+=step; Ex-; xi=-step; if(JRy=E) JRy-=E; y-=step; Ey-; yi=step; if(xi!=0|yi!=0) linerel(xi,yi); lineto(350+x2,250-y2);/*DDA法逆時針插補起點在第三象限的圓弧*/ddaanticlock3(int x1,int y1,int x2,int y2,int x0,int y0,int step) int E,Ex,Ey,x,y,xe,ye,xi,yi,JRx=0,JRy=0; if(x2x0|y2y0)|(x2=y1) ddaanticlock

23、4(x0,y0-r,x2,y2,x0,y0,step); x2=x0;y2=y0-r; x=abs(x1-x0); y=abs(y1-y0); xe=x2-x1;ye=y2-y1; if(abs(xe)=abs(ye) E=two(abs(xe); else E=two(abs(ye); Ex=abs(xe)/step; Ey=abs(ye)/step; moveto(350+x1),(250-y1); while(Ex0|Ey0) JRx+=y; JRy+=x; xi=0;yi=0; if(JRx=E) JRx-=E; x-=step; Ex-; xi=step; if(JRy=E) JRy

24、-=E; y+=step; Ey-; yi=step; if(xi!=0|yi!=0) linerel(xi,yi); lineto(350+x2,250-y2); /*DDA法逆時針插補起點在第四象限的圓弧*/ddaanticlock4(int x1,int y1,int x2,int y2,int x0,int y0,int step) int E,Ex,Ey,x,y,xe,ye,xi,yi,JRx=0,JRy=0; if(!(x2x1)&(y2=y0)/*(x2y0)|(x2=x1&y2=abs(ye) E=two(abs(xe); else E=two(abs(ye); Ex=abs(

25、xe)/step; Ey=abs(ye)/step; moveto(350+x1),(250-y1); while(Ex0|Ey0) JRx+=y; JRy+=x; xi=0;yi=0; if(JRx=E) JRx-=E; x+=step; Ex-; xi=step; if(JRy=E) JRy-=E; y-=step; Ey-; yi=-step; if(xi!=0|yi!=0) linerel(xi,yi); lineto(350+x2,250-y2);/*DDA法繪制順時針圓弧*/ddacircle_clock(int x1,int y1,int x2,int y2,int x0,int

26、 y0,int step) putpixel(350+x0),(250-y0),2); setcolor(1); circle(x0+350),(250-y0),r); setcolor(2); if(x1=x0&y1y0) ddaclockwise1(x1,y1,x2,y2,x0,y0,step); /*起點在第一象限*/ else if(x1=y0) ddaclockwise2(x1,y1,x2,y2,x0,y0,step); /*起點在第二象限*/ else if(x1=x0&y1x0&y1=y0) ddaanticlock1(x1,y1,x2,y2,x0,y0,step); /*起點在

27、第一象限*/ else if(x1y0) ddaanticlock2(x1,y1,x2,y2,x0,y0,step); /*起點在第二象限*/ else if(x1x0&y1=y0) ddaanticlock3(x1,y1,x2,y2,x0,y0,step); /*起點在第三象限*/ else ddaanticlock4(x1,y1,x2,y2,x0,y0,step); /*起點在第四象限*/ /*DDA法繪制任意圓弧主函數*/void circle_DDA()int step,d; int x1,y1,x2,y2,x0,y0; system(cls); printf(n please inp

28、ut the first point:X1=); scanf(%d,&x1); printf(Y1=); scanf(%d,&y1); printf( please input the end point:X2=); scanf(%d,&x2); printf(Y2=); scanf(%d,&y2); printf( please input the center of the circle:X0=); scanf(%d,&x0); printf(Y0=); scanf(%d,&y0); printf( input step:nstep=); scanf(%d,&step); printf(Choose a direction:n); printf( 1 clockwise circle;n); printf( 2 anticlockwise circle;n); scanf(%d,&d); axis(); R=sqrt(x1-x0)*(x1-x0)+(y1-y0)*(y1-y0); r=(int)R; if(d=1) ddacircle_clock(x1,y1,x2,y2,x0,y0,step); if(d=2) ddacircle_anticlock(x1,y1,x2,y2,x0,y0,step); getch();五 程序中有待改進的地方本插補程序所具備

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論