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

📄 07_08.dt

📁 一个16LED显示的双路马达驱动电路图
💻 DT
📖 第 1 页 / 共 2 页
字号:
		
LEDDUTY0:
        MOV     A,SPEED_L
        CALL    MODE1_TABH
        OR      A,@0b00001110     ;60 
        MOV     R6_BUF,A
        JMP     LEDDISOUT
LEDDUTY1:
        MOV     A,SPEED_L
        CALL    MODE1_TABL
        OR      A,@0b00001101     ;61
        MOV     R6_BUF,A
        JMP     LEDDISOUT
LEDDUTY2:
        MOV     A,SPEED_R
        CALL    MODE1_TABH
        OR      A,@0b00001011     ;62
        MOV     R6_BUF,A
        JMP     LEDDISOUT
LEDDUTY3: 
        MOV     A,SPEED_R
        CALL    MODE1_TABL
        OR      A,@0b00000111     ;63   
        MOV     R6_BUF,A
        JMP		LEDDISOUT
           
;*******************************************
DIS_MODE3:
		MOV		A,@0X02   ;display every bit 60ms 
		XOR	  	A,FLAG_30MS
		JBS	 	STATUS,Z
		JMP	  	DIS_M2
		CLR	  	FLAG_30MS
		JMP	  	TEST2L
		
;********************************************************
DIS_MODE2:
		MOV	  	A,@0X02   ;display every bit 60ms 
		XOR	  	A,REG_30MS
		JBS	  	STATUS,Z
		JMP	  	DIS_M2
		CLR	  	REG_30MS
;***************************************************** change speed_duty
TEST2L:	
		MOV	  	SPEED_L,SPEED_L  ;test speed_l is not equal 0
		JBC	  	STATUS,Z
		JMP	  	TEST2R
		MOV	  	SPEEDL_DUTY,SPEEDL_DUTY		;speedl_duty is using as to switch led
		JBS	  	STATUS,Z
		JMP	  	TEST2LH
		MOV	  	A,@0X00
		MOV	  	SPEEDL_FLAG,A			;speedl_flag is switch down and up 0=up
TEST2LH:
		MOV	  	A,@0X09
		XOR	  	A,SPEEDL_DUTY
		JBS	  	STATUS,Z
		JMP	  	TEST2LF
		MOV   	A,@0X01
		MOV	  	SPEEDL_FLAG,A
TEST2LF:								;switch down and up from the speedl_flag=0 up speedl=1 down
		MOV   	SPEEDL_FLAG,SPEEDL_FLAG
		JBC   	STATUS,Z
		INC	  	SPEEDL_DUTY
	
		MOV	  	SPEEDL_FLAG,SPEEDL_FLAG
		JBS	  	STATUS,Z
		DEC	  	SPEEDL_DUTY

;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
TEST2R:
		MOV	  	SPEED_R,SPEED_R
		JBC	  	STATUS,Z
		JMP	  	DIS_M2
		MOV   	SPEEDR_DUTY,SPEEDR_DUTY
		JBS	  	STATUS,Z
		JMP	  	TEST2RH
		MOV	  	A,@0X00
		MOV	  	SPEEDR_FLAG,A
TEST2RH:
		MOV	  	A,@0X09
		XOR	  	A,SPEEDR_DUTY
		JBS	  	STATUS,Z
		JMP	  	TEST2RF
		MOV   	A,@0X01
		MOV	  	SPEEDR_FLAG,A
TEST2RF:						;switch  up and down
		MOV	  	SPEEDR_FLAG,SPEEDR_FLAG
		JBC	  	STATUS,Z
		INC	  	SPEEDR_DUTY

		MOV	  	SPEEDR_FLAG,SPEEDR_FLAG
		JBS   	STATUS,Z
		DEC	  	SPEEDR_DUTY
		
;*******************************		
DIS_M2:
		MOV	  	A,@0X00
		MOV	  	SPEED_L,SPEED_L		;test the speedl=0?
		JBC   	STATUS,Z
		CLR   	SPEEDL_DUTY
		
		MOV	  	SPEED_R,SPEED_R
		JBC	  	STATUS,Z
		CLR	  	SPEEDR_DUTY
		
		MOV   	A,LED_DUTY
		ADD	  	PC,A
		JMP	  	LEDDUTY00
		JMP	  	LEDDUTY01
		JMP   	LEDDUTY02
		JMP	  	LEDDUTY03

LEDDUTY00:
		MOV	  	A,SPEEDL_DUTY
		CALL  	MODE2L_TAB
		MOV	  	R6_BUF,A
		JMP	  	LEDDISOUT

LEDDUTY01:
		MOV	  	A,SPEEDL_DUTY
		CALL  	MODE2L_TAB
		MOV	  	R6_BUF,A
		JMP   	LEDDISOUT

LEDDUTY02:
		MOV	  	A,SPEEDR_DUTY
		CALL  	MODE2R_TAB
		MOV	  	R6_BUF,A
		JMP	  	LEDDISOUT

LEDDUTY03:
		MOV	  	A,SPEEDR_DUTY
		CALL  	MODE2R_TAB
		MOV	  	R6_BUF,A
		
;****************************************************
LEDDISOUT:
        MOV    	A,R6_BUF
        MOV    	PORT6,A
		
;***************************************************MOTORPLAY 
;***************************************************
MOTORPLAY:
		MOV		A,MODE
		ADD		PC,A		;switch motor mode
		JMP		MODE1
		JMP		MODE2
		JMP		MODE3
		
;**************************************MODE1		
MODE1:

		BC		R5_BUF,CONT1_L
		BC		R5_BUF,CONT2_L
		
		JBS		FLAG0,TURNL_FLAG		;switch left motor play from the turnl_flag
		CALL	MODE1_L
		
		JBC		FLAG0,TURNL_FLAG
		CALL	MODE1_L_NEV
		
		JBC		FLAG1,MOTORL_ON			;test the motorl_on that delay in mode2 and mode3
		JMP		$+3
		BC		R5_BUF,CONT1_L			;if motorl_on=0 close the G+
		BC		R5_BUF,CONT2_L
		
		MOV		SPEED_L,SPEED_L		;test speedl  equal 0
		JBS		STATUS,Z
		JMP		$+3
		BC		R5_BUF,CONT1_L		;if speedl=0 then close the G+
		BC		R5_BUF,CONT2_L
		
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&		
MODE1R:		
		BC		R5_BUF,CONT1_R
		BC		R5_BUF,CONT2_R
		
		JBS		FLAG0,TURNR_FLAG		;switch right motor play 
		CALL	MODE1_R
		
		JBC		FLAG0,TURNR_FLAG
		CALL	MODE1_R_NEV
		
		JBC		FLAG1,MOTORR_ON			;test the motorr_on use in mode2(4*18ms close)  and mode3(3*18ms close) 
		JMP		$+3
		BC		R5_BUF,CONT1_R
		BC		R5_BUF,CONT2_R
		
		MOV		SPEED_R,SPEED_R			;test the speedr=0? if speedr=0 close right motor
		JBS		STATUS,Z
		JMP		$+3
		BC		R5_BUF,CONT1_R
		BC		R5_BUF,CONT2_R
		
		MOV		A,R5_BUF
		OR		A,@0X60			;give data to port5 from r5_buf
		AND		A,@0XE1
		OR		A,R5_BUF
		MOV		PORT5,A
		JMP		INT_EXIT
				
;**************************************************	
MODE2:
	 	MOV     A,@0X3C				; the left total timer 60*18ms=120*9ms
        MOV     POSL_REG,A
        MOV		A,@0X44				;the right total timer 68*18ms=204*6ms
        MOV		POSR_REG,A
        MOV     A,@0X04				;delay 4*18ms for low
        MOV     NEV_REG,A
        JMP     TURNL
;***************************************************		
MODE3:
		MOV     A,@0X1E				;the left total timer 30*18ms=60*9ms
        MOV     POSL_REG,A
        MOV		A,@0X22				;the right total timer 34*18ms=102*6ms
        MOV		POSR_REG,A
        MOV     A,@0X03				;delay 4*18ms for low
        MOV     NEV_REG,A
        JMP     TURNL
        
;**************************************************
TURNL:
		JBC		FLAG0,TURNL_FLAG	;test the turnl_flag
		JMP		TURNL_ON
TURNL_OFF:
        MOV     A,POSL_REG			;the left total timer
        XOR     A,REGL_18MS
        JBS     STATUS,Z			;if the total timer is out then jump to turnl_on
        JMP     $+4

        BS      FLAG0,TURNL_FLAG
		CLR     REGL_18MS
        JMP     TURNR
                  
        MOV     A,NEV_REG
        SUB     A,REGL_18MS			;if the nev_reg timer is not out then colse the motorl 
        
        JBC     STATUS,C
        BS		FLAG1,MOTORL_ON		
        
        JBS		STATUS,C
        BC		FLAG1,MOTORL_ON
        
        JMP		TURNR

TURNL_ON:
		MOV		A,POSL_REG
		XOR		A,REGL_18MS
		JBS		STATUS,Z
		JMP		$+4
		
		BC		FLAG0,TURNL_FLAG
		CLR		REGL_18MS
		JMP		TURNR
		
		MOV		A,NEV_REG
		SUB		A,REGL_18MS
		JBC		STATUS,C
		BS		FLAG1,MOTORL_ON
		
		JBS		STATUS,C
		BC		FLAG1,MOTORL_ON
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&			
TURNR:
		JBC		FLAG0,TURNR_FLAG
		JMP		TURNR_ON
		
TURNR_OFF:
        MOV     A,POSR_REG
        XOR     A,REGR_18MS
        JBS     STATUS,Z
        JMP     $+4

        BS      FLAG0,TURNR_FLAG
		CLR     REGR_18MS
        JMP     TURN_EXIT
                  
        MOV     A,NEV_REG
        SUB     A,REGR_18MS
        JBC     STATUS,C
        BS		FLAG1,MOTORR_ON
        
        JBS		STATUS,C
        BC		FLAG1,MOTORR_ON
        
        JMP		TURN_EXIT

TURNR_ON:
		MOV		A,POSR_REG
		XOR		A,REGR_18MS
		JBS		STATUS,Z
		JMP		$+4
		
		BC		FLAG0,TURNR_FLAG
		CLR		REGR_18MS
		JMP		TURN_EXIT
		
		MOV		A,NEV_REG
		SUB		A,REGR_18MS
		JBC		STATUS,C
		BS		FLAG1,MOTORR_ON
		
		JBS		STATUS,C
		BC		FLAG1,MOTORR_ON
		
TURN_EXIT:
		JMP		MODE1
			
;*************************************************	

MODE1_L:
		JBC		FLAG0,DYONL_FLAG		;test the dyonl_flag if dyonl_flag=1,speedl=off 0				
		JMP		SPEED_OFF_L			
		
SPEED_ON_L:
		BS		R5_BUF,CONT1_L         ;cont1+=1 for delay_on_l
		
		MOV		DELAY_ON_L,DELAY_ON_L  ;test the motor play timer is not out
		JBC		STATUS,Z
		JMP		$+3
		DEC		DELAY_ON_L
		JMP		SPEED_OFF_L
		
		MOV		A,SPEED_L 			;the delay_on_l time is from the speedl
		CALL	DELAYON_L_TAB
		MOV		DELAY_ON_L,A
		BC		R5_BUF,CONT1_L
		BS		FLAG0,DYONL_FLAG
		
SPEED_OFF_L:
		MOV		DELAY_OFF_L,DELAY_OFF_L		;test the total cycle is not out
		JBC		STATUS,Z
		JMP		$+3
		DEC		DELAY_OFF_L
		RET
		
		MOV		A,@0X12
		MOV		DELAY_OFF_L,A
		BC		FLAG0,DYONL_FLAG
		RET
		
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&		
		
MODE1_L_NEV:
		JBC		FLAG0,DYONL_FLAG
		JMP		SPEED_OFF_L_NEV

SPEED_ON_L_NEV:
		BS		R5_BUF,CONT2_L
		MOV		DELAY_ON_L,DELAY_ON_L
		JBC		STATUS,Z
		JMP		$+3
		DEC		DELAY_ON_L
		JMP		SPEED_OFF_L_NEV
		
		MOV		A,SPEED_L
		CALL	DELAYON_L_TAB
		MOV		DELAY_ON_L,A
		BS		FLAG0,DYONL_FLAG
		BC		R5_BUF,CONT2_L
		
SPEED_OFF_L_NEV:
		MOV		DELAY_OFF_L,DELAY_OFF_L
		JBC		STATUS,Z
		JMP		$+3
		DEC		DELAY_OFF_L
		RET
		
		MOV		A,@0X12
		MOV		DELAY_OFF_L,A
		BC		FLAG0,DYONL_FLAG
		RET		
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&		

MODE1_R:
		JBC		FLAG0,DYONR_FLAG
		JMP		SPEED_OFF_R
		
SPEED_ON_R:
		BS		R5_BUF,CONT1_R
		MOV		DELAY_ON_R,DELAY_ON_R
		JBC		STATUS,Z
		JMP		DELAY_R
		DEC		DELAY_ON_R
		JMP		SPEED_OFF_R
DELAY_R:
		MOV		A,SPEED_R
		CALL	DELAYON_R_TAB
		MOV		DELAY_ON_R,A
		BC		R5_BUF,CONT1_R
		BS		FLAG0,DYONR_FLAG
		
SPEED_OFF_R:
		MOV		DELAY_OFF_R,DELAY_OFF_R
		JBC		STATUS,Z
		JMP		$+3
		DEC		DELAY_OFF_R
		RET
		
		MOV		A,@0X0C
		MOV		DELAY_OFF_R,A
		BC		FLAG0,DYONR_FLAG
		RET
		
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&		
		
MODE1_R_NEV:
		JBC		FLAG0,DYONR_FLAG
		JMP		SPEED_OFF_R_NEV

SPEED_ON_R_NEV:
		BS		R5_BUF,CONT2_R
		MOV		DELAY_ON_R,DELAY_ON_R
		JBC		STATUS,Z
		JMP		$+3
		DEC		DELAY_ON_R
		JMP		SPEED_OFF_R_NEV
		
		MOV		A,SPEED_R
		CALL	DELAYON_R_TAB
		MOV		DELAY_ON_R,A
		BS		FLAG0,DYONR_FLAG
		BC		R5_BUF,CONT2_R
		
SPEED_OFF_R_NEV:
		MOV		DELAY_OFF_R,DELAY_OFF_R
		JBC		STATUS,Z
		JMP		$+3
		DEC		DELAY_OFF_R
		RET
		
		MOV		A,@0X0C
		MOV		DELAY_OFF_R,A
		BC		FLAG0,DYONR_FLAG
		RET			
		  
;*************************************exit interrupter
		
INT_EXIT:
		
		BC		ISR,TCIF  ;clean the TCC intterrupt flag
		
		MOV		A,R4_BUF
		MOV		RSR,A
		
		MOV		A,R3_BUF
		MOV		STATUS,A
		
		SWAPA	ACC_BUF
		
		RETI
		
POWERON:
		DISI				;colse the intterrupt
		MOV		A,@0X00    ;clean the special register
		MOV		PORT5,A
		MOV		PORT6,A
		
		MOV		WPC,A
		MOV		ISR,A
		
		MOV		A,@0X00		;PORT6 set as output
		IOW		P6CR
		MOV		A,@0X60
		IOW		P5CR
		MOV		A,@0XFF
		IOW		PDCR
		MOV		A,@0X0F
		IOW		PHCR

		
		
		MOV		A,@0X55			;power on test1
		XOR		A,POWERTEST1
		JBS		STATUS,Z
		JMP		CLR_RAM
		
		MOV		A,@0XAA			;power on test2
		XOR		A,POWERTEST2
		JBS		STATUS,Z
		JMP		CLR_RAM
		
		MOV		A,@0X18			;test power on T=1,P=1
		AND		A,STATUS
		XOR		A,@0X18
		JBC		STATUS,Z
		JMP		MAIN

		
CLR_RAM:                    ;clean the RAM   
		MOV		A,@0X2F
		MOV		TEMP,A
		MOV		A,@0X11
		MOV		RSR,A
LOOP1:
		CLRA
		MOV 	R0,A
		INC		RSR
		DJZ		TEMP
		JMP		LOOP1
		CLR		TEMP

;*********************************************************		
MAIN:
		MOV		A,@0X55				
		MOV		POWERTEST1,A
		
		MOV		A,@0XAA
		MOV		POWERTEST2,A
		
		MOV		A,@0X06   ;set TCC  time equal 250   
		MOV		TCC,A
		MOV		A,@0X49		;set TCC prescaler as 1:4  (256*4/4)*4=1ms
		CONTW
				
		MOV		A,@0X8C		;close the WDT
		IOW		WDTCR
		
		MOV		A,@0X01     ;enable TCC time intterrupt flag
		IOW		IMR
		BS		FLAG1,MOTORL_ON
		BS		FLAG1,MOTORR_ON
		ENI					;enable the intterrupt

LOOP2:
		WDTC
		MOV		A,@0X64
		XOR		A,SLEEP_FLAG
		JBS		STATUS,Z
		JMP		LOOP2

		CLR		SLEEP_FLAG
		
		DISI	
		
			
		
		MOV		A,@0X00
		IOW		P5CR
		MOV		A,@0X00
		MOV		PORT5,A
		
		MOV		A,@0X0F
		IOW		P6CR
		MOV		A,@0X00
		MOV		PORT6,A
		
		MOV		A,@0XF0
		IOW		PHCR
		
		MOV		A,@0X00
		IOW		WDTCR
		
		MOV		A,@0X00
		IOW		0X0F
		
		MOV 	PORT6,PORT6
		
		MOV		A,@0X02
		MOV		WPC,A

		SLEP
		
		
WAKE_UP:
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		
		DISI				;colse the intterrupt
        WDTC
		
		MOV		A,@0X8C		;close the WDT
		IOW		WDTCR
		
		MOV		A,@0X00
		MOV		WPC,A
		
		MOV		A,@0X00		;PORT6 set as output
		IOW		P6CR
		MOV		A,@0X60
		IOW		P5CR
		MOV		A,@0X0F
		IOW		PHCR	
		MOV		A,@0X01     ;enable TCC time intterrupt flag
		IOW		IMR
		ENI					;enable the intterrupt
		
		JMP		LOOP2
		

			

⌨️ 快捷键说明

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