📄 89lpc933(修改充电过程).asm
字号:
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 + -