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

📄 control.asm

📁 用直流无刷电机控制电动门的运转,可已省掉机械定位装置
💻 ASM
字号:

	title this is a program for rolling door controller
;version1.1
;下端定位
;名称定义和变量定义
	F0 EQU 0
	RTCC EQU 1
	PC EQU 2
	STATUS EQU 3
	FSR EQU 4
	RA EQU 5
	RB EQU 6
	W EQU 0
	F EQU 1
	Z EQU 2
	C EQU 0
	;输出变量
	DIRECTION EQU 0	;电机正反转运转(RA)
	BRAKE EQU 1		;电机刹车控制(RA)
	LOCK EQU 2		;电机制动控制(RA)
	;输入变量
	PULSEIN EQU 3		;脉冲输入(RA)
	up equ 2	;门向上运动
	stop equ 1	;门停止运动
	down equ 0	;门向下运动
	LOCKIN EQU 3	;遥控锁输入,电压低于18V时输入
	CONTINUEUP EQU 4	;门持续向上运动(RB)
	CONTINUEDOWN EQU 5	;门持续向下运动(RB)
	
	TOPHIG EQU 10H	;门的上限位置
	TOPMED EQU 11H
	TOPLOW EQU 12H
	PULSEHIG EQU 13H	;脉冲数
	PULSEMED EQU 14H
	PULSELOW EQU 15H
	BOTTOMHIG EQU 16H	;门的下限位置
	BOTTOMMED EQU 17H
	BOTTOMLOW EQU 18H
	COUNT1 EQU 19H	;计数器
	COUNT2 EQU 1AH	;延时计数
	COUNT3 EQU 1cH	;计数器
	count4 equ 1dh
	count5 equ 1eh
	count6 equ 1fh

	FLAG EQU 1BH	;标志
	ERRORFLAG EQU 0	;电机异常状态标志
	topflag equ 1	;门到上端位置标志
	bottomflag equ 2	;门到下端位置标志
	updelayflag equ 5	;上升延时标志
	downdelayflag equ 6	;下降延时标志
	highflag  equ 7	;高电平标志
	RESETADD EQU 1FFH

;开始
	ORG RESETADD
	GOTO MAIN
	ORG 0
;子程序区


;***************
;***************
;上升子程序*****
;***************
;***************
UPSUB:
	MOVLW 40			;为低电平则延时,确保低电平有足够的宽度
	MOVWF COUNT2
upsubloop1
	DECFSZ COUNT2,F
	GOTO upsubLOOP1
	btfss rb,up
	goto upback	;没有按钮按下,则结束
	btfss rb,lockin	;输入电压是否高于22V
	goto upback		;低于22V则结束
	BTFSC FLAG,ERRORFLAG	;电机是否发生了异常
	goto upback
	btfsc flag,topflag	;门是否在上端位置
	goto upback
	btfsc rb,stop	;停止按钮有无按下.
	goto upback	;有则结束
	bcf ra,direction	;门上升
				;判断当前状态
	btfsc ra,pulsein	;当前输入是否为低电平
	goto upsubhigh	;设置当前状态为高电平
	bcf flag,highflag	;设置当前状态为低电平
	goto upstart1
upsubhigh
	bsf flag,highflag ;设置当前状态为高电平
upstart1
	bcf flag,updelayflag
	CLRF RTCC	;开始计时
UPBRAN1
	MOVF PULSELOW,W	;比较PULSELOW和TOPLOW是否相等
	SUBWF TOPLOW,W	
	BTFSS STATUS,Z
	GOTO	UPBRAN2	;不等则上升
	MOVF PULSEMED,W	;相等则比较PULSEMED和TOPMED是否相等
	SUBWF TOPMED,W
	BTFSS STATUS,Z
	GOTO	UPBRAN2	;不等则上升
	MOVF PULSEHIG,W	;相等则比较PULSEHIG和TOPHIG是否相等
	SUBWF TOPHIG,W
	BTFSC STATUS,Z
	GOTO	UPEND1		;相等则停止上升
UPBRAN2
	bcf ra,lock	;制动系统不起作用
	bcf ra,brake
	CALL UPCOUNTSUB	;对脉冲数进行计数
	BTFSC FLAG,ERRORFLAG	;电机发生异常?
	GOTO UPEND		;电机发生异常
	BTFSC RB,STOP	;停止按钮是否按下
	GOTO upend		;停止按钮按下则门停止上升
	bcf flag,bottomflag	;清除下端位置标志
	GOTO UPBRAN1	;转到UPBRAN1
upend1
	bsf flag,topflag	;设置门到上端位置标志
UPEND
	BSF RA,BRAKE	;电机停止上升
	BSF RA,DIRECTION
	BSF RA,LOCK		;制动系统起作用
	clrf rtcc
	bsf flag,updelayflag
	clrf count1
updelayloop
	CALL UPCOUNTSUB	;计数
	movlw 0ffh
	SUBWF RTCC,W
	BTFSS STATUS,C
	goto updelayloop
	incf count1,f
	movlw 0ah	
	subwf count1,w
	btfss status,z
	goto updelayloop
	clrf count1
	bcf flag,updelayflag
upback
	RETLW 0

;***********
;***********
;下降子程序*
;***********
;***********
DOWNSUB
	MOVLW 40			;为低电平则延时
	MOVWF COUNT2
downsubloop1
	DECFSZ COUNT2,F
	GOTO downsubLOOP1
	btfss rb,down
	goto downback
	btfss rb,lockin	;电压是否低于20V
	GOTO downback	;低于20V则结束
	btfsc flag,errorflag
	goto downback
	btfsc flag,bottomflag
	goto downback
	btfsc rb,stop	;停止按钮有无按下.
	goto downback	;有则结束

	BSF RA,DIRECTION	;电机下降,电机引出线端视逆时针方向
	btfsc ra,pulsein	;当前输入是否为低电平
	goto downsubhigh	;设置当前状态为高电平
	bcf flag,highflag	;设置当前状态为低电平
	goto downstart
downsubhigh
	bsf flag,highflag ;设置当前状态为高电平
downstart
	bcf flag,downdelayflag
	clrf rtcc
DOWNSUB1
	MOVF PULSELOW,W	;比较PULSELOW和BOTTOMLOW是否相等
	SUBWF BOTTOMLOW,W	
	BTFSS STATUS,Z
	GOTO	DOWNBRAN1	;不等则下降
	MOVF PULSEMED,W	;相等则比较PULSEMED和BOTTOMMED是否相等
	SUBWF BOTTOMMED,W
	BTFSS STATUS,Z
	GOTO	DOWNBRAN1	;不等则下降
	MOVF PULSEHIG,W	;相等则比较PULSEHIG和BOTTOMHIG是否相等
	SUBWF BOTTOMHIG,W
	BTFSC STATUS,Z
	GOTO	DOWNEND		;相等则停止下降
DOWNBRAN1		
	bcf ra,lock
	bcf ra,brake	;去掉刹车门开始下降
	CALL DOWNCOUNTSUB		;对脉冲数进行计数
	BTFSC FLAG,ERRORFLAG
	GOTO DOWNEND1
	BTFSC RB,STOP		;停止按钮是否按下
	GOTO downend1		;停止按钮按下则转到DOWNend1
	bcf flag,topflag	;清除门到上端位置标志
	GOTO DOWNSUB1		;转到DOWNSUB1
downend
	bsf flag,bottomflag
DOWNEND1
	BSF RA,BRAKE		;门停止下降
	BSF RA,DIRECTION
	BSF RA,LOCK			;制动系统起作用
	bsf flag,downdelayflag
	clrf count1
	clrf rtcc
downdelayloop
	CALL DOWNCOUNTSUB
	MOVLW 0ffh			;判断电机是否停止运转
	SUBWF RTCC,W
	BTFSS STATUS,C
	goto downdelayloop
	INCF COUNT1,F
	movlw 0ah
	subwf count1,w
	btfss status,z
	goto downdelayloop
	clrf count1
	bcf flag,downdelayflag
downback
	RETLW 0


	
;****************
;****************
;持续上升子程序**
;****************
;****************
CONTINUEUPSUB
	BTFSC FLAG,ERRORFLAG	;电机是否异常
	RETLW 0
	bcf flag,topflag
	bcf flag,bottomflag
	bcf flag,updelayflag
	bcf ra,lock			;制动系统不起作用
	BCF RA,DIRECTION	;电机上升(电机位于左边)
	BCF RA,BRAKE	;去掉刹车
	clrf rtcc
	btfsc ra,pulsein	;当前输入是否为低电平
	goto cuhigh		;设置当前状态为高电平
	bcf flag,highflag	;设置当前状态为低电平
	goto continueupbran1
cuhigh
	bsf flag,highflag ;设置当前状态为高电平
CONTINUEUPBRAN1
	BTFSC RB,CONTINUEUP	;持续上升按钮是否按下
	GOTO	CONTINUEUPEND	;没有按下停止上升
	CALL UPCOUNTSUB		;按下则调用上升计数子程序
	BTFSC FLAG,ERRORFLAG	;电机是否发生异常
	GOTO CONTINUEUPEND	;电机发生异常现象
	GOTO CONTINUEUPBRAN1	
CONTINUEUPEND
	BSF RA,BRAKE		;电机停止运转
	bsf ra,direction
	bsf ra,lock			;制动系统起作用
	MOVF PULSELOW,W	;是则设置上限位置值
	MOVWF TOPLOW
	MOVF PULSEMED,W
	MOVWF TOPMED
	MOVF PULSEHIG,W
	MOVWF TOPHIG

	RETLW 0

;*****************
;*****************
;持续下降子程序***
;*****************
;*****************
CONTINUEDOWNSUB
	BTFSC FLAG,ERRORFLAG	;电机是否异常
	RETLW 0
	bcf flag,topflag
	bcf flag,bottomflag
	bcf flag,downdelayflag
	bcf ra,lock			;制动系统不起作用
  	BSF RA,DIRECTION	;电机下降
	BCF RA,BRAKE	;去掉刹车
	clrf count3
	CLRF RTCC
	btfsc ra,pulsein	;当前输入是否为低电平
	goto cdhigh		;设置当前状态为高电平
	bcf flag,highflag	;设置当前状态为低电平
	goto continuedownbran1
cdhigh
	bsf flag,highflag ;设置当前状态为高电平
CONTINUEDOWNBRAN1
	BTFSC RB,CONTINUEDOWN	;持续下降按钮是否按下
	GOTO CONTINUEDOWNEND	;没有按下则停止下降
	CALL DOWNCOUNTSUB		;按下则调用下降计数子程序
	BTFSC FLAG,ERRORFLAG	;电机是否发生异常
	GOTO CONTINUEDOWNEND	;电机发生异常
	GOTO CONTINUEDOWNBRAN1
CONTINUEDOWNEND
	BSF RA,BRAKE		;电机刹车
	bsf ra,direction
	bsf ra,lock			;制动系统起作用
	MOVF PULSELOW,W	;是则设置上限位置值
	MOVWF TOPLOW
	MOVF PULSEMED,W
	MOVWF TOPMED
	MOVF PULSEHIG,W
	MOVWF TOPHIG

	RETLW 0

;************
;************
;上升计数****
;************
;************
UPCOUNTSUB
	BTFSC RA,PULSEIN		;脉冲是否为低电平
	goto uphigh		;不为低电平则转到高电平
	btfss flag,highflag	;原来为高电平吗?
	goto 	upcountend		;不为高电平则结束
	bcf flag,highflag		;设置当前状态为低电平
	bcf count3,0
	goto upcount		;计数
uphigh
	btfsc flag,highflag	;原来为低电平吗?
	goto	upcountend		;不为低电平则结束
	bsf flag,highflag		;设置当前状态为高电平
	bsf count3,0
UPCOUNT
	btfsc count3,0
	goto upcountend
	btfss flag,updelayflag	
	CLRF RTCC	;计时重新开始
	MOVLW 1			;PULSELOW+1
	ADDWF PULSELOW,F
	BTFSS STATUS,C		;有无进位
	RETLW 0		;无进位则结束
	MOVLW 1			;有进位则PULSEMED+1
	ADDWF PULSEMED,F
	BTFSC STATUS,C		;有无进位
	INCF PULSEHIG,F		;有进位则PULSEHIG+1
	RETLW 0
UPCOUNTEND
	btfsc flag,updelayflag
	retlw 0
	MOVLW 0ffH			;判断电机是否停止运转
	SUBWF RTCC,W
	BTFSC STATUS,C
	BSF FLAG,ERRORFLAG	;设置电机异常标志
	RETLW 0

;***********
;***********
;下降计数***
;***********
;***********
DOWNCOUNTSUB
	BTFSC RA,PULSEIN		;脉冲是否为低电平
	goto downhigh		;不为低电平则转到高电平
	btfss flag,highflag	;原来为高电平吗?
	goto 	downcountend	;不为高电平则结束
	bcf flag,highflag		;设置当前状态为低电平
	bsf count3,0
	goto downcount		;计数
downhigh
	btfsc flag,highflag	;原来为低电平吗?
	goto	downcountend	;不为低电平则结束
	bsf flag,highflag		;设置当前状态为高电平
	bcf count3,0
DOWNCOUNT
	btfsc count3,0
	goto downcountend
	btfss flag,downdelayflag
	CLRF RTCC	;计时重新开始
	movlw 1
	SUBWF PULSELOW,F		;PULSELOW-1
	BTFSC	STATUS,C		;有无借位
	RETLW 0		;无借位则结束
	MOVLW 1			;pulsemed-1
	SUBWF PULSEMED,F
	BTFSS STATUS,C		;有无借位
	DECF PULSEHIG,F		;有借位则PULSEHIG-1
	RETLW 0
DOWNCOUNTEND
	btfsc flag,downdelayflag
	retlw 0
	MOVLW 0ffh			;判断电机是否停止运转
	SUBWF RTCC,W
	BTFSC STATUS,C
	BSF FLAG,ERRORFLAG	;设置电机异常标志
	RETLW 0
;********
;********
;主程序**
;********
;********
MAIN
	movlw 0ffh
	movwf ra
	MOVLW 0f8H	;设置RA口(0,1为输出,2,3为输入)
	TRIS RA
	movlw 07fh
	tris rb
	MOVLW 07H	;定时器方式,比率为1:256
	OPTION
	BSF RA,BRAKE	;电机刹车
	bsf ra,lock		;制动系统起作用
	bsf ra,direction
	CLRF TOPLOW
	CLRF TOPMED
	CLRF TOPHIG
	CLRF PULSELOW
	CLRF PULSEMED
	CLRF PULSEHIG
	CLRF BOTTOMLOW
	CLRF BOTTOMMED
	CLRF BOTTOMHIG
	CLRF COUNT1
	CLRF COUNT3
	CLRF FLAG
	btfsc ra,pulsein	;当前输入是否为低电平
	goto mainhigh		;设置当前状态为高电平
	bcf flag,highflag	;设置当前状态为低电平
	goto mainloop
mainhigh
	bsf flag,highflag ;设置当前状态为高电平
MAINLOOP
	BTFSC RB,UP	
	CALL UPSUB	;电机上升
	BTFSC RB,DOWN	
	CALL DOWNSUB	;电机下降
	BTFSS RB,CONTINUEUP
	CALL CONTINUEUPSUB	;电机持续上升
	BTFSS RB,CONTINUEDOWN
	CALL CONTINUEDOWNSUB	;电机持续下降
	btfsc rb,stop	;停止按钮按下以调整ERRORFLAG
	bcf flag,errorflag
	GOTO MAINLOOP
	END






	

⌨️ 快捷键说明

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