📄 mill.lst
字号:
C51 COMPILER V7.20 MILL 06/13/2008 11:55:35 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE MILL
OBJECT MODULE PLACED IN MILL.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE MILL.C DEBUG OBJECTEXTEND PAGEWIDT
-H(79) PAGELENGTH(66)
line level source
1 #include "math.h"
2 sbit xyz_enb=0x96;
3 sbit x_pulse=0x90; //2个坐标进给脉冲,一个脉冲走一步
4 sbit y_pulse=0x92;
5 sbit x_dir=0x91; //2个坐标进给方向控制,=0正走
6 sbit y_dir=0x93;
7 //-----------------延时100us函数------------------
8 void delay(unsigned char time)//延时时间=time*100us
9 {
10 1 unsigned i,j;
11 1 for(i=0;i<time;i++)
12 1 for(j=0;j<22;j++);
13 1 }
14 //----------------x方向走一步---------------------
15 // dir为方向,0:正方向;1:负方向。每步当量=1/400 mm
16 // dl为延时时间,100us为单位。
17 void x_step(bit dir,unsigned char dl)
18 {
19 1 dl=dl/2;
20 1 x_dir=!dir;
21 1 x_pulse=!x_pulse; //信号取反
22 1 delay(dl);
23 1 x_pulse=!x_pulse; //信号取反
24 1 delay(dl);
25 1 }
26 //----------------y方向走一步---------------------
27 // dir为方向,0:正方向;1:负方向. 每步当量=1/400 mm
28 // dl为延时时间,100us为单位。
29 void y_step(bit dir,unsigned char dl)
30 {
31 1 dl=dl/2;
32 1 y_dir=!dir;
33 1 y_pulse=!y_pulse; //信号取反
34 1 delay(dl);
35 1 y_pulse=!y_pulse; //信号取反
36 1 delay(dl);
37 1 }
38 //----------------- 直线插补子程序 ------------------
39 // 起点在原点,(Xe,Ye)终点坐标
40 void line(long Xe,long Ye)
41 {unsigned char quadrant; //象限值=1,2,3,4。代表4个象限
42 1 long Fi=0; //偏差函数
43 1 long M; //计数长度
44 1
45 1 if (Xe>0 && Ye>=0) quadrant=1; //判断哪个象限直线
46 1 else if(Xe<=0 && Ye>0) quadrant=2;
47 1 else if(Xe<0 && Ye<=0) quadrant=3;
48 1 else quadrant=4;
49 1
50 1 M=labs(Xe)+labs(Ye); //双向计数
51 1
52 1 do //插补循环
53 1 {
54 2 if(Fi>=0) //偏差判别
55 2 {
56 3 if(quadrant==1 ||quadrant==4) x_step(0,6); //1、4象限,X正
C51 COMPILER V7.20 MILL 06/13/2008 11:55:35 PAGE 2
-方向走一步
57 3 else x_step(1,6); //2、3象限,X负
-方向走一步
58 3 Fi=Fi-labs(Ye);
59 3 }
60 2 else //偏差判别
61 2 {
62 3 if(quadrant==1 ||quadrant==2) y_step(0,6); //1、4象限,Y正
-方向走一步
63 3 else y_step(1,6); //2、3象限,y负
-方向走一步
64 3 Fi=Fi+labs(Xe);
65 3 }
66 2 }
67 1 while(M-->0);//终点判断
68 1 }
69 //------------------ 圆弧插补子程序 -------------------
70 // (X0,Y0)起点坐标;(Xe,Ye)终点坐标;圆心在原点
71 // N: 顺圆逆圆标志,N=1顺圆; N=0.逆圆
72 // Xf,Yf: 动点(xi,yi)的符号,=0表示正;=1表示负
73 // Ff: 偏差函数符号位,=0表示正;=1表示负
74 // Pi: 进给坐标判别位,=0走X;=1走Y
75 // deltaXf,deltaYf:两坐标进给方向,=0走正方向,=1走负方向
76 void circle(bit N,long X0,long Y0,long Xe,long Ye)
77 {
78 1 long Fi=0; //偏差函数
79 1 long deltaX,deltaY; //进给量=正负1
80 1 long Xi=X0,Yi=Y0; //动点坐标
81 1 bit Ff,Pi,Xf,Yf,deltaXf,deltaYf;
82 1
83 1 do
84 1 {
85 2 if(Fi>=0) Ff=0; //偏差判别
86 2 else Ff=1;
87 2
88 2 if(Xi>=0) Xf=0; //判别动点坐标符号
89 2 else Xf=1;
90 2 if(Yi>=0) Yf=0;
91 2 else Yf=1;
92 2
93 2 Pi=Ff^N^Xf^Yf; //进给坐标判别位计算
94 2 deltaXf=(!N)^Yf; //进给方向判别
95 2 deltaYf= N ^Xf;
96 2
97 2 if(Pi==0) //进给deltaX
98 2 {
99 3 if(deltaXf==0) deltaX=1;
100 3 else deltaX=-1;
101 3 Fi=Fi+2*Xi*deltaX+1; //算新的偏差
102 3 Xi=Xi+deltaX; //进给控制
103 3 x_step(deltaXf,6); //延时600us
104 3 }
105 2 else
106 2 {
107 3 if(deltaYf==0) deltaY=1;
108 3 else deltaY=-1;
109 3 Fi=Fi+2*Yi*deltaY+1; //算新的偏差
110 3 Yi=Yi+deltaY; //进给控制
111 3 y_step(deltaYf,6); //延时600us
112 3 }
113 2 }
114 1 while(Xi!=Xe || Yi!=Ye); //终点判别
115 1 }
116 //------------------ 主程序 -------------------------
C51 COMPILER V7.20 MILL 06/13/2008 11:55:35 PAGE 3
117 void main(void)
118 {
119 1 xyz_enb=0;
120 1 circle(1,0,40*400L,0,40*400L);
121 1 //line(0,80L*400L);
122 1 line(-38L*400L,-28L*400L);
123 1 line(15L*400L,-44L*400L);
124 1 line(46L*400L,0L*400L);
125 1 line(15L*400L,44L*400L);
126 1 line(-38L*400L,28L*400L);
127 1 while(1);
128 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 938 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 55
IDATA SIZE = ---- ----
BIT SIZE = ---- 9
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -