📄 md166bv1.asm
字号:
CLR YFREE
_AUTO_EXIT: RET
;-------------------------------------------------------
_AUTO_PLUS: MOV STEP_MODEL,#01
CLR STEP_A_FLAG
CLR T0_HL_FLAG
SETB STEP_M_FLAG
MOV C,BD_END
JNC _PLUS_EXIT
_PLUS_LOP1: MOV C,MOTOR_BD
JNC _PLUS_LOP1
INC STEP_MODEL
_PLUS_LOP2: MOV C,MOTOR_MD
JNC _PLUS_LOP2
INC STEP_MODEL
_PLUS_LOP3: MOV C,MOTOR_FD
JNC _PLUS_LOP3
_PLUS_EXIT: CLR STEP_M_FLAG
MOV STEP_MODEL,#00
RET
;-------------------------------------------------------
_AUTO_MINUS: MOV STEP_MODEL,#01
CLR STEP_A_FLAG
CLR T0_HL_FLAG
SETB STEP_M_FLAG
_MINUS_LOP1: MOV C,MOTOR_MD
JNC _MINUS_LOP1
INC STEP_MODEL
_MINUS_LOP2: MOV C,MOTOR_BD
JNC _MINUS_LOP2
INC STEP_MODEL
_MINUS_LOP3: MOV C,BD_END
JNC _MINUS_LOP3
CLR STEP_M_FLAG
MOV STEP_MODEL,#00
RET
;-------------------------------------------------------
_SYSTEM_INIT: MOV SEL_BYTE,#01
MOV tick_clock,#00
MOV LSB_PERIOD,#LOW(65536-2000) ;1mS
MOV MSB_PERIOD,#HIGH(65536-2000)
MOV TL1,LSB_PERIOD
MOV TH1,MSB_PERIOD
ORL TMOD,#10H
SETB EA
SETB ET1
SETB TR1
WAIT 100
CLR OOE
RET
;-------------------------------------------------------
_STEP_INIT: MOV TH0,T0_TH
MOV TL0,T0_TL
ORL TMOD,#01H
SETB EA
SETB ET0
SETB TR0
RET
;-------------------------------------------------------
_MACH_INIT: MOV C,CLAMP_BD
JNC _MACH_FAIL
; MOV C,CLAMP_FD
; JC _MACH_FAIL
MOV C,BD_END
JC _MACH_END ;_MACH_MOVE
; MOV T0_TH,#HIGH(65536-20000) ;10mS
; MOV T0_TL,#LOW(65536-20000) ;RAD=1N/10S
; CLR STEP_DIRECT ;0-PLUS;1-MINUS
; MOV STEP_MODEL,#02 ;HIGH SPEED
; SETB STEP_M_FLAG
; MOV R7,#10
;_MACH_LOP1: WAIT 100 ;10*100*10mS=10S
; DJNZ R7,_MACH_LOP1
; CLR STEP_M_FLAG
; MOV STEP_MODEL,#00
; SETB XCW
; SETB YCW
; SETB XCCW
; SETB YCCW
; RET
_MACH_MOVE: MOV T0_TH,#HIGH(65536-20000) ;10mS
MOV T0_TL,#LOW(65536-20000) ;RAD=1N/10S
SETB STEP_DIRECT ;0-PLUS;1-MINUS
MOV STEP_MODEL,#02 ;HIGH SPEED
SETB STEP_M_FLAG
_MOVE_LOP1: MOV C,BD_END
JNC _MOVE_LOP1
CLR STEP_M_FLAG ;CLOSE STEP MOTOR
; SETB XCW
; SETB YCW
; SETB XCCW
; SETB YCCW
CLR XCW
CLR YCW
CLR XCCW
CLR YCCW
CLR XFREE
CLR YFREE
CLR STEP_DIRECT ;0-PLUS;1-MINUS
; SETB STEP_M_FLAG
; MOV R7,#10
;_MOVE_LOP2: WAIT 100 ;10*100*10mS=10S
; DJNZ R7,_MOVE_LOP2
; CLR STEP_M_FLAG
; MOV STEP_MODEL,#00
; SETB XCW
; SETB YCW
; SETB XCCW
; SETB YCCW
RET
_MACH_FAIL: CPL BUZZER
WAIT 50
JMP _MACH_FAIL
_MACH_END: RET
;=======================================================
STEP_ACCEL: ;01-ACCELERATE
PUSH ACC
JB STEP_A_FLAG,ACCEL_LOP1
MOV T0_TH,#HIGH(65536-59904);RAD(min)=2N/M
MOV T0_TL,#LOW (65536-59904)
MOV TH0,T0_TH
MOV TL0,T0_TL
SETB STEP_A_FLAG
ACCEL_LOP1: ;MOV C,STEP_DIRECT
JB STEP_DIRECT,ACCEL_LOP2
CLR YCCW
; SETB YCCW
CPL YCW
CLR XCCW
; SETB XCCW
CPL XCW
JMP ACCEL_LOP3
ACCEL_LOP2: CLR YCW
; SETB YCW
CPL YCCW
CLR XCW
; SETB XCW
CPL XCCW
ACCEL_LOP3: MOV A,T0_TH
XRL A,#HIGH(65536-1024);;RAD(max)=2N/S
JNZ ACCEL_LOP5
MOV A,T0_TL
XRL A,#LOW(65536-1024)
JZ ACCEL_LOP6
ACCEL_LOP5: MOV A,T0_TL
ADD A,#80H;1
MOV T0_TL,A
MOV A,T0_TH
ADDC A,#0
MOV T0_TH,A
ACCEL_LOP6:
ACCEL_END: POP ACC
RET
;-----------------------------------------------------
STEP_HIGH: ;02_HIGH SPEEP
PUSH ACC
;MOV C,STEP_DIRECT
JB STEP_DIRECT,HIGH_LOP1
; SETB YCCW
CPL YCW
; SETB XCCW
CPL XCW
JMP HIGH_LOP2
HIGH_LOP1:; SETB YCW
CPL YCCW
; SETB XCW
CPL XCCW
HIGH_LOP2:
HIGH_END: POP ACC
RET
;--------------------------------------------------
STEP_DECEL: ;03_DECELERATE
PUSH ACC
;MOV C,STEP_DIRECT
JB STEP_DIRECT,DECEL_LOP2
CLR YCCW
; SETB YCCW
CPL YCW
CLR XCCW
; SETB XCCW
CPL XCW
JMP DECEL_LOP3
DECEL_LOP2: CLR YCW
; SETB YCW
CPL YCCW
CLR XCW
; SETB XCW
CPL XCCW
DECEL_LOP3: MOV A,T0_TH
XRL A,#HIGH(65536-59904);;RAD(max)=2N/S
JNZ DECEL_LOP5
MOV A,T0_TL
XRL A,#LOW(65536-59904)
JZ DECEL_LOP6
DECEL_LOP5: MOV A,T0_TL
CLR C
SUBB A,#80H;1
MOV T0_TL,A
MOV A,T0_TH
SUBB A,#0
MOV T0_TH,A
DECEL_LOP6:
DECEL_END: POP ACC
RET
;--------------------------------------------------
STEP_LOW: ;04_LOW SPEED
PUSH ACC
JB STEP_L_FLAG,LOW_LOP1
MOV T0_TH,#HIGH(65536-20000);10mS;24MHZ
MOV T0_TL,#LOW (65536-20000)
MOV TH0,T0_TH
MOV TL0,T0_TL
CLR A
MOV WORK_COUNTER0,A
MOV WORK_COUNTER1,A
SETB STEP_L_FLAG
LOW_LOP1: MOV A,WORK_COUNTER0 ;CHANGE WORK_COUNTER TO BCD CODE
ADD A,#01
DA A
MOV WORK_COUNTER0,A
JNZ LOW_LOP2
MOV A,WORK_COUNTER1
ADD A,#01
DA A
MOV WORK_COUNTER1,A
LOW_LOP2: MOV A,STEP_L_COUNTER ;20000 X 0.5uS X 6 = 60mS
INC A ;RAD(LOW)=1N/M
MOV STEP_L_COUNTER,A
CJNE A,#06,LOW_END
MOV STEP_L_COUNTER,#00
JB STEP_DIRECT,LOW_LOP3
CLR YCCW
; SETB YCCW
CPL YCW
CLR XCCW
; SETB XCCW
CPL XCW
JMP LOW_LOP4
LOW_LOP3: CLR YCW
; SETB YCW
CPL YCCW
CLR XCW
; SETB XCW
CPL XCCW
LOW_LOP4:
LOW_END: POP ACC
RET
;-------------------------------------------------------
STEP_WAIT: ;05_STEP WAITING
MOV T0_TH,#00
MOV T0_TL,#00
CLR XCW
CLR YCW
CLR XCCW
CLR YCCW
; SETB XCW
; SETB YCW
; SETB XCCW
; SETB YCCW
INC WAIT_COUNTER0
MOV A,WAIT_COUNTER0
JNZ WAIT_LOP1
INC WAIT_COUNTER1
WAIT_LOP1: RET
;===================================================
ASTEP_ACCEL: ;01-ACCELERATE
PUSH ACC
JB STEP_A_FLAG,AACCEL_LOP1
MOV T0_TH,#HIGH(65536-59904);RAD(min)=2N/M
MOV T0_TL,#LOW (65536-59904)
MOV _T0_TH,#HIGH(59904);RAD(min)=2N/M
MOV _T0_TL,#LOW (59904)
MOV TH0,T0_TH
MOV TL0,T0_TL
SETB STEP_A_FLAG
AACCEL_LOP1: CPL T0_HL_FLAG
JB STEP_DIRECT,AACCEL_LOP2
; SETB YCCW
CLR YCCW
CPL YCW
; SETB XCCW
CLR XCCW
CPL XCW
JMP AACCEL_LOP3
AACCEL_LOP2: CLR YCW
; SETB YCW
CPL YCCW
CLR XCW
; SETB XCW
CPL XCCW
AACCEL_LOP3: JB T0_HL_FLAG,AACCEL_END
CALL TWO_DIV
CALL TWO_SUB
MOV A,_T0_TL ;400H(1024)
CLR C
SUBB A,#00
MOV A,_T0_TH
SUBB A,#4
JNC AACCEL_LOP4
MOV _T0_TH,#4
MOV _T0_TL,#00
AACCEL_LOP4: MOV A,_T0_TL
CPL A
ADD A,#1
MOV T0_TL,A
MOV A,_T0_TH
CPL A
ADDC A,#0
MOV T0_TH,A
AACCEL_END: POP ACC
RET
;-----------------------------------------------
ASTEP_DECEL: ;03_DECELERATE
PUSH ACC
CPL T0_HL_FLAG
JB STEP_DIRECT,ADECEL_LOP2
CLR YCCW
; SETB YCCW
CPL YCW
CLR XCCW
; SETB XCCW
CPL XCW
JMP ADECEL_LOP3
ADECEL_LOP2: CLR YCW
; SETB YCW
CPL YCCW
CLR XCW
; SETB XCW
CPL XCCW
ADECEL_LOP3: JB T0_HL_FLAG,ADECEL_END
CALL TWO_DIV
CALL TWO_ADD
MOV A,_T0_TL ;EA00H(59904)
CLR C
SUBB A,#00
MOV A,_T0_TH
SUBB A,#0EAH
JC ADECEL_LOP4
MOV _T0_TH,#0EAH
MOV _T0_TL,#00
ADECEL_LOP4: MOV A,_T0_TL
CPL A
ADD A,#1
MOV T0_TL,A
MOV A,_T0_TH
CPL A
ADDC A,#0
MOV T0_TH,A
ADECEL_END: POP ACC
RET
;--------------------------------------------------
TWO_DIV:
MOV A,#100 ;#25 ;#50 ;100=1%;50=2% ;25=4%
MOV R5,A
MOV R0,A
MOV B,A
MOV A,_T0_TL
MOV R7,A
MOV A,_T0_TH ;T0_TH&T0_TL*2%
MOV R6,A
DIV AB
MOV R6,A
MOV R5,B
MOV B,#08
DIV_LOOP: MOV A,R7
ADD A,R7
MOV R7,A
MOV A,R5
RLC A
MOV R5,A
JC DIV_LOP1
SUBB A,R0
JNC DIV_LOP2
JMP DIV_LOP3
DIV_LOP1: CLR C
SUBB A,R0
DIV_LOP2: MOV R5,A
INC R7
DIV_LOP3: DJNZ B,DIV_LOOP
RET
;-------------------------------------
TWO_ADD: MOV A,_T0_TL ;T0_TH-T0_TL*(1+2%)
ADD A,R7
MOV _T0_TL,A
MOV A,_T0_TH
ADDC A,R6
MOV _T0_TH,A
RET
;-------------------------------------
TWO_SUB: MOV A,_T0_TL ;T0_TH-T0_TL*(1-2%)
CLR C
SUBB A,R7
MOV _T0_TL,A
MOV A,_T0_TH
SUBB A,R6
MOV _T0_TH,A
RET
;====================================
RSEG TIME0INT
USING 1
T0_INT: ;
MOV TH0,T0_TH
MOV TL0,T0_TL
PUSH ACC
PUSH B
PUSH PSW
STEP_RUN: MOV PSW,#08H
MOV A,STEP_MODEL
CJNE A,#05,T0_LOP1
CALL STEP_WAIT ;05_STEP WAITING
T0_LOP1: JNB STEP_M_FLAG,T0_INT_END
MOV A,STEP_MODEL
DEC A
JNZ T0_LOP2
;CALL STEP_ACCEL ;01-ACCELERATE
CALL ASTEP_ACCEL
T0_LOP2: DEC A
JNZ T0_LOP3
CALL STEP_HIGH ;02_HIGH SPEEP
T0_LOP3: DEC A
JNZ T0_LOP4
CALL ASTEP_DECEL ;03_DECELERATE
;CALL STEP_DECEL
T0_LOP4: DEC A
JNZ T0_LOP5
CALL STEP_LOW ;04_LOW SPEED
T0_LOP5: INC R3
MOV A,R3
JNZ T0_LOP6
INC R2
T0_LOP6:
T0_INT_END: POP PSW
POP B
POP ACC
RETI
;----------------------------------
SCAN: CLR INR
MOV A,#INP_BUF ;INPUT BUFFER ADDRESS
ADD A,IN_PTR ;INPUT BUFFER POINTER
MOV R0,A
MOV A,@R0
MOV R2,A
CJNE A,P2,SCAN_LOP1
MOV A,#IN_PORT ;INPUT_BUFFER TO IN_PORT
ADD A,IN_PTR
MOV R1,A
MOV @R1,12H ;&R2=12H
SCAN_LOP1: MOV @R0,P2 ;P2 TO INPUT_BUFFER
SETB INR ;INR-LOW EFFECT TO 74HC244
SETB OE ;OE-LOW EFFECT TO 74HC374
CLR OST ;OST-HIGH EFFECT TO 74HC374
; MOV P2,#INPORT
INC IN_PTR
MOV A,SEL_BYTE
ADD A,ACC
MOV SEL_BYTE,A
JNZ SCAN_LOP2
MOV IN_PTR,A
MOV SEL_BYTE,#01
SCAN_LOP2: MOV P2,SEL_BYTE
CLR OE
SETB OST
NOP
MOV P2,#0FFH
RET
;----------------------------------------
SEND: ;CLR OOE
CLR OPORT0
CLR OPORT1
CLR OPORT2
CLR OPORT3
CLR CLK
MOV A,#OUT_PORT
ADD A,OUT_PTR
MOV R0,A
MOV A,@R0
MOV R7,A
MOV R6,#08H
SEND_LOOP: MOV A,R7
;RRC A ;LSB --MSB
RLC A ;MSB --LSB
MOV SDI,C
SETB CLK
MOV A,R7
CLR C
;RRC A
RLC A
MOV R7,A
NOP
NOP
CLR CLK
DJNZ R6,SEND_LOOP
MOV A,OUT_PTR
DEC A
JZ SEND_LOP1
DEC A
JZ SEND_LOP2
DEC A
JZ SEND_LOP3
ADD A,#03
JNZ SEND_LOP4
SETB OPORT0
NOP
NOP
CLR OPORT0
JMP SEND_LOP4
SEND_LOP1: SETB OPORT1
NOP
NOP
CLR OPORT1
JMP SEND_LOP4
SEND_LOP2: SETB OPORT2
NOP
NOP
CLR OPORT2
JMP SEND_LOP4
SEND_LOP3: SETB OPORT3
NOP
NOP
CLR OPORT3
SEND_LOP4: INC OUT_PTR
MOV A,OUT_PTR
CJNE A,#4,SEND_END
MOV OUT_PTR,#00
SEND_END: RET
;====================================
RSEG TIME1INT
using 2
T1_INT:
MOV TL1,LSB_PERIOD
MOV TH1,MSB_PERIOD
PUSH ACC
PUSH PSW
MOV PSW,#10H
INC R3
CJNE R3,#200,ADAN
MOV R3,#00
INC R4
CJNE R4,#10,ADAN
MOV R4,#00
MOV A,OUTPORT2
CPL A
; MOV OUTPORT0,A
; MOV OUTPORT1,A
MOV OUTPORT2,A
; MOV OUTPORT3,A
ADAN:
INC TICK
MOV A,TICK
CJNE A,#10,T1_LOP1
INC TICK_CLOCK ;10*1mS=10mS
MOV TICK,#00
T1_LOP1: CALL SCAN
CALL SEND
POP PSW
POP ACC
RETI
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -