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

📄 ver30.asm

📁 用一片单片机控制两个直流无刷电机运转,所以可有效的控制两个直流无刷电机的同步运转
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	addwf fsr,f
	goto addallstoptimeloop
allstoptimeend
	incf topdatacountreg,f
	call threelowtonesub
	return

;***************************
;改变所有画的停留时间为20s子程序
;***************************
allstoptime3keysub
	;call delaysub	;
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw allstoptime3key	;是否为allstoptimekey按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	return
waitnotallstoptime3key
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw allstoptime3key	;是否为allstoptimekey按钮
	subwf remotetemp,w	;remotetemp-w
	btfsc status,z		;=0?
	goto waitnotallstoptime3key	;等待直到放开按键
	movlw d'6'
	movwf stoptimereg
	call stoptimesub
	return

;*****************
;改变停留时间子程序
;*****************
stoptimesub
	decf topdatacountreg,f
	movlw topstart
	movwf fsr	;取出第一个延时参数
allstoptime3loop
	movf stoptimereg,w
	movwf indf		;保存数据3
	movlw topstart
	addwf topdatacountreg,w	;所有数据是否更改完
	subwf fsr,w
	btfsc status,z
	goto allstoptime3end
	movlw 04h
	addwf fsr,f
	goto allstoptime3loop
allstoptime3end
	incf topdatacountreg,f
	call threelowtonesub
	return


;**************
;高速子程序
;**************
highspeedkeysub
;	;call delaysub	;
;	call delaysub
;	movlw remotemask
;	andwf remote,w	;读取遥控器输入数据
;	movwf remotetemp	
;	movlw highspeedkey	;是否为highspeedkey按钮
;	subwf remotetemp,w	;remotetemp-w
;	btfss status,z		;=0?
;	return
;waitnothighspeedkey
;	call delaysub
;	movlw remotemask
;	andwf remote,w	;读取遥控器输入数据
;	movwf remotetemp	
;	movlw highspeedkey	;是否为highspeedkey按钮
;	subwf remotetemp,w	;remotetemp-w
;	btfsc status,z		;=0?
;	goto waitnothighspeedkey	;等待直到放开按键
;	bcf storeflag	;数据需要保存
;	movlw upsametimelowspeedadcmax
;	movwf upsametimelowspeedreg
;	movlw downsametimelowspeedadcmax
;	movwf downsametimelowspeedreg
	call threelowtonesub
	return
;**************
;中速子程序
;**************
medspeedkeysub
;	;call delaysub	;
;	call delaysub
;	movlw remotemask
;	andwf remote,w	;读取遥控器输入数据
;	movwf remotetemp	
;	movlw medspeedkey	;是否为medspeedkey按钮
;	subwf remotetemp,w	;remotetemp-w
;	btfss status,z		;=0?
;	return
;waitnotmedspeedkey
;	call delaysub
;	movlw remotemask
;	andwf remote,w	;读取遥控器输入数据
;	movwf remotetemp	
;	movlw medspeedkey	;是否为medspeedkey按钮
;	subwf remotetemp,w	;remotetemp-w
;	btfsc status,z		;=0?
;	goto waitnotmedspeedkey	;等待直到放开按键
;	bcf storeflag	;数据需要保存	
;	movlw upsametimelowspeedadc
;	movwf upsametimelowspeedreg
;	movlw downsametimelowspeedadc
;	movwf downsametimelowspeedreg	
	call threelowtonesub
	return
;**************
;低速子程序
;**************
lowspeedkeysub
;	;call delaysub	;
;	call delaysub
;	movlw remotemask
;	andwf remote,w	;读取遥控器输入数据
;	movwf remotetemp	
;	movlw lowspeedkey	;是否为lowspeedkey按钮
;	subwf remotetemp,w	;remotetemp-w
;	btfss status,z		;=0?
;	return
;waitnotlowspeedkey
;	call delaysub
;	movlw remotemask
;	andwf remote,w	;读取遥控器输入数据
;	movwf remotetemp	
;	movlw lowspeedkey	;是否为lowspeedkey按钮
;	subwf remotetemp,w	;remotetemp-w
;	btfsc status,z		;=0?
;	goto waitnotlowspeedkey	;等待直到放开按键
;	bcf storeflag	;数据需要保存
;	movlw upsametimelowspeedadcmin
;	movwf upsametimelowspeedreg
;	movlw downsametimelowspeedadcmin
;	movwf downsametimelowspeedreg	
	call threelowtonesub
	return

;***********************
;使所有画面停留时间为1min
;***********************
stoptime1minkeysub
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw stoptime1minkey	;是否为stoptime1minkey按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	return
waitnotstoptime1minkey
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw stoptime1minkey	;是否为stoptime1minkey按钮
	subwf remotetemp,w	;remotetemp-w
	btfsc status,z		;=0?
	goto waitnotstoptime1minkey	;等待直到放开按键
	bcf storeflag	;数据需要保存	
	movlw d'18'
	movwf stoptimereg
	call stoptimesub
	return

;***********************
;使所有画面停留时间为5min
;***********************
stoptime5minkeysub
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw stoptime5minkey	;是否为stoptime5minkey按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	return
waitnotstoptime5minkey
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw stoptime5minkey	;是否为stoptime5minkey按钮
	subwf remotetemp,w	;remotetemp-w
	btfsc status,z		;=0?
	goto waitnotstoptime5minkey	;等待直到放开按键
	bcf storeflag	;数据需要保存	
	movlw d'31'
	movwf stoptimereg
	call stoptimesub
	return

;***********************
;使所有画面停留时间为10min
;***********************
stoptime10minkeysub
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw stoptime10minkey	;是否为stoptime10minkey按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	return
waitnotstoptime10minkey
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw stoptime10minkey	;是否为stoptime10minkey按钮
	subwf remotetemp,w	;remotetemp-w
	btfsc status,z		;=0?
	goto waitnotstoptime10minkey	;等待直到放开按键
	bcf storeflag	;数据需要保存	
	movlw d'52'
	movwf stoptimereg
	call stoptimesub
	return

;**************
;延时10S子程序
;**************
delay10ssub
	;movlw d'10'
	movf delaytemp,w
	movwf delay10scount1
delay10sloop3
	movlw d'250'
	;movlw d'100'
	movwf delay10scount2
delay10sloop2
	clrf tmr1L	;TIMER1为0
	clrf tmr1h
	bsf t1con,tmr1on	;启动TIMER1
delay10sloop1
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw stopandrunkey	;是否为stopandrunkey按钮
	subwf remotetemp,w	;remotetemp-w
	btfss status,z		;=0?
	goto otherkey

waitnokey
	call delaysub
	movlw remotemask
	andwf remote,w	;读取遥控器输入数据
	movwf remotetemp	
	movlw stopandrunkey	;是否为stopandrunkey按钮
	subwf remotetemp,w	;remotetemp-w
	btfsc status,z		;=0?
	goto waitnokey	;等待直到放开按键
	bsf changeparameterflag
	call threelowtonesub
	return	;返回

otherkey
	call voltagecomparesub ;比较电压低于规定值则断开蓄电池并保存数据
	btfss mode
	goto nostop
	bcf runmodeflag	;处于参数设置状态
	return
nostop	
	btfss pir1,tmr1if	;时间到?
	goto delay10sloop1
	bcf pir1,tmr1if
	decfsz delay10scount2,f
	goto delay10sloop2
	decfsz delay10scount1,f
	goto delay10sloop3
	bcf t1con,tmr1on
	return
;*************
;adc转换子程序
;*************
readadcsub
	;bsf adcon0,go
	btfss pir1,adif	;is adc ready?
	goto readadcsub	;no then return
	bcf pir1,adif
	bsf adcon0,go	;restart adc
	movf adresh,w	;get adc result
	movwf adcvoltage	;save result in speed control threshold
	;movwf adc
	return

;****************
;判断电压是否过低
;****************
voltagelowsub
	bsf adcon0,go		;开始转换
	call readadcsub		;读取输入电压
	;movlw 06fh			;电压是否大与22V?
	movf voltagecompare,w
	subwf adcvoltage,w
	btfsc status,c			
	return
	bsf systemerror
	bsf voltagelowflag	;电压低标志
	return
;*******************
;保存数据后处理子程序
;*******************
afterwritedosub
	bsf relaycontrol	;关闭蓄电池
	call delaysub		;延时一段时间后判断电压是否为高电平
	call delaysub
waitturnonvoltage
	;movlw turnonvoltage	;电压比较值(22.5V)(2.65v以下为7eh,2.65v以上为82h)
	movf turnonvoltagereg,w
	MOVWF VOLTAGECOMPARE
	;bsf adcon0,go		;开始转换
	call readadcsub		;读取输入电压
	movf voltagecompare,w
	subwf adcvoltage,w
	btfss status,c		
	goto waitturnonvoltage
	bcf relaycontrol	;大于22V则打开蓄电池
	call readdatasub
	bcf voltagelowflag
	bcf systemerror
	return
;*****************************
;电压低于规定值后不能运转子程序
;*****************************
cannotrunvoltagesub
	movlw cannotrunvoltage		;电压是否低于18V
	movwf voltagecompare
	call voltagelowsub
	btfss voltagelowflag
	return
	call writedatasub
	call afterwritedosub
	return
;**********************
;电压比较子程序
;**********************
voltagecomparesub
	;movlw turnoffvoltage	;电压比较值(22DCV)(2.65v以下为7ch,2.65v以上为80h)
	movf turnoffvoltagereg,w
	movwf voltagecompare
	call voltagelowsub
	btfss voltagelowflag
	return
	call writedatasub	;电压过低则保存数据
	call afterwritedosub	;保存数据后处理
	return

;***************
;读取数据子程序
;***************
readdatasub
				;bank0数据的读取
	movlw flag
	movwf fsr
	movlw topcount	;BANK0最后一个需要保存到EEPROM中的地址
	movwf storedatacountreg
	incf storedatacountreg,f
	movlw flag		;BANK0中第一个需要保存到EEPROM中的地址
	subwf storedatacountreg,f	;需要保存的数据个数
	movf storedatacountreg,w
	movwf count4
	banksel eeadr
	clrf eeadr	;地址为0
	call bankreaddatasub
	
				;bank1数据的读取
	movlw topstart
	movwf fsr
	;movlw storedatacount	;bank1需要保存的数据个数
	movlw d'79'
	subwf topdatacountreg,w
	btfss status,c
	goto lessthan79
	movlw d'79'
	movwf topdatacountreg
lessthan79
	movf topdatacountreg,w 
	movwf count4
	movf storedatacountreg,w
	banksel eeadr
	movwf eeadr	;地址为storedatacountreg
	call bankreaddatasub
	return

;********************
;BANK的数据读数据子程序
;********************
bankreaddatasub
	
;	movlw flag	;内存起始地址
;	movwf fsr
;	banksel count4
;	movlw topcount	;BANK0最后一个需要保存到EEPROM中的地址
;	movwf storedatacountreg
;	incf storedatacountreg,f
;	movlw flag		;BANK0中第一个需要保存到EEPROM中的地址
;	subwf storedatacountreg,w	;需要保存的数据个数
;	movwf count4
READLOOP
	banksel eecon1	;设为BANK1
	bcf eecon1,eepgd
	bsf eecon1,rd	;启动读操作
	;bcf status,rp0	;设为BANK0
	banksel eedata
	movf eedata,w
	movwf indf	;读取数据到内存
	INCF EEADR,f	;地址加1
	incf fsr,f
	banksel count4
	DECFSZ COUNT4,F
	GOTO READLOOP
	return
;***************
;保存数据子程序
;***************
Writedatasub
	btfsc storeflag	;数据是否已保存
	return	;已保存则返回
			;没有保存则需要保存
				;bank0数据的保存
	movlw flag
	movwf fsr
	movlw topcount	;BANK0最后一个需要保存到EEPROM中的地址
	movwf storedatacountreg
	incf storedatacountreg,f
	movlw flag		;BANK0中第一个需要保存到EEPROM中的地址
	subwf storedatacountreg,f	;需要保存的数据个数
	movf storedatacountreg,w
	movwf count4
	banksel eeadr
	clrf eeadr	;地址为0
	call bankwritedatasub
	
				;bank1数据的保存
	movlw topstart
	movwf fsr
	;movlw storedatacount	;bank1需要保存的数据个数
	movf topdatacountreg,w
	movwf count4
	movf storedatacountreg,w
	banksel eeadr
	movwf eeadr	;地址为storedatacountreg
	call bankwritedatasub
	
	bsf storeflag
	return

;********************
;bank 数据的保存子程序
;********************
bankwritedatasub
	;banksel eeadr
	;clrf eeadr	;地址为0
bank0w3	
	;bsf status,rp0	;设为BANK1
bank0w1
	banksel eecon1
	bcf eecon1,eepgd	
	BTFSC EECON1,WR
	GOTO bank0W1
	;BCF STATUS,RP0
	banksel eedata
	MOVF indf,W	;数据放在EEDATA
	MOVWF EEDATA
	;BSF STATUS,RP0
	banksel eecon1
	BSF EECON1,WREN
	MOVLW 55H	;固定的5指令序列
	MOVWF EECON2
	MOVLW 0AAH
	MOVWF EECON2
	BSF EECON1,WR	;启动写操作
	BCF EECON1,WREN	;禁止写操作发生
bank0w11
	btfsc eecon1,wr
	goto bank0w11
	;bcf eecon1,eeif
	;bcf status,rp0
	incf fsr,f
	banksel eeadr
	incf eeadr,f
	banksel count4
	decfsz	count4,f
	goto bank0w3
	;bsf storeflag
	return
	

;****************
;延时子程序(10ms)

⌨️ 快捷键说明

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