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

📄 md166bv1.asm

📁 步进马达控制程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;//-------------------------------------------------------------------------
;//	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

⌨️ 快捷键说明

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