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

📄 步进电机总程序.asm

📁 用51驱动LED
💻 ASM
📖 第 1 页 / 共 2 页
字号:
          ORG   0000H
          AJMP  MAIN

          ORG    0100H
    MAIN: MOV    P2,#00H
          MOV    40H,#0EH	         ;键行扫描码,分别从第一行到第四行
          MOV    41H,#0DH
	  MOV    42H,#0BH
	  MOV    43H,#07H

	  MOV    44H,#1EH		 ;0的键值码
	  MOV    45H,#2EH		 ;1的键值码
	  MOV    46H,#4EH		 ;2的键值码
	  MOV    47H,#8EH
	  MOV    48H,#1DH
	  MOV    49H,#2DH
	  MOV    4AH,#4DH
	  MOV    4BH,#8DH
	  MOV    4CH,#1BH
	  MOV    4DH,#2BH		 ;9的键值码
	  MOV    4EH,#4BH		 ;A的键值码
	  MOV    4FH,#8BH		 ;B的键值码
	  MOV    50H,#17H
	  MOV    51H,#27H
	  MOV    52H,#47H
	  MOV    53H,#87H		 ;F的键值码
	  MOV    60H,#00H                ;设置一个单元用来装从键盘输入的键码

          MOV    66H,#0AH                ;上升标志
          MOV    67H,#0BH                ;下降标志
          MOV    68H,#0CH                ;升半旗标志
          MOV    6BH,#00H                ;旗的初始位置
          MOV    6CH,#0FH                ;降半旗标志

      ML: MOV     R0,#61H
      ML0:MOV     A,#00H		 ;显示缓冲区清0
	  MOV     @R0,A
          INC     R0
          CJNE    R0,#65H,ML0


      ML2:ACALL   DISP                   ;调用显示子程序
          ACALL   keyscan
          CJNE    A,66H,LOP1             ;是否是上升标志
          MOV     A,6BH
          CJNE    A,#180,LOOP1           ;是否是最高点,假定旗杆高为180厘米
          AJMP    ML2
   LOOP1: ACALL   SHANG_SHENG0           ;不是调用上升
          AJMP    ML

     LOP1:CJNE    A,67H,LOP2             ;是否是下降标志
          MOV     A,6BH
          CJNE    A,#0,LOOP2             ;是否是最底点
          AJMP    ML2
   LOOP2: ACALL   XIA_JIANG0             ;不是调用下降
          AJMP    ML

     LOP2:CJNE    A,68H,LOP3             ;是否是升半旗
          MOV     A,6BH
          CJNE    A,#180,LOOP3           ;是否是最高点
          AJMP    ML2
   LOOP3: ACALL   BAN_GAOT               ;不是调用升半旗
          AJMP    ML

     LOP3:CJNE    A,6CH,ML2              ;是否是降半旗
          MOV     A,6BH
          CJNE    A,#0,LOOP4             ;是否是最底点
          AJMP    ML2
   LOOP4: ACALL   BAN_GAOL               ;不是调用降半旗
          AJMP    ML


   ;显示子程序
DISP:
disp_number:

       MOV R0,#64H                     ;显示数码存放在61~64(BCD形式)
       MOV R4,#0F7H                    ;把显示位码取到R4
display_scan:
       MOV A,@R0
       MOV R2,A                        ;把显示数码取到R2

       ACALL display_a_bit
       ACALL delay

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

       DEC R0                           ;下一显示数码
       CJNE R0,#60H,display_scan
       ret



display_a_bit:
       MOV DPTR,#table
next:
       MOV A,R2
       MOVC A,@A+DPTR
       MOV p1,A                        ;取段码:TABLE+x

       MOV A,R4
       MOV p3,A                        ;输出位码

       RET
delay:
       MOV R7,#0FFH
       DJNZ R7,$
       RET                             ;延迟 2us*255+2us=512us


table:
       db  0c0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
       db  80H,90H,88H,83H,0C6H,0A1H,86H,8EH,8CH


keyscan:   ACALL   KS1                                   ;调用是否有键闭合程序
           JNZ     LK1                                   ;有键按下转LK1处理
       NI: mov     r6,#06h
       ys: ACALL   DISP
           djnz    r6,ys
           AJMP    KEYSCAN
      LK1: MOV     R6,#12                                ;等待12MS
      YS1: ACALL   DISP
           DJNZ    R6,YS1
           ACALL   KS1                                   ;确有键闭合吗?
           JNZ     LK2                                   ;有,确定键值
           AJMP    NI                                    ;没有继续扫描
      LK2: MOV     R0,#40H                               ;设R0为键扫描码入口地址
      LK3: MOV     P3,#0FFH
           MOV     P0,#0FFH
           MOV     A,@R0                                 ;得扫描码
           MOV     P3,A
           MOV     R6,#0FFH
      LK4: DJNZ     R6,LK4
           MOV     A,P0                                  ;读列线
           CPL     A
           JZ      NEXT1                                  ;无键,转下一行
           ADD     A,@R0                                 ;有键,确定键码 =列取反+行
           MOV     60H,A
           MOV     R1,#44H                               ;键码首地址送R1,查键值
           MOV     R3,#00H                               ;键值置初值
      CMP: CLR     C
           MOV     A,60H
           SUBB    A,@R1
           JZ      LK5                                   ;查到键码
           INC     R1                                    ;不是继续查找
           INC     R3
           AJMP    CMP
      LK5: ACALL   DISP                                  ;判键是否释放
           ACALL   KS1
           JNZ     LK5
           MOV     A,R3                                  ;键值放A中
           MOV    64H,63H                                ;显示缓冲区左移一位
           MOV    63H,62H
           MOV    62H,61H
           MOV    61H,A

           RET
    NEXT1: INC    R0                                     ;修改行扫描码
           CJNE   R0,#44H,LK3
           AJMP   KEYSCAN
      KS1: MOV    P0,#0FFH                               ;列全1,送行全0
           MOV    P3,#0F0H
           MOV    R6,#05H
      DS6: DJNZ   R6,DS6
           MOV    A,P0                                   ;读列值
           CPL    A
           RET
;============================================================================================================
;键盘连接图       P2.4        P2.5         P2.6          P2.7
;                  |           |             |             |
;   ____(升半旗)C__|_(暂停)__D_|___(继续)_E__|(降半旗)__F__|_________ P3.3
;                  |           |             |             |
;   ____________8__|_________9_|___(上升)_A__|__(下降)__B__|_________ P3.2
;                  |           |             |             |
;   ____________4__|_________5_|__________6__|__________7__|_________ P3.1
;                  |           |             |             |
;   ____________0__|_________1_|__________2__|__________3__|_________ P3.0
;


;============================================================================================================



;----------------------------正转--------------------------
SHANG_SHENG0:
         MOV    A,6BH
         CJNE   A,#90,GO_SHANG           ;在半旗状态下,可以按升半旗或升旗,使旗继续上升
         AJMP   BAN_GAOT
GO_SHANG:MOV    R5,#0
         ACALL  JI_SUAN
SHANG_0: MOV    R3,#240                   ;每走一圈的脉冲数
START0:  ACALL  DISP1
         MOV    R0,#00H
         MOV    P2,#80H                   ;上升的同时播放音乐
START1:
         MOV    A,R0
         MOV    DPTR,#TABLE0
         MOVC   A,@A+DPTR
         JZ     START0                    ;对 A 的判断,当 A = 0 时则转到 START

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

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

         MOV    A,6BH
         CJNE   A,#180,SHANG_0            ;是否升到最高点
         MOV    P2,#00H
         RET



;-----------------------------反转------------------------
XIA_JIANG0:
         MOV    A,6BH
         CJNE   A,#90,GO_XIA               ;在半旗状态下,可以按降半旗或降旗,使旗继续下降
         AJMP   BAN_GAOL
  GO_XIA:MOV    R5,#90                     ;假定每一圈为2厘米,则上升到180厘米所需的圈数为90.
         ACALL  JI_SUAN
   XIA_0:MOV    R3,#240
  START4:ACALL  DISP1
         MOV    P2,#00H                    ;下降的同时音乐停
         MOV    R0,#06H
  START5:
         MOV    A,R0
         MOV    DPTR,#TABLE0
         MOVC   A,@A+DPTR
         JZ     START4

         MOV    P2,A
         ACALL  DELAY0

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

         MOV    A,6BH
         CJNE   A,#0,XIA_0                 ;是否降到最底点
         MOV    P2,#00H
         RET
;------------------升半旗------------------
BAN_GAOT:
         MOV    R5,#0
         MOV    A,6BH
         MOV    70H,A
         CLR    C
         SUBB   A,#90
         JNC    DA_YU
         CLR    27H
         AJMP   SHANG_1
DA_YU:   SETB   27H
SHANG_1: MOV    R3,#240                   ;每走一圈的脉冲数
START2:  ACALL  DISP1
         MOV    R0,#00H
         MOV    P2,#80H                   ;上升的同时播放音乐
START3:
         ;MOV    A,R0
         ;PUSH   A
         ;ACALL  JI_SUAN1
         ;ACALL  DISP1
         ;POP    A

⌨️ 快捷键说明

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