⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 步进电机总程序.asm

📁 用51驱动LED
💻 ASM
📖 第 1 页 / 共 2 页
字号:
         MOV    A,R0
         MOV    DPTR,#TABLE0
         MOVC   A,@A+DPTR
         JZ   START2              ;对 A 的判断,当 A = 0 时则转到 START

         MOV    P2,A
         ACALL  DELAY0             ;升半旗,速度降为原来的一半,使音乐播放完
         ACALL  DELAY0

         INC    R0
         MOV    A,R0
         PUSH   A
         ACALL  DISP1
         LCALL  KEYSCAN1
         CJNE   A,#0DH,GO_ON1      ;判断是否有暂停
         ACALL  ZAN_TING
         ACALL  DELAY1
GO_ON1:
         POP    A
         MOV    R0,A
         DJNZ   R3,START3
         INC    R5
         ACALL  JI_SUAN1
         ;ACALL  DISP1

         MOV    A,6BH
         JB     27H,DA_YU1
         CJNE   A,#90,SHANG_1
         MOV    P2,#00H
         RET

DA_YU1:  CJNE   A,#180,SHANG_1
         MOV    P2,#00H
         RET
;------------降半旗---------------
BAN_GAOL:
         MOV    R5,#0             ;假定每一圈为2厘米,则上升到180厘米所需的圈数为90.
         MOV    A,6BH
         MOV    71H,A
         MOV    A,#90
         CLR    C
         SUBB   A,6BH
         JNC    XIAO_YU
         SETB   27H
         AJMP   XIA_1
XIAO_YU: CLR    27H
   XIA_1:MOV    R3,#240
  START6:ACALL  DISP1
         MOV    P2,#00H            ;下降的同时音乐停
         MOV    R0,#06H
  START7:
         ;MOV    A,R0
         ;PUSH   A
         ;ACALL  JI_SUAN2
         ;ACALL  DISP1
         ;POP    A
         MOV    A,R0
         MOV    DPTR,#TABLE0
         MOVC   A,@A+DPTR
         JZ     START6

         MOV    P2,A
         ACALL  DELAY0

         INC    R0
         MOV    A,R0
         PUSH   A
         ACALL  DISP1
         LCALL  KEYSCAN1
         CJNE   A,#0DH,GO_ON3       ;判断是否有暂停
         ACALL  ZAN_TING
         ACALL  DELAY1
GO_ON3:
         POP    A
         MOV    R0,A
         DJNZ   R3,START7
         INC    R5
         ACALL  JI_SUAN2
         ;ACALL  DISP1

         MOV    A,6BH
         JNB    27H,XIAO_YU1
         CJNE   A,#90,XIA_1
         MOV    P2,#00H
         RET

XIAO_YU1:CJNE   A,#0,XIA_1
         MOV    P2,#00H
         RET
;-----------暂停-------------
ZAN_TING:
 LOP4:   MOV    P2,#00H
         LCALL  KEYSCAN2
         CJNE   A,#0EH,LOP4
         RET                               ;暂停结束,返回
;-----------延时-------------
DELAY0:
         MOV R7,#10                        ;步进电机的转速,延时5MS
M3:
         MOV R6,#250
         DJNZ R6,$
         DJNZ R7,M3
         RET
DELAY1:                                    ; 6MS 延时子程序
         MOV    R3,#120
DEL3:    MOV    R2,#250
         DJNZ   R2,$
         DJNZ   R3,DEL3
         RET

TABLE0:
         DB 81H,82H,84H,88H,81H            ;正转表
         DB 00H                            ;正转结束
         DB 01H,08H,04H,02H,01H            ;反转表
         DB 00H                            ;反转结束



       ;显示程序
DISP1:
        MOV    R2,64H                      ;显示数码存放在61~64
        MOV    R4,#0F7H                    ;把显示位码取到R4
        LCALL  DISPLAY_A_BIT
        LCALL  DELAY

        MOV    A, 63H
        MOV    DPTR,#TABLE
        MOVC   A,@A+DPTR
        ANL    A,#7FH
        MOV    P1,A
        MOV    A,#0FBH
        MOV    P3,A
        LCALL  DELAY

        MOV    R0,#62H
        MOV    R4,#0FDH
DISPLAY_SCAN1:
        MOV A,@R0
        MOV R2,A                        ;把显示数码取到R2

        LCALL DISPLAY_A_BIT
        LCALL DELAY

        MOV A,R4
        RR  A                            ;下一位码
        MOV R4,A

        DEC R0                           ;下一显示数码
        CJNE R0,#60H,DISPLAY_SCAN1
        RET


KEYSCAN1:  ACALL   KS2                   ;调用是否有键闭合程序
           JNZ     LK1N                  ;有键按下转LK1N处理
           RET                           ;没键按下,返回

     LK1N: MOV     R6,#12                ;等待3MS
     YS2N: ACALL   DISP1
           DJNZ    R6,YS2N
           ACALL   KS2                   ;确有键闭合吗?
           JNZ     LK2N                  ;有,确定键值
           RET                           ;没有继续扫描

     LK2N: MOV     R0,#40H                ;设R0为键扫描码入口地址
     LK3N: MOV     P3,#0FFH
           MOV     P0,#0FFH
           MOV     A,@R0                  ;得扫描码
           MOV     P3,A
           MOV     R6,#0FFH
     LK4N: DJNZ     R6,LK4N
           MOV     A,P0                   ;读列线
           CPL     A
           JZ      NEXT1N                 ;无键,转下一行
           ADD     A,@R0                  ;有键,确定键码 =列取反+行
           MOV     60H,A
           MOV     R1,#44H                ;键码首地址送R1,查键值
           MOV     R3,#00H                ;键值置初值
     CMPN: CLR     C
           MOV     A,60H
           SUBB    A,@R1
           JZ      LK5N                   ;查到键码
           INC     R1                      ;不是继续查找
           INC     R3
           AJMP    CMPN
     LK5N: LCALL   DISP1                   ;判键是否释放
           ACALL   KS2
           JNZ     LK5N
           MOV     A,R3                    ;键值放A中
           RET


   NEXT1N: INC    R0                       ;修改行扫描码
           CJNE   R0,#44H,LK3N
           AJMP   KEYSCAN1
      KS2: MOV    P0,#0FFH                 ;列全1,送行全0
           MOV    P3,#0F0H
           MOV    R6,#05H
     DS6N: DJNZ   R6,DS6N
           MOV    A,P0                     ;读列值
           CPL    A
           RET

KEYSCAN2:  ACALL   KS3                                   ;调用是否有键闭合程序
           JNZ     LK1NN                                 ;有键按下转LK1处理
     NINN: MOV     R6,#06h
     YSNN: ACALL   DISP1
           DJNZ    R6,YSNN
           AJMP    KEYSCAN2
    LK1NN: MOV     R6,#12                                ;等待12MS
    YS1NN: ACALL   DISP1
           DJNZ    R6,YS1NN
           ACALL   KS3                                   ;确有键闭合吗?
           JNZ     LK2NN                                 ;有,确定键值
           AJMP    NINN                                  ;没有继续扫描
    LK2NN: MOV     R0,#40H                               ;设R0为键扫描码入口地址
    LK3NN: MOV     P3,#0FFH
           MOV     P0,#0FFH
           MOV     A,@R0                                 ;得扫描码
           MOV     P3,A
           MOV     R6,#0FFH
    LK4NN: DJNZ     R6,LK4NN
           MOV     A,P0                                  ;读列线
           CPL     A
           JZ      NEXT1NN                               ;无键,转下一行
           ADD     A,@R0                                 ;有键,确定键码 =列取反+行
           MOV     60H,A
           MOV     R1,#44H                               ;键码首地址送R1,查键值
           MOV     R3,#00H                               ;键值置初值
    CMPNN: CLR     C
           MOV     A,60H
           SUBB    A,@R1
           JZ      LK5NN                                 ;查到键码
           INC     R1                                    ;不是继续查找
           INC     R3
           AJMP    CMPNN
    LK5NN: ACALL   DISP1                                  ;判键是否释放
           ACALL   KS3
           JNZ     LK5NN
           MOV     A,R3                                  ;键值放A中
           RET

  NEXT1NN: INC    R0                                     ;修改行扫描码
           CJNE   R0,#44H,LK3NN
           AJMP   KEYSCAN2
      KS3: MOV    P0,#0FFH                               ;列全1,送行全0
           MOV    P3,#0F0H
           MOV    R6,#05H
    DS6NN: DJNZ   R6,DS6NN
           MOV    A,P0                                   ;读列值
           CPL    A
           RET

JI_SUAN:
         MOV    B,#2                       ;假设每圈走2厘米
         MOV    A,R5
         MUL    AB
 ONTO:   MOV    6BH,A                      ;高度放在6BH中
         MOV    B,#100
         DIV    AB
         MOV    64H,A                      ;十位赋予63H
         MOV    A,B
         MOV    B,#10
         DIV    AB
         MOV    63H,A                      ;个位赋予62H
         MOV    A,B
         MOV    62H,A                      ;十分位赋予61H
         MOV    61H,#00H
         RET

JI_SUAN1:
         MOV    B,#2                       ;假设每圈走2厘米
         MOV    A,R5
         MUL    AB
         ADD    A,70H
         AJMP   ONTO

JI_SUAN2:
         MOV    B,#2                       ;假设每圈走2厘米
         MOV    A,R5
         MUL    AB
         MOV    B,A
         MOV    A,71H
         SUBB   A,B
         AJMP   ONTO
         END


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -