📄 avr165-46r47.asm
字号:
;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 + -