📄 08232x2.asm
字号:
IN TEMP0,TCNT0
LDI TEMP1,140
CLC
CP TEMP0,TEMP1
BRSH _RE50
RJMP _RE60
_RE50: LDI TCNTON,80 ;RELAY CLOSE (ON) DELAY
LDI TCNTOFF,80 ;RELAY OPEN (OFF) DELAY
LDI HZ,15
RJMP _MAIN
_RE60: LDI TCNTON,100 ;RELAY CLOSE (ON) DELAY
LDI TCNTOFF,100 ;RELAY OPEN (OFF) DELAY
LDI HZ,18
RJMP _MAIN
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
_MAIN: CLI
OUT TIMSK,TWO ;CLOCK INTERRUPT ENABLE
LDI PIN5CH,0 ;CLEAR THE PINB.2 CHANGE
LDI PIN3CH,0 ;CLEAR THE PINB.3 CHANGE
MOV CYCSTART,ZERO ;CLEAR THE POWER CYCLE ENDING
MOV COUNT,ZERO
MOV MANFIRST,ZERO
LDI DELAY0,100 ;DELAY 30SECS.
MOV DELAY1,HZ
RCALL WAIT
SEI
_M3: MOV CYCSTART,ZERO ;CLEAR THE POWER CYCLE ENDING
RCALL MAN
CPI PIN3CH,10
BREQ _M4
_M2: CP MANFIRST,ONE ;"1" SHI FOU YOU GUO YI CI SHOU DONG AN JIAN (WITHIN 30SEC.)
BRNE _M7 ;"0" MEI YOU GUO SHOU DONG KONG ZHI SHU RU, JIN RU SHUI MIAN.
RJMP _M5 ;"1" YOU GUO SHOU DONG SHU RU, JIN RU SENSOR KONG ZHI
_M4: MOV IO5,SIXTEEN
LDI PIN3CH,0
MOV IO3,PIN3
SBIC PINB,3
RJMP _M2 ;invalid manual on input, no operation, go to label-M2
LDI RELAYONOFF,2 ;valid manual on input, close the relay
RCALL WAIT ;go to sleep to waitting for a new cycstart then start the timer 0
MOV CYCSTART,ZERO
OUT TCNT0,TCNTON ;initial the relay close delay
OUT TCCR0,THREE ;set prescaler at 64
RCALL WAIT ;sleep
RCALL _JUDGE ;judge if the relay close at the zero point
_RELEASE:
SBIS PINB,3 ;waitting for manual on press be released
RJMP _RELEASE
IN PIN5,PINB ;get newly state of the pin5
AND PIN5,SIXTEEN
MOV IO5,PIN5
MOV COUNT,ZERO
MOV MANFIRST,ONE
LDI DELAY0,100 ;DELAY 30SECS.
MOV DELAY1,HZ
RCALL WAIT
RJMP _M3
_M5: CP COUNT,ONE ;no sensor input yet?
BREQ _M6 ;
RCALL SEC30 ;go on 30sec count backwards
CPI DELAY1,0 ;end of 30sec delay?
BRNE _M6
MOV COUNT,ZERO ;yes, clear the sensor input flag
MOV MANFIRST,ZERO ;clear the manual on input flag
LDI RELAYONOFF,3 ;open the relay
RCALL WAIT ;go to sleep
MOV CYCSTART,ZERO ;wake up, clear the cycle start flag
OUT TCNT0,TCNTOFF ;initial the relay open delay value
OUT TCCR0,THREE ;set the prescaler at 64
RCALL WAIT ;sleep again
RCALL _JUDGE ;judge the relay open at zero point or not
RJMP _MAIN ;return to the top
_M6: CPI CONFIRM,1 ;need confirm or not
BRNE _MM0 ;no, have no change in the pinb.5, go to normal scan
RJMP _MM1 ;yes, change have occur in the pinb.5, go to confirm the input state
_MM0: RCALL CTRL ;scan the pin5 input state change
CPI PIN5CH,2 ;eliminate the input tremble
BREQ _M8 ;change
SBIC PORTB,2 ;no change,sleep or warm up the relay coil
RJMP _M7
RCALL _PWMOUT ;warm up the relay coil
RJMP _M3
_MM1: RCALL ENSURE ;confirm the pin5 input state
CPI TEMP1,9
BREQ _M9
CPI TEMP2,9
BREQ _M9
SBIC PORTB,2
RJMP _M7
RCALL _PWMOUT ;warm up the relay coil
RJMP _M3
_M7: RCALL WAIT
RJMP _M3
_M8: MOV COUNT,ONE
LDI CONFIRM,1 ;needs confirm? 1="yes"; 0="no"
LDI PIN5CH,0
MOV IO5,PIN5
RJMP _M3
_M9: LDI CONFIRM,0
LDI TEMP1,0
LDI TEMP2,0
MOV IO5,PIN5
RCALL WAIT
MOV CYCSTART,ZERO
RCALL SCAN
RCALL WAIT
RCALL _JUDGE
MOV CYCSTART,ZERO
RCALL WAIT
RJMP _M3
;//////////////////////////////SUBPROGRAM SEGMENT///////////////////////////////////
;-----------------------ZERO CROSS SERVE SUBPROGRAM-------------------------
_JUDGE:
CPI RELAYONOFF,2
BREQ _ON
CPI RELAYONOFF,3
BREQ _OFF
RJMP _JR
_ON: LDI RELAYONOFF,0
SBIS PINB,1
RJMP _ON0
RJMP _ON1
_ON0: MOV NEUTSTAON,ZERO
RJMP _JR
_ON1: OUT TCCR0,THREE
OUT TCNT0,ZERO
_ON2: SBIC PINB,1
RJMP _ON2
OUT TCCR0,ZERO
IN TEMP0,TCNT0
ADD TCNTON,TEMP0
MOV NEUTSTAON,ONE
RJMP _JR
_OFF: LDI RELAYONOFF,0
SBIC PINB,1
RJMP _OFF1
RJMP _OFF0
_OFF1: MOV NEUTSTAOFF,ONE
RJMP _JR
_OFF0: OUT TCCR0,THREE
OUT TCNT0,ZERO
_OFF2: SBIS PINB,1
RJMP _OFF2
OUT TCCR0,ZERO
IN TEMP0,TCNT0
ADD TCNTOFF,TEMP0
MOV NEUTSTAOFF,ZERO
RJMP _JR
_JR: RET
;-----------------------WAITTING FOR THE FALLING EDGE OF PINB.0-----------------------
WAIT: SBIS PINB,0
RJMP WAIT
WAIT1: SBIC PINB,0
RJMP WAIT1
MOV CYCSTART,ONE
RET
;----------------------RELAY'S COIL WARN UP SERVE SUBPROGRAM-----------------
_PWMOUT:
SBI PORTB,2
CBI PORTB,2
SBIS PINB,0
RJMP _PWMOUT
_PWM0: SBIS PINB,0
_PWMR: RET
SBI PORTB,2
NOP
CBI PORTB,2
RJMP _PWM0
;**********************************INTERRUPT SERVE SEGMENT****************************
INTT:
MOV CYCSTART,ONE ;set the power cycle start flag
IR: RETI
;++++++++++TIMER0 OVERFLOW INTERRUPT SERVE SEGMENT++++++++++++++++++++++++++
TOV:
OUT TCCR0,ZERO ;INABLE THE TIMER COUNTER
CPI RELAYONOFF,3
BREQ T0
CPI RELAYONOFF,2
BREQ T1
RJMP TR
T0: CBI PORTB,2
CPI NEUTSTAOFF,1
BRNE T00
DEC TCNTOFF
RJMP TR
T00: INC TCNTOFF
RJMP TR
T1: SBI PORTB,2
CPI NEUTSTAON,1
BREQ T11
DEC TCNTON
RJMP TR
T11: INC TCNTON
TR: RETI
;//////////////////////////////SUBPROGRAM SEGMENT///////////////////////////////////
;+++++++++++++++++++++++++++++++JUDGE THE MANUAL ON INPUT++++++++++++++++++++++
MAN: IN PIN3,PINB
AND PIN3,EIGHT
CP IO3,PIN3
BRNE MA1
RJMP MA2
MA1: INC PIN3CH
RJMP MAR
MA2: LDI PIN3CH,0
MAR: RET
;----------------------30sec RELAY Delay open count backwards-----------------
SEC30: DEC DELAY0
CPI DELAY0,0
BRNE SECR
DEC DELAY1
CPI DELAY1,0
BREQ SECR
LDI DELAY0,100
SECR: RET
;-------------------JUDGE THE sensor input state-----------------------------
CTRL: IN PIN5,PINB
AND PIN5,SIXTEEN
CP IO5,PIN5
BRNE CT1
RJMP CT2
CT1: INC PIN5CH
RJMP CTR
CT2: LDI PIN5CH,0
CTR: RET
;-------------------confirm the sensor input state---------------------------
ENSURE: IN PIN5,PINB
AND PIN5,SIXTEEN
LDI TEMP0,0X20
CP PIN5,TEMP0
BRNE E1
RJMP E2
E1: INC TEMP1
LDI TEMP2,0
RJMP ER
E2: INC TEMP2
LDI TEMP1,0
ER: RET
;-----------------------------get the sensor input state-----------------------
SCAN: SBIS PINB,5 ;PINB.5'S STATEMNET
RJMP S1 ;1
RJMP S2 ;0
S1: OUT TCNT0,TCNTON
OUT TCCR0,THREE ;ENABLE THE TIMER
LDI RELAYONOFF,2 ;RELAY ON
RJMP S3
S2: OUT TCNT0,TCNTOFF
OUT TCCR0,THREE ;ENABLE THE TIMER
LDI RELAYONOFF,3 ;RELAY OFF
S3: RET
;-----------------------GO TO SLEEP-----------------------------------------
SLEEPP: OUT MCUCR,SLEEPMODE
SLEEP
OUT MCUCR,INTMODE
CP CYCSTART,ONE
BRNE SLEEPP
RET
;-----------------------ZERO CROSS SERVE SUBPROGRAM-------------------------
JUDGE:
CPI RELAYONOFF,2
BREQ ON
CPI RELAYONOFF,3
BREQ OFF
RJMP JR
ON: LDI RELAYONOFF,0
SBIS PINB,0
RJMP ON0
RJMP ON1
ON0: MOV NEUTSTAON,ZERO
RJMP JR
ON1: OUT TCCR0,THREE
OUT TCNT0,ZERO
ON2: SBIC PINB,0
RJMP ON2
OUT TCCR0,ZERO
IN TEMP0,TCNT0
ADD TCNTON,TEMP0
MOV NEUTSTAON,ONE
RJMP JR
OFF: LDI RELAYONOFF,0
SBIC PINB,0
RJMP OFF1
RJMP OFF0
OFF1: MOV NEUTSTAOFF,ONE
RJMP JR
OFF0: OUT TCCR0,THREE
OUT TCNT0,ZERO
OFF2: SBIS PINB,0
RJMP OFF2
OUT TCCR0,ZERO
IN TEMP0,TCNT0
ADD TCNTOFF,TEMP0
MOV NEUTSTAOFF,ZERO
RJMP JR
JR: RET
;----------------------RELAY'S COIL WARN UP SERVE SUBPROGRAM-----------------
PWMOUT:
SBI PORTB,2
NOP
CBI PORTB,2
NOP
CP CYCSTART,ONE
BRNE PWMOUT
RET
;------------------------25us 0DELAY------------------------------------------
DELAY10: ;JUDGE THE DIFFERENT FREQUENCY.
LDI TEMP0,20 ;1
D2: DEC TEMP0 ;1
CPI TEMP0,0 ;1
BRNE D2 ;1
RET ;4
;-----------------------1s DELAY---------------------------------------------
DELAY1S:
LDI TEMP2,5
DE00: LDI TEMP1,200
DE11: LDI TEMP0,200
DE22: DEC TEMP0
CPI TEMP0,0
BRNE DE22
DEC TEMP1
CPI TEMP1,0
BRNE DE11
DEC TEMP2
CPI TEMP2,0
BRNE DE00
RET
;---------------------+++ END +++---------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -