?? md166bv1.asm
字號:
;//-------------------------------------------------------------------------
;// Copyright (c) Johnson Electric Industry Mfty. Ltd.
;// Filename : Md166bv1.ASM
;// Language : ASM for AT89C52
;// Revision : 1.0
;// Initial Date : 19/05/2004
;// Last Modify : 20/05/2004
;// System clock : 24.00MHZ
;// Description :
;//
;//-------------------------------------------------------------------------
; NAME md166B
; PUBLIC ?C_START
;$include (D:\works\md166B\md166B.inc)
$include (D:\dyh\md166B.inc)
;--------------------------------------------------------------------------
C_START SEGMENT CODE
TIME0INT SEGMENT CODE
TIME1INT SEGMENT CODE
VAR0 SEGMENT DATA
VAR1 SEGMENT DATA
VAR2 SEGMENT DATA
VAR3 SEGMENT DATA
BVAR SEGMENT BIT
STACK SEGMENT IDATA
RSEG VAR0
switch_dly: DS 01
auto_end: DS 01
task_p: DS 01
manual_p: DS 01
manual_code: DS 01
wait_ms: DS 01
NUM_BUF: DS 01
RSEG VAR1
T0_TH: DS 01
T0_TL: DS 01
_T0_TH: DS 01
_T0_TL: DS 01
STEP_MODEL: DS 01 ;00-STOP;01-ACCELERATE;02-HIGHSPEED;03-DECELERATE
;STEP_SPEED: DS 01 ;ADJUST rotate speed
;STEP_H_SPEED: DS 01
;STEP_INDEX: DS 01
STEP_L_COUNTER: DS 01 ;ADJUST LOW ROTATE SPEED
WORK_COUNTER0: DS 01 ;WORKING TIMER
WORK_COUNTER1: DS 01 ;WORKING TIMER
WAIT_COUNTER0: DS 01 ;WAITING TIMER
WAIT_COUNTER1: DS 01 ;WAITING TIMER
RSEG VAR2
MSB_PERIOD: DS 01 ;
LSB_PERIOD: DS 01 ;
IN_PTR: DS 01
OUT_PTR: DS 01
INP_BUF: DS 08
SEL_BYTE: DS 01
RSEG VAR3
TICK_CLOCK: DS 01
TICK: DS 01
DSEG AT 20H
IN_PORT: DS 8H
OUT_PORT: DS 4H
RSEG BVAR
STEP_M_FLAG: DBIT 1 ;0-OFF;1-ON
STEP_DIRECT: DBIT 1 ;0-PLUS;1-MINUS
STEP_A_FLAG: DBIT 1 ;0-ORIGIN STATUS
STEP_L_FLAG: DBIT 1 ;1-LOW SPEED STATUS
T0_HL_FLAG: DBIT 1 ;HIGH
RSEG STACK
DS 10H ; 16 Bytes Stack
CSEG AT 00H
LJMP MAIN
CSEG AT 0BH
LJMP T0_INT
CSEG AT 1BH
LJMP T1_INT
;-------------------------------------------------------
RSEG C_START
MAIN: MOV R0,#07FH
CLR A
IDATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP
MOV SP,#STACK-01H
SETB OUTLAMP
CALL _SYSTEM_INIT
CALL _STEP_INIT
CALL _MACH_INIT
CLR OUTLAMP
WAIT 100
SETB XCW
SETB YCW
CLR XCCW
CLR YCCW
MAIN_LOOP:; MOV C,CLAMP_BD ;;;//
; JNC ADAN1
; MOV A,OUTPORT2
; RR A
; MOV OUTPORT2,A
ADAN2: ; MOV C,CLAMP_BD
; JC ADAN2
; ADAN1:
; MOV C,CLAMP_FD
; JNC ADAN3
ADAN4: ; MOV C,CLAMP_FD
; JC ADAN4
; MOV A,OUTPORT3
; ADD A,ACC
; JNZ ADAN5
; MOV A,#01
; ADAN5:
; MOV OUTPORT3,A
ADAN3:
; SETB STEP_M_FLAG
; MOV C,STARTL
; JNC K1
K2: ; MOV C,STARTL
; JC K2
; INC STEP_MODEL
; MOV A,STEP_MODEL
; CJNE A,#6,K1
; MOV STEP_MODEL,#1
; K1:
; MOV C,STARTR
; JNC K3
K4: ; MOV C,STARTR
; JC K4
; CPL STEP_DIRECT
; K3:
;;;//
MOV C,AUTO
JNC MAIN_LOP1
CALL auto_mode
MAIN_LOP1: MOV C,MANUAL
JNC MAIN_LOOP
CALL manual_mode
JMP MAIN_LOOP
;-------------------------------------------------------
auto_mode: MOV C,STARTL
ORL C,STARTR
JNC AUTO_EXIT
AUTO_ADAN:
SETB OUTLAMP
MOV switch_dly,#5 ;5*10*10mS=0.5S
AUTO_LOOP: WAIT 10
MOV C,STARTL
ANL C,STARTR
JC AUTO_LOP2
DJNZ switch_dly,AUTO_LOOP
AUTO_LOP1: MOV C,STARTL
ORL C,STARTR
JC AUTO_LOP1
CLR OUTLAMP
RET
AUTO_LOP2: MOV C,STARTL
ORL C,STARTR
JC AUTO_LOP2
MOV STEP_MODEL,#00
CLR STEP_A_FLAG
CLR T0_HL_FLAG
CLR STEP_L_FLAG
CLR XCW
CLR YCW
CLR XCCW
CLR YCCW
SETB XFREE
SETB YFREE
AUTO_LOP3: CALL auto_motion
MOV A,auto_end
CJNE A,#80h,AUTO_LOP3
AUTO_EXIT:
CLR OUTLAMP
CLR XCW
CLR YCW
CLR XCCW
CLR YCCW
CLR XFREE
CLR YFREE
MOV auto_end,#00h
RET
;-------------------------------------------------
auto_motion: MOV DPTR,#MOTION_VECTOR
MOV A,task_p
ADD A,ACC
ADD A,TASK_P
JMP @A+DPTR
MOTION_VECTOR: LJMP STEP_DETECT ;0.1 THE STEP MOTOR RETURN WORK POSITION
LJMP clamping ;0 holding the object
LJMP opmotor ;1 operate tri_motor
LJMP cwaccel ;2 step motor plus direct accelerate
LJMP cwhigh ;3 step motor plus direct high speed
LJMP cwdecel ;4 step motor plus direct decelerate
LJMP cwlow ;5 step motor plus direct low speed
LJMP opsuck ;6 open the sucking
LJMP CWLOW_OFF ;6.1 WORKING TTIME OVER
LJMP cwwait ;7 step motor waiting
LJMP ccwlow ;8 step motor minus direct low speed
LJMP clsuck ;9 close sucking
LJMP clmotor ;10 close tri_motor
LJMP ccwaccel ;11 step motor minus direct accelerate
LJMP ccwhigh ;12 step motor minus direct high speed
LJMP ccwdecel ;13 step motor minus direct decelerate
LJMP ccwstop ;14 step motor stop
LJMP clclamp ;15 close clamping
LJMP CYC_END ;16
;-------------------------------------------------------
STEP_DETECT: ;0.1 THE STEP MOTOR RETURN WORK POSITION
MOV C,BD_END
JC STEP_D_EXIT
MOV T0_TH,#HIGH(65536-60000);30mS LOW SPEED
MOV T0_TL,#LOW(65536-60000) ;RAD=1N/30S
SETB STEP_DIRECT
MOV STEP_MODEL,#02
SETB STEP_M_FLAG
S_DETECT_WAIT: MOV C,BD_END
JNC S_DETECT_WAIT
CLR STEP_M_FLAG
MOV STEP_MODEL,#00
CLR STEP_DIRECT
SETB XCW
SETB YCW
SETB XCCW
SETB YCCW
STEP_D_EXIT: INC task_p
RET
;-------------------------------------------------------
clamping: ;0 holding the object
MOV C,CLAMP_BD
JNC CLAMPING_EXIT
CLR SC_03 ;CLOSE TRI_MOTOR
CLR STEP_M_FLAG ;CLOSE STEP_MOTOR
SETB CLAMP ;OPEN CLAMPING
INC task_p
CLAMPING_EXIT: RET
;-------------------------------------------------------
opmotor: ;1 operate tri_motor
MOV C,CLAMP_FD
JNC opmotor_EXIT
CLR STEP_A_FLAG
SETB SC_03 ;OPEN TRI_MOTOR
INC task_p
opmotor_EXIT: RET
;-------------------------------------------------------
cwaccel: ;2 step motor plus direct accelerate
CLR STEP_DIRECT
MOV STEP_MODEL,#01
SETB STEP_M_FLAG
INC task_p
cwaccel_EXIT: RET
;-------------------------------------------------------
cwhigh: ;3 step motor plus direct high speed
MOV C,MOTOR_BD
JNC cwhigh_EXIT
MOV STEP_MODEL,#02
INC task_p
cwhigh_EXIT: RET
;-------------------------------------------------------
cwdecel: ;4 step motor plus direct decelerate
MOV C,MOTOR_MD
JNC cwdecel_EXIT
MOV STEP_MODEL,#03
INC task_p
cwdecel_EXIT: RET
;-------------------------------------------------------
cwlow: ;5 step motor plus direct low speed
MOV C,MOTOR_FD
JNC cwlow_EXIT
MOV WORK_COUNTER0,#00
MOV WORK_COUNTER1,#00
MOV STEP_L_COUNTER,#00
CLR STEP_L_FLAG
MOV STEP_MODEL,#04
INC task_p
cwlow_EXIT: RET
;-------------------------------------------------------
opsuck: ;6 open the sucking
SETB SUCK
INC task_p
opsuck_EXIT: RET
;---------------
CWLOW_OFF: ;6.1 WORKING TTIME OVER
MOV A,WORK_COUNTER1
SUBB A,INPORT2 ;WORK_COUNTER1
JNZ CWLOW_OFF_EXIT
MOV A,WORK_COUNTER0
SUBB A,INPORT3 ;WORK_COUNTER0
; JNZ CWLOW_OFF_EXIT
; MOV WORK_COUNTER0,#00
; MOV WORK_COUNTER1,#00
MOV WAIT_COUNTER0,#00
MOV WAIT_COUNTER1,#00
MOV STEP_MODEL,#05
INC task_p
CWLOW_OFF_EXIT: RET
;-------------------------------------------------------
cwwait: ;7 step motor waiting
MOV A,WAIT_COUNTER0
SUBB A,#200
JNZ CWWAIT_EXIT
MOV WORK_COUNTER0,#00
MOV WORK_COUNTER1,#00
MOV STEP_L_COUNTER,#00
SETB STEP_DIRECT ;STEP MOTOR CHANGE MINUS DIRECT
CLR STEP_L_FLAG
MOV STEP_MODEL,#04
INC task_p
cwwait_EXIT: RET
;-------------------------------------------------------
ccwlow: ;8 step motor minus direct low speed
MOV A,WORK_COUNTER1
; INC A ;NO-balance technology
SUBB A,INPORT2 ;WORK_COUNTER1
JNZ CCWLOW_EXIT
; MOV A,WORK_COUNTER0
; SUBB A,INPORT3 ;WORK_COUNTER0
; JNZ CCWLOW_EXIT
; MOV WORK_COUNTER1,#00
; MOV WORK_COUNTER1,#00
CLR STEP_A_FLAG
MOV STEP_MODEL,#01
INC task_p
ccwlow_EXIT: RET
;-------------------------------------------------------
clsuck: ;9 close sucking
CLR SUCK
INC task_p
clsuck_EXIT: RET
;-------------------------------------------------------
clmotor: ;10 close tri_motor
CLR SC_03
INC task_p
clmotor_EXIT: RET
;-------------------------------------------------------
ccwaccel: ;11 step motor minus direct accelerate
MOV C,MOTOR_MD
JNC ccwaccel_EXIT
MOV STEP_MODEL,#2
INC task_p
ccwaccel_EXIT: RET
;-------------------------------------------------------
ccwhigh: ;12 step motor minus direct high speed
MOV C,MOTOR_BD
JNC ccwhigh_EXIT
MOV STEP_MODEL,#3
INC task_p
ccwhigh_EXIT: RET
;-------------------------------------------------------
ccwdecel: ;13 step motor minus direct decelerate
MOV C,BD_END
JNC ccwdecel_EXIT
; MOV A,_T0_TH
; SUBB A,#0EAH
; JNZ ccwdecel_EXIT
; MOV A,_T0_TL
; JNZ ccwdecel_EXIT
MOV STEP_MODEL,#00
INC task_p
ccwdecel_EXIT: RET
;-------------------------------------------------------
ccwstop: ;14 step motor stop
CLR STEP_A_FLAG
CLR STEP_L_FLAG
CLR STEP_DIRECT
CLR T0_HL_FLAG
CLR STEP_M_FLAG
SETB XCW
SETB YCW
SETB XCCW
SETB YCCW
CLR A
MOV WAIT_COUNTER0,A
MOV WAIT_COUNTER1,A
MOV WORK_COUNTER0,A
MOV WORK_COUNTER1,A
INC task_p
ccwstop_EXIT: RET
;-------------------------------------------------------
clclamp: ;15 close clamping
CLR CLAMP
INC task_p
clclamp_EXIT: RET
;-------------------------------------------------------
CYC_END: ;16
MOV C,CLAMP_BD
JNC CYC_END_EXIT
SETB NUM_CT
WAIT 1
CLR NUM_CT
SETB BUZZER
WAIT 20
CLR BUZZER
SETB OUTLAMP
MOV task_p,#00H
MOV AUTO_END,#80H
CYC_END_EXIT: RET
;--------------------------------------------------------------
;00:-- : MACHINE ADJUST ;BCD CODE : -- : -- |
; 00 : RESET MOTION |
; 01 : CLAMP MOTION |
; 02 : SC_03 MOTION |
; 03 : SUCK MOTION |
;01:-- : TICK MOVE |
; 01 : PLUS DIRECT LOW SPEED; 11 : MINUS DIRECT LOW SPEED |
; 02 : PLUS DIRECT MID SPEED; 12 : MINUS DIRECT MID SPEED |
; 03 : PLUS DIRECT HIGH SPEED; 13 : MINUS DIRECT HIGH SPEED |
;02:-- : AUTO MOVE |
; 00 : PLUS DIRECT SPEED; 10 : MINUS DIRECT SPEED |
;---------------------------------------------------------------
;WORKING--retrorse --CW
;REBACK--clock direct --ccw
manual_mode: WAIT 2
MOV C,MANUAL
JNC MANUAL_EXIT
MOV A,INPORT2
JNZ MANUAL_LOP1
CALL MACHINE_MOVE ;00=MACHINE MOVE
MANUAL_LOP1: DEC A
JNZ MANUAL_LOP2
CALL TICK_MOVE ;01=TICK MOVE
MANUAL_LOP2: DEC A
JNZ MANUAL_LOP3
CALL AUTO_MOVE ;02=AUTO MOVE
MANUAL_LOP3: JMP MANUAL_MODE
MANUAL_EXIT: CLR OUTLAMP
RET
;---------------------------------------------------------------------
MACHINE_MOVE: MOV A,INPORT3
ANL A,#0FH
MOV manual_code,A
_OUT: CALL OUT_LAMP
MOV C,EXECUTE
JNC M_MOVE_END
M_M_LOP1: MOV C,EXECUTE
JC M_M_LOP1
; CLR OUTLAMP
MOV DPTR,#MANUAL_VECTOR
MOV A,manual_code
ADD A,ACC
ADD A,manual_code
JMP @A+DPTR
MANUAL_VECTOR: LJMP MANU_EXE0
LJMP MANU_EXE1
LJMP MANU_EXE2
LJMP MANU_EXE3
MANU_EXE0: CLR OUTLAMP
RET
MANU_EXE1: CPL CLAMP
RET
MANU_EXE2: CPL SC_03
RET
MANU_EXE3: CPL SUCK
RET
M_MOVE_END: RET
;------------------------------------------------------
OUT_LAMP: JNZ OUT_L1
CLR OUTLAMP
RET
OUT_L1: DEC A
JNZ OUT_L2
MOV C,CLAMP ;1
MOV OUTLAMP,C
RET
OUT_L2: DEC A
JNZ OUT_L3
MOV C,SC_03 ;2
MOV OUTLAMP,C
RET
OUT_L3: DEC A
JNZ OUT_L4
MOV C,SUCK ;3
MOV OUTLAMP,C
RET
OUT_L4: CLR OUTLAMP
RET
;---------------------------------------------------------------------
TICK_MOVE: MOV A,INPORT3
MOV R2,A
ANL A,#0FH
DEC A ;01 = LOW SPEED
JNZ TICK_LOP1
MOV T0_TH,#HIGH(65536-60000);30mS LOW SPEED
MOV T0_TL,#LOW(65536-60000) ;RAD=1N/30S
JMP TICK_LOP3
TICK_LOP1: DEC A
JNZ TICK_LOP2
MOV T0_TH,#HIGH(65536-20000);10mS MID SPEED
MOV T0_TL,#LOW(65536-20000) ;RAD=1N/10S
JMP TICK_LOP3
TICK_LOP2: DEC A
JNZ TICK_EXIT
MOV T0_TH,#HIGH(65536-2000) ;1mS HIGH SPEED
MOV T0_TL,#LOW(65536-2000) ;RAD=1N/S
TICK_LOP3: MOV A,R2
ANL A,#0F0H
SWAP A
JNZ TICK_LOP4
CLR STEP_DIRECT
JMP TICK_LOP5
TICK_LOP4: DEC A
JNC TICK_EXIT
SETB STEP_DIRECT
TICK_LOP5:
_TICK_START: MOV C,EXECUTE
JNC _TICK_STOP
MOV C,MOTOR_FD
ANL C,/STEP_DIRECT
JC _TICK_STOP
MOV C,BD_END
ANL C,STEP_DIRECT
JC _TICK_STOP
SETB XFREE
SETB YFREE
MOV STEP_MODEL,#02
SETB STEP_M_FLAG
JMP _TICK_START
_TICK_STOP: CLR STEP_M_FLAG
MOV STEP_MODEL,#00
CLR XCW
CLR YCW
; SETB XCW
; SETB YCW
CLR XCCW
CLR YCCW
; SETB XCCW
; SETB YCCW
CLR XFREE
CLR YFREE
TICK_EXIT: RET
;--------------------------------------------------------------------
AUTO_MOVE: MOV A,INPORT3
ANL A,#0F0H
SWAP A
JNZ _AUTO_LOP1
CLR STEP_DIRECT
JMP _AUTO_LOP2
_AUTO_LOP1: DEC A
JNC _AUTO_EXIT
SETB STEP_DIRECT
_AUTO_LOP2: MOV C,EXECUTE
JNC _AUTO_EXIT
_AUTO_START: MOV C,EXECUTE
JC _AUTO_START
MOV C,STEP_DIRECT
ANL C,BD_END
JC _AUTO_STOP
MOV C,MOTOR_FD
ANL C,/STEP_DIRECT
JC _AUTO_STOP
SETB XFREE
SETB YFREE
MOV C,STEP_DIRECT
JC _AUTO_S_LOP1
CALL _AUTO_PLUS
JMP _AUTO_STOP
_AUTO_S_LOP1: CALL _AUTO_MINUS
_AUTO_STOP: MOV STEP_MODEL,#00
CLR STEP_A_FLAG
CLR T0_HL_FLAG
CLR XCW
CLR YCW
CLR XCCW
CLR YCCW
CLR XFREE
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -