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

📄 motor_sensor.asm

📁 关于pm35l-048-ccb0 步进马达的控制程序 汇编程序,指令集可参考义隆单片机指令集.
💻 ASM
字号:
;project:motor control
;IC body:SG8P122
;Author:wulj
;Data:2007/11/16
;motor model:pm35l-048-ccb0
;*******************************************
R_iar	equ	[00h]
R_rp	equ	[04h]
r_pressdebonce	equ [10h]	;去抖值
r_relaxdebonce	equ	[11h]
keyflag	equ	[12h]	;key flag
keycode	equ	[13h]	;
R_speed	equ	[14h]	;motor speed
temp0	equ	[15h]
temp1	equ	[16h]
delayl	equ	[17h]
num	equ	[18h]
direction	equ	[19h]
temp2	equ	[1ah]
temp3	equ	[1bh]

acc_buf	equ	[1eh]
status_buf	equ	[1fh]

c_debonce	equ	225
;*******************************************
CSEG	000h
	jmp	reset
CSEG	001H
	mov	acc_buf,a
	swpa	status
	mov	status_buf,a
	nop
	sbz	irq,0
	jmp	tcc_int
	jmp	int_end

tcc_int:	
	mov	a,0feh
	mov	IRQ,A
	mov	a,p0
	and	a,03h
	xor	a,00h
	sbnz	status,2
	inc	r_pressdebonce	;按键延时
;	inc	r_relaxdebonce
;	mov	a,250
;	mov	tcc,a
	inc	temp0
	jmp	int_end
int_end:
	swp	acc_buf
	swpa	acc_buf
	swpa	status_buf
	mov	status,a
	reti
speed_Table:
	tbl
	retl	7
	retl	80
	retl	40
	retl	7
	retl	20
	retl	7
	retl	7
	retl	7
	retl	14
;*******************************************	
reset:
	di
	call	portini
	call	sysini
	call	ramini
	mov	a,1
	mov	R_speed,a
	jmp	main
	
portini:
	mov	a,03h
	ctlw	p0c
	MOV	A,00FH
	ctlw	p1c
	mov	a,00h	
	mov	p1,a
	mov	p0,a
	MOV	A,00cH	;P10~P13 P00,P01 PULLD enable
	ctlw	pulld
	ret
	
sysini:
	mov	a,02h
	ctlw	wwc
	mov	a,00000000b	;OSC=2MHZ	000-->1:2 256*2/1mhz=512us
	cntw
	mov	a,00000000b
	mov	irq,a
	mov	a,01h	;ttc enable
	ctlw	ire
	nop	
;	ei
	ret
	
ramini:
	mov	a,10h
	mov	R_rp,a
clear_begin:
	mov	a,00h
	mov	R_iar,a	
	inc	R_rp
	mov	a,R_rp
	xor	a,3fh
	sbnz	status,2
	jmp	clear_begin
	clr	R_iar
	clr	R_rp
	ret
;*******************************************
;*******************************************
main:
	ei
	wdtc
	sbz	keyflag,0
	jmp	On_off_loop
	call	scankey
	sbz	keyflag,1
	call	speed_loop
	sbnz	direction,0
	jmp	run_r
	jmp	run_l	
;	jmp	motor_loop
On_off_loop:
	call	scankey
	sbz	keyflag,1
	call	speed_loop	
	sbz	keyflag,0	;
	jmp	On_off_loop
	sbnz	direction,0
	jmp	run_r
	jmp	run_l	
;*******************************************
;*******************************************
speed_loop:
	bclr	keyflag,1	
	bclr	status,0
	slc	R_speed
	mov	a,R_speed
	sub	a,09h
	sbz	status,0
	ret	
	mov	a,1
	mov	R_speed,a
	ret
;*******************************************
	
motor_loop:	
;	mov	a,025h
;	mov	num,a	;/*设置转数*/	
	jmp	run_l	;左转
	
;	mov	a,020h
;	mov	delayl,a
;	call	delay

;	mov	a,025h
;	mov	num,a	;/*设置转数*/	
;	call	run_r	;右转
	
;	mov	a,020h
;	mov	delayl,a
;	call	delay
	jmp	main
;*******************************************
run_l:	;正转
	call	delay	;切换时延时
		
	bst	direction,0	;正转
	
	bst	p1,7	;10000000b   
	nop

  	bclr	p1,4             
;	mov	a,01Ah         
;	mov	delayl,a       
;	call	delay     
	
	call	sensor_loop	;查看是否到边界
	
	     
	call	wait_loop00
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
	
	bst	p0,4	;led
;;
	bst	p1,6	;11000000b
;	mov	a,01Ah
;	mov	delayl,a
;	call	delay
	call	sensor_loop	;查看是否到边界
	
	call	wait_loop00
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
;	bclr	p0,4	;led

	bst	p1,6	
	nop
 
	bclr	p1,7	;01000000b  
;	mov	a,01Ah
;	mov	delayl,a
;	call	delay
	call	sensor_loop	;查看是否到边界
	call	wait_loop00
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
 	bclr	p0,4	;led
;;
	bst	p1,5	;01100000b 
;	mov	a,01Ah
;	mov	delayl,a
;	call	delay
	call	sensor_loop	;查看是否到边界
	call	wait_loop00        
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
;	bclr	p0,4	;led
	
	bst	p1,5	;00100000b
	nop	
	
	bclr	p1,6	
;	mov	a,01Ah
;	mov	delayl,a
;	call	delay
	call	sensor_loop	;查看是否到边界
	call	wait_loop00	
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main	
	bst	p0,4	;led	
	
;;	
	bclr	p1,4	;00110000b
;	mov	a,01Ah
;	mov	delayl,a
;	call	delay
	call	sensor_loop	;查看是否到边界
	call	wait_loop00
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
;	bclr	p0,4	;led

	bst	p1,4
	nop
 	
	bclr	p1,5	;00010000b	
;	mov	a,01Ah
;	mov	delayl,a
;	call	delay
	call	sensor_loop	;查看是否到边界
	call	wait_loop00
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
	bclr	p0,4	;led

	
;;
	bst	p1,7	;10010000b
;	mov	a,01Ah
;	mov	delayl,a
;	call	delay
	call	sensor_loop	;查看是否到边界
	call	wait_loop00
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
;	bclr	p0,4	;led	
	jmp	run_l
;	sdz	num
;	jmp	run_l		;
;	ret

	
sensor_loop:
	sbz	direction,0
	jmp	left_loop
	jmp	right_loop
	
left_loop:
	sbz	p1,0	;TEST
	ret
	sbz	direction,1
	ret
	mov	a,00h	;motor stop
	mov	p1,a
	nop	
	bst	direction,1	
	bclr	direction,2
	mov	a,R_speed
	xor	a,8
	sbnz	status,2
	jmp	run_r
	mov	a,00h
	mov	p1,a	
	mov	a,254
	mov	R_speed,a	
wait_loop:	;如果是最高速,暂停一会
	nop	
	nop
	nop	
	nop
	nop	
	nop
	nop	
	nop
	nop	
	nop
	nop	
	nop
	nop	
	nop
	nop	
	nop	
	sdz	R_speed
	jmp	wait_loop
	mov	a,8
	mov	R_speed,a
	jmp	run_r
		
right_loop:
	sbz	p1,2
	ret
	sbz	direction,2
	ret
	mov	a,00h	;motor stop
	mov	p1,a
	nop	
	bclr	direction,1
	bst	direction,2	
	mov	a,R_speed
	xor	a,8
	sbnz	status,2
	jmp	run_l
	mov	a,00h
	mov	p1,a	
	mov	a,254
	mov	R_speed,a
wait_loop1:	;如果是最高速,暂停一会
	nop	
	nop
	nop	
	nop
	nop	
	nop
	nop	
	nop
	nop	
	nop
	nop	
	nop
	nop	
	nop
	nop	
	nop			
	sdz	R_speed
	jmp	wait_loop1
	mov	a,8
	mov	R_speed,a
	jmp	run_l	
	
				


	
wait_loop00:
	di
	mov	a,R_speed
	call	speed_Table
	mov	temp1,a
	ei
wait_loop01:	
	bclr	status,0	
	mov	a,temp0
	sub	a,temp1	;8~64
	sbz	status,0
	jmp	wait_loop01
	clr	temp0
	ret
			
run_r:	;反转   
	call	delay	;切换时延时
	
	bclr	direction,0	;反转
	
	bst	p1,4	;00010000b  
	nop 

  	bclr	p1,7             
;	mov	a,01Ah         
;	mov	delayl,a       
;	call	delay      
	call	sensor_loop	;查看是否到边界    
	call	wait_loop00
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
	bst	p0,4	;led
;;
	bst	p1,5	;00110000b
;	mov	a,01Ah
;	mov	delayl,a
;	call	delay
	call	sensor_loop	;查看是否到边界
	call	wait_loop00
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
;	bclr	p0,4	;led
	
	bst	p1,5	;00100000b
	nop

	bclr	p1,4
;	mov	a,01Ah
;	mov	delayl,a
;	call	delay
	call	sensor_loop	;查看是否到边界
	call	wait_loop00
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
	bclr	p0,4	;led

;;
	bst	p1,6	;01100000b
;	mov	a,01Ah
;	mov	delayl,a
;	call	delay  
	call	sensor_loop	;查看是否到边界   
	call	wait_loop00
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
;	bclr	p0,4	;led
			
	bst	p1,6	;01000000b
	nop	
	
	bclr	p1,5	
;	mov	a,01Ah
;	mov	delayl,a
;	call	delay
	call	sensor_loop	;查看是否到边界
	call	wait_loop00	
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
	bst	p0,4	;led

;;
	bst	p1,7	;11000000b
;	mov	a,01Ah
;	mov	delayl,a
;	call	delay
	call	sensor_loop	;查看是否到边界
	call	wait_loop00
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
;	bclr	p0,4	;led

	bst	p1,7
	nop
 	
	bclr	p1,6	;10000000b	
;	mov	a,01Ah
;	mov	delayl,a
;	call	delay
	call	sensor_loop	;查看是否到边界
	call	wait_loop00
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
	bclr	p0,4	;led	
;;
	bst	p1,4	;10010000b
;	mov	a,01Ah
;	mov	delayl,a
;	call	delay
	call	sensor_loop	;查看是否到边界
	call	wait_loop00
	call	scankey	;
	mov	a,keyflag
	xor	a,00h
	sbnz	status,2
	jmp	main
;	bclr	p0,4	;led
;	sdz	num
	jmp	run_r		;
;	ret	


scankey:
;	di
	mov	a,p0
	and	a,00000011b
	xor	a,00h
	mov	keycode,a
	sbz	status,2
	ret
	mov	a,r_pressdebonce
	add	a,c_debonce
	sbnz	status,0
	ret	
	clr	r_pressdebonce	
	mov	a,p0
	and	a,00000011b
	xor	a,keycode	
	sbnz	status,2
	ret
;	clr	r_pressdebonce
;	ei
	mov	a,keycode
	sbz	keycode,0
	xor	keyflag,a	;对on/off 取反
	sbz	keycode,1
	bst	keyflag,1
	clr	keycode
wait_low:			
	mov	a,p0
	and	a,00000011b
	xor	a,0
	sbnz	status,2
	jmp	wait_low
	mov	a,r_pressdebonce
	add	a,c_debonce
	sbnz	status,0		
	ret
	clr	r_pressdebonce
	ret
	
;scankey:	;
	di
	mov	a,p0
	and	a,00000011b
	xor	a,00h
	ei
	mov	keycode,a
	sbz	status,2
	jmp	nokey_loop
	bclr	status,0
	mov	a,r_pressdebonce
	add	a,c_debonce
	sbnz	status,0
	jmp	exit_loop
	clr	r_relaxdebonce	
	mov	a,keycode
	sbz	keycode,0
	xor	keyflag,a	;对on/off 取反
	sbz	keycode,1
	bst	keyflag,1
;	clr	keycode
	ret
nokey_loop:
	mov	a,r_relaxdebonce
	add	a,c_debonce
	sbnz	status,0
	jmp	exit_loop	
	clr	r_pressdebonce
	clr	keycode
exit_loop:
;	clr	r_pressdebonce	;	
	ret
	
delay:
	mov	a,20
	mov	temp2,a
delay_loop0:
	mov	a,200
	mov	temp3,a
delay_loop1:
	wdtc
	nop
	nop
	nop
	nop
	nop
	nop
	sdz	temp3
	jmp	delay_loop1
	sdz	temp2	
	jmp	delay_loop0
	nop
	ret	

⌨️ 快捷键说明

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