程序编译主程序里包含以下程序:中断服务程序、主程序、各子程序模块、变量定义等,启动CS+ for CC,打开hdwinit,在编译窗口,把下面的程序拷贝过来即可。
中断服务程序,使用了4个,10mS定时器中断、1S定时器中断、串行通信发送中断、串行通信接收中断。
以下是主程序:
;========================================================
.PUBLIC MAIN
.EXTERN _R_FDL_Init
.EXTERN _R_FDL_Read
.EXTERN _PFDL_Close
.EXTERN _R_FDL_ExecuteWrite
.EXTERN _R_FDL_ClearDataFlash
.extern _g_write_address
.extern _g_block_valeu
.extern _g_read_value
.extern _g_write_value
.SECTION .data, DATA
;--------------------------------------------------------
RXADDREG .EQU0XF800 ; UART1-RX1缓存区寄存器(32byte)
;--------------------------------------------------------
TX1ADDREG .EQU0XF820 ; UART1-TX1缓存区寄存器(32byte)
;--------------------------------------------------------
WDTBUFREG .EQU0XF840 ;
RXTXFLG .EQU0XF841
MODEFLG .EQU0XF842
FLHADREG .EQU0XF843 ; FLASH读写字节数量记数器
BLOCK_TIM .EQU0XF844 ; DATA FLSCH 块擦除间隔计时器
DATCRCRG .EQU0XF845 ; CRC计算数据个数计数器
RXTIM10RG .EQU0XF846 ; UART接收数据延时计数器
SHRDARG .EQU0XF847 ; CRC计算移位寄存器
TXCOUN .EQU0XF848 ; UART发送数据长度计数器
RXCOUN .EQU0XF849 ; UART接收数据长度计数器
TIM60SREG .EQU0XF84A ; 秒计数寄存器
TIM60MREG .EQU0XF84B ; 分计数寄存器
TIM24HREG .EQU0XF84C ; 时计数寄存器
DAYREG .EQU0XF84D ; 日计数寄存器
MONTHREG .EQU0XF84E ; 月计数寄存器
YEARREG .EQU0XF84F ; 年计数寄存器;
DEVIADDREG .EQU0XF850 ; 设备类型配置寄存器
UNITTYPEH .EQU0XF851
UNITTYPEL .EQU0XF852
DATETIME1 .EQU0XF853
DATETIME2 .EQU0XF854
DATETIME3 .EQU0XF855
DATETIME4 .EQU0XF856
BCEDBUFG .EQU0XF858
FLASHRG .EQU0XF859
BCT60MREG .EQU0XF85C ; 充电计时寄存器
EDT60MREG .EQU0XF85E ; 放电计时寄存器;
TRCRCREG .EQU0XF860 ; 收发CRC计算结果寄存器2BYTE
RXADDBUF .EQU0XF862 ; UART接收地址指针寄存器2BYTE
TXADDBUF .EQU0XF864 ; UART发送地址指针寄存器2BYTE
BAUDAREG .EQU0XF866 ; 波特率配置寄存器2BYTE
BATDCRGL .EQU0XF86A ; 蓄电池电压寄存器L
BATDCRGH .EQU0XF86B ; 蓄电池电压寄存器H
VSODCRGL .EQU0XF86C ; 电池板电压寄存器L
VSODCRGH .EQU0XF86C ; 电池板电压寄存器H
BATIVRGL .EQU0XF86E ; 充电电流寄存器L;
BATIVRGH .EQU0XF86F ; 充电电流寄存器H;
LEDOTIMG .EQU0XF870 ; LED指示灯闪烁计时器
ADCBITBUF .EQU0XF871
MODE1TIMG .EQU0XF872
MODE2TIMG .EQU0XF873
VER50CRG .EQU0XF874
VTR50BRG .EQU0XF875
TIMEVD1RG .EQU0XF876
TIMEVD2RG .EQU0XF877
TIMEVD3RG .EQU0XF878
TIMEVD4RG .EQU0XF879
TIMEVD5RG .EQU0XF87A
TIMEVD6RG .EQU0XF87B;
ADCD1TSG .EQU0XF880
ADCD2TSG .EQU0XF882
ADCD3TSG .EQU0XF884;
LEDO1 .EQUP6.0 ; 充电状态指示
LEDO2 .EQUP6.1 ; 电池状态指示1
LEDO3 .EQUP6.2 ; 电池状态指示2
INUA .EQUP2.2 ; P2.3/2=01涓流/恒流充电
INUB .EQUP2.3 ; P2.3/2=10浮充充电;
UART1_CN .EQUp12.0 ; 485收发控制位;
LEDGOUT .EQUP5.1 ; 收发指示灯(绿)输出;
RXOK_BIT .EQURXTXFLG.0
TXOK_BIT .EQURXTXFLG.1
TXEN_BIT .EQURXTXFLG.6 ; 发送使能
RXEN_BIT .EQURXTXFLG.7 ; 接收使能;
FLASH_EN .EQUFLASHRG.0 ; 写FLASH使能
ERASES_BT .EQUFLASHRG.1 ; 块清楚标志
FDERR_BT .EQUFLASHRG.6
YEAR_BIT .EQUFLASHRG.7 ; 闰年标志
;
TXME1_BIT .EQUMODEFLG.0 ; 发送模式1使能
TXME2_BIT .EQUMODEFLG.1 ; 发送模式2使能
TXME3_BIT .EQUMODEFLG.2 ; 发送模式3使能
TXME4_BIT .EQUMODEFLG.3 ; 发送模式4使能
TXME5_BIT .EQUMODEFLG.4 ; 发送模式5使能;
TRICH_BT .EQUBCEDBUFG.0 ; 涓流充电标记
FLOAT_BT .EQUBCEDBUFG.1 ; 浮充充电标记
CONSC_BT .EQUBCEDBUFG.2 ; 恒流充电标记
POWERH_BT .EQUBCEDBUFG.3 ; 电池过压标记
POWERM_BT .EQUBCEDBUFG.4 ; 电池正常标记
POWERL_BT .EQUBCEDBUFG.5 ; 电池欠压标记
BATT_ERR .EQUBCEDBUFG.6 ; 电池故障状态
BATENA_BT .EQUBCEDBUFG.7 ; 充电允许状态;
;--------------------------------------------------------
.SECTION.textf,TEXTF
;--------------------------------------------------------
INTST1 .VECTOR 0x0024
INTSR1 .VECTOR 0x0026
INTTM06 .VECTOR 0x0046
INTTM07 .VECTOR 0x0048
;--------------------------------------------------------
; 10Ms定时中断服务子程序
; 使用0单元7通道
;--------------------------------------------------------
INTTM07:
PUSHAX
INC!WDTBUFREG
INC!LEDOTIMG
MOVA,!RXTXFLG
BT A.7,$INTTM07_STR
POPAX
RETI
INTTM07_STR:
CMP!RXTIM10RG,#1
BNC$INTTM07_END
INC!RXTIM10RG
POPAX
RETI
INTTM07_END:
SET1!SRMK1 ; disable INTSR1 interrupt
SET1!ST0L.3
CLR1!SRIF1 ; clear INTSR1 interrupt flag
SET1!RXOK_BIT ; 数据接收完成
CLR1!RXEN_BIT
SET1LEDGOUT
POPAX
RETI
;--------------------------------------------------------
; 1000Ms定时中断服务子程序
; 使用0单元6通道
;--------------------------------------------------------
INTTM06:
CMP!TIM60SREG,#59
BNC$INTTM06_M
INC!TIM60SREG
RETI
INTTM06_M:
CLRB!TIM60SREG
CMP!TIM60MREG,#59
BNC$INTTM06_H
INC!TIM60MREG
INCW!BCT60MREG ; 充电计时+1
INCW!EDT60MREG ; 放电计时+1
RETI
INTTM06_H:
CLRB!TIM60MREG
CMP!TIM24HREG,#23
BNC$INTTM06_SET
INC!TIM24HREG
RETI
INTTM06_SET:
CLRB!TIM24HREG
INC!DAYREG ; 日计数寄存器+1
RETI
;--------------------------------------------------------
; UART0接收中断服务子程序
; UART0使用0单元3通道接收
;--------------------------------------------------------
INTSR1:
PUSHAX
PUSHHL
CLR1LEDGOUT
CLR1!SRIF1 ; clear INTSR0 interrupt flag
MOVA,!SSR03L
BT A.2,$INTSR1_RXE
MOVWHL,!RXADDBUF
SET1!RXEN_BIT
CLRB!RXTIM10RG
MOVA,!RXD1
MOV[HL],A
INCW!RXADDBUF
INC!RXCOUN
POPHL
POPAX
RETI
INTSR1_RXE:
SET1LEDGOUT
MOV!SIR03L,#0X07
POPHL
POPAX
RETI
;--------------------------------------------------------
; UART0发送中断服务子程序
; UART0使用0单元2通道发送
;--------------------------------------------------------
INTST1:
PUSHAX
PUSHHL
CLR1LEDGOUT
CLR1!STIF1 ; clear INTST0 interrupt flag
DEC!TXCOUN
CMP!TXCOUN,#0
BZ $INTST1_END
MOVWHL,!TXADDBUF
MOVA,[HL]
MOVTXD1,A
INCW!TXADDBUF
POPHL
POPAX
RETI
INTST1_END:
SET1!TXOK_BIT ; 发送完成,=1完成
SET1LEDGOUT
SET1!STMK1
SET1!ST0L.2
CLR1!SOE0L.2 ; Set SOE0
CLR1STIF1 ; clear INTST1 interrupt flag
POPHL
POPAX
RETI
;********************************************************
; 主运行程序
;********************************************************
MAIN:
MOV!UNITTYPEH,#0XAC
MOV!UNITTYPEL,#0X68
MOV!DATETIME4,#0X17
MOV!DATETIME3,#0X09
MOV!DATETIME2,#0X03
MOV!DATETIME1,#0X01 ; 生产序列号(可变ID)
MOV!DEVIADDREG,#0XFA ; 设备类型=0xFA(蓄电池管理)
MOVWAX,#0
MOVW!_g_write_address,AX
NOP
CALL!_R_FDL_Init
MAIN_LOP:
NOP
CALL!_R_FDL_Read
MOVWHL,#LOWW(_g_read_value)
MAIN_LOOP:
NOP
MOVA,[HL]
CMPA,#0XFF ; 判断数据块是否为空
BNZ$MAIN_LOP1 ; 一个字节不是FF即有写入数据
INCWHL
INC!FLHADREG
INC!_g_write_address
CMP!FLHADREG,#2
BC $MAIN_LOOP
MOVWAX,!_g_write_address
CLRWBC
MOVC,!FLHADREG
SUBWAX,BC
SUBWAX,#2
MOVW!_g_write_address,AX; 减去2作为当前读地址
BT A.7,$MAIN_LOP2
NOP
CALL!_R_FDL_Read
MOVWAX,!_g_read_value
MOVW!BAUDAREG,AX ; 波特率
MOVW!_g_write_value,AX
MOVWAX,!_g_write_address
ADDWAX,#2
MOVW!_g_write_address,AX; 加2作为当前写地址
NOP
BR $MAIN_LOP3
MAIN_LOP1:
CLRWBC
MOVWDTE,#0XAC
MOVC,!FLHADREG
MOVWAX,!_g_write_address
SUBWAX,BC
ADDWAX,#2
MOVW!_g_write_address,AX
BR $MAIN_LOP ;
MAIN_LOP2:
MOVWAX,#0X2580 ; 默认波特率=9600bps,16进制=0X2580
MOVW!BAUDAREG,AX
MOVW!_g_write_value,AX
SET1!FLASH_EN ; 置写FLASH使能标记
MAIN_LOP3:
NOP
CALL!_PFDL_Close
NOP
MOVWAX,!BAUDAREG
CMPWAX,#0X0960 ; 波特率=2400bps,16进制=0X0960
BZ $MAIN_BAUS1
CMPWAX,#0X12C0 ; 波特率=4800bps,16进制=0X12C0
BZ $MAIN_BAUS2
CMPWAX,#0X2580 ; 波特率=9600bps,16进制=0X2580
BZ $MAIN_BAUS3
CMPWAX,#0X4B00 ; 波特率=19200bps,16进制=0X4B00
BZ $MAIN_BAUS4
CMPWAX,#0X9600 ; 波特率=38400bps,16进制=0X9600
BZ $MAIN_BAUS5
BR !MAIN_RET
MAIN_BAUS1:
MOVWAX,#0x0061
MOVW!SPS0,AX ;CK01:20MHz/64=0.3125MHz,CK00:20MHz/2=10MHz
BR !MAIN_RET
MAIN_BAUS2:
MOVWAX,#0x0051
MOVW!SPS0,AX ;CK01:20MHz/32=0.625MHz,CK00:20MHz/2=10MHz
BR !MAIN_RET
MAIN_BAUS3:
MOVWAX,#0x0041
MOVW!SPS0,AX ;CK01:20MHz/16=1.25MHz,CK00:20MHz/2=10MHz
BR !MAIN_RET
MAIN_BAUS4:
MOVWAX,#0x0031
MOVW!SPS0,AX ;CK01:20MHz/8=2.5MHz,CK00:20MHz/2=10MHz
BR !MAIN_RET
MAIN_BAUS5:
MOVWAX,#0x0021
MOVW!SPS0,AX ;钟CK01:20MHz/4=5MHz,CK00:20MHz/2=10MHz
MAIN_RET:
CLR1UART1_CN ; 485收发控制位,0=接收
CLRB!RXCOUN
MOVWHL,#LOWW(RXADDREG)
MOVWAX,HL
MOVW!RXADDBUF,AX
MOVWAX,#0x8022 ; 传送结束中断
MOVW!SMR02,AX
SET1!SS0.3 ; enable UART0 接收
CLR1!SRIF1 ; clear INTSR1 interrupt flag
CLR1!SRMK1 ; enable INTSR1 interrupt
NOP
EI
MAIN_STR:
NOP
CMP!WDTBUFREG,#50
BC $MAIN_CNR ; WDTBUFREG<0.5秒 TO MAIN_CNR
MOVWDTE,#0XAC
CLRB!WDTBUFREG
MAIN_CNR:
NOP
CALL!RXDAT_CON ; UART1接收数据处理子程序
NOP
CALL!DATE_CONT ; 日期处理子程序(年、月、日)
NOP
CALL!TXDATM_CON ; UART1发送数据模式1设置子程序
NOP
CALL!BTSTASTO_CNT ; 充电启停判断处理子程序
NOP
CALL!BTMODE_CON ; 充电模式判断处理子程序
NOP
CALL!BATTEN_CON ; 充电使能处理子程序
NOP
CALL!XDCV_CNT ; 蓄电池电压判断子程序
NOP
CALL!LEDOUT_CNT ; 指示灯控制子程序
NOP
CALL!ACCUL_CNT ; 蓄电池故障处理子程序
NOP
CALL!DAFW_CONT
NOP
MOVA,!RXTXFLG
BF A.1,$MAIN_STR ; 发送完成?
CLR1!TXOK_BIT ; 清发送完成
CLR1UART1_CN ; 485收发控制位,0=接收
CLRB!RXCOUN
MOVWHL,#LOWW(RXADDREG)
MOVWAX,HL
MOVW!RXADDBUF,AX
MOVWAX,#0x8022 ; 传送结束中断
MOVW!SMR02,AX
SET1!SS0.3 ; enable UART0 接收
CLR1!SRIF1 ; clear INTSR1 interrupt flag
CLR1!SRMK1 ; enable INTSR1 interrupt
NOP
BR !MAIN_STR
;--------------------------------------------------------
把前期介绍的各模块的子程序拷贝到此处
;--------------------------------------------------------
ACCUL_CNT:
MOVA,!BCEDBUFG
BT A.6,$ACCUL_FCNS
MOVWAX,!BCT60MREG
CMPWAX,#21600 ; 充电大于6小时?
BNC$ACCUL_CON1
RET
ACCUL_CON1:
MOVWAX,!BATDCRGL ;蓄电池电压小于12V?
MOVB,#12
MOVC,#0
CMPWAX,BC
BC $ACCUL_CON2
CLR1!BATT_ERR ; 清电池故障标记
RET
ACCUL_CON2:
SET1!BATT_ERR ; 置电池故障标记
MOVWAX,#0
MOVW!BCT60MREG,AX ; 清充电计时
RET
ACCUL_FCNS:
MOVWAX,!EDT60MREG
CMPWAX,#7200 ; 放电大于2小时?
BNC$ACCUL_FCN1
RET
ACCUL_FCN1:
MOVWAX,#0
MOVW!EDT60MREG,AX
MOVWAX,!BATDCRGL ;蓄电池电压小于10V?
MOVB,#10
MOVC,#0
CMPWAX,BC
BC $ACCUL_FCN2
RET
ACCUL_FCN2:
SET1!TXME1_BIT
RET
蓄电池故障判断条件:
1、充电时电压:连续充电6小时后,电池电压小于12V。
2、放电时电压:充电结束2小时后,电压小于10V。
同时满足以上两个条件,电池失效。