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

📄 pic522_4.asm

📁 用PIC16F877做的蓄电池充放电管理程序
💻 ASM
字号:
LIST  P=16F877
INCLUDE<P16F877.INC>
#DEFINE  RS   PORTE,0      ;RE0接LCD的RS
#DEFINE  RW   PORTE,1
#DEFINE  E    PORTE,2

LCD             EQU   PORTB
COUNT           EQU   35H   ;计数寄存器
COUNT0          EQU   36H
COUNT1          EQU   37H
COUNT2          EQU   38H   ;
COUNT3          EQU   39H   ;
ADV_DISPLAY     EQU   40H  ;电压AD显示送出寄存器
FLAG            EQU   41H  ;电池有效标志位
AD_TEM0         EQU   44H  ;温度当前A/D转换高位暂存
AD_TEM1         EQU   45H  ;温度当前A/D转换低位暂存
AD_TEM2         EQU   46H  ;温度前一次A/D转换高位暂存
AD_TEM3         EQU   47H  ;温度前一次A/D转换低位暂存

COUNT_GF        EQU   53H   ;过放次数寄存器
COUNT_GC        EQU   54H   ;过充次数寄存器
AD_TEM_DISPLAY  EQU   55H   ;温度显示寄存器

AD_VOL0         EQU   57H   ;A0通道当前A/D转换高位暂存
AD_VOL1         EQU   58H   ;A0通道当前A/D转换低位暂存
AD_VOL2         EQU   59H   ;A0通道前一次A/D转换高位暂存
AD_VOL3         EQU   60H   ;A0通道前一次A/D转换低位暂存
TMR1            EQU   0EH
T1CON           EQU   10H
ADCON0          EQU   1FH
ADCON1          EQU   9FH
PORTD           EQU   08H

_13V0           EQU  0D3H;  211  4.7K电阻分压值, 以5V为参考电压计算得到

_2V0            EQU  66H  ;102
_10V0           EQU  0ABH  ;171
_43C            EQU  57H   ;87   
_0C             EQU  0BAH  ;186



       ORG    00H
       NOP
       GOTO   MAIN
       ORG    04H
MAIN:
       MOVLW  04H
       MOVWF  COUNT0    ;电压采集次数
       MOVLW  04H
       MOVWF  COUNT2    ;温度采集次数
       CLRF   COUNT_GF
       CLRF   COUNT_GC
       CALL    INITIAL      ;调用初始化子程序
       
       CALL   AVAIL_BATT
       CALL   CON_VOL      ;调用充放电子程序
       ;CALL   CON_VOL
       GOTO   MAIN


;初始化程序**************************************************************************
INITIAL:
        BSF		STATUS,RP0	;转到体1
		BCF		STATUS,RP1
        CLRF     TRISD          
        CLRF     TRISB
        MOVLW    0FFH
        MOVWF    TRISA
        MOVWF    TRISC 
        
        BSF		STATUS,RP0	;转到体1
		BCF		STATUS,RP1
        MOVLW		02H				;设定A/D转换的输入端为RA0--RA3,参考电压为VDD
		MOVWF		ADCON1				;
		MOVLW		0FFH				;设定PORTA为输入
        MOVWF       TRISA        
      ;**********************************************************************    
        BCF		STATUS,RP0	;转到体0
		BCF		STATUS,RP1
        CLRF     PORTA
        CLRF     PORTB
        CLRF     PORTC
        CLRF     PORTD

       	MOVLW		81H			    	;
		MOVWF		ADCON0	        	;设定工作时钟为FOSC/32,启动A/D转换
		BSF			INTCON,1	    	;开中断的总开管

        BANKSEL ADCON1
        MOVLW   80H
        MOVWF   ADCON1   ; 选择系统时钟。频率为FOSC/32
        RETURN 


;电池有效性检测***************************************************
AVAIL_BATT:
   CALL   VOL_GATHER    ;
   CALL   TEST_BATT  ;
   RETURN

TEST_BATT:   
    MOVLW   66H         ;2V       ;和2V电压进行比较,判断电池有效性(要修改)    
    SUBWF   AD_VOL2,1   ;采集值减去参考值
    BTFSS   STATUS,0    ;若小于2V,则跳过下条指令
    GOTO    XIAOYU2V    ;小于2V则,电池无效,停止充放电
    NOP                ;GOTO    DAYU2V      ;大于2V表明电池有效
    RETURN
    RETURN
XIAOYU2V:
    BCF     FLAG,0      ;标志位清0
    BCF     PORTD,3     ;红灯点亮,报警信号
    CALL    DELAY3S
    GOTO    AVAIL_BATT   ;继续进行电池有效性检测
    

;DAYU2V:
    ;BSF     FLAG,0
    ;CALL    CON_VOL
    RETURN
;电压控制程序*********************************************************************
CON_VOL:
    BSF     FLAG,0 
    BCF     STATUS,0       
    MOVLW   0ABH         ;10V   要修改      ;
    SUBWF   AD_VOL2,1    ;电池电压值与11V电压参考值比较
    BTFSS   STATUS,0     ;大于等于则跳过下条指令
    GOTO    CHONG_DIAN    ;电池电压低于11V,则充电
    GOTO    FOR_VOLCD   ;高于11V,不充电,可以放电     
    RETURN
;DADIANLIU:
    ;BSF    PORTB,0    ;启动50MA	充电
    ;BSF    PORTB,2    ;启动500MA充电
    ;BCF    PORTB,1    ;关250MA充电
    ;CALL   DELAY3S
    ;CALL   TEM_GATHER
    ;CALL   TEM_CON
    ;CALL   VOL_GATHER
    ;CALL   CON_VOL
    ;RETURN
;XIAODIANLIU:
    ;BCF    PORTB,0    ;关50MA	充电
    ;BCF    PORTB,2    ;关500MA充电
    ;BSF    PORTB,1    ;启动250MA充电
    ;CALL   DELAY3S
    ;CALL   TEM_GATHER
    ;CALL   TEM_CON
    ;CALL   VOL_GATHER
    ;CALL   CON_VOL
    ;RETURN
CHONG_DIAN:
    
     BTFSS   FLAG,0  ;检测电池标志位
     GOTO    AVAIL_BATT    ;如果无电池则进行电池有效性检测	
    ; MOVLW   00H     ;电池有效,预充电
     ;MOVWF   PORTD    ;开MOS管,开始充电;断开继电器,停止放电

      ;**************************
      BCF   PORTB,3
      BCF   PORTB,4     ;开MOS管,开始充电;断开继电器,停止放电
      ;*************************
     CALL    DELAY3S
     CALL    TEM_GATHER
     CALL    TEM_CON
     CALL    VOL_GATHER
     CALL    VOL_GATHER13V
     GOTO    CHONG_DIAN
    ; RETURN


FOR_VOLCD:    ;停止充电,开始放电
   BSF    PORTD,1   ;送高电平,mos管截止,停止充电
   BSF    PORTD,0   ;送高电平,继电器吸合,放电
LOOP5:   
   CALL   DELAY3S
   CALL   TEM_GATHER
   CALL   TEM_CON
   CALL   VOL_GATHER
   CALL   CON_VOL     
   GOTO   LOOP5
   RETURN

;GUOFANG:
   ;CALL   CHONG_DIAN     
   ;INCF   COUNT_GF      
   ;RETURN

VOL_GATHER13V:
   MOVLW   0D3H ;15V
   SUBWF   AD_VOL2,1    ;
   BTFSS   STATUS,0
   GOTO    CHONG_DIAN    ;电池电量小于13V
   GOTO    GUOCHONG      ;电池电量大于13V
   RETURN

GUOCHONG:
   
   CLRF   PORTD  
   BSF    PORTD,1   ;停止充电
   BCF    PORTD,0   ;开始放电
   BSF    PORTD,3   ;红灯点亮
   INCF   COUNT_GC  ;过充寄存器加1
LOOP4: 
   CALL   DELAY1S     ;
   CALL   TEM_GATHER
   CALL   TEM_CON
   CALL   VOL_GATHER  ;
   CALL   CON_VOL
   GOTO   LOOP4
   RETURN

    
;电压采集*********************************************************
VOL_GATHER:   
    BANKSEL  ADCON0
    MOVLW    49H
    MOVWF    ADCON0   ;选择频率为FOSC/8;A/D转换通道为A1,启用A/D转换,选通AN1
    BSF      ADCON0,2 ;A/D转换开始   
NEXT:
    NOP
    NOP
    NOP
    BTFSC   ADCON0,2  ;检查采集是否结束
    GOTO    NEXT      ;未结束等待
    MOVF    ADRESH,0
    MOVWF   AD_VOL0  ;存储转换结果
    MOVF    ADRESL,0
    MOVWF   AD_VOL1
    
ADD4_VOL:
    BCF     STATUS,0
    MOVF    AD_VOL1,0
    ADDWF   AD_VOL2,1
    MOVF    AD_VOL0,0
    ADDWF   AD_VOL3,1
    BTFSC   STATUS,0       ; AD_VOL1+AD_VOL2>FF?
    CALL    ADDONE         ;是,AD_VOL3再加1
    GOTO    GO_ON
ADDONE:
    MOVLW   01H
    ADDWF   AD_VOL3,1
    RETURN
GO_ON:
    DECFSZ   COUNT0,1
    GOTO     VOL_GATHER
    MOVLW    02H
    MOVWF    COUNT1
AVERAGE_VOL:       
    RRF  AD_VOL2,1
    RRF    AD_VOL3,1
    MOVLW  0FFH
    MOVWF  AD_VOL2
    MOVWF  AD_VOL3
    DECFSZ  COUNT1,1
    GOTO    AVERAGE_VOL
    GOTO    TEST_BATT      ;将首次电压采集值,进行电池有效性判断
    RETURN
;温度采集******************************************************
TEM_GATHER:   
    
    BCF   STATUS,RP0
    BCF   STATUS,RP1
    MOVLW  00H
    MOVWF  AD_TEM0 ;温度采集累加值清0
    MOVWF  AD_TEM1
    MOVWF  AD_TEM2
    MOVWF  AD_TEM3
    BANKSEL  ADCON0
    MOVLW    41H
    MOVWF    ADCON0   ;选择频率为FOSC/8;A/D转换通道为A0,启用A/D转换
    BSF      ADCON0,2 ;A/D转换开始
   
NEXT_TEM:
    NOP
    NOP
    NOP
    BTFSC   ADCON0,2    ;检查转化是否结束
    GOTO    NEXT_TEM      ;未结束等待
    MOVF    ADRESH,0
    MOVWF   AD_TEM0     ;存储转换结果
    MOVF    ADRESL,0
    MOVWF   AD_TEM1
    
ADD4_TEM:             ; 累加采集值
    BCF     STATUS,0
    MOVF    AD_TEM1,0
    ADDWF   AD_TEM2,1
    MOVF    AD_TEM0,0
    ADDWF   AD_TEM3,1
    BTFSC   STATUS,0       ; AD_TEM1+AD_TEM2>FFH?
    CALL    ADDONE_TEM     ;是,AD_VOL3再加1
    GOTO    GO_ON_TEM
ADDONE_TEM:
    MOVLW   01H
    ADDWF   AD_TEM3,1
    RETURN
GO_ON_TEM:
    DECFSZ   COUNT2,1     ;四次采集是否完成?
    GOTO     TEM_GATHER
    MOVLW    02H
    MOVWF    COUNT3
AVERAGE_TEM: 
    BCF    STATUS,0      
    RRF    AD_TEM2,1
    RRF    AD_TEM3,1
    DECFSZ  COUNT3,1
    GOTO    AVERAGE_TEM
    MOVLW   87H
    MOVWF   AD_TEM2
    MOVWF   AD_TEM3
    CALL    TEM_CON
    

    RETURN

;温度控制子程序***************************************************************
TEM_CON:
    MOVLW    57H      ;43度     温度最高限定值
    SUBWF    AD_TEM2  ;采集的温度值与参考值进行比较    
    BTFSC    STATUS,0
    GOTO     FOR_TEM      ;温度值高过警戒温度值
    RETURN

FOR_TEM:
    BANKSEL PORTD
    CLRF    PORTD
    BCF     PORTD,0   ;使继电器断开,停止放电
    BSF     PORTD,1   ;使MOS管截止,禁止充电
LOOP6:
    ;CALL    TEM_GATHER
    ;CALL    TEM_CON
    CALL    ALARM
    CALL    DELAY3S
    GOTO    LOOP6
    RETURN

ALARM:   MOVLW  03H
         MOVWF  COUNT
         CLRF   PORTD
         MOVLW  04H
LOOP:    MOVWF  PORTD
         ;CALL   DELAY3S
         COMF   PORTD
         ;CALL   DELAY1S
         DECFSZ  COUNT
         GOTO    BACK      
         GOTO    LOOP
         
         RETURN 
BACK:    RETURN
DELAY1S:
     MOVLW   0FFH
     MOVWF   20H
LOOP11:
     MOVLW   0FFH
     MOVWF   21H
LOOP21:
     DECFSZ  21H,1
     GOTO    LOOP21
     DECFSZ  20H,1
     GOTO    LOOP11
     RETURN

DELAY3S:
     MOVLW  03H
     MOVWF  COUNT
LOP: MOVLW   0FFH
     MOVWF   20H
LOOP13:
     MOVLW   0FFH
     MOVWF   21H
LOOP23:
     DECFSZ  21H,1
     GOTO    LOOP23
     DECFSZ  20H,1
     GOTO    LOOP13
     DECFSZ  COUNT
     GOTO    LOP
     RETURN



    END

⌨️ 快捷键说明

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