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

📄 ledavr-5k.src

📁 两个三位数码管显示输入与输出电压的接触式交流稳压器
💻 SRC
📖 第 1 页 / 共 4 页
字号:
                

	CALL    Input_Module
        CALL    Detect_Module
        CLRWDT
        CALL    Output_Module
        CALL	output_regulate
        CLRWDT
        CALL    Display_Module

        JR      Main_loop
;--------------------------------------------------------------------
INT_Handler:    
        TM      T0CON,#01H
        JR      NZ,INT_Timer0
        IRET

INT_Timer0::
	TM      ADCON,#ADC_OEC
        JR      Z,skip_fresh_adc
        LD      AdataH,ADDATAH
        LD      AdataL,ADDATAL
        OR      ADCON,#START_ADC
        OR      UserFlag,#FreshAdc
skip_fresh_adc:
        
        DEC     YuanLaiShiJian
        JR      NZ,exit_this_interrupt                  ;6
        LD      YuanLaiShiJian,#__2ms   ;2ms定时
        ;**************
        CP      RegulateTime,#0
        JR      EQ,STOP_REG_VOUT
        DEC     RegulateTime
        JR      timer_system
STOP_REG_VOUT:
        AND     P2,#~(_OUT_INC|_OUT_DEC) ;regulate stop
        ;**************
timer_system:  
      
        CALL	display 

        CP      System_Timer,#100         ;100*2ms=0.2s
        JR      UGE,timer_j2        
        INC     System_Timer       
exit_this_interrupt:    
        AND     T0CON,#0F6H     ;CLR Interrupt Flag Of T0
        IRET

timer_j2:
        CLR     System_Timer
        
        DEC     FreshDipsTime
        JR      NZ,skip_FreshDispVolt
        LD      FreshDipsTime,#__600ms
        OR      UserFlag,#FreshDispVolt
skip_FreshDispVolt:

        CP      disp_fresh_time,#0
        JR      EQ,skip_dispfreshtime
        DEC     disp_fresh_time
skip_dispfreshtime:        
              
        CP      Buzer_Timer,#0
        JR      EQ,timer_j9
        DEC     Buzer_Timer
timer_j9:
	CP	DIG_BLINK_Time,#0
	JR	EQ,timer_1s
	DEC	DIG_BLINK_Time
    ;-----------timer 1s----------
timer_1s:    
        DEC     system_timer1s
        CP      system_timer1s,#0
        JR      NE,EXIT_END
        LD      system_timer1s,#5
        
        ;CP      HighProtTime,#0
        ;JR      EQ,ProtTime
        ;DEC     HighProtTime
        
ProtTime:             
        CP      VOLT_PRTdelay,#0
        JR      EQ,out_delay
        DEC     VOLT_PRTdelay
out_delay:        
        CP      OutputDly_Timer,#0   	
        JR      EQ,DELAY_OVER      		
        DEC     OutputDly_Timer 
DELAY_OVER:        
        
EXIT_END:
        AND     T0CON,#0F6H     ;CLR Interrupt Flag Of T0
        IRET


        
;--------------------------------------------------------------------
; Get Delay time switch input and V_ADC,T_ADC  A/D input
;--------------------------------------------------------------------
Input_Module:
 
        CALL    READ_Key        
;=============================
AD_INPUT:    
        CALL    OUTPUT_VOLT_ADC
        CALL    INPUT_VOLT_ADC
        CALL    TEMP_ADC
        RET
;===================================
READ_Key::
        TM      P2,#_RELAY
        JR      NZ,exit_readkey
        
        TM      P2,#10H;P2.4
        JR      Z,outDly_is6S 
               
        TM      UserFlag,#DLYFlag
        JR      NZ,exit_readkey             ;延时键一直是按下状态(180S延时)
        LD      OutputDly_Timer,#180        ;延时键由弹起状态到按下状态
        OR      UserFlag,#DLYFlag           ;延时键按下标志(180S延时)
        JR      exit_readkey 
        
outDly_is6S: 
        TM      UserFlag,#DLYFlag
        JR      Z,exit_readkey             ;延时键一直是弹起状态(6S延时)             
        LD      OutputDly_Timer,#6         ;延时键由按下状态到弹起状态
        AND     UserFlag,#~DLYFlag         ;延时键弹起标志(6S延时)
        
exit_readkey:       
        RET
;===================================

OUTPUT_VOLT_ADC::
        
        LD      ADCON,#OUTVOLT_ADCONTROL|START_ADC
        CALL    SampleNew
        LD	OutVoltRegulate,R6
        LD	OutVoltRegulate+1,R7         
        CALL    calc_outvolt	     ;计算输出电压
       
        RET
;===================================
INPUT_VOLT_ADC::
        LD      ADCON,#INVOLT_ADCONTROL|START_ADC
        CALL    SampleNew
        CALL    calc_involt
        LD      VIn_ADValueL,R1
        LD      VIn_ADValueH,R0
	RET 	
;===================================
TEMP_ADC::
        LD      ADCON,#TEMP_ADCONTROL|START_ADC
        LD      R7,#16 ; 30 * 50us=1.5ms
        CLR     R6
        CALL    Get_DCaverage_Data
        RCF
        RRC     R0
        RRC     R1
        
        RCF
        RRC     R0
        RRC     R1
        
        RCF
        RRC     R0
        RRC     R1
        
        RCF
        RRC     R0
        RRC     R1
        
        LD      T_ADValueL,R1  
        LD      T_ADValueH,R0  
        RET
;===================================
;取当前ADC最大/最小值,用于KEY 和 Temp
;出口: RR0:最大, RR2:最小值
Get_DCaverage_Data::
        
        AND     UserFlag,#~FreshAdc
        
watie_djfdkfjDSL:
        CLRWDT  
        TM      UserFlag,#FreshAdc
        JR      Z,watie_djfdkfjDSL
        CLR     R0
        CLR     R1      ;总和
        
        LD      R2,#01H ;最大  
        LD      R3,#5EH
               
start_get_:
        AND     UserFlag,#~FreshAdc
        
waite_over__:   
        CLRWDT
        TM      UserFlag,#FreshAdc
        JR      Z,waite_over__
        
        CLR     R4
        LD      R5,AdataH
        LD      R8,AdataL
        AND     R8,#03H
        RCF
        RLC     R5
        RLC     R4
        RCF
        RLC     R5
        RLC     R4
        OR      R5,R8
;**********************
        ADD     R1,R5
        ADC     R0,R4  
        JR      C,TMPadc_over     
        ;===========取最大值            
        ;CP      R4,R0
        ;JR      UGT,set_max
        ;JR      ULT,check_min
        ;CP      R5,R1
        ;JR      ULE,check_min
;set_max:
        ;LD      R0,R4
        ;LD      R1,R5
        ;JR      check_min
check_over_time:
        SUB     R7,#1   ;采样时间到
        SBC     R6,#0
        JR      NC,waite_over__       
        RET
TMPadc_over:
        LD      R1,R3
        LD      R0,R2
        RET        
        ;===========取最小值            
;check_min:      
        ;CP      R4,R2
        ;JR      UGT,check_over_time
        ;JR      ULT,set_min
        ;CP      R5,R3
        ;JR      UGE,check_over_time
;set_min:
        ;LD      R2,R4
        ;LD      R3,R5
        ;JR      check_over_time 
;**********************        
;===================================        
;--------------------------------------------------------------------
; Delay_1ms 1ms
;  One period is 15us, if delay 1ms, R1=1000/15=67
;--------------------------------------------------------------------
Delay_1ms:
        PUSH    R1

        LD      R1,#140
loop_1ms:
        NOP                   ;6 cycle
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP

        DEC     R1            ;6
        JR      NZ,loop_1ms    ;12/10

        POP     R1
        RET
         
;--------------------------------------------------------------------
; Detect regulated output voltage, transformer temperature
;--------------------------------------------------------------------
Detect_Module::    
	   
check_volt_disp:        
        CALL    sumallfordisp
        TM      UserFlag,#FreshDispVolt
        JR      Z,skip_volt_fresh_dispf
        AND     UserFlag,#~FreshDispVolt
        CALL    checkallfordisp

skip_volt_fresh_dispf:
        CALL    Detect_OverOrUnder_Voltage
        CALL    Detect_Over_Temperature
        CALL    Detect_fan_status
        RET
;DETECT_EXIT:
        ;AND      UserFlag,#~DetectFlag
        ;JR      check_volt_disp
;-----------------------------------------------------------------
InVoltForDisp:          .RAM_DS 2
OutVoltForDisp:         .RAM_DS 2
DispCnt:                .RAM_DS 1

sumallfordisp:  
        ADD     InVoltForDisp+1,VIn_ADValueL
        ADC     InVoltForDisp,VIn_ADValueH

        ADD     OutVoltForDisp+1,Vout_ADValueL
        ADC     OutVoltForDisp,Vout_ADValueH

        INC     DispCnt
        RET
;===================================
checkallfordisp:
        LD      R1,InVoltForDisp+1
        LD      R0,InVoltForDisp
        LD      R3,DispCnt
        CLR     R2
        CALL    dbl_divs
        LD      Vin_valueL,R1
        LD      Vin_valueH,R0
        
        LD      R1,OutVoltForDisp+1
        LD      R0,OutVoltForDisp
        LD      R3,DispCnt
        CLR     R2
        CALL    dbl_divs
        LD      Vout_valueL,R1
        LD      Vout_valueH,R0

        CLR     DispCnt
        CLR     InVoltForDisp+1
        CLR     InVoltForDisp
        CLR     OutVoltForDisp+1
        CLR     OutVoltForDisp
        RET


;------------------------------------------------------------------
; 入口: R6:数据高八位 R7:数据低八位
; 出口: BCD码->低:(R2,),R3,R4,R5
BCD_conversion::
                CLR     R2
                CLR     R3
                
                
        _1000_loop:
                LD      R4,R6           ;转换千位
                LD      R5,R7
                SUB     R7,#1000%256
                SBC     R6,#1000/256
                JR      C,conversion_next
                INC     R2
                JR      _1000_loop
                
        conversion_next:
                LD      R6,R4           ;转换百位
                LD      R7,R5
        _100_loop:
                LD      R4,R6
                LD      R5,R7
                SUB     R7,#100
                SBC     R6,#0
                JR      C,_10_loop
                INC     R3
                JR      _100_loop
                                        ;转换百位
        _10_loop:
                LD      R6,R5
                SUB     R5,#10
                JR      C,end_of_BCD_conversion
                INC     R4
                JR      _10_loop        ;转换个位
        end_of_BCD_conversion:
                LD      R5,R6           
                RET

;--------------------------------------------------------------------
; Detect if output voltage great than 260V or less than 180V
;--------------------------------------------------------------------
CJUGTRR0L:      .MACRO L,addr
        CP      R0,#L/256
        JP      UGT,addr
        JR      ULT,nxt
        CP      R1,#L%256
        JP      UGE,addr
nxt:
        .ENDM
CJULTRR0L:      .MACRO L,addr
        CP      R0,#L/256
        JP      ULT,addr
        JR      UGT,nxt
        CP      R1,#L%256
        JP      ULT,addr
nxt:
        .ENDM
        ;=-===========
Detect_OverOrUnder_Voltage::

	LD      R1,Vout_valueL
        LD      R0,Vout_valueH
        
        CJUGTRR0L     256,immediately ;260       
        
        CP	Volt_PStatus,#VOLT_HIGH
        JR	EQ,restore_high

        CJUGTRR0L     250,overhighvolt;252
        JR      deal_low
        
restore_high:
        ;******************
        ;CP      HighProtTime,#0
        ;JR      NE,voltprot_exit
        ;******************
        CJUGTRR0L     242,voltprot_exit;242
        
deal_low        
        CP      Volt_PStatus, #VOLT_LOW 
        JR      EQ,restore_low  
         
        CJULTRR0L     180,lesslowvolt   ;179     
        JR      voltprot_normal
        
restore_low                  
  	CJULTRR0L     185,voltprot_exit ;185

        ;==================        
voltprot_normal:                                                
        LD      Volt_PStatus,#VOLT_NORMAL
        RET

lesslowvolt:
        LD      Volt_PStatus, #VOLT_LOW
        RET

Input_restNormal:
        LD      Volt_PStatus,#VOLT_NORMAL
        RET

overhighvolt:
        LD	Volt_PStatus,#VOLT_HIGH	     
        LD      VOLT_PRTdelay,#3
        LD      SystemStatus,#SYSTEM_FAILED
        JR      voltprot_exit
        
immediately:         
        LD	Volt_PStatus,#VOLT_HIGH	
        LD      VOLT_PRTdelay,#0
        LD      SystemStatus,#SYSTEM_FAILED
voltprot_exit:

        RET
;=====================================        
Detect_Over_Temperature::
       
        CP      Temp_Status,#TEMP_PROTECTED
        JR      EQ,temp_restar
        
        CP      T_ADValueH,#T_PROTECT_VALUE/256
        JR      ULT,overtemp
        JR      UGT,Normaltemp
        CP      T_ADValueL,#T_PROTECT_VALUE%256
        JR      ULE,overtemp
        JR      Normaltemp
        
temp_restar:
        CP      T_ADValueH,#T_RESTAR_VALUE/256
        JR      ULT,temp_exit
        JR      UGT,Normaltemp
        CP      T_ADValueL,#T_RESTAR_VALUE%256
        JR      ULE,temp_exit       
        
Normaltemp:
        LD      Temp_Status,#TEMP_NOPROTECTED
        JP      temp_exit
overtemp:
        LD      Temp_Status,#TEMP_PROTECTED
        LD      SystemStatus,#SYSTEM_FAILED
temp_exit:
        RET
;=====================================
TEMP_45            .EQU        600;550    
TEMP_65            .EQU        450;380
FAN_ON:            .EQU        55H
FAN_OFF:           .EQU        00H

Detect_fan_status:
        CP      FAN_STATUS,#FAN_ON
        JR      NE,NO_FAN_ON        
        CP      T_ADValueH,#TEMP_45/256
        JR      ULT,EXIT_FAN
        JR      UGT,clr_fan
        CP      T_ADValueL,#TEMP_45%256
        JR      ULE,EXIT_FAN
clr_fan       
        LD      FAN_STATUS,#FAN_OFF
        AND     P2,#~_FAN
EXIT_FAN        
        RET
        
        
NO_FAN_ON	
        CP      T_ADValueH,#TEMP_65/256
        JR      ULT,SET_FAN
        JR      UGT,set_no_fan  
        CP      T_ADValueL,#TEMP_65%256
        JR      ULE,SET_FAN
set_no_fan        
        LD      FAN_STATUS,#FAN_OFF
        RET
SET_FAN
        LD      FAN_STATUS,#FAN_ON
        OR      P2,#_FAN
        RET
;=====================================SYSTEM INIT OUTPUT
SYS_INIT_OUTPUT:
        CP      SystemStatus,#SYSTEM_INIT
        JR      NE,SYSTEM_NORMAL_OUT
        
        CP      OutputDly_Timer,#00H
        JR      UGT,SYSTEM_INIT_EXIT
              
        LD      SystemStatus,#SYSTEM_NORMAL
SYSTEM_NORMAL_OUT:
SYSTEM_INIT_EXIT:
        RET
;==================================
VoltUp          MACRO                   ;电压向上调节,伺服驱动硬件模型 P2.0
                AND     P2,#~(_OUT_INC|_OUT_DEC)  
                OR      P2,#_OUT_INC         
                ENDM
                

⌨️ 快捷键说明

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