📄 pic522_4.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 + -