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

📄 08232x2.asm

📁 实现继电器开关在市电的零点闭合
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		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 + -