基于AT89S51单片机自动往返小车系统设计 第4页

基于AT89S51单片机自动往返小车系统设计 第4页
*************************************
    主 程  序       
*************************************
START:     LCALL  CLEARMEMIO   ;上电初始化
        SETB  P1.6     ;选择7.5V输出
        CLR   P1.7     ;选择7.5V输出
        SETB  P3.7     ;前进状态
        CLR   P3.6     ;前进状态
        CLR   P1.0     ;电机供电开始
MAIN:      LCALL  DISP     ;LED显示一次
        LJMP MAIN     ;转MAIN循环
        NOP         ;PC值出错处理
        NOP
     LJMP  START    ;重新初始化
*************************************
外中断0服务程序,用作跑道位置处理
  23H作跑道计数器        
*************************************
INTEX0:    PUSH  ACC     ;堆栈保护
       PUSH  PSW     ;
       CLR   EX0     ;关中断
       LCALL  DISP     ;LED显示一次(延时抗干扰)
       JB   P3.2,IN0RET    ;P3.2为1退出(干扰)
       INC   23H     ;跑道计数器加1
       MOV   A,23H     ;数据入A
       CJNE  A,#06H,JUDGE1   ;不是第6道转JUDGE1
       LCALL  STOP     ;是第6道,停车
       LJMP  IN0RET     ;转中断退出
JUDGE1:    CJNE  A,#03H,JUDGE2   ;不是第3道转JUDGE2
       LCALL  STOPSLOW    ;是第3道,变慢车
       LJMP  IN0RET     ;转中断退出
JUDGE2:    CJNE  A,#04H,JUDGE3   ;不是第4道转JUDGE3
       LCALL  FAST     ;是第4道,变快车
       LJMP  IN0RET     ;转中断退出
JUDGE3:    CJNE  A,#05H,IN0RET   ;不是第5道转INORET退出
       LCALL  STOPSLOW    ;是第5道,变慢车
IN0RET:    CLR   IE0     ;清外中断0中断标志
       POP   PSW     ;恢复现场
       POP   ACC     ;
       LCALL  DL7MS     ;延时7毫秒(抗干扰)
       SETB  EX0     ;开外中断0
       RETI       ;中断返回

************************************
     慢车控制子程序    
************************************
STOPSLOW:   CLR   P1.6     ;关7.5V电源
        CPL   P3.6     ;反向驱动(刹车)
        CPL   P3.7     ;反向驱动
        LCALL  DS50MS    ;刹车时间(可根据试车情况调整)
        LCALL  DS50MS    ;
        LCALL  DS50MS    ;
        CPL   P3.6     ;正向驱动
        CPL   P3.7     ;正向驱动
        SETB  P1.7     ;开4.3V电源
        RET      ;返回
;
;************************************
;*     快车控制子程序      *
;************************************
FAST:     CLR   P1.7     ; 关4.3V电源
        SETB  P1.6     ; 开7.5V电源
        RET       ;返回

************************************
     停车控制程序      
************************************
STOP:     MOV  23H,#00H    ;跑道计数单元清0
       CPL   P3.6     ;反向驱动(刹车)
       CPL   P3.7     ;反向驱动(刹车)
       LCALL  DS50MS     ;刹车时间
       LCALL  DS50MS     ;刹车时间(可调整)
       SETB  P1.0     ;关电机电源
       SETB  PT1       ;定时器T1为高优先级
       LCALL  DS10S     ;停车10秒
       CLR   PT1     ;恢复T1为低优先级
       SETB  P1.6     ;开7.5V电源(高速)
       CLR   P1.7     ;关4.3V
       CLR   P1.0     ;电机电源开
       CPL   30H     ;停车点位置判断标志取反
       JB   30H,STREN    ;为1(中途停车)转STREN
       LCALL  CLR00     ;是终点,调复0程序
 STREN:    RET      ;返回

*********************************
    计时清0程序     
*********************************
CLR00:      MOV  70H,#00H     ;计时单元清0
         MOV  71H,#00H     ;计时单元清0
         MOV  72H,#00H     ;计时单元清0
         MOV  73H,#00H     ;计时单元清0
         RET        ;返回

*************************************
     外中断1程序,里程计数用   
  20H、21H、22H、24H作计数器  
************************************
INTEX1:     PUSH  ACC       ;堆栈保护
         PUSH  PSW       ;
         CLR  EX1       ;关外中断1
         INC  20H       ;圈加1
 LLLL:     MOV  A,20H     ;判断是否满6圈
         CJNE  A,#06H,LLL    ;不满6圈转LLL退出
         MOV  20H,#00H     ;满6圈清0进位(6圈为1米)
         INC  21H       ;上位加1
         MOV  A,21H     ;判断是否满10
         CJNE  A,#0AH,LLL    ;不满10转LLL
         MOV  21H,#00H     ; 满10清0进1位
         INC  22H       ; 高位加1
         MOV  A,22H     ; 判断是否满10
         CJNE  A,#0AH,LLL    ; 不满10转LLL
         MOV  22H,#00H     ; 满10清0进1位
         INC  24H      ; 高位加1
         MOV  A,24H     ; 判断是否满10
         CJNE  A,#0AH,LLL    ; 不满10转LLL
         MOV  24H,#00H     ; 满10清0
LLL:       MOV  74H,21H     ; 将里程数移入显示单元(个位)
         MOV  75H,22H     ; 将里程数移入显示单元(十位)
         MOV  76H,24H     ; 将里程数移入显示单元(百位)
IN1RET:     POP  PSW      ;恢复堆栈
         POP  ACC     ;
         SETB  EX1      ;开外中断1
         RETI      ;中断返回

上一页  [1] [2] [3] [4] [5] [6] 下一页

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有