📄 motor.lst
字号:
C51 COMPILER V7.06 MOTOR 10/25/2007 22:48:42 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MOTOR
OBJECT MODULE PLACED IN motor.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE motor.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /////////////////////////////////////////////////////////////////////////////////////
2 // MCS51单片机作为主控制器组成一个双步进电机控制器 //
3 // 通过小键盘,能给定两台步进电机单独运行的速度,要求可供选择的步 //
4 // 进速度从60~600步/秒,可连续任意设置;通过直线差补算法能实时显 //
5 // 示所绘直线段的坐标,并能通过键盘设定新的终点参数,且步进电机能 //
6 // 正确运行到该点,回零后能快速回到始点。 //
7 /////////////////////////////////////////////////////////////////////////////////////
8 /////////////////////////////////////////////////////////////////////////////////////
9 #include<reg51.h> //51芯片管脚定义头文件
10 #include<stdio.h>
11
12 typedef unsigned char unchar;
13 sbit LED1=P2^0; //LED位选
14 sbit LED2=P2^1;
15 sbit LED3=P2^2;
16 sbit LED4=P2^3;
17 sbit LED5=P2^4;
18 sbit LED6=P2^5;
19 sbit LED7=P2^6;
20 sbit LED8=P2^7;
21 unchar start=0; //启动键按下标志, 按下标志量变为一
22 unchar back=0; //回零键按下标志, 按下标志量变为一
23 unchar setX_F=0; //设置键X按下标志,按下标志量变为一
24 unchar setY_F=0; //设置键Y按下标志,按下标志量变为一
25 unchar set_add_F=0; //加一键按下标志, 按下标志量变为一
26 unchar set_sure_F=0; //确定键按下标志, 按下标志量变为一
27 unchar setX_Z=0; //设置X坐标键按下,按下标志量变为一
28 unchar setY_Z=0; //设置Y坐标键按下,按下标志量变为一
29
30 ////////////////////////////////////////////////////////////////////////////////////////////////
31 //定义全局变量
32 ///////////////////////////////////////////////////////////////////////////////////////////
33 unsigned int keytmp,tmp;
34 unsigned int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,p=0,t=0,u=0,r=0;
35 unsigned int speed=0,speed1=0,speed2=0;
36 unsigned int Xi=0,Yi=0;
37 unsigned int FX=0,FY=0;
38 unsigned int XE=0,YE=0,Nxy=0; //(X轴坐标,Y轴坐标,总部数)
39 int FM=0;
40 unsigned int flag=0,flagx=0,flagy=0;
41 unsigned int setX_value=0; // 当标志位为一时跳出设置X速度的循环
42 unsigned int setY_value=0; // 当标志位为一时跳出设置Y速度的循环
43 unsigned int setX_Z_value=0; // 当标志位为一时跳出设置X坐标的循环
44 unsigned int setY_Z_value=0; // 当标志位为一时跳出设置X坐标的循环
45 unsigned char code LED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //LED段选码
46 // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
47 int time=0; //定时扫描键盘标志位
48 int time1=0;
49 int time2=0; //LED闪射时间
50 int timeF2=0; //LED闪射时间标志
51
52 /////////////////////////////////////////////////////////////////////////////////////////////
53 //声明函数
54 ////////////////////////////////////////////////////////////////////////////////////////////
55 void Time0_initial();
C51 COMPILER V7.06 MOTOR 10/25/2007 22:48:42 PAGE 2
56 void Time1_initial(); //定时器1初始化
57 void chabu(); //双步进电机差补运行
58 void runback(); //步进电机回零
59 void runX(); //电机X正向运行
60 void runY(); //电机Y正向运行
61 void control(); //速度,坐标设置控制
62 void displayxy(int,int); //LED显示(int-位选,int-段选)
63 void displayXY_data(int,int,int,int,int,int,int,int,int); //8位LED显示数据,第一个int代表LED1显示的
64 //数值,第二个int代表LED2显示的数值,*****
65 //第九个int代表是否屏蔽其中的位选,是否闪动.
66 //////////////////////////////////////////////////////////////////////////////
67 void dingshi1ms(int i) //延时10ms程序
68 {
69 1 time1=0;
70 1 while(1)
71 1 {
72 2 if(time1==i)
73 2 break;
74 2 }
75 1 }
76 /////////////////////////////////////////////
77 main() //主程序
78 {
79 1 P0=0x00;
80 1 P1=0;
81 1 P2=0xff;
82 1 P3=0x00;
83 1 TMOD=0x11;
84 1 TF1=0;
85 1 TF0=0;
86 1 Time0_initial();
87 1 Time1_initial();
88 1 ET0=1;
89 1 ET1=1;
90 1 EA=1;
91 1 while(1)
92 1 {
93 2 control();
94 2 }
95 1 }
96 void time0_initial()
97 {
98 1 TR0=0;
99 1 TF0=0;
100 1 TH0=0xfc;
101 1 TL0=0x17;
102 1 TR0=1;
103 1 }
104 ///////////////////////////////////////////////
105 void time0_int(void) interrupt 1
106 {
107 1 time1+=1;
108 1 time0_initial();
109 1 }
110 void Time1_initial() //定时器1中断初始化定时50ms
111 {
112 1 TR1=0;
113 1 TF1=0;
114 1 TH1=0x3c;
115 1 TL1=0xaf;
116 1 TR1=1;
117 1 }
C51 COMPILER V7.06 MOTOR 10/25/2007 22:48:42 PAGE 3
118 ///////////////////////////////////////////////
119 //定时扫描键盘
120 ////////////////////////////////////////////////
121 void time1_int(void) interrupt 3
122 {
123 1 time+=1;
124 1 time1+=1;
125 1 time2+=1;
126 1 if(time2<=4)
127 1 {timeF2=0;}
128 1 if(time2>4&&time2<8)
129 1 {timeF2=1;}
130 1 if(time2==8)
131 1 { timeF2=0;
132 2 time2=0;
133 2 }
134 1 if(time==2)
135 1 {
136 2 P3=0x00;
137 2 P3=0x01; //第一行置零
138 2 tmp=P3;
139 2 keytmp=tmp&0xff;
140 2 if(keytmp!=0x01)
141 2 {
142 3 switch(keytmp)
143 3 {
144 4 case 0x11:
145 4 start=1; break;
146 4 case 0x21:
147 4 setX_F=1; break;
148 4 case 0x41:
149 4 setY_F=1; break;
150 4 case 0x81:
151 4 setX_Z=1; break;
152 4 default : break;
153 4 }
154 3 }
155 2 }
156 1 if(time==4)
157 1 {
158 2 P3=0x00;
159 2 P3=0x02; //第二行置零
160 2 tmp=P3;
161 2 keytmp=tmp&0xff;
162 2 if(keytmp!=0x02)
163 2 {
164 3 switch(keytmp)
165 3 {
166 4 case 0x12:
167 4 back=1; break;
168 4 case 0x22:
169 4 set_sure_F=1; break;
170 4 case 0x42:
171 4 set_add_F=1; break;
172 4 case 0x82:
173 4 setY_Z=1; break;
174 4 default : break;
175 4 }
176 3 }
177 2 time=0;
178 2 }
179 1 Time1_initial();
C51 COMPILER V7.06 MOTOR 10/25/2007 22:48:42 PAGE 4
180 1 }
181 //////////////////////////////////////////////
182 //电机X轴正运行函数
183 //////////////////////////////////////////////
184 void runX(void)
185 { int tt;
186 1 speed=(int)(3750/(a*100+b*10+c));
187 1 while(1)
188 1 {
189 2 P1=0x01;
190 2 tt=speed;
191 2 while(tt--)
192 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
193 2 P1=0x03;
194 2 tt=speed;
195 2 while(tt--)
196 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
197 2 P1=0x02;
198 2 tt=speed;
199 2 while(tt--)
200 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
201 2 P1=0x06;
202 2 tt=speed;
203 2 while(tt--)
204 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
205 2 P1=0x04;
206 2 tt=speed;
207 2 while(tt--)
208 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
209 2 P1=0x0c;
210 2 tt=speed;
211 2 while(tt--)
212 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
213 2 P1=0x08;
214 2 tt=speed;
215 2 while(tt--)
216 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
217 2 P1=0x09;
218 2 tt=speed;
219 2 while(tt--)
220 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
221 2 Xi+=1;Yi+=1;
222 2 if(set_sure_F==1) break;
223 2 }
224 1 }
225 /////////////////////////////////////////////
226 //电机Y正运行函数
227 /////////////////////////////////////////////
228 void runY(void)
229 {
230 1 int tt;
231 1 speed=(int)(3750/(d*100+e*10+f));
232 1 while(1)
233 1 {
234 2 P1=0x10;
235 2 tt=speed;
236 2 while(tt--)
237 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
238 2 P1=0x30;
239 2 tt=speed;
240 2 while(tt--)
241 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
C51 COMPILER V7.06 MOTOR 10/25/2007 22:48:42 PAGE 5
242 2 P1=0x20;
243 2 tt=speed;
244 2 while(tt--)
245 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
246 2 P1=0x60;
247 2 tt=speed;
248 2 while(tt--)
249 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
250 2 P1=0x40;
251 2 tt=speed;
252 2 while(tt--)
253 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
254 2 P1=0xc0;
255 2 tt=speed;
256 2 while(tt--)
257 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
258 2 P1=0x80;
259 2 tt=speed;
260 2 while(tt--)
261 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
262 2 P1=0x90;
263 2 tt=speed;
264 2 while(tt--)
265 2 displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
266 2 Xi+=1;Yi+=1;
267 2 if(set_sure_F==1) break;
268 2 }
269 1 }
270 /////////////////////////////////////////////
271 ///双步进电机差补运行
272 //////////////////////////////////////////////
273 void chabu(void)
274 { int tt;
275 1 speed1=(int)(3750/(a*100+b*10+c));
276 1 speed2=(int)(3750/(d*100+e*10+f));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -