四时宝库

程序员的知识宝库

单片机实战——连载之十一(单片机!)

程序编译主程序里包含以下程序:中断服务程序、主程序、各子程序模块、变量定义等,启动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。

同时满足以上两个条件,电池失效。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接