📄 logic.lst
字号:
320 5 TR0=1;
321 5 transmit_run();
322 5 direction_display();
323 5 }
324 4 }
325 3 }
326 2 else if((0==down_list_flag)&&(0!=up_list_flag))
327 2 {
328 3 current_direction=up;
329 3 }
330 2 }
331 1 }
332
333 void input_up_list(uchar request)
334 {
335 1 uchar i=0,temp=0,k;
336 1 if(0==up_list_flag)//若上升队列为空则直接插入
337 1 up_list[0]=request;
338 1 else if(5>up_list_flag)//若上升队列没有满
339 1 {
340 2 if(request>up_list[up_list_flag-1])//若请求楼层最大则插在上升队列末尾
341 2 up_list[up_list_flag]=request;
342 2 else //若请求楼层不是最大则进行判断
343 2 {
344 3 while(0!=up_list[i])
345 3 {
346 4 if(request>up_list[i]) //当请求楼层大于此楼层时则往后判断
347 4 {
348 5 i++;
349 5 }
350 4 else if(request<up_list[i]) //当请求楼层小于此楼侧时则插在此楼层前面
351 4 {
352 5 for(k=4;k>i;k--)
353 5 {
354 6 up_list[k]=up_list[k-1];
355 6 }
356 5 up_list[i]=request;
357 5 break;
358 5 }
359 4 else //当请求楼层等于此楼层时则不改变此队列
360 4 {
361 5 temp=1;
362 5 break;
363 5 }
364 4 }
365 3 }
C51 COMPILER V7.50 LOGIC 05/15/2008 15:59:15 PAGE 7
366 2 }
367 1 if(1!=temp)
368 1 up_list_flag++;
369 1 }
370
371 void input_down_list(uchar request)
372 {
373 1 uchar i=0,temp=0,k;
374 1 if(0==down_list_flag)//若下降队列为空则直接插入
375 1 down_list[0]=request;
376 1 else if(5>down_list_flag)//若下降队列没有满
377 1 {
378 2 if(request<down_list[down_list_flag-1])//若请求楼层最小则插在下降队列末尾
379 2 down_list[down_list_flag]=request;
380 2 else //若请求楼层不是最小则进行判断
381 2 {
382 3 while(0!=down_list[i])
383 3 {
384 4 if(request<down_list[i]) //当请求楼层小于此楼层时则往后判断
385 4 {
386 5 i++;
387 5 }
388 4 else if(request>down_list[i]) //当请求楼层大于此楼侧时则插在此楼层前面
389 4 {
390 5 for(k=4;k>i;k--)
391 5 {
392 6 down_list[k]=down_list[k-1];
393 6 }
394 5 down_list[i]=request;
395 5 break;
396 5 }
397 4 else
398 4 {
399 5 temp=1;
400 5 break;
401 5 }
402 4 }
403 3 }
404 2 }
405 1 if(1!=temp)
406 1 down_list_flag++;
407 1 }
408
409 void interrupt_logic(void)
410 {
411 1 if((0==down_list_flag)&&(0==up_list_flag)) //判断电梯是否在运行中
412 1 {
413 2 if(0!=inside_request)//内部按键控制
414 2 {
415 3 if(storey<inside_request)
416 3 {
417 4 current_direction=up;
418 4 input_up_list(inside_request);
419 4 }
420 3 else if(storey>inside_request)
421 3 {
422 4 current_direction=down;
423 4 input_down_list(inside_request);
424 4 }
425 3 inside_request=0;
426 3 }
427 2 else if(0!=outside_request)//外部按键控制
C51 COMPILER V7.50 LOGIC 05/15/2008 15:59:15 PAGE 8
428 2 {
429 3 if(storey<(outside_request&0x0f))
430 3 {
431 4 if(0x10<outside_request)//此时为下降请求时
432 4 {
433 5 highest_floor_flag=1;//此时表明最高上升请求为一下降请求
434 5 outside_request&=0x0f;
435 5 }
436 4 input_up_list(outside_request);
437 4 current_direction=up;
438 4 }
439 3 else if(storey>(outside_request&0x0f))
440 3 {
441 4 if(0x10>outside_request)//此时为上升请求时
442 4 lowest_floor_flag=1;//此时表明最低下降请求为一上升请求
443 4 else
444 4 outside_request&=0x0f;
445 4 input_down_list(outside_request);
446 4 current_direction=down;
447 4 }
448 3 outside_request=0;
449 3 }
450 2 }
451 1 else //若电梯正在运行
452 1 {
453 2 if(0!=inside_request)//如果是内部按钮控制
454 2 {
455 3 if(up==current_direction)
456 3 {
457 4 if(storey<inside_request)//表明此时请求楼层在当前楼层上面
458 4 {
459 5 if(inside_request<=up_list[0])//如果此请求小于等于最高请求楼层则直接插入上升队列
460 5 input_up_list(inside_request);
461 5 else if(1==highest_floor_flag)//若此请求大于最高请求楼曾则需判断最高请求楼层为向上还是向下请求
462 5 {
463 6 input_down_list(up_list[0]);//则将最大请求楼层插入向下队列
464 6 up_list[0]=inside_request;//将最大请求楼层变为此次请求的楼层
465 6 highest_floor_flag=0;//表示最高请求楼层是上升请求
466 6 }
467 5 else//若为最高请求楼层向上请求则直接插入向上请求队列
468 5 input_up_list(inside_request);
469 5 }
470 4 else//表明此请求楼层在当前楼层下面,注:因为就是在运动中因此不用考虑在当前楼层的问题
471 4 {
472 5 input_down_list(inside_request);//当次上升请求小于当前楼层时则直接插入向下队列
473 5 }
474 4 }
475 3 else
476 3 {
477 4 if(storey>inside_request)//表明此时请求楼层在当前楼层下面
478 4 {
479 5 if(inside_request>=down_list[0])//如果此请求大于等于最低请求楼层则直接插入下降队列
480 5 input_down_list(inside_request);
481 5 else if(1==lowest_floor_flag)//若此请求小于最低请求楼曾则需判断最低请求楼层为向上还是向下请求
482 5 {
483 6 input_up_list(down_list[0]);//则将最小请求楼层插入向上队列
484 6 down_list[0]=inside_request;//将最小请求楼层变为此次请求的楼层
485 6 lowest_floor_flag=0;//表示最小请求楼层是下降请求
486 6 }
487 5 else//若为最低请求楼层向下请求则直接插入向下请求队列
488 5 input_down_list(inside_request);
489 5 }
C51 COMPILER V7.50 LOGIC 05/15/2008 15:59:15 PAGE 9
490 4 else//表明此请求楼层在当前楼层上面
491 4 {
492 5 input_up_list(inside_request);//当次下降请求大于当前楼层时则直接插入向上队列
493 5 }
494 4 }
495 3 inside_request=0;
496 3 }
497 2 else if(0!=outside_request)//如果是外部按钮控制
498 2 {
499 3 if(up==current_direction)//若电梯正在往上运行则响应向上的请求
500 3 {
501 4 if(0x10>outside_request)//表明请求为上升请求时
502 4 {
503 5 if(storey<outside_request)//表明此时请求楼层在当前楼层上面
504 5 {
505 6 if(outside_request<=up_list[0])//如果此上升请求小于等于最高请求楼层则直接插入上升队列
506 6 input_up_list(outside_request);
507 6 else if(1==highest_floor_flag)//若此上升请求大于最高请求楼曾则需判断最高请求楼层为向上还是向下请求
508 6 {
509 7 input_down_list(up_list[0]);//则将最大请求楼层插入向下队列
510 7 up_list[0]=outside_request;//将最大请求楼层变为此次请求的楼层
511 7 highest_floor_flag=0;//表示最高请求楼层是上升请求
512 7 }
513 6 else//若为最高请求楼层向上请求则直接插入向上请求队列
514 6 input_up_list(outside_request);
515 6 }
516 5 else//表明此请求楼层在当前楼层下面,注:因为就是在运动中因此不用考虑在当前楼层的问题
517 5 {
518 6 input_down_list(outside_request);//当次上升请求小于当前楼层时则直接插入向下队列
519 6 }
520 5 }
521 4 else//表明请求若为下降请求时
522 4 {
523 5 outside_request&=0x0f;
524 5 if(outside_request<=up_list[0])//若此下降请求小于等于最高请求楼层时直接插入下降队列
525 5 {
526 6 input_down_list(outside_request);
527 6 }
528 5 else//若此下降请求大于最高请求楼层时则插入上升队列并表明最高请求楼层的方向
529 5 {
530 6 input_up_list(outside_request);
531 6 highest_floor_flag=1; //表示最高请求楼层是下降请求
532 6 }
533 5 }
534 4 }
535 3 else //若电梯正在往下运行则相应向下的请求
536 3 {
537 4 if(0x10<outside_request)//表明请求为下降请求时
538 4 {
539 5 outside_request&=0x0f;
540 5 if(storey>outside_request)//表明此时请求楼层在当前楼层下面
541 5 {
542 6 if(outside_request>=down_list[0])//如果此下降请求大于等于最低请求楼层则直接插入下降队列
543 6 input_down_list(outside_request);
544 6 else if(1==lowest_floor_flag)//若此下降请求小于最低请求楼曾则需判断最低请求楼层为向上还是向下请求
545 6 {
546 7 input_up_list(down_list[0]);//则将最小请求楼层插入向上队列
547 7 down_list[0]=outside_request;//将最小请求楼层变为此次请求的楼层
548 7 lowest_floor_flag=0;//表示最小请求楼层是下降请求
549 7 }
550 6 else//若为最低请求楼层向下请求则直接插入向下请求队列
551 6 input_down_list(outside_request);
C51 COMPILER V7.50 LOGIC 05/15/2008 15:59:15 PAGE 10
552 6 }
553 5 else//表明此请求楼层在当前楼层上面
554 5 {
555 6 input_up_list(outside_request);//当次下降请求大于当前楼层时则直接插入向上队列
556 6 }
557 5 }
558 4 else//表明请求若为上升请求时
559 4 {
560 5 if(outside_request>=down_list[0])//若此上升请求大于等于最低请求楼层时直接插入上升队列
561 5 {
562 6 input_up_list(outside_request);
563 6 }
564 5 else//若此上升请求小于最低请求楼层时则插入下降队列并表明最低请求楼层的方向
565 5 {
566 6 input_down_list(outside_request);
567 6 lowest_floor_flag=1; //表示最高请求楼层是下降请求
568 6 }
569 5 }
570 4 }
571 3 outside_request=0;
572 3 }
573 2 }
574 1 }
575 /*********************************主程序*********************/
576 void main(void)
577 {
578 1 init_port();
579 1 init_serialport();
580 1 init_timer();
581 1 init_exint0();
582 1 init_CH451L();
583 1 init_stepper_motor();
584 1 start_lift();
585 1 while(1)
586 1 {
587 2 keyboard_program();
588 2 if(1==direction_display_flag)
589 2 {
590 3 direction_display();
591 3 direction_display_flag=0;
592 3 }
593 2 lift_run();
594 2 over_load_judge();
595 2 }
596 1 }
597
598 /*****************************中断程序及其判断*************/
599 void exint0(void) interrupt 0 using 1
600 {
601 1 read_flag=1;
602 1 direction_display_flag=1;
603 1 }
604
605 void timer0_interrupt(void) interrupt 1 using 2
606 {
607 1 L297_clock=!L297_clock;
608 1 TH0=step_motor_frequence/256;
609 1 TL0=step_motor_frequence%256;
610 1 }
611
612 void timer1_interrupt(void) interrupt 3 using 3
613 {
C51 COMPILER V7.50 LOGIC 05/15/2008 15:59:15 PAGE 11
614 1 counter_5s--;
615 1 TH1=timer_10ms/256;
616 1 TL1=timer_10ms%256;
617 1 }
618
619 void serial_receive(void) interrupt 4 using 3
620 {
621 1 uchar weight_signal;
622 1 weight_signal=SBUF;
623 1 if(0x0A==weight_signal)//表示接收到异常重物信号
624 1 {
625 2 over_load_flag=1;
626 2 }
627 1 else if(0xA0==weight_signal)//接收到正常重物信号
628 1 {
629 2 over_load_flag=2;
630 2 }
631 1 RI=0;
632 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1226 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 18 1
IDATA SIZE = ---- ----
BIT SIZE = 5 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -