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

📄 dcmauto.asm

📁 直流电机控制
💻 ASM
字号:
;***********************************************************************
;  直流电机速度控制     预设速度值 动态调速
;  30H\31H : 十六位计数器
;  35H\36H : 十六位速度设定值寄存器
;  32H : T0中断次数 
;  34h : 延时寄存器 
;  3EH : 低电平延时

;***********************************************************************

RS              BIT     P3.4
R_W             BIT     P3.2
ENABLE          BIT     P3.3
DB0_DB7         EQU     P1	        
ENA             BIT     00H


    ORG   0000H
    LJMP  MAIN
    ORG   000BH
    LJMP  PTF0
    ORG   0050H

MAIN:
    MOV      SP,#5FH
    CLR      P2.7
    SETB     ENA
    MOV      TH0,#4CH
    MOV      TL0,#0
    MOV      TH1,#0
    MOV      TL1,#0
    MOV      TMOD,#51H
    SETB     EA
    SETB     ET0   
    SETB     TR0
    SETB     TR1
    MOV      30H,#0 
    MOV      31H,#0
    MOV      32H,#30
    MOV      34H,#20
    MOV      35H,#0
    MOV      36H,#0
    MOV      3EH,#0CH
    mov      50h,#0 
    mov      51h,#0
    mov      52h,#0
    mov      53h,#0
    mov      54h,#42h
    mov      55h,#0ffh
    mov      56h,#3dh
    mov      57h,#39h
    mov      58h,#3eh  
    LCALL    Initial
    LCALL    CLS
    MOV      A,#10000000B            
    LCALL    Write_instruction
    MOV      DPTR,#LINE1
    LCALL    PR_STRING
    MOV      A,#11000000B
    LCALL    Write_instruction
    MOV      DPTR,#LINE2
    LCALL    PR_STRING
    
LINE1: DB 'SET SP:',00H
LINE2: DB 'REL SP:',00H

	 
SET:
    MOV      A,35H
    MOV      30H,A
    MOV      A,36H
    MOV      31H,A
    LCALL    TRAN
    MOV      A,#10000111B            
    LCALL    Write_instruction
    LCALL    DIS
    JNB      P0.0,GOHERE    ;  P0.0按下,开始
    JNB      P0.7,GO_ADDSP  ;  P0.7, 设定值加10 R/MIN
    SJMP     K1
GO_ADDSP:
    LCALL    ADDSP    
K1: JNB      P0.6,GO_DECSP  ;  P0.6, 设定值减10 R/MIN
    SJMP     K2
GO_DECSP:
    LCALL    DECSP    
K2: AJMP     SET

ADDSP:
    LCALL  DELAY ;按p0.0的消除抖动
    JNB    P0.7,$ ; p0.0放开否?
    LCALL  DELAY ;放开消除抖动
    MOV      A,35H
    ADD      A,#1
    MOV      35H,A
    MOV      A,#0
    ADDC     A,36H
    MOV      36H,A
    RET
DECSP:
    LCALL  DELAY ;按p0.0的消除抖动
    JNB    P0.6,$ ; p0.0放开否?
    LCALL  DELAY ;放开消除抖动
    MOV      A,35H
    SUBB     A,#1
    MOV      35H,A
    MOV      A,36H
    SUBB     A,#0H
    MOV      36H,A
    RET


GOHERE:
     LCALL  DELAY ;按p0.0的消除抖动
     JNB    P0.0,$ ; p0.0放开否?
     LCALL  DELAY ;放开消除抖动
     MOV    30H,#0 
     MOV    31H,#0  ; 十六位计数器清零

HERE:
;    JNB    ENA,KEY
    CLR    P2.4
    LCALL  DELAYPOS
    MOV    A,#11000111B
    LCALL  Write_instruction
    LCALL  DIS
    LCALL  AUTOADJ
BACK:    
    CPL    P2.4
    LCALL  DELAYNEG
	
;KEY:
;     JNB    P0.7,GOSP1
;	 LJMP   A1
;GOSP1:
;	 LCALL  SP1
;A1:
;	 JNB    P0.6,GOSP2
;	 LJMP   A2
;GOSP2:
;	 LCALL  SP2
;A2:
;	 JNB    P0.5,GOSP3
;	 LJMP   A3
;GOSP3:
;	 LCALL  SP3
;A3:
     SJMP   HERE

DELAYPOS:
     MOV    R7,#1
D1:
     MOV    R6,#0FFH
	 DJNZ   R6,$
	 DJNZ   R7,D1
     RET

DELAYNEG:
     MOV    R7,3EH
D2:
     MOV    R6,#0FFH
	 DJNZ   R6,$
	 DJNZ   R7,D2
     RET
     
AUTOADJ:
     MOV    A,31H
     SUBB   A,36H
     JC     GOSPUP
     SJMP   B1
GOSPUP:
     LCALL  SP_UP
B1:  CLR    C
     MOV    A,30H
     SUBB   A,35H
     JC     GOSPUP1
     SJMP   B2
GOSPUP1:
     LCALL  SP_UP
B2:  CLR    C
     LCALL  SP_DOWN
     RET
     
     
SP_UP:
     LCALL  DELAY
     DEC    3EH
     RET
SP_DOWN:
     LCALL  DELAY
     INC    3EH
     RET


;SP1:
;    LCALL  DELAY ;按p0.7的消除抖动
;     JNB    P0.7,$ ; p0.7放开否?
;     LCALL  DELAY ;放开消除抖动
;     SETB   ENA
;     DEC    3EH
;     RET

;SP2:
;     LCALL  DELAY ;按p0.6的消除抖动
;     JNB    P0.6,$ ; p0.6放开否?
;     LCALL  DELAY ;放开消除抖动
;     SETB   ENA
;     INC    3EH
;     RET

;SP3:
;     LCALL  DELAY ;按p0.5的消除抖动
;     JNB    P0.5,$ ; p0.5放开否?
;     LCALL  DELAY ;放开消除抖动
;     CLR    ENA
; 	  MOV    3EH,#0
;     RET
    

DELAY:
    MOV    R5,#3
D3:
    MOV    R4,#248
    DJNZ   R4,$
    DJNZ   R5,D3
    RET

ptf0: push   acc
      orl    tl0,#0b0h
      mov    th0,#3ch
      djnz   32h,ptf0r
      mov    32h,#30
      mov    30h,tl1
      mov    31h,th1
      clr    tr1
      clr    tr0
      clr    it0
      clr    ex0
      clr    et0
      clr    ea
      lcall  TRAN
;      LCALL  DIS
      mov    th1,#0
      mov    tl1,#0
;      mov    30h,#0
;      mov    31h,#0
      setb   pt0
      SETB   EA
	  SETB   EX0
	  setb   et0
	  SETB   IT0
	  setb   tr1
	  setb   tr0
	  
ptf0r: pop   acc
       reti 

TRAN:  mov   r3,30h
       mov   r2,31h
       mov   a,r3
       mov   b,#10
       mul   ab
       mov   r3,a
       mov   33h,b
       mov   a,r2
       mov   b,#10
       mul   ab
       mov   r2,a
       mov   a,33h
       add   a,r2
       mov   r2,a
       clr   a
       mov   40h,a
       mov   41h,a
       mov   42h,a
       mov   43h,#16
loop1: 
       clr   c
       mov   a,r3
       rlc   a
       mov   r3,a
       mov   a,r2
       rlc   a
       mov   r2,a
       mov   a,42h
       addc  a,42h
       da    a
       mov   42h,a
       mov   a,41h
       addc  a,41h
       da    a
       mov   41h,a
       mov   a,40h
       addc  a,40h
       da    a
       mov   40h,a
       djnz  43h,loop1
       mov   a,41h
       anl   a,#0fh
       mov   51h,a
       mov   a,41h
       swap  a
       anl   a,#0fh
       mov   50h,a
       mov   a,42h
       anl   a,#0fh
       mov   53h,a
       mov   a,42h
       swap  a
       anl   a,#0fh
       mov   52h,a
       ret
DIS:            push    acc
                mov     r1,#50h
;                LCALL   Initial   
                MOV     r0,#11000000B
loop:
;                mov     a,r0
;                LCALL   Write_instruction
                MOV     A,@r1
                add     a,#30h                  
                LCALL   WriteLCDData
                inc     r1
                inc     r0
                cjne    r0,#11001001b,loop
                pop     acc
                ret
                      
;*****************************************************************
Initial:
                MOV      A,#00111000B
                LCALL    Write_instruction
                MOV      A,#00001110B
                LCALL    Write_instruction
                MOV      A,#00000110B
                LCALL    Write_instruction
                RET

;*****************************************************************
CheckBusy:
                PUSH    ACC
CheckBusyLoop:
	     	    CLR	    ENABLE
		        SETB	R_W
		        CLR	    RS
                SETB    ENABLE
                MOV     A,DB0_DB7
                CLR     ENABLE
                JB      ACC.7,CheckBusyLoop
                POP     ACC
                LCALL   DELAY
                RET
;*****************************************************************
Write_instruction:
                LCALL   CheckBusy
		        CLR	    ENABLE
		        CLR	    R_W
		        CLR	    RS
                SETB    ENABLE
                MOV     DB0_DB7,A
                CLR     ENABLE
                RET
;*****************************************************************
WriteLCDData:
                LCALL   CheckBusy
		        CLR	    ENABLE
		        CLR	    R_W
		        SETB	RS
                SETB    ENABLE
                MOV     DB0_DB7,A
                CLR     ENABLE
                RET
;*****************************************************************
CLS:
		        MOV	    A,#01H
		        LCALL	Write_instruction
		        RET                

PR_STRING:
                PUSH    ACC
PR_LOOP:
                CLR     A
                MOVC    A,@A+DPTR
                JZ      END_PR
                LCALL   WriteLCDData
                INC     DPTR
                JMP     PR_LOOP
END_PR:
                POP     ACC
                RET      
        
       END		  

⌨️ 快捷键说明

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