📄 main.lst
字号:
189 3 {
190 4 temp=temp+MAXSTEPS;
191 4 }
192 3
193 3 if(temp>0)
194 3 {
195 4 FuncRotate(ConstClockWise,temp,&RegAngle);
196 4 }
197 3 if(temp<0)
198 3 {
199 4 FuncRotate(ConstAntiClock,-temp,&RegAngle);}
200 3 }
201 2
202 2 if(workmode==1)
203 2 {
204 3 send((char*)&RegAngle,2);
205 3 }
206 2 else if(workmode==2)
207 2 {
208 3 send((char*)&RegAngle,2);
209 3 send((char*)&XPulse,4);
210 3 send((char*)&YPulse,4);
211 3 }
212 2
213 2 EvTimer=FALSE;
214 2 }
215 1 }
216
217
218
219 void initial(void)
220 {
221 1
222 1 // IP=0x08; //定义T1中断优先
223 1 // IE=0x87; //允许中断0、1、定时器0
224 1 // TCON=0x05; //外部中断为负边沿中断
225 1
226 1 IP=0x10; //定义串口为高优先级中断
227 1 IE=0x97; //允许串口、中断0、1、定时器0
228 1 TCON=0x05;
229 1
230 1 // TMOD=0x01; //定时器0以十六位定时/计数器方式工作
231 1 TMOD=0x21; //定时器1为自动装入(auto-load)方式
232 1 // TMOD=0x22; //定时器1为自动装入(auto-load)方式
233 1 // TH0=0xD8; //10ms产生中断
234 1 // TL0=0xEF;
235 1 TH0=0xB1; //10ms产生中断 24Mhz
236 1 TL0=0xE0;
237 1 // TH0=0x4E; //10ms产生中断 24Mhz
238 1 // TL0=0x20;
239 1 // TH0=0xFF; //10ms产生中断 24Mhz
C51 COMPILER V6.23a MAIN 11/24/2002 21:27:04 PAGE 5
240 1 // TL0=0x80;
241 1 // TH0=0xff; //10ms产生中断 24Mhz
242 1 // TL0=0x3f;
243 1 // TH0=0x00;
244 1 // TL0=0x00; //
245 1 TR0=1;
246 1
247 1
248 1 PCON=0; //SMOD(PCON.7)=1时,baudrate doubled.//smod=1 (11M晶振时为0)
249 1
250 1 SCON=0xD0; //串行口工作方式 : 9位UART, 波特率可变
251 1 TH1=0xf3;
252 1 TL1=0xf3; //
253 1 PCON=0x80|PCON; // SMOD=1; //波特率设置 : 9600 baud(E8--24MHZ)
254 1 //SMOD=0=4.8kbps
255 1 //th1=tl1=fd,smod=0 ,=19.2kbps
256 1 TR1=1; //启动定时器1
257 1
258 1
259 1 XPulse=0;
260 1 YPulse=0;
261 1 XPulseTemp=0;
262 1 YPulseTemp=0;
263 1
264 1 }
265
266 void send(char *temp,int j)
267 {
268 1 int i=0;
269 1 LampComm=TRUE;
270 1 EA=0;
271 1 for(i=0;i<=j-1;i++)
272 1 {
273 2 ACC=*(temp+i);
274 2 TB8=P;
275 2 SBUF=ACC;
276 2 while(TI==0);
277 2 TI=0;
278 2 }
279 1 EA=1;
280 1 LampComm=FALSE;
281 1 }
282
283 int FuncRotate(bit BClockWise,int step,int *PRegAngle)
284 {
285 1
286 1 PinRotIndicator=TRUE;
287 1 if (BClockWise)
288 1 {
289 2 PinDrvAntiClock=INVALID;
290 2 *PRegAngle+=step;
291 2 if (*PRegAngle>=MAXSTEPS) *PRegAngle-=MAXSTEPS;
292 2 }
293 1 else
294 1 {
295 2 PinDrvAntiClock=VALID;
296 2 *PRegAngle-=step;
297 2 if (*PRegAngle<0) *PRegAngle+=MAXSTEPS;
298 2 }
299 1
300 1
301 1 while(step)
C51 COMPILER V6.23a MAIN 11/24/2002 21:27:04 PAGE 6
302 1 {
303 2 PinDriver=INVALID;
304 2 delay(delaycount);
305 2 PinDriver=VALID;
306 2 delay(delaycount);
307 2 --step;
308 2 }
309 1 PinRotIndicator=FALSE;
310 1 return(TRUE);
311 1
312 1
313 1 }
314 void delay(int i)
315 {
316 1 int j=0;
317 1 i=i*DELAY_VALVE;
318 1
319 1 while (j<i)j++;
320 1
321 1 }
322
323 void XPulse_INT(void) interrupt 2
324 {
325 1 EX0=0;
326 1
327 1 if(PinXClockWise) XPulseTemp++;
328 1 else XPulseTemp--;
329 1
330 1 EX0=1;
331 1 }
332 void YPulse_INT(void) interrupt 0
333 {
334 1 EX1=0;
335 1
336 1 if(PinYClockWise) YPulseTemp++;
337 1 else YPulseTemp--;
338 1
339 1 EX1=1;
340 1 }
341
342 void TIMER(void) interrupt 1
343 {
344 1 TH0=0xB1; //10ms产生中断 24Mhz
345 1 TL0=0xE0;
346 1
347 1 counter10ms++;
348 1 // if(counter10ms==5)
349 1 // PinLampBlink=TRUE;
350 1
351 1 if(counter10ms>=30)
352 1 {
353 2 counter10ms=0;
354 2 if(EvTimer==TRUE){while(1){LampFatalError=TRUE;}}//for debug use
355 2 EvTimer=TRUE;
356 2 // PinLampBlink=FALSE;
357 2 XPulse=XPulseTemp;
358 2 YPulse=YPulseTemp;
359 2 XPulseTemp=0;
360 2 YPulseTemp=0;
361 2 }
362 1 }
363
C51 COMPILER V6.23a MAIN 11/24/2002 21:27:04 PAGE 7
364
365
366 void Rcv_INT(void) interrupt 4
367 {
368 1 LampComm=TRUE;
369 1 if(RI)
370 1 {
371 2 ACC=SBUF;
372 2 if(P==RB8)
373 2 {
374 3 rcvdata=ACC;
375 3 EvRcv=TRUE;
376 3 }
377 2
378 2 RI=0;
379 2
380 2 }
381 1 LampComm=FALSE;
382 1 }
383
C51 COMPILATION COMPLETE. 0 WARNING(S), 1 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -