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

📄 md166bv1.asm

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