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

📄 avr165-46r47.asm

📁 数码管显示的接触式交流稳压器MCU46R47
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;cpu used ht46r47,fosc=8mhz
;designed by HL
;****************************************************
#INCLUDE HT46R47.INC 
 
CLK		equ		PA.4		;for the PA4 for the hd74h clock
SDA		equ		PA.5		;for the PA5 for the hd74h sda 

J1		equ		PA.3            ;define the J1(RL1)
J2		equ		PA.0            ;define the j2(RL2)
J3		equ		PA.1            ;define the j3(RL3)
J4		equ		PA.2		;define the J4(RL4)
dig0	        equ		PA.7		;for control which light 
dig1	        equ		PA.6
dig2	        equ		PD.0 

SW1		equ		PB.2		;for key delay 
SW2		equ		PB.3            ;for key input/output display
ON		EQU		1		
OFF		EQU		0

MAX_SAMPLE_TIME	EQU		20
ZERO_SAM_TIME   EQU             40;35	
AD_2V_VAL_LOW	EQU		204

_500ms          equ             100
_200ms          equ             80;40
_1s             EQU             200
_0s8            equ             160
_3s             equ             3
_4s             equ             4
_6sens          equ             6
_2mins          equ             180

RL1_pointL      EQU             167
RL1_pointH      EQU             175;176;178
RL2_pointL      EQU             205
RL2_pointH      EQU             213;216
RL3_pointL      equ             205;207;205
RL3_pointH      EQU             237
;*********************************************
;the following difine some variables 
;*********************************************
AD_EOF		EQU		ADCR.6
A_BACK		EQU		[40H]		;for store the acc back 
STATU_BACK	EQU		[41H]		;for store the  status register back
FLAG		EQU		[42H]		;FOR STORE THE FLAG 
sys_status0	equ	        flag.0		;sys_status1,sys_status0:00 is delay;01 is normal;
sys_status1	equ	        flag.1		;sys_status1,sys_status0:10 is high;11 is low.
bLED0	        EQU		FLAG.2
bLED1	        EQU		FLAG.3
bLED2	        EQU		FLAG.4
bSW_delay	equ	        flag.5
out_on          equ	        flag.6		;the flag when out is on
flash	        equ	        flag.7		;the flag when get to 1 second 
 
TEMP1		EQU		[43H]
TEMP2		EQU		[44H]
TEMP3		EQU		[45H]
TEMP4		EQU		[46H]
TEMP5		EQU		[47H]
TEMP6		EQU		[48H]
TEMP7           EQU             [49H]

disp_buf0	EQU		[4AH]
disp_buf1	EQU		[4BH]
disp_buf2	EQU		[4CH]

Vout_H	        EQU		[4DH]
Vout_L	        EQU		[4EH]
Vin_H   	EQU		[4FH]
Vin_L	        EQU		[50H]

Out_delay       equ             [51H]
DISP_POINT	EQU		[52H]
pro_delay       equ             [53H]
display_4s      equ             [54H]
DISP_DATA	EQU		[55H]
ITEMP		EQU		[56H]

CNT_5MS		EQU		[57H]
CNT_1S          EQU             [58H]
SAMPLETIME	EQU		[59H]	        ;FOR STORE THE SAMPLE TIME

relay_delay_time    EQU         [5AH]
disp_fresh      equ             [5BH]
FLAG1           EQU             [5CH]
RL1_status      equ             FLAG1.0
RL2_status      equ             FLAG1.1
RL3_status      equ             FLAG1.2
temp_status     equ             FLAG1.7

SW1_VALUE       EQU             [5DH]
check_temp_dly  equ             [5EH]

TEMP0           EQU             [5FH]

Vout_SUM_L      EQU             [78H]
Vout_SUM_H      EQU             [79H]
SUM_TIME        EQU             [7AH]
Vin_SUM_L       EQU             [7BH]
Vin_SUM_H       EQU             [7CH]


;===============================================

;CODE .SECTION 'CODE'
ORG 0h
	jmp begin
org 04h
	jmp isr_ext
org 08h
	jmp isr_tim0
org 0ch 
	jmp isr_adc
	
;========================================
;稳压继电器组别转换
;========================================	
avr_step0 macro
        clr j2
        clr j1
        clr j3
        endm   	
avr_step1 macro
        clr j2
        clr j1        
        set j3
        endm
avr_step2 macro
        Clr j2
	set j1
	clr j3
	endm
avr_step3 macro
        clr j2
        set j1
        set j3
        endm
avr_step4 macro
        set j2
        set j1
        clr j3
        endm
avr_step5 macro
        set j2
        set j1
        set j3
        endm	   	
;========================================
;THE MACRO TO ENABLE THE TIMER INTERRUPT 
;========================================
 ENABLE_TIMER MACRO
	;SET INTC.0
	SET INTC.2
ENDM
;========================================
;THE MACRO TO DISABLE THE TIMER 
;========================================
  DISABLE_TIMER MACRO
;========================================
	CLR INTC.2
ENDM 

;==================================
;THE FOLLOWING DEFINE SOME MACRO 
;==================================
OFF_ALL_LIGHT MACRO
	SET dig0
	SET dig1
	SET dig2
ENDM 
;===================================================
;the following define macro to send data to the disp_DATA
;===================================================
SEND_DISP_DATA macro disp_data
LOCAL ROTATE_LOOP,GIVE_HIGH,GIVE_CLK,LIT_H,EXIT_M
		mov a,8
		mov itemp,a
rotate_loop:
		sz disp_data.7
		jmp give_high
		clr sda
		jmp give_clk
give_high:
		set sda
give_clk:
		clr clk
		set clk
		clr clk
		sdz itemp		;judge counte if end rotate
		jmp lit_h
		jmp EXIT_M
lit_h:	
		rl disp_data
		jmp rotate_loop
EXIT_M:
endm
;======================================================
;THE FOLLOWING IS THE MACRO OF SWITCH THE WORKIGN LIGHT
;======================================================
WORK_LED MACRO ON_OFF
	IF ON_OFF
		SET BLED2
	ELSE
		CLR BLED2
	ENDIF
ENDM
;==================================================
;THE MACRO TO START THE ADC CONVERTER
;==================================================
ADC_START MACRO
	SET ADCR.6
	NOP
	CLR ADCR.7
	SET ADCR.7
	CLR ADCR.7
ENDM
;**********************************************************
;the following function to select channel 2 of ad converter
;***********************************************************
sel_channel_2  MACRO
	clr adcr.0
	set adcr.1
	clr adcr.2
ENDM
;**********************************************************
;the following function to select channel 1 of ad converter
;***********************************************************
sel_channel_1  MACRO
	set adcr.0
	clr adcr.1
	clr adcr.2
ENDM
;**********************************************************
;the following function to select channel 0 of the ad converter
;this time to scan the input vol value
;*************************************************************
sel_channel_0 MACRO
	clr adcr.0
	clr adcr.1
	clr adcr.2
ENDM 
;=======================================
;THE FOLLOWING IS THE EXTERNAL INTERRUPT
;=======================================
ISR_EXT:
	RETI

;===============================================
;THE FOLLOWING IS THE TIMER INTERRUPT SUBROUTINE 
;IN THIS PROGRAM EVERY 1MS EXECUTE ONCE ft=fsys/32
;===============================================
ISR_TIM0:
	mov a_back,a			;backup the acc register
	mov a,status
	mov statu_back,a		;backup the status register 
	SZ SAMPLETIME
	DEC SAMPLETIME		        ;IF SAMPLE!=0 REDUCE ONE
	INC CNT_5MS
	MOV A,5
	SUB A,CNT_5MS
	SNZ Z 
	JMP TIM_EXIT
	;=======time 5ms==========
	CLR CNT_5MS			;indicate that to 5ms select another one
	
	OFF_ALL_LIGHT			;CLOSE ALL LIGHT
	inc disp_point
	mov a,disp_point
	sub a,1
	sz z
	jmp point_first
	mov a,disp_point
	sub a,2
	sz z
	jmp point_second
	mov a,disp_point
	sub a,3
	sz z 
	jmp point_last
point_first:
	mov a,disp_buf0
	mov disp_data,a	
	SEND_DISP_DATA DISP_DATA
	CLR dig0
	JMP DISP_NEXT
point_second:
	mov a,disp_buf1
	mov disp_data,a
	SEND_DISP_DATA DISP_DATA
	CLR dig1
	JMP DISP_NEXT
point_last:
	mov a,disp_buf2
	mov disp_data,a
	SEND_DISP_DATA DISP_DATA
	CLR dig2
	CLR DISP_POINT	
DISP_NEXT:	
	;=======================
	sz  disp_fresh
	dec disp_fresh
	
TIM_FIRST:
        SZ  relay_delay_time
        DEC relay_delay_time
        ;=====time one secend=====
        sdz CNT_1S
        JMP tim_exit
        mov a,_1s
        mov CNT_1S,a
        
        sz  out_delay
        dec out_delay
        
        SZ  pro_delay
        DEC pro_delay
        
        SZ  check_temp_dly
        DEC check_temp_dly
        
        sz  display_4s
        dec display_4s

tim_exit:
	mov a,statu_back
	mov status,a			;restore status register
	mov a,a_back			;restore acc register
        RETI
;================================================
;THE FOLLOWING IS THE ADC INTERRUPT SUBROUTINE 
;================================================
ISR_ADC:
RETI


;================================================
;THE MAIN PROGRAM BEGINS HERE
begin:
;************************************************
       call  Initial_System
Main_loop:     

       call  Input_Module
       call  Detect_Module
       call  Output_Module       
       call  Regulate_Module
       call  Display_Module
       jmp   Main_loop
;================================================
Initial_System PROC
       MOV A,40H
       MOV MP,A
RAM_CLEAR:
       CLR IAR
       INC MP
       MOV A,MP
       SUB A,80H
       SNZ C
       JMP RAM_CLEAR       

       CLR INTC 
       CLR TMR
       CLR TMRC 
       Clr pa
       CLR pac		;SET THE PORTA OUTPUT
       MOV A,0FFH
       MOV pbc,a        ;SET PORTB INPUT	
       CLR pdc		;SET PORTC OUTPUT
       Clr pa
       
       Clr J1		;close ouput
       Clr j2
       Clr j3
       Clr J4
       SET dig0	        ;close all light 
       SET dig1
       SET dig2	
       MOV A,0FFH
       MOV disp_buf0,A
       MOV disp_buf1,A
       MOV disp_buf2,A
       CLR disp_fresh
       
       clr sys_status0
       clr sys_status1
       Clr bled0
       Clr bled1
       Clr bled2
       clr out_on
       set bSW_delay
       mov a,_6sens
       mov out_delay,a
       
       CLR temp_status
       CLR FLAG1
       clr display_4s


       Clr disp_point	;clear the light pointer
       CLR relay_delay_time
       mov a,_1s
       ;clr step
       mov CNT_1S,A       

       mov a,6;106;130
       mov tmr,a 
       mov a,95h	;FT =FSYS/32
       mov tmrc,a	;set the timer 
       ENABLE_TIMER
       SET INTC.0
       
       MOV A,1		;SET AD CONVERT FREQ IS FSYS/8
       MOV ACSR,A
       Clr adrl
       Clr adrh
       mov a,18h	;SET AD CONVERT CHANNEL AN1&AN0 AND CONTROL
       mov ADCR,a
       
       ret

Initial_System ENDP   
;================================================
Input_Module PROC
       ;----read SW2
       SZ   SW2
       JMP  exit_sw2
       MOV  A,_4S
       MOV  display_4s,a
              
exit_sw2:
       ;----sample input voltage
       SEL_CHANNEL_0
       CALL SAMPLE_VOLAGE
       MOV  A,TEMP2
       ADDM A,Vin_SUM_L
       MOV  A,TEMP1
       ADCM A,Vin_SUM_H
       
       ;----sample output voltage
       SEL_CHANNEL_1
       CALL SAMPLE_VOLAGE
          
       mov  a,temp2
       ADDM A,Vout_SUM_L
       mov  a,temp1
       adcm a,Vout_SUM_H
       inc  SUM_TIME
       MOV  A,SUM_TIME
       SUB  A,16
       SNZ  C
       JMP  read_delay
       clr  C
       rrc  Vout_SUM_H
       rrc  Vout_SUM_L
       clr  C
       rrc  Vout_SUM_H
       rrc  Vout_SUM_L
       clr  C
       rrc  Vout_SUM_H
       rrc  Vout_SUM_L
       clr  C
       rrc  Vout_SUM_H
       rrc  Vout_SUM_L    
       
       
       MOV  A,Vout_SUM_H
       MOV  Vout_H,A
       MOV  A,Vout_SUM_L
       MOV  Vout_L,A
    
       clr  C
       rrc  Vin_SUM_H
       rrc  Vin_SUM_L
       clr  C
       rrc  Vin_SUM_H
       rrc  Vin_SUM_L
       clr  C
       rrc  Vin_SUM_H
       rrc  Vin_SUM_L
       clr  C
       rrc  Vin_SUM_H
       rrc  Vin_SUM_L 
       
       mov  a,Vin_SUM_H
       MOV  Vin_H,A
       MOV  A,Vin_SUM_L
       mov  Vin_L,A   
    
       clr  Vout_SUM_H
       clr  Vout_SUM_L
       CLR  Vin_SUM_H
       CLR  Vin_SUM_L
       CLR  SUM_TIME
read_delay:       
       ;----read delay sw1
       SEL_CHANNEL_2 
       CALL SAMPLE_DELAY
       sz   out_on
       ret
       
       mov  a,SW1_VALUE
       sub  a,100
       sz   C
       JMP  delay_off
       snz  bSW_delay           ;delay on
       ret  
       mov  a,_2mins
       mov  out_delay,a
       clr  bSW_delay
       ret
delay_off:
       sz   bSW_delay
       ret
       mov  a,_6sens
       mov  out_delay,a
       set  bSW_delay
       ret
               
Input_Module ENDP
;=====================
SAMPLE_VOLAGE PROC
        CLR TEMP1
        CLR TEMP2
	CLR TEMP3
	CLR TEMP4
ONCE_CAL:
	clr TEMP5		;clear the sample sum value
	clr TEMP6
	CLR TEMP7               ;STORE SAMPLE TIMES

	ADC_START		;START THE AD CONVERTER
FIRST_LOOP:
	SZ AD_EOF
	JMP FIRST_LOOP
	MOV A, max_sample_time
	MOV SAMPLETIME,A
BEGIN_SAMPLE:
	NOP
	ADC_START		;START THE TIME
WAIT_SAMPLE_LOOP:
	SZ AD_EOF
	JMP WAIT_SAMPLE_LOOP
	SZ SAMPLETIME		;compare the sample to the maxi 20ms
	JMP NEED_CON
	JMP SAMPLE_END
NEED_CON:
	MOV A,ADRL
	MOV TEMP1,A		;move the adrh to temp1
	MOV A,ADRH
	MOV TEMP2,A
	RLC TEMP1
	RLC TEMP2
	CLR TEMP1
	RLC TEMP1		;TEMP1 STORE THE HIGH 1BIT, temp2 store the low 8bit
;=================
	MOV A,AD_2V_VAL_LOW
	MOV TEMP4,A
	CLR TEMP3
	MOV A,TEMP2
	SUBM A,TEMP4
	MOV A,TEMP1
	SBCM A,TEMP3
	SNZ C
	JMP LESS_THAN_204		;THE CURRENT VALUE <204 THEN JUMP
;ADD THE ABS TO SUM_L,SUM_H
TOTAL_SUBSTRACT:
	MOV A,TEMP4
	ADDM A,TEMP6
	MOV A,TEMP3
	ADCM A,TEMP5
	INC TEMP7			;COUNTER ADD ONE 
	JMP BEGIN_SAMPLE		;REPEAT THE NEXT ONE
;THE FOLLOWING INDICATE THAT SUBSTRACT LESS THEN 204
LESS_THAN_204:
	MOV A,AD_2V_VAL_LOW
	SUB A,TEMP2
	ADDM A,TEMP6
	MOV  A,0
	ADCM A,TEMP5
	INC TEMP7
	JMP BEGIN_SAMPLE
;==================	
SAMPLE_END:
	 ;NEED TO CALCULATE THE AVR VALUE IN TEMP5,TEMP6/TEMP7
	MOV A,TEMP6
	MOV TEMP4,A 
	MOV A,TEMP5
	MOV TEMP3,A 
	clr C 
	RLC TEMP6
	RLC TEMP5
	MOV  A,TEMP6
	ADDM A,TEMP4
	MOV  A,TEMP5
	ADCM A,TEMP3	;TEMP5,TEMP6*3-->TEMP3,TEMP4
;THE FOLLOWING THEN STILL_SUMH,STILL_SUML/TEMP7
	CLR TEMP6
	clr temp1
	clr temp2
sub_loop:
	mov a,TEMP4
	sub a,TEMP7
	mov TEMP4,a
	mov a,TEMP3
	sbc a,TEMP6
	mov TEMP3,a
	snz c 
	jmp sub_fini
	inc TEMP2
	SZ  TEMP2
	JMP SUB_LOOP
	INC TEMP1
	jmp  sub_loop
sub_fini:
	SZ  TEMP1
	jmp dir_regulate
	MOV a,200
	SUB a,TEMP2
	SNZ C 
	jmp dir_comp_next
	MOV a,2
	addm a,TEMP2
	MOV a,0
	adcm a,TEMP1
	ret
dir_comp_next:
	MOV a,210
	SUB a, TEMP2
	SNZ C 
	jmp dir_comp_next1
	MOV a,1
	addm a,TEMP2
	MOV a,0
	adcm a,TEMP1
	ret
dir_comp_next1:
	;MOV a,180
	;SUB a,TEMP2
	;SNZ C 
	;jmp dir_comp_next2
	;MOV a,5
	;addm a,TEMP2
	;MOV a,0
	;adcm a,TEMP1 
	ret
	
;dir_comp_next2:
	;MOV a,190
	;SUB a,TEMP2
	;SNZ C 
	;jmp dir_comp_next3
	;MOV a,6
	;addm a,TEMP2
	;MOV a, 0
	;adcm a,TEMP1 
	;ret
;dir_comp_next3:
	;MOV a,200
	;SUB a,TEMP2
	;SNZ C 
	;jmp	dir_comp_next4
	;MOV a,7
	;addm a,TEMP2 
	;MOV a,0
	;adcm a,TEMP1
	;ret		
;dir_comp_next4:
	;MOV a,210
	;SUB a,TEMP2
	;SNZ C 
	;jmp dir_comp_next5
	;MOV a,8
	;addm a,TEMP2
	;MOV a,0
	;adcm a,TEMP1
	;ret
;dir_comp_next5:
	;MOV a,220
	;SUB a,TEMP2
	;SNZ C 
	;jmp dir_comp_next7
	;MOV a,9
	;addm a,TEMP2
	;MOV a,0
	;adcm a,TEMP1
	;ret
;dir_comp_next7:
	;MOV a,230
	;SUB a,TEMP2 
	;SNZ  C 
	;jmp dir_comp_next8
	;MOV a,10
	;addm a,TEMP2
	;MOV a,0
	;adcm a,TEMP1
	;ret
;dir_comp_next8:
	;MOV a,240
	;SUB a,TEMP2
	;SNZ C 
	;jmp dir_comp_next9
	;MOV a,11
	;addm a,TEMP2

⌨️ 快捷键说明

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