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

📄 89lpc933(修改充电过程).asm

📁 用pic单片机实现的对锂电池冲电的程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
FMCON  EQU    0E4H
FMDATA EQU    0E5H
FMADRL EQU    0E6H
FMADRH EQU    0E7H

;-------引脚分配-------
PWADO  BIT      P2.0    ;DAC0输出,接充电器同相放大器输入
                        ;仅为高阻输入(复位置为高)。
V2_C   BIT      P2.1    ;辅助电源控制(高电平有效),推挽或准双向(优先)
SDI    BIT      P2.2    ;串行数据输出端(一般处于准双向,使用时置为推挽模式
                        ;平时置为高电平.
KEY2   BIT      P2.3    ;按键输入2, 定义为准双向,低电平有效(以便利用电阻上拉)
PCLK   BIT      P2.4    ;并行锁存脉冲输出,(一般处于准双向,使用时置为推挽模式)
                        ;平时置为高电平.(上升沿有效)
SCLK   BIT      P2.5    ;串行锁存脉冲输出,(一般处于准双向,使用时置为推挽模式)
                        ;平时置为高电平.(上升沿有效)
ACIN   BIT      P2.6    ;市电检测输入,高阻输入(高电平有效)
PWON   BIT      P2.7    ;充电器启动控制, (高电平有效),准双向

;MOV P2M2, #00000000B
;MOV P2M1, #01000001B
;MOV P2,   #01111101B      ;数据线先定义为输入状态。

;***P0****
P00    BIT      P0.0    ;电池温度检测输入端(定义为高阻输入),低电平有效。
PWICH  BIT      P0.1    ;AD10转换输入端(充电器电流采样输入),定义为高阻输入.
BAT_IN BIT      P0.2    ;AD11转换输入端(电池电压采样输入),定义为高阻输入.
TEMPIN BIT      P0.3    ;定义为输出(在逆变状态下,输出低电平;在充电状态输出高电平)
                        ;漏极开路状态
       ;BIT     P0.4    ;未用
       ;BIT     P0.5    ;未用
       ;BIT     P0.6    ;未用
P07    BIT      P0.7    ;解码模块输入,高阻输入(高电平表示有信号输入)
;MOV P0M2, #00001000B   ;缺省设置
;MOV P0M1, #11111111B
;MOV P0,   #11111111B   ;数据线先定义为输入状态。
;MOV PTOAD,#00000110B   ;禁止P0.1-P0.3数字信号输入

LFACON BIT      P1.0    ;周波启动控制,输出,漏极开路,低电平有效。
RXD0   BIT      P1.1    ;串行接收(高阻输入)。
BELL   BIT      P1.2    ;蜂鸣器输出(漏极开路),低电平有效
INT0   BIT      P1.3    ;充电器过热中断(高阻输入).
INT1   BIT      P1.4    ;周波变换器过热中断(高阻输入).
       ;BIT     P1.5    ;复位输入
KEY1   BIT      P1.6    ;按键输入1, 定义为准双向,低电平有效(以便利用电阻上拉)
KEY0   BIT      P1.7    ;按键输入0, 定义为准双向,低电平有效(以便利用电阻上拉)

;MOV P1M2, #00000101B
;MOV P1M1, #00111111B
;MOV P1,   #11111111B

;***P3口****
;  BIT      P3.0    ;未用
;  BIT      P3.1    ;未用

;保留20、21H两个具有位地址字节

MSTU DATA      22H    ;主机状态
                      ;B2~b0位定义输入电压状态
                      ;000-(电池电压小于9.0V)
                      ;001-电池电压在9-10.0之间,小电流充电
                      ;010-电池电压在10.0-10.5V,小电流充电
                      ;011-电池电压在10.5-13.7V,大电流充电
                      ;100-电池电压在13.8-15.5之间,涓流充电
                      ;101-电池电压在15.5以上

LVTIMEB    BIT  00H   ;低压计时标志(1有效)
TIME_1ms   BIT  01H   ;1ms时间到标志
TIME_20ms  BIT  02H   ;20ms时间到标志
ACIO_OV    BIT  03H   ;过流/短路标志有效
KEY2STU    BIT  04H   ;主机开关状态
PWIO_OV    BIT  05H   ;充电器过流标志
TIME05S    bit  06H   ;指示灯状态
TIME01S    bit  07H   ;指示灯状态
TIME_20msp BIT  08H   ;充电器管理时间到标志
KUAION     BIT  0AH   ;快速启动标志
LEDRUN     BIT  0BH   ;允许执行LED状态改变标志
TIME05SB   BIT  0CH   ;在充电状态下电流显示标志

WUSTU   DATA 28H
HEADV   BIT WUSTU.0   ;找同步头/解数据状态标志(0-同步头无效
                      ;1-同步头有效,在解数据码)
LXJIE   BIT WUSTU.1   ;连续解码有效标志(1-有效,0-无效)
JIEMA   BIT WUSTU.2   ;解码缓冲区数据有效标志(1-有效,0-无效)
                      ;000——脉冲头无效
                      ;001——脉冲头有效,解数据帧
                      ;010——第一帧解码成功的过渡状态
                      ;011——
                      ;11X——数据有效,但发送未停止
                      ;100——数据有效,发送停止
JINXUNP BIT WUSTU.3   ;解码数据处理标志
DAFRM   BIT WUSTU.4   ;帧起始标志

           ;WUSTU.5   ;在解码过程中记录载波长短标志(0-短,1-长)


LEDSTU1   DATA  29H   ;D206-D204指示灯状态位
                ;b1、b0定义d204指示灯状态
                      ;00-非旁路状态
                      ;11-旁路状态
                      ;10-录码状态
                ;b3、b2定义d205指示灯状态
                      ;00-非充电状态
                      ;11-充电状态
                      ;01-电池过热状态
                      ;10-充电器过热
                ;b5、b4定义d206指示灯状态
                      ;00-非逆变状态
                      ;11-逆变状态
                      ;01-电池过热状态
                      ;10-DC-AC过热
                ;b7、b6定义蜂鸣器状态
                      ;00-不响
                      ;01-慢响(响1S_停1S)
                      ;10-快响(响0.2S_停0.2S)
                      ;11-常响(单音)

LEDSTU2   DATA  2AH   ;D203-D201指示灯状态位
                ;b1、b0定义d201指示灯状态
                      ;00-灭
                      ;01-慢闪(过载)
                      ;10-快闪(短路)
                      ;11-正常
                ;b3、b2定义d202指示灯状态(输出电压或充电电流)
                ;b6、b5定义d203指示灯状态(电池电压)

DISPBUF   DATA  2BH   ;显示缓冲区(2B-2E)
          ;2BH为状态位
          ;b5——D206灯(绿色),逆变状态
          ;b4——D205灯(红色),充电状态
          ;b3——D204灯(黄色),旁路状态
          ;b2——D203灯(绿色),电池电压
          ;b1——D202灯(红色),输出电流(逆变)/充电电流(充电)状态
          ;b0——D201灯(黄色),输出功率(逆变状态)

          ;2C为个位
          ;2D为十位
          ;2E为百位

KEYSTU   DATA  2FH    ;按键状态及按键值(b7为按键有效标志,b6-b4记录
                      ;按键值;b2-b0记录按键状态)

TIMEB    DATA  30H    ;基本定时单元(每1ms加+1)
LVTIME   DATA  31H    ;低压定时时间
BATV     DATA  32H    ;电池电压采样值
ACSTU    data  33h    ;交流状态采样寄存器
                      ;b2-b0记录最近3个ms交流采样结果
                      ;b3记录当前状态交流状态(1-存在;0-不存在)

DABA_TC DATA  34H     ;DC-AC散热片及电池温度状态
                      ;b6-b4记录DC-AC温度状态;b7记录AC-DC温度检测结果
                      ;(1-过热;0-正常)

                      ;b2-b0记录电池温度状态;b3记录电池温度检测结果
                      ;(1-过热;0-正常)

PWONSTU DATA  35H     ;充电器散热片温度状态
                      ;b2-b0记录充电器温度状态;b3记录充电器温度检测结果
                      ;(1-过热;0-正常)

TIMEBELL DATA 36H     ;蜂器器鸣时间(0.1s)
PUTIME   DATA 37H     ;上电延迟
PWUPSTU  DATA 38H     ;充电状态(AA、55)
BATVPN   DATA 39H     ;电池电压采样点数
PWTIME   DATA 3AH     ;恒压充电定时时间
LFACTIME DATA 3BH     ;LFAC启动延迟

RXDBUF   DATA 40H     ;40H、41H、42H、43H、44H(5个字节)作为接收缓冲
RXDSP    DATA 45H     ;接收指针
RXDBUFD  DATA 46H     ;串行接收数据保存区
                      ;46H为标志位、47H为电压、48H为电流、49H为脉冲宽度
RXDBUFEV DATA  4AH    ;串行接收有效标志
LEDTIME  DATA  4BH    ;LED定时时间
PWIOAV   DATA  4CH    ;充电电流
PWIOPN   DATA  4DH    ;充电电流平均点数
LUTIME   data  4EH    ;录码定时时间
ACIO_TIME DATA 4FH    ;过载过流关闭延迟

;50-57H作为解码接收缓冲区,采用中断方式接收,因此50-57不宜再使用。
BUFF0    DATA  50H    ;接收缓冲区最高位
                      ;占据50-53H
BUFFS0    DATA 54H    ;接收缓冲区最高位
                      ;占据54H-57H

CNTB   DATA 5CH       ;解码位
TIMEL  DATA 5AH       ;记录高电平时间(解码用)
TIMEH  DATA 5BH       ;记录低电平时间(解码用)


;(振荡电阻为4.7M, a=105u, 晶振频率为7.3728MHz)

;利用键盘中断检测慢脉冲信号高低电平时间
;无线编码信号从P0.7引脚输入


PWIIBUF  DATA  80H    ;80-87H,共8个单元存放充电电流8个采样值
BATVBUF  DATA  88H    ;88-8FH,共8个单元存放电池电压8个采样值

ORG 0000H
LJMP MAIN
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

ORG 0023H
LJMP RXDPROC               ;串行接收中断
                           ;用2区(与基准时间RTC同级)
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

ORG 003BH
LJMP KBINT                 ;使用第3工作寄存器区
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

ORG 0053H
LJMP RTC                   ;实时时钟中断入口地址
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******
                           ;用2区(与串行口同级)
ORG 0073H
LJMP ADPROC                ;使用1区
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******


ORG 0080H
PROC MAIN
MAIN:
    ;调整CCLK频率
;-----------将CLKLP位置1,以降低系统功耗---------------


    ORL AUXR1, #80H
    ORL PCONA, #00101100B  ;由于没有使用比较器、I2C,因此关闭其电源
    MOV SP, #0DFH       ;把E0-FF之间作为堆栈区

    ;变量初始化区

    ;初始化看门狗
    MOV WDL, #195	   ;初始化装载寄存器
    MOV WDCON, #10100101B  ;通过初始化控制器寄存器,设定PRE2~PRE0位,确定分频值
                           ;N=5
    MOV WFEED1, #0A5H
    MOV WFEED2, #5AH      ;顺序执行看门狗清零指令序列,强迫WDCON装入
    ;溢出时间约为500ms左右

    MOV DPTR, #ICBF
    CLR A
    MOVC A, @A+DPTR
    CJNE A, #55H, ICNEXT1
    INC DPTR
    CLR A
    MOVC A, @A+DPTR
    CJNE A, #0AAH, ICNEXT1
    ;已经初始化过!
    SJMP ICEXIT
ICNEXT1:
    LCALL ICPROC        ;初始化标志
    ;强制复位
;    CLR EA
;    SJMP $              ;使看门狗强制复位
ICEXIT:

    MOV A, RSTSRC       ;读复位标志
    ANL A, #00110000B
    XRL A, #0
    JZ NEXT1
    ;不为0,可能是上电复位、也可能是掉电复位、软件复位
    ;清除内存
    MOV R0, #1             ;清除01H-fFH单元
LOOP:
    MOV @R0, #0
    INC R0
    CJNE R0, #00H, LOOP

    MOV PUTIME, #10     ;延迟
    CLR KEY2STU         ;即上电、掉电复位后默认开关处于关闭
    MOV DABA_TC, #77H   ;开始置为正常状态
    mov PWONSTU, #07h   ;开始时认为充电器散热温度正常
;   MOV ACSTU, #00      ;开始时默认无电
    ;初始化蜂鸣器
    ORL LEDSTU1, #0C0H  ;单音状态
    CLR BELL            ;开蜂鸣器
    MOV TIMEBELL, #10
    MOV LEDTIME, #5     ;初始值为5
    ANL RSTSRC, #11001111B;清除上电、掉电复位标志
NEXT1:
    MOV KEYSTU, #07H    ;开始时按键状态置为111
    MOV RXDBUFEV, #55H  ;无效字节(接收缓冲区无效标志)
    MOV R0, #RXDBUFD
    MOV @R0, #55H       ;复位后,将46H单元置为无效状态

    ;日历时钟初始化
    MOV RTCH, #0         ;初始化重装初值
    MOV RTCL, #58        ;CCLK为7.3728MHz,当RTCL初值为58时
                         ;溢出时间为1ms。

    MOV RTCCON, #01100011B;选择CCLK作为RTC时钟,允许RTC溢出中断,
                          ;启动RTC计数器



    MOV TMOD, #00100001B    ;T0工作在方式1(作解码定时器,禁止其中断)
    ;T1作为波特率发生器(工作在方式2,自动重装初值)
    ;CCLK频率为7.3728MHz,波特率为1200,对应初值C为160(不倍增)
    MOV TL1, #160           ;初值为160
    MOV TH1, #160


    ;初始化串行口
    MOV SCON, #11010000B    ;方式3、SM2为0,即RB8为奇偶检验位
                            ;REN为1,允许串行接收
    MOV P2M2, #00000000B
    MOV P2M1, #01000001B
    ANL P2, #01111101B      ;数据线先定义为输入状态。
;    MOV P2,   #01111101B      ;数据线先定义为输入状态。

    MOV P1M2, #00000101B
    MOV P1M1, #00101111B
;    MOV P1,   #11111111B

    MOV P0M2, #00001000B   ;缺省设置
    MOV P0M1, #11111111B
;    MOV P0,   #11111111B   ;数据线先定义为输入状态。



    ;初始化AD转换器

    MOV ADINS, #38H         ;选择AD10通道(充电电流采样);
                            ;AD11通道(电池电压采样);
                            ;AD13未用
                            ;选择AD03通过(作为DAC0使用)

    MOV ADMODA, #01000000B  ;ADC1工作在“自动扫描,连续转换”模式
                            ;AD10通道(充电电流采样)存放在AD1DAT0;
                            ;AD11通道(电池电压采样)存放在AD1DAT1;
                            ;AD13未用

    MOV ADMODB, #01100100B  ;对CCLK进行4分频后作为AD时钟(7.3728MHz/4)。
                            ;使用AD功能,非DA功能。
                            ;由于电流、电压范围不同。
                            ;DAC0工作在DAC0

    MOV ADCON1, #01000101B  ;采用立即启动方式,禁止边界中断、允许AD转换结束中断。
    MOV ADCON0, #00000100B  ;允许ADC0工作。

    ;从P0.7引脚输入
    MOV KBMASK, #80H    ;屏蔽除P0.7引脚外的其他引脚
    MOV KBPATN, #80H    ;假设无线接收模块没有信号时输出高电平
    MOV KBCON,  #00H    ;PATN_SEL位为0,即开始时采用不匹配中断。
                        ;检测下降沿后启动T0计数器,并将PATN_SEL位
                        ;置1,采用匹配时中断
    ;SETB EKBI          ;允许键盘中断(中断控制寄存器具有位寻址功能)


    ;中断初始化
    MOV IEN0, #11010000B
;    CLR ET0
;    CLR ET1               ;禁止T1中断
;    SETB ES
;    SETB EA
;    SETB EWDRT            ;允许看门狗/实时时钟中断
    ORL IEN1, #10000010B
;    SETB EAD              ;允许AD中断
;    SETB EKBI             ;允许键盘中断(中断控制寄存器具有位寻址功能)

;    CLR TR0               ;T0启动由键盘中断程序控制
     ORL IP1H, #02H         ;键盘中断级别置为最高
     SETB PS
     SETB TR1
END

;*****软件陷阱开始*******
;     NOP
;     NOP
;     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

;主程序
PROC MAINPROC
MAINPROC:

     ;上电延迟10*0.1S,即1s
PUWAIT:
    CLR EA
    MOV WFEED1, #0A5H
    MOV WFEED2, #5AH      ;顺序执行看门狗清零指令序列,强迫WDCON装入
    SETB EA

    MOV A, PUTIME
    CJNE A, #0, PUWAIT
    ;目的是为了检测电池电压、交流状态


;延迟后正式开始循环位置
RUN:
    CLR EA
    MOV WFEED1, #0A5H
    MOV WFEED2, #5AH      ;顺序执行看门狗清零指令序列,强迫WDCON装入
    SETB EA
    JNB KEY2STU, NODISPEXIT
    ;在打开状态下执行
    JNB LEDRUN, NODISPEXIT
    LCALL LEDROC             ;指示灯及鸣响处理
    CLR LEDRUN
NODISPEXIT:

    ;校验串行接收并开放串行接收
    MOV A, RXDBUFEV
    CJNE A, #0AAH, RXDEXIT
    ;串行接收缓冲区有效,可以校验
    MOV R1, #RXDBUF
    MOV R2, #4          ;对4个字节求和
    CLR A               ;清累加器
RXDLOOP1:
    ADD A, @R1
    INC R1
    DJNZ R2, RXDLOOP1
    ANL A, #7FH         ;仅保留低7位
    XRL A, @R1          ;与和单元进行校验
    JZ RXDNEXT11
    ;错误,放弃
    SJMP RXDNEXT1
RXDNEXT11:
    ;正确
    MOV R1, #RXDBUF
    MOV A, @R1
    CJNE A, #0EAH, RXDNEXT12
    ;处于工作状态,要检查脉冲宽度是否合理?

    ;检查有无电流输出!
    MOV R1, #RXDBUF+2
    MOV A, @R1
    CJNE A, #12, RXDNEXT121

⌨️ 快捷键说明

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