📄 control.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 + -