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

📄 mainpro.asm

📁 程序控制步进电机正反转加减速
💻 ASM
字号:
;步进电机控制系统,控制二相步进电机正反转0—999任意角度,八级调速,
;可连续转动,停止,键盘输入,LCD显示,L298驱动。
;                       BY TONVERHO 
;					    2006/12

E  EQU  P3.5
RW  EQU  P3.6
RS  EQU  P3.7
KEY_PRESS  EQU  00H
STOP_FLAG  EQU  01H
REV_FOR  EQU  02H
CHG_PRESS  EQU  03H
KEY_CNT  EQU  21H
FIR  EQU  22H
SED  EQU  23H
THR  EQU  24H
TEM  EQU  25H
STEPCNTH  EQU  26H
STEPCNTL  EQU  27H
KEYCODE  EQU  28H
CURSTEP  EQU  29H
TIME  EQU  2AH
TESTH  EQU  2BH
TESTL  EQU  2CH
CNTH  EQU  2DH
CNTL  EQU  2EH
RATE  EQU  2FH
LEAST  DATA  9
STOPVAL  DATA  0C0H
STEPNUM  DATA  8
FIRSTEP  DATA  0D1H
INITIME  DATA  224



ORG  0000H
LJMP  MAIN
ORG  0003H
LJMP  KEY_PAD
ORG  0030H



MAIN:  MOV  SP,#35H
       CLR  KEY_PRESS
       CLR  CHG_PRESS
       SETB  REV_FOR
       SETB  STOP_FLAG
       MOV  TIME,#INITIME
       MOV  KEYCODE,#00H
       MOV  KEY_CNT,#00H
       MOV  CURSTEP,#00H
       MOV  CNTH,#00H
       MOV  CNTL,#00H
       MOV  TIME,#128
       MOV  RATE,#31H
       SETB  EX0
       SETB  IT0
       SETB  EA
       MOV  P0,#STOPVAL
       MOV  P2,#0FFH
       LCALL  INI_LCD
       MOV P1,#80H
       LCALL  ENABLE_LCD
       MOV DPTR,#ANG_TAB
       LCALL  WRITE_LCD
       MOV P1,#88H
       LCALL  ENABLE_LCD
       MOV DPTR,#TRU_TAB
       LCALL  WRITE_LCD
       MOV P1,#90H
       LCALL  ENABLE_LCD
       MOV DPTR,#STA_TAB
       LCALL  WRITE_LCD
       MOV P1,#8EH
       LCALL  ENABLE_LCD
       MOV DPTR,#DOC_TAB
       LCALL  WRITE_LCD
       MOV P1,#98H
       LCALL  ENABLE_LCD
       MOV DPTR,#SPD_TAB
       LCALL  WRITE_LCD
       MOV P1,#9CH
       LCALL  ENABLE_LCD
       MOV  A,#31H
       LCALL  WRITE
     


LOOP:  JNB  KEY_PRESS,$
       CLR  KEY_PRESS
       MOV  DPTR,#FUN_TAB
       MOV  A,KEYCODE
       MOV  B,#6
       MUL  AB
       JMP  @A+DPTR


FUN_TAB:
         LCALL IS_NUMBER
         LJMP  LOOP
         LCALL IS_NUMBER
         LJMP  LOOP
         LCALL IS_NUMBER
         LJMP  LOOP
         LCALL IS_NUMBER
         LJMP  LOOP
         LCALL IS_NUMBER
         LJMP  LOOP
         LCALL IS_NUMBER
         LJMP  LOOP
         LCALL IS_NUMBER
         LJMP  LOOP
         LCALL IS_NUMBER
         LJMP  LOOP
         LCALL IS_NUMBER
         LJMP  LOOP
         LCALL IS_NUMBER
         LJMP  LOOP
         LCALL  FORWARD
         LJMP  LOOP
         LCALL  REVERSE
         LJMP  LOOP
         LCALL  KEEP_RUN
         LJMP  LOOP
         LCALL  STOP_RUN
         LJMP  LOOP
         LCALL  UNDO
         LJMP  LOOP
         LCALL  SPEED
         LJMP  LOOP


IS_NUMBER:
          INC  KEY_CNT
          MOV  A,#3
          CLR  C
          SUBB  A,KEY_CNT
          JNC  LESS
          MOV  KEY_CNT,#00H
          MOV P1,#84H
          LCALL  ENABLE_LCD
          MOV  A,#20H
          LCALL  WRITE
          LCALL  WRITE
          LCALL  WRITE
          RET
LESS:     MOV  A,#1
          CJNE  A,KEY_CNT,NOT_ONE
          MOV  FIR,KEYCODE
          MOV  SED,#00H
          MOV  THR,#00H
          MOV  DPTR,#NUM_TAB
          MOV  A,KEYCODE
          MOV P1,#84H
          LCALL  ENABLE_LCD
          MOVC  A,@A+DPTR
          LCALL  WRITE
          RET

NOT_ONE:  MOV  A,#2
          CJNE  A,KEY_CNT,NOT_TWO
          MOV  SED,FIR
          MOV  FIR,KEYCODE
          MOV  THR,#00H
          MOV  DPTR,#NUM_TAB
          MOV  A,KEYCODE
          MOV P1,#85H
          LCALL  ENABLE_LCD
          MOVC  A,@A+DPTR
          LCALL  WRITE
          RET

NOT_TWO:  MOV  THR,KEYCODE
          MOV  DPTR,#NUM_TAB
          MOV  THR,SED
          MOV  SED,FIR
          MOV  FIR,KEYCODE
          MOV  A,KEYCODE
          MOV P1,#86H
          LCALL  ENABLE_LCD
          MOVC  A,@A+DPTR
          LCALL  WRITE
          RET



KEY_PAD:
         CLR  EA
         PUSH  ACC
         MOV A,P2
         ANL A,#0FH
         MOV KEYCODE,A
         SETB  KEY_PRESS
         CJNE  A,#13,NEXT1
         SETB  STOP_FLAG
         AJMP  KEY_OUT
NEXT1:   CJNE  A,#15,KEY_OUT
         LCALL  SPEED
KEY_OUT: POP  ACC
         SETB  EA
         RETI



UNDO:
         MOV  A,#1
         CJNE  A,KEY_CNT,UN_SED
         DEC  KEY_CNT
         MOV  FIR,#00H
         MOV  SED,#00H
         MOV  THR,#00H
         MOV P1,#84H
         LCALL  ENABLE_LCD
         MOV  A,#20H
         LCALL  WRITE
         RET

UN_SED:  MOV  A,#2
         CJNE  A,KEY_CNT,UN_THR
         DEC  KEY_CNT
         MOV  FIR,SED
         MOV  SED,#00H
         MOV  THR,#00H
         MOV P1,#85H
         LCALL  ENABLE_LCD
         MOV  A,#20H
         LCALL  WRITE
         RET

UN_THR:  MOV  A,#3
         CJNE  A,KEY_CNT,OTHER
         MOV  FIR,SED
         MOV  SED,THR
         MOV  THR,#00H
         DEC  KEY_CNT
         MOV P1,#86H
         LCALL  ENABLE_LCD
         MOV  A,#20H
         LCALL  WRITE
OTHER:   RET




ENTER:
          MOV  A,SED
          MOV  B,#10
          MUL  AB
          ADD  A,FIR
          MOV  TEM,A
          MOV  A,THR
          MOV  B,#100
          MUL  AB
          CLR  C
          ADDC  A,TEM
          MOV  TEM,A
          MOV  A,B
          ADDC  A,#00H
          MOV  R2,A
          MOV  R3,TEM
          MOV  R6,#00H
          MOV  R7,#10
          LCALL  MULD
          MOV  R3,#00H
          MOV  R7,#LEAST
          LCALL  DV31
          MOV  STEPCNTH,R4
          MOV  STEPCNTL,R5
          MOV  KEY_CNT,#00H
          
          RET


INI_LCD:  MOV P1,#01H
          LCALL  ENABLE_LCD
          MOV P1,#38H
          LCALL  ENABLE_LCD
          MOV P1,#0CH
          LCALL  ENABLE_LCD
          MOV P1,#06H
          LCALL  ENABLE_LCD
          RET


WRITE_LCD:  MOV R4,#00H
AGAIN:      MOV A,R4
            MOVC A,@A+DPTR
            LCALL WRITE
            INC R4
            MOV A,R4
            MOVC A,@A+DPTR
            CJNE A,#0FFH,AGAIN
            RET

WRITE:   MOV P1,A
         SETB RS
         CLR RW
         CLR E
         LCALL DELAY_LCD
         SETB E
         RET



ENABLE_LCD:  CLR RS
             CLR RW
             CLR E
             LCALL DELAY_LCD
             SETB E
             RET

READ:       SETB  RS
            SETB  RW
            SETB  E
            LCALL  DELAY_LCD
            MOV  A,P1
            RET

DELAY_LCD:  MOV R7,#10
D1:         MOV R6,#50
D2:         DJNZ R6,D2
            DJNZ R7,D1
            RET




DELAY:
           MOV R7,TIME
DEL1:      MOV R6,#4
DEL2:      MOV R5,#246
           DJNZ R5,$
           DJNZ R6,DEL2
           DJNZ R7,DEL1
           RET



SPEED:    PUSH  ACC
          PUSH  DPH
          PUSH  DPL
          CLR  KEY_PRESS
          MOV  A,TIME
          CLR  C
          RR  A
          MOV  TIME,A
          INC  RATE
          MOV  A,RATE
          CJNE  A,#39H,NOT_NINE
          MOV  RATE,#31H
NOT_NINE: 
          MOV  P1,#9CH
          LCALL  ENABLE_LCD
          MOV  A,RATE
          LCALL  WRITE
          POP  DPL
          POP  DPH  
          POP  ACC
          RET

FORWARD:
           LCALL  ENTER
           MOV  A,STEPCNTL
           CJNE  A,#00H,FOR1
           MOV  A,STEPCNTH
           CJNE  A,#00H,FOR1
           LJMP  FR_OUT

FOR1:      
           CLR  STOP_FLAG
           MOV  P1,#94H
           LCALL  ENABLE_LCD
           MOV  DPTR,#FOR_TAB
           LCALL  WRITE_LCD
           MOV  P1,#97H
           LCALL  ENABLE_LCD
           MOV  A,#20H
           LCALL  WRITE
           MOV R0,#00H
		   
FR_GOON:   MOV  P1,#8BH
           LCALL  ENABLE_LCD
           MOV  DPTR,#STEP_FOR
           
FR_NEXT:   MOV  A,R0
           MOVC  A,@A+DPTR
           MOV  P0,A
           INC  R0
           MOV  A,R0
           CJNE  A,#STEPNUM,FR_NOT
           MOV  R0,#00H
FR_NOT:    LCALL  DELAY
           
           JB  STOP_FLAG,FR_OUT
           DEC  STEPCNTL
           LCALL  WINC
           MOV  A,STEPCNTL
           CJNE  A,#00H,FR_GOON
           
           MOV  A,STEPCNTH
           CJNE  A,#00H,FOR2
           LJMP  FR_OUT
FOR2:      DEC  STEPCNTH
           LJMP  FR_GOON
FR_OUT:    MOV  STEPCNTH,#00H
           MOV  STEPCNTL,#00H
           MOV  FIR,#00H
           MOV  SED,#00H
           MOV  THR,#00H
           MOV  CNTH,#00H
           MOV  CNTL,#00H
           LCALL  CLEARLCD
		   MOV  P1,#94H
           LCALL  ENABLE_LCD
           MOV  DPTR,#STOP_TAB
           LCALL  WRITE_LCD
           RET



REVERSE:
            LCALL  ENTER
            MOV  A,STEPCNTL
            CJNE  A,#00H,RE1
            MOV  A,STEPCNTH
            CJNE  A,#00H,RE1
            LJMP  REV_OUT

RE1:        
            CLR  STOP_FLAG
            MOV  P1,#94H
            LCALL  ENABLE_LCD
            MOV  DPTR,#REV_TAB
            LCALL  WRITE_LCD
            MOV  P1,#97H
            LCALL  ENABLE_LCD
            MOV  A,#20H
            LCALL  WRITE
			
            MOV  R0,#00H

REV_GOON:   
            MOV  P1,#8BH
            LCALL  ENABLE_LCD
            MOV  DPTR,#STEP_REV
            
REV_NEXT:   MOV  A,R0
            MOVC  A,@A+DPTR
            MOV  P0,A
            INC  R0
            MOV  A,R0
            CJNE  A,#STEPNUM,REV_NOT
            MOV  R0,#00H
REV_NOT:    LCALL  DELAY
           	
            JB  STOP_FLAG,REV_OUT
            DEC  STEPCNTL
           
            LCALL  WINC
            MOV  A,STEPCNTL
            CJNE  A,#00H,REV_GOON
            MOV  A,STEPCNTH
            CJNE  A,#00H,RE2
            LJMP  REV_OUT
RE2:        DEC  STEPCNTH
            LJMP  REV_GOON
REV_OUT:    MOV  STEPCNTH,#00H
            MOV  STEPCNTL,#00H
            MOV  FIR,#00H
            MOV  SED,#00H
            MOV  THR,#00H
            MOV  CNTH,#00H
            MOV  CNTL,#00H
            LCALL  CLEARLCD
			MOV  P1,#94H
            LCALL  ENABLE_LCD
            MOV  DPTR,#STOP_TAB
            LCALL  WRITE_LCD
            RET

 
KEEP_RUN:   
            CLR  STOP_FLAG
            MOV  P1,#94H
            LCALL  ENABLE_LCD
            MOV  DPTR,#RUN_TAB
            LCALL  WRITE_LCD
            MOV  P1,#97H
            LCALL  ENABLE_LCD
            MOV  A,#20H
            LCALL  WRITE
            CPL  REV_FOR
            JB  REV_FOR,CHG_FOR
            MOV  DPTR,#STEP_REV
            AJMP  KEP_GOON
CHG_FOR:    MOV  DPTR,#STEP_FOR
            AJMP  KEP_GOON

KEP_GOON:   MOV  R1,#STEPNUM
           
            MOV R0,#00H
KEP_NEXT:   MOV  A,R0
            MOVC  A,@A+DPTR
            MOV  P0,A
            INC  R0
            LCALL  DELAY
            JB  STOP_FLAG,KEP_OUT
            DJNZ  R1,KEP_NEXT
            LJMP  KEP_GOON
KEP_OUT:    RET

STOP_RUN:
           SETB  STOP_FLAG
           MOV  P0,#STOPVAL
           LCALL  DELAY
           MOV  P0,#FIRSTEP
           MOV  P1,#94H
           LCALL  ENABLE_LCD
           MOV  DPTR,#STOP_TAB
           LCALL  WRITE_LCD
           MOV  P1,#97H
           LCALL  ENABLE_LCD
           MOV  A,#20H
           LCALL  WRITE
           MOV  STEPCNTH,#00H
           MOV  STEPCNTL,#00H
           MOV  FIR,#00H
           MOV  SED,#00H
           MOV  THR,#00H
           MOV  CNTH,#00H
           MOV  CNTL,#00H
           LCALL  CLEARLCD
           RET


MULD:	
     MOV	A,R3
	 MOV	B,R7
     MUL	AB
	MOV	R4,B
	MOV	R5,A
	MOV	A,R3
	MOV	B,R6
	MUL	AB
	ADD	A,R4
	MOV	R4,A
	CLR	A
	ADDC	A,B
	MOV	R3,A
	MOV	A,R2
	MOV	B,R7
	MUL	AB
	ADD	A,R4
	MOV	R4,A
	MOV	A,R3
	ADDC	A,B
	MOV	R3,A
	CLR	A
	RLC	A
	XCH	A,R2
	MOV	B,R6
	MUL	AB
	ADD	A,R3
	MOV	R3,A
	MOV	A,R2
	ADDC	A,B
	MOV	R2,A
	RET


DV31:	CLR	C
	MOV	A,R3
	SUBB	A,R7
	JC	DV30
	SETB	OV
	RET
DV30:	MOV	R2,#10H
DM23:	CLR	C
	MOV	A,R5
	RLC	A
	MOV	R5,A
	MOV	A,R4
	RLC	A
	MOV	R4,A
	MOV	A,R3
	RLC	A
	MOV	R3,A
	MOV	F0,C
	CLR	C
	SUBB	A,R7
	ANL	C,/F0
	JC	DM24
	MOV	R3,A
	INC	R5
DM24:	DJNZ	R2,DM23
	MOV	A,R3
	ADD	A,R3
	JC	DM25
	SUBB	A,R7
	JC	DM26
DM25:	INC	R5
	MOV	A,R5
	JNZ	DM26
        INC	R4
DM26:	CLR	OV
	RET




HB2:	CLR	A
	MOV	R3,A
	MOV	R4,A
	MOV	R5,A
	MOV	R2,#10H
HB3:	MOV	A,R7
	RLC	A
	MOV	R7,A
	MOV	A,R6
	RLC	A
	MOV	R6,A
	MOV	A,R5
	ADDC	A,R5
	DA	A
	MOV	R5,A
	MOV	A,R4
	ADDC	A,R4
	DA	A
	MOV	R4,A
	MOV	A,R3
	ADDC	A,R3
	MOV	R3,A
	DJNZ	R2,HB3
        RET

CLEARLCD:
             MOV  P1,#84H
             LCALL  ENABLE_LCD
             MOV  A,#20H
             LCALL  WRITE
             LCALL  WRITE
             LCALL  WRITE
             RET


DISBCD:     
            PUSH  DPH
            PUSH  DPL
			MOV  P1,#8BH
            LCALL  ENABLE_LCD
            MOV  R6,#00H
            MOV  R7,#9
            LCALL  MULD
            MOV  A,R4
            MOV  R6,A
            MOV  A,R5
            MOV  R7,A
            LCALL  HB2
            MOV  TESTH,R4
            MOV  TESTL,R5  
            MOV  DPTR,#NUM_TAB
            MOV  A,R4
            ANL  A,#0F0H
            SWAP  A            
            MOVC  A,@A+DPTR
            LCALL  WRITE
            MOV  A,R4
            ANL  A,#0FH
            MOVC  A,@A+DPTR
            LCALL  WRITE
            MOV  A,R5
            ANL  A,#0F0H
            SWAP  A
            MOVC  A,@A+DPTR
            LCALL  WRITE
            MOV  P1,#8FH
            LCALL  ENABLE_LCD
            MOV  A,R5
            ANL  A,#0FH
            MOVC  A,@A+DPTR
            LCALL  WRITE
            POP  DPL
            POP  DPH
            RET


WINC:         CLR  C
              MOV  A,CNTL
              ADDC  A,#1
              MOV  CNTL,A
              MOV  A,#00H
              ADDC  A,CNTH
              MOV  CNTH,A
              MOV  R2,CNTH
              MOV  R3,CNTL
              LCALL  DISBCD
              RET  



FOR_TAB: DB 46H,4FH,57H,0FFH

REV_TAB: DB 52H,45H,56H,0FFH

RUN_TAB: DB 52H,55H,4EH,0FFH

STOP_TAB: DB 53H,54H,50H,0FFH

NUM_TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H

ANG_TAB: DB 41H,4EH,47H,3AH,0FFH

SPD_TAB: DB 53H,50H,44H,3AH,0FFH

STA_TAB: DB 53H,54H,41H,3AH,0FFH

TRU_TAB: DB 54H,52H,3AH,0FFH

DOC_TAB: DB 2EH,0FFH

STEP_FOR: DB 0F5H,0E4H,0F6H,0D2H,0FAH,0E8H,0F9H,0D1H

STEP_REV: DB 0F9H,0E8H,0FAH,0D2H,0F6H,0E4H,0F5H,0D1H

END

⌨️ 快捷键说明

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