📄 dcmauto.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 + -