本帖最后由 haikuotian 于 2020-5-5 20:40 编辑
还在改写,完善中
;可充电电池测试器程序2020 05 1 STC12C5A60S2
ORG 0000H ;
LJMP CHUSI
ORG 0003H
RETI
ORG 000BH ;定时器0中断向量用于显示
LJMP XIANSHI ;点亮8位显示器
ORG 0013H
RETI
ORG 001BH ;定时器1中断向量
RETI
ORG 0023H ;串口中断向量
RETI ;串口中断响应
RETI
NOP
NOP
NOP
NOP
ORG 0064H ;初始化和定义寄存器用途
CHUSI: CLR A ;清零
MOV 87H,A ;置CPU功率方式
MOV IE,A ;禁止中断
MOV IP,A ;禁止中断优先控制
MOV SCON,A ;关闭串行控制
MOV TMOD,A ;计数器控制
MOV TCON,A ;计数器控制
SETB P1.0 ;放电电流检测片选IC5 0有效
SETB P1.2 ;充电电流检测片选IC3 0有效
SETB P1.4 ;电压检测片选IC4 0有效
SETB P1.1 ;SDO数据线
CLR P1.3 ;SCLK 读取用移位脉冲 超过高电平2ms会休眠
SETB P1.5 ;空 用于测试
SETB P1.6 ;温度读取
SETB P1.7 ;放电控制 0放 1停
SETB P3.2 ;充电控制 0充 1停
MOV P0,#0FFH ;用于显示划驱动 低有效
MOV P2,#0FFH ;用于显示位驱动P2.7 第一位 P2.0 第8位
MOV 20H,#0H ; A/D 转换暂存数据高8位07-00
MOV 21H,#0H ; A/D 转换暂存数据低8位0F-08
MOV 22H,#0H ;02 电压A/D1 1转换后数据高8位
MOV 23H,#0H ;03 电压A/D1 1转换后数据低8位
MOV 24H,#0H ;04 电流A/D2 转换后数据高8位
MOV 25H,#0H ;05 电流A/D2 转换后数据高8位
MOV 26H,#0H ;06 电压A/D1 2转换后数据高8位
MOV 27H,#0H ;07 电压A/D1 2转换后数据低8位
MOV 28H,#0H ;08 18B20
MOV 29H,#0H ;09 18B20
MOV 2AH,#1H ;10 存预设充电终止电压 伏特位
MOV 2BH,#5H ;11 存预设充电终止电压 百毫伏特位
MOV 2CH,#6H ;12 存预设充电终止电压 十毫伏特位
MOV 2DH,#7H ;13 存预设充电终止电压 毫伏特位
MOV 2EH,#3H ;14 充/放电标志 3停/1充/2放
MOV 2FH,#0H ;15
MOV 30H,#0H ;16 显示计数器
MOV 31H,#0H ;17 显示存储器 存模数转换后电压 伏特位
MOV 32H,#0H ;18 显示存储器 存模数转换后电压 百毫伏特位
MOV 33H,#0H ;19 显示存储器 存模数转换后电压 十毫伏特位
MOV 34H,#0H ;20 显示存储器 存模数转换后电压 毫伏特位
MOV 35H,#0BFH ;21 显示存储器 显示设定状态 A划/D划 FEH/F7H
MOV 36H,#0H ;22 显示存储器 模数转换后电流 百毫安培位
MOV 37H,#0H ;23 显示存储器 模数转换后电流 十毫安培位
MOV 38H,#0H ;24 显示存储器 模数转换后电流 毫安培位
MOV 39H,#8H ;25 充/过放计数器
MOV 3AH,#0H ;26 存预设放电终止电压 伏特位
MOV 3BH,#8H ;27 存预设放电终止电压 百毫伏特位
MOV 3CH,#7H ;28 存预设放电终止电压 十毫伏特位
MOV 3DH,#6H ;29 存预设放电终止电压 毫伏特位
MOV 3EH,#0H ;30 充/放电计数器 小时(16进制)
MOV 3FH,#0H ;31 充/放电计数器 分钟(16进制)
MOV 40H,#0H ;32 充/放电计数器 秒(60进制)
MOV 41H,#0H ;33 发送代码和
MOV 42H,#0H ;34 临时计数器
MOV 43H,#0H ;临时计数器
MOV 44H,#0H ;临时计数器
MOV 45H,#0H ;临时计数器
MOV 46H,#0H ;临时计数器
MOV 47H,#0H ;临时计数器
MOV 48H,#0H ;临时计数器
MOV 49H,#0H ;临时计数器
MOV 91H,#0H ;设定P1.7输出推挽模式 STC12C5A60S2 P1M1
MOV 92H,#80H ;设定P1.7输出推挽模式 STC12C5A60S2 P1M0
MOV 0B1H,#0H ;设定P3.2输出推挽模式 STC12C5A60S2 P3M1
MOV 0B2H,#04H ;设定P3.2输出推挽模式 STC12C5A60S2 P3M0
MOV 0BBH,#70H ;设定P4(C0) -4-5-6 I/O 模式端口在 C4H C5H C6H
MOV 0B3H,#0H ;设定P4 普通弱上拉
MOV 0B4H,#0H ;设定P4 普通弱上拉
MOV 0C1H,#0H ;不使用看门狗
MOV SP,#80H ;设置栈底
SETB TR0 ;使用11059200晶振
MOV 87H,#0H ;波特率不加倍
MOV 8EH,#11H ;使用独立波特率发生器STC12C5A60S2
MOV 9CH,#0F4H ;独立波特率发生器重装寄存器(2400BT)
MOV 8AH,#0H ;定时器0 16位计数低8位
MOV 8CH,#0F7H ;16位计数高8位 4毫秒中断 显示用
;定时器0 方式2 8位自动重装入定时器1 工作1 16位计数器
NOP ; TMOD GATE C/T M1 M0 GATE C/T M1 M0
MOV TMOD,#11H ;定时/计数 0 0 0 1 0 0 0 1
;
NOP ; TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
MOV TCON,#10H ;启动定时器 0 0 0 1 0 0 0 0
; SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
MOV SCON,#40H ; 0 1 0 0 0 0 0 0
MOV IP,#0H ;中断优先控制 X X PT2 PS PT1 PX1 PT0 PX0
; 0 0 0 0 0 0 0 0
;
;中断控制 EA - ET2 ES ET1 EX1 ET0 EX0
MOV IE,#10000010B; 1 0 0 0 0 1 0
;
NOP
NOP
NOP
KAISHI: NOP ;显示开机画面12345678
MOV 0C1H,#0H ;不使用看门狗
MOV 31H,#1H ;显示存储器 存模数转换后电压 伏特位
MOV 32H,#2H ;显示存储器 存模数转换后电压 百毫伏特位
MOV 33H,#3H ;显示存储器 存模数转换后电压 十毫伏特位
MOV 34H,#4H ;显示存储器 存模数转换后电压 毫伏特位
MOV 35H,#92H ;显示存储器 显示设定状态 A划/D划 FEH/F7H
MOV 36H,#6H ;显示存储器 模数转换后电流 百毫安培位
MOV 37H,#7H ;显示存储器 模数转换后电流 十毫安培位
MOV 38H,#8H ;显示存储器 模数转换后电流 毫安培位
MOV 44H,#30 ;延时3秒
YS1: LCALL YSCX100 ;延时100mS
DJNZ 44H,YS1 ;重复30次 灭一下
MOV 31H,#0FFH ;显示存储器 存模数转换后电压 伏特位
MOV 32H,#0FFH ;显示存储器 存模数转换后电压 百毫伏特位
MOV 33H,#0FFH ;显示存储器 存模数转换后电压 十毫伏特位
MOV 34H,#0FFH ;显示存储器 存模数转换后电压 毫伏特位
MOV 35H,#0BFH ;显示存储器 显示设定状态 A划/D划 FEH/F7H
MOV 36H,#0FFH ;显示存储器 模数转换后电流 百毫安培位
MOV 37H,#0FFH ;显示存储器 模数转换后电流 十毫安培位
MOV 38H,#0FFH ;显示存储器 模数转换后电流 毫安培位
MOV 0C1H,#0H ;不使用看门狗
MOV 44H,#20 ;延时2秒
YS2: LCALL YSCX100 ;延时100mS
DJNZ 44H,YS2 ;重复20次
LCALL DYCS2 ;无显示测电压 估算电源电压
NOP
MOV A,#60H ;大约2.4伏
CJNE A,26H,P26DX ;和26H数据比较2.5伏分界
LJMP JC012
P26DX: JNC JC012 ;如果超过2.4 就设成4.312 和 2.876
MOV 2AH,#4H ;存预设充电终止电压 伏特位
MOV 2BH,#3H ;存预设充电终止电压 百毫伏特位
MOV 2CH,#1H ;存预设充电终止电压 十毫伏特位
MOV 2DH,#2H ;存预设充电终止电压 毫伏特位
MOV 3AH,#2H ;存预设放电终止电压 伏特位
MOV 3BH,#8H ;存预设放电终止电压 百毫伏特位
MOV 3CH,#7H ;存预设放电终止电压 十毫伏特位
MOV 3DH,#6H ;存预设放电终止电压 毫伏特位
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
JC012: NOP ;程序从这里开始
MOV 0C1H,#0H ;不使用看门狗
NOP ;检查按键 S1(P36)S2(P37)S3(P35)S4(P34)S5(P33)
ANJIAN: NOP
JNB P3.6,S1 ;检查S1 0转移
JNB P3.7,S2 ;检查S2 0转移
JNB P3.5,S3 ;检查S3 0转移
JNB P3.4,S4 ;检查S4 0转移
JNB P3.3,S5 ;检查S5 0转移
AJFH: LJMP JC0121 ;没有按键 转移到工作
S1: LJMP S1C
S2: LJMP S2C
S3: LJMP S3C
S4: LJMP S4C
S5: LJMP S5C
NOP
S1C: LCALL YSCX100 ;调用防抖 显示终止电压
LCALL YSCX100 ;调用防抖 显示终止电压
LCALL YSCX100 ;调用防抖 显示终止电压
JB P3.6,AJFH ;检查S1 1转移 没按则转移
MOV A,2EH ;2E存工作模式
CJNE A,#1,XSF2 ;显充电终止电压
MOV 31H,2AH ;充电
MOV 32H,2BH
MOV 33H,2CH
MOV 34H,2DH
LJMP S1T2
XSF2: CJNE A,#2,XSF3 ;显放电终止电压
MOV 31H,3AH ;放电
MOV 32H,3BH
MOV 33H,3CH
MOV 34H,3DH
LJMP S1T2
XSF3: LJMP JC0121
S1T2: JB P3.7,S1T3 ;若S2未按 则检查S3 1转移 调第一位
LCALL YSCX100 ;调用防抖 显示终止电压
MOV A,2EH ;若按 则判2E是1或2
CJNE A,#1,TZFD1 ;调整充电终止电压
INC 2AH
MOV A,2AH
CJNE A,#5,S1T1XH
MOV 2AH,#1
S1T1XH: MOV 31H,2AH ;显充电终止值
MOV 32H,2BH
MOV 33H,2CH
MOV 34H,2DH
S1FH1: LJMP JC012
TZFD1: CJNE A,#2,S1FH1 ;调整放电终止电压
DEC 3AH
MOV A,3AH
CJNE A,#0FFH,S1T2XH
MOV 3AH,#4
S1T2XH: MOV 31H,3AH ;放电
MOV 32H,3BH
MOV 33H,3CH
MOV 34H,3DH
LJMP JC012 ;显充电终止值
S1T3: JB P3.5,S1T4 ;若S2未按 则检查S3 1转移 调第二位
LCALL YSCX100 ;调用防抖 显示终止电压
MOV A,2EH ;若按 则判2E是1或2
CJNE A,#1,TZFD2 ;调整充电终止电压
INC 2BH
MOV A,2BH
CJNE A,#10,S1T3XH
MOV 2BH,#0
S1T3XH: MOV 31H,2AH ;显充电终止值
MOV 32H,2BH
MOV 33H,2CH
MOV 34H,2DH
LJMP JC012
TZFD2: CJNE A,#2,S1FH1 ;调整放电终止电压
DEC 3BH
MOV A,3BH
CJNE A,#0FFH,S1T4XH
MOV 3BH,#9
S1T4XH: MOV 31H,3AH ;放电
MOV 32H,3BH
MOV 33H,3CH
MOV 34H,3DH
LJMP JC012 ;显充电终止值
S1T4: JB P3.4,S1T5 ;若S2未按 则检查S3 1转移 第三位
LCALL YSCX100 ;调用防抖
MOV A,2EH ;若按 则判2E是1或2
CJNE A,#1,TZFD3 ;调整充电终止电压
INC 2CH
MOV A,2CH
CJNE A,#10,S1T5XH
MOV 2CH,#0
S1T5XH: MOV 31H,2AH ;显充电终止值
MOV 32H,2BH
MOV 33H,2CH
MOV 34H,2DH
LJMP JC012
TZFD3: CJNE A,#2,S1FH ;调整放电终止电压
DEC 3CH
MOV A,3CH
CJNE A,#0FFH,S1T6XH
MOV 3CH,#9
S1T6XH: MOV 31H,3AH ;放电
MOV 32H,3BH
MOV 33H,3CH
MOV 34H,3DH
LJMP JC012 ;显充电终止值
S1T5: JB P3.3,S1T6 ;若S2未按 则检查S3 1转移 第四位
LCALL YSCX100 ;调用防抖 显示终止电压
MOV A,2EH ;若按 则判2E是1或2
CJNE A,#1,TZFD5 ;调整充电终止电压
INC 2DH
MOV A,2DH
CJNE A,#10,S1T7XH
MOV 2DH,#0
S1T7XH: MOV 31H,2AH ;显充电终止值
MOV 32H,2BH
MOV 33H,2CH
MOV 34H,2DH
LJMP JC012
TZFD5: CJNE A,#2,S1FH ;调整放电终止电压
DEC 3DH
MOV A,3DH
CJNE A,#0FFH,S1T8XH
MOV 3DH,#9
S1T8XH: MOV 31H,3AH ;放电
MOV 32H,3BH
MOV 33H,3CH
MOV 34H,3DH
S1T6: NOP
S1FH: LJMP JC012
S5CFH: LJMP JC0121
S5C: LCALL YSCX100 ;调用防抖 显示终止电压
JB P3.3,S5CFH ;检查S5 1转移 没按则转移 防抖
MOV 2EH,#1 ;充电
MOV 35H,#0FEH
MOV 3EH,#0H ;充/放电计数器 小时(16进制)
MOV 3FH,#0H ;充/放电计数器 分钟(16进制)
MOV 40H,#0H ;充/放电计数器 秒(60进制)
MOV 39H,#0 ;过滤器
LJMP JC0121
S4C: LCALL YSCX100 ;调用防抖 显示终止电压
JB P3.4,S1FH ;检查S2 1转移 没按则转移
MOV 2EH,#2 ;放电
MOV 35H,#0F7H
MOV 3EH,#0H ;充/放电计数器 小时(16进制)
MOV 3FH,#0H ;充/放电计数器 分钟(16进制)
MOV 40H,#0H ;充/放电计数器 秒(60进制)
MOV 39H,#0 ;过滤器
LJMP JC0121
S3C: LCALL YSCX100 ;调用防抖 显示终止电压
JB P3.5,JC0121 ;检查S2 1转移 没按则转移
MOV 2EH,#3 ;暂停
MOV 35H,#0BFH
MOV 3EH,#0H ;充/放电计数器 小时(16进制)
MOV 3FH,#0H ;充/放电计数器 分钟(16进制)
MOV 40H,#0H ;充/放电计数器 秒(60进制)
MOV 39H,#0 ;过滤器
LJMP JC0121
NOP
NOP
NOP
S2C: LJMP CHUSI
NOP
NOP
NOP
JC0121: MOV 0C1H,#0H ;不使用看门狗
NOP ;检查2EH有关键字 1 2 3
MOV A,2EH ;读2EH到A
CJNE A,#3,JCS1 ;2EH是0 转移到空操作
LJMP KCZ
JCS1: CJNE A,#1,JCS2 ;2EH 不是1 转移到放电操作
LJMP CDCZ
JCS2: CJNE A,#2,JCS3
LJMP FDCZ
JCS3: LJMP KCZ
NOP
NOP
NOP
CDCZ: LJMP CDCZKS ;转到充电操作
NOP
FDCZ: LJMP FDCZKS ;2EH 是2 转移到放电操作
NOP
KCZ: NOP ;转到空操作
NOP ;空操作 测试电压,发送数据,延时
SETB P3.2 ;低电平充电,高停
SETB P1.7 ;低电平放电 高停
LCALL DYCS1 ;监测电池电压 P14
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YS10 ;调用延时10毫秒程序
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YSCX100 ;调用延时100毫秒程序
CXS: MOV 36H,#0H ;显示存储器 模数转换后电流 百毫安培位
MOV 37H,#0H ;显示存储器 模数转换后电流 十毫安培位
MOV 38H,#0H ;显示存储器 模数转换后电流 毫安培位
MOV 24H,#0 ;清除残存
MOV 25H,#0 ;清除残存
MOV 26H,#0 ;清除残存
MOV 27H,#0 ;清除残存
LCALL FS232 ;调用发送232程序
LCALL WDCS ;调用温度测试程序
LJMP JC012 ;转到下一周期
NOP
NOP
NOP
CDCZKS: NOP ;充电操作 测试电压,发送数据,延时
LCALL YSCX100 ;调用延时100毫秒程序
LCALL DYCS1 ;调用电压转换程序 无充电测试 P14
NOP ;以下判别充电到位过充
MOV A,2AH ;读取预存千位
CJNE A,31H,KYCD ;不相等 转移
MOV A,2BH ;读取预存百位
CJNE A,32H,KYCD ;不相等 转移
MOV A,2CH ;读取预存十位
CJNE A,33H,KYCD ;不相等 转移
MOV A,2DH ;读取预存个位
CJNE A,34H,KYCD ;不相等 转移
BNCD: NOP
CLR C ;
INC 39H ;过充计数
MOV A,39H ;
CJNE A,#10,KYCD1 ;比较过充计数
MOV 35H,#0BFH
MOV 39H,#0 ;满足条件
MOV 2EH,#3H ;全相等 停充
LJMP JC012 ;不充电 转移
KYCD: JC BNCD ;大于比较值 不能充电
KYCD1: NOP ;充电
NOP
NOP ;
CLR P3.2 ;低电平充电,高停
SETB P1.7 ;低电平放电 高停
LCALL YSCX100 ;调用延时100毫秒程序
LCALL DLCSC ;调用电流转换程序1 充电 P12
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YSCX100 ;调用延时100毫秒程序
LCALL FS232 ;调用发送232程序
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YSCX100 ;调用延时100毫秒程序
LCALL DYCS2 ;调用电压转换程序2 有充电测试 P14
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YS10 ;调用延时10毫秒程序
LCALL YS10 ;调用延时10毫秒程序
LCALL YS10 ;调用延时10毫秒程序
LCALL YS10 ;调用延时10毫秒程序
LCALL YS10 ;调用延时10毫秒程序
SETB P3.2 ;高电平充电,低停
SETB P1.7 ;低电平放电 高停
LCALL WDCS ;调用温度测试程序
LCALL JSQCX ;调用计时程序
LJMP JC012 ;转到下一周期
NOP
NOP
NOP
FDCZKS:NOP ;放电操作 测试电压,发送数据,延时,
LCALL YSCX100 ;调用延时100毫秒程序
LCALL DYCS1 ;调用电压转换程序 无放电测试 P14
NOP
NOP
NOP ;以下检查过放
MOV A,31H ;读取预存千位
CJNE A,3AH,KYFD ;不相等 转移
MOV A,32H ;读取预存百位
CJNE A,3BH,KYFD ;不相等 转移
MOV A,33H ;读取预存十位
CJNE A,3CH,KYFD ;不相等 转移
MOV A,34H ;读取预存个位
CJNE A,3DH,KYFD ;不相等 转移
BNFD: NOP
CLR C
INC 39H
MOV A,39H
CJNE A,#10,KYFD1
MOV 35H,#0BFH
MOV 39H,#0
MOV 2EH,#3H ;全相等 停放
LJMP JC012 ;不放电 转移
KYFD: JC BNFD ;大于比较值 不能放电
KYFD1: NOP ;放电
SETB P3.2 ;低电平充电,高停
CLR P1.7 ;低电平放电 高停
LCALL YSCX100 ;调用延时100毫秒程序
LCALL DLCSF ;调用电流转换程序2 P10
LCALL YSCX100 ;调用延时100毫秒程序
LCALL FS232
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YSCX100 ;调用延时100毫秒程序
LCALL DYCS2 ;调用电压转换程序2 带电测试 P14
LCALL YSCX100 ;调用延时100毫秒程序
LCALL YS10 ;调用延时10毫秒程序
LCALL YS10 ;调用延时10毫秒程序
LCALL YS10 ;调用延时10毫秒程序
LCALL YS10 ;调用延时10毫秒程序
LCALL WDCS ;调用温度测试程序
SETB P3.2 ;低电平充电,高停
SETB P1.7 ;低电平放电 高停
LCALL JSQCX ;调用计时程序
LJMP JC012 ;转到下一周期
NOP
NOP
NOP
JSQCX: INC 40H ;脉冲计数器 秒脉冲加1
MOV A,40H ;读秒到累加
CJNE A,#60,JSFH ;60秒 进位
MOV 40H,#0 ;秒清零
MOV 39H,#0 ;充放监测延时清零
INC 3FH ;分加1
MOV A,3FH ;读分到累加
CJNE A,#60,JSFH ;和60比较
MOV 3FH,#0 ;等于60 清零
INC 3EH ;小时加1
JSFH: RET ;返回
NOP
NOP
NOP
DYCS1: NOP ;电压测试程序1 纯电压 送显
CLR P1.4 ;IC4 电压片选线
NOP
NOP
SETB P1.1 ;SDO 数据线
LCALL ADZH1 ;调用AD转换程序
SETB P1.4 ;选中 释放
NOP ;20H 21H 存电压 高位和低位(16位)
CLR P1.3 ; 时钟脉冲线~|_
NOP
MOV A,20H ;
MOV 22H,A ;保存至电压寄存器 高位
MOV R6,A ;16位被除数高8位
MOV A,21H
MOV 23H,A ;保存至电压寄存器 低位
MOV R7,A ;16位被除数低8位
LCALL CFDYCX ;调用除法电压程序 并送显
RET
NOP
NOP
NOP
RET ;电压测试结束
DYCS2: NOP ;电压测试程序2 带载电压 不送显
CLR P1.4 ;IC4 电压片选线
NOP
NOP
SETB P1.1 ;SDO 数据线
LCALL ADZH1 ;调用AD转换程序
SETB P1.4 ;撤销选中
NOP ;20H 21H 存电压 高位和低位(16位)
CLR P1.3 ; 时钟脉冲线~|_
MOV A,20H ;
MOV 26H,A ;保存至电压寄存器 高位
MOV A,21H
MOV 27H,A ;保存至电压寄存器 低位
RET
NOP
NOP
RET ;电压测试结束
DLCSC: NOP ;电流测试程序1 送显
CLR P1.2 ;IC3 电流片选线
NOP
NOP
SETB P1.1 ;SDO 数据线
LCALL ADZH2 ;调用AD转换程序
SETB P1.2 ;选中撤销
NOP ;20H 21H 存电压 高位和低位(16位)
CLR P1.3 ; 时钟脉冲线~|_
MOV A,20H ;
MOV 24H,A ;保存至电压寄存器 高位
MOV A,21H
MOV 25H,A ;保存至电压寄存器 低位
MOV R6,24H ;16位被除数高8位
MOV R7,25H ;16位被除数低8位
LCALL CFDLCX ;调用除法电流程序 并送显
RET
DLCSF: NOP ;电流测试程序1
CLR P1.0 ;IC5 电流片选线
NOP
NOP
SETB P1.1 ;SDO 数据线
LCALL ADZH2 ;调用AD转换程序
SETB P1.0 ;释放选中
NOP ;20H 21H 存电压 高位和低位(16位)
CLR P1.3 ; 时钟脉冲线~|_
MOV A,20H ;
MOV 24H,A ;保存至电压寄存器 高位
MOV A,21H
MOV 25H,A ;保存至电压寄存器 低位
MOV R6,24H ;16位被除数高8位
MOV R7,25H ;16位被除数低8位
LCALL CFDLCX ;调用除法电压程序 并送显
NOP
NOP
NOP
RET ;电流测试结束
ADZH1: JB P1.1,ADZH1 ;等待转换完成
LCALL DYAD ;D23 调用读端口
MOV 127,C ;
LCALL DYAD ;D22
MOV 126,C
LCALL DYAD ;D21
MOV 125,C
LCALL DYAD ;D20
MOV 124,C
LCALL DYAD ;D19
MOV 123,C
LCALL DYAD ;D18
MOV 7H,C ;数据送20.7
LCALL DYAD ;D17
MOV 6H,C ;数据送20.6
LCALL DYAD ;D16
MOV 5H,C ;数据送20.5
LCALL DYAD ;D15
MOV 4H,C ;数据送20.4
LCALL DYAD ;D14
MOV 3H,C ;数据送20.3
LCALL DYAD ;D13
MOV 2H,C ;数据送20.2
LCALL DYAD ;D12
MOV 1H,C ;数据送20.1
LCALL DYAD ;D11
MOV 0H,C ;数据送20.0
LCALL DYAD ;D10
MOV 0FH,C ;数据送21.7
LCALL DYAD ;D9
MOV 0EH,C ;数据送21.6
LCALL DYAD ;D8
MOV 0DH,C ;数据送21.5
LCALL DYAD ;D7
MOV 0CH,C ;数据送21.4
LCALL DYAD ;D6
MOV 0BH,C ;数据送21.3
LCALL DYAD ;D5
MOV 0AH,C ;数据送21.2
LCALL DYAD ;D4
MOV 9H,C ;数据送21.1
LCALL DYAD ;D3
MOV 8H,C ;数据送21.0
LCALL DYAD ;D2
MOV 122,C
LCALL DYAD ;D1
MOV 121,C
LCALL DYAD ;D0
MOV 120,C
;LCALL DYAD ;D0
RET
DYAD: SETB P1.3 ;__|~ 在上升沿后读取数据
MOV C,P1.1 ;读数据
CLR P1.3 ;~|_ 下降
RET
NOP
NOP
RET
ADZH2: JB P1.1,ADZH2 ;等待转换完成
LCALL DYAD ;D23 调用读端口
LCALL DYAD ;D22
LCALL DYAD ;D21
LCALL DYAD ;D20
LCALL DYAD ;D19
LCALL DYAD ;D18
MOV 7H,C ;数据送20.7
LCALL DYAD ;D17
MOV 6H,C ;数据送20.6
LCALL DYAD ;D16
MOV 5H,C ;数据送20.5
LCALL DYAD ;D15
MOV 4H,C ;数据送20.4
LCALL DYAD ;D14
MOV 3H,C ;数据送20.3
LCALL DYAD ;D13
MOV 2H,C ;数据送20.2
LCALL DYAD ;D12
MOV 1H,C ;数据送20.1
LCALL DYAD ;D11
MOV 0H,C ;数据送20.0
LCALL DYAD ;D10
MOV 0FH,C ;数据送21.7
LCALL DYAD ;D9
MOV 0EH,C ;数据送21.6
LCALL DYAD ;D8
MOV 0DH,C ;数据送21.5
LCALL DYAD ;D7
MOV 0CH,C ;数据送21.4
LCALL DYAD ;D6
MOV 0BH,C ;数据送21.3
LCALL DYAD ;D5
MOV 0AH,C ;数据送21.2
LCALL DYAD ;D4
MOV 9H,C ;数据送21.1
LCALL DYAD ;D3
MOV 8H,C ;数据送21.0
LCALL DYAD ;D2
LCALL DYAD ;D1
LCALL DYAD ;D0
;LCALL DYAD ;D0
NOP
NOP
NOP
RET
NOP
CFDYCX: NOP ;除法子程序 R6存高八位 R7存低八位
MOV R4,#27H ;除数10000 2710H
MOV R5,#10H ;
LCALL CF16 ;R7存商 R4(H)R5(L)为余数
MOV 31H,R7 ;千位送显存
NOP
MOV A,R4
MOV R6,A ;16位余除数高8位
MOV A,R5
MOV R7,A ;16位余除数低8位
MOV R4,#3H ;除数1000 3E8H
MOV R5,#0E8H ;
LCALL CF16 ;R7存商 R4(H)R5(L)为余数
MOV 32H,R7 ;百位送显存
NOP
MOV A,R4
MOV R6,A ;16位余除数高8位
MOV A,R5
MOV R7,A ;16位余除数低8位
MOV R4,#0H ;除数100 64H
MOV R5,#64H ;
LCALL CF16 ;R7存商 R4(H)R5(L)为余数
MOV 33H,R7 ;十位送显存
NOP
MOV A,R5
MOV B,#0AH
DIV AB
MOV 34H,A ;个位送显存
RET
NOP
NOP
NOP
LJMP JC012
CFDLCX: NOP ;除法电流程序 R6存高八位 R7存低八位
MOV R4,#27H ;除数10000 2710H
MOV R5,#10H ;
LCALL CF16 ;R7存商 R4(H)R5(L)为余数
NOP ;MOV 36H,R7 千位送显存
NOP
MOV A,R4
MOV R6,A ;16位余除数高8位
MOV A,R5
MOV R7,A ;16位余除数低8位
MOV R4,#3H ;除数1000 3E8H
MOV R5,#0E8H ;
LCALL CF16 ;R7存商 R4(H)R5(L)为余数
MOV 36H,R7 ;百位送显存
NOP
MOV A,R4
MOV R6,A ;16位余除数高8位
MOV A,R5
MOV R7,A ;16位余除数低8位
MOV R4,#0H ;除数100 64H
MOV R5,#64H ;
LCALL CF16 ;R7存商 R4(H)R5(L)为余数
MOV 37H,R7 ;十位送显存
NOP
MOV A,R5
MOV B,#0AH
DIV AB
MOV 38H,A ;个位送显存
NOP
RET
NOP
NOP
NOP
CF16: NOP
CJNE R4,#00H,DIV_H1
CJNE R6,#00H,DIV_H2
ALLDIV_L:NOP
MOV A,R7
MOV B,R5
DIV AB
MOV R7,A
MOV R5,B
RET
DIV_H1: NOP
CLR A
XCH A,R4
MOV R0,A
MOV B,#08H
UIDIV_LOOP1:NOP
MOV A,R7
ADD A,R7
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R6
SUBB A,R5
MOV A,R4
SUBB A,R0
JC R4_HIGH
R4_EQU_LOW:NOP
MOV R4,A
MOV A,R6
SUBB A,R5
MOV R6,A
INC R7
R4_HIGH: NOP
DJNZ B,UIDIV_LOOP1
CLR A
XCH A,R6
MOV R5,A
RET
DIV_H2: NOP
MOV A,R5
MOV R0,A
MOV B,A
MOV A,R6
DIV AB
JB OV,UIDIV_END
MOV R6,A
MOV R5,B
MOV B,#08H
UIDIV_LOOP2:NOP
MOV A,R7
ADD A,R7
MOV R7,A
MOV A,R5
RLC A
MOV R5,A
JC UIDIV_NEXT
SUBB A,R0
JNC RE_EQU_LOW
RE_HIGH: NOP
DJNZ B,UIDIV_LOOP2
RET
UIDIV_NEXT:NOP
CLR C
SUBB A,R0
RE_EQU_LOW:NOP
MOV R5,A
INC R7
DJNZ B,UIDIV_LOOP2
UIDIV_END: NOP
NOP
RET
NOP
NOP
NOP
FS232: NOP ;发送数据,22H-41H
MOV A,#55H
LCALL FSCXK ;FE送发送器
MOV A,#0AAH
LCALL FSCXK ;送字节发送器
MOV R1,#22H ;发送数据地址指针
MOV R2,#34 ;发送数据字数
MOV 41H,#0 ;清零代码和
FSSS: MOV A,@R1 ;R1指向数据
LCALL FSCXK ;第16字节送发送器
INC R1
DJNZ R2,FSSS ;
RET
NOP
NOP
NOP
FSCXK: MOV SBUF,A ;字节送发送器
ADD A,41H
MOV 41H,A
JNB TI,$ ;等待发完
CLR TI
RET ;
NOP
NOP
NOP
YS10: NOP ;延时/防抖 10mS t=0.0904微秒
MOV 50H,#48H ;10毫秒 *
YS11: MOV 51H,#0FFH ;255*T 2t 138 微秒
YS12: NOP ;1t 11059200
DJNZ 51H,YS12 ;5t
DJNZ 50H,YS11 ;
RET ;延时/防抖结束
NOP
NOP
NOP
YSCX100: NOP ;100毫秒延时
MOV 53H,#10 ;10*10毫秒=100毫秒
YSCX103: MOV 54H,#97 ;100*100微秒=10毫秒
YSCX102: MOV 55H,#162 ;循环7t*160*0.0904=100微秒(99.982)
YSCX101: NOP
NOP
DJNZ 55H,YSCX101 ;100微秒循环
DJNZ 54H,YSCX102 ;10毫秒循环
DJNZ 53H,YSCX103 ;100毫秒循环
RET
NOP
NOP
NOP
NOP ;串口中断响应
CKZD: RETI ;如果是接收则响应 RI=1 ;如果不是接收则返回RI=0
NOP
NOP
NOP
LJMP JC012
NOP
NOP
NOP
XIANSHI: NOP ;不使用看门狗 从中断进入显示程序
PUSH PSW ;程序状态字入栈
PUSH ACC ;累加器入栈
PUSH B ;累加器入栈
MOV 8AH,#0H ;定时器0 16位计数低8位 重装
MOV 8CH,#0F7H ;16位计数高8位 2.5毫秒中断 显示用
SETB TR0 ;允许计数
MOV A,30H ;读取要显示的位
MOV DPTR,#ZYDZ ;设置转移地址
MOV B,#3 ;位移
MUL AB ;乘法得地址位移量
JMP @A+DPTR ;根据地址位移量转移
NOP
NOP
NOP
ZYDZ: LJMP D1W ;转移指向SM8
LJMP D2W ;转移指向SM7
LJMP D3W ;转移指向SM6
LJMP D4W ;转移指向SM5
LJMP D5W ;转移指向SM4
LJMP D6W ;转移指向SM3
LJMP D7W ;转移指向SM2
LJMP D8W ;转移指向SM1
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV 30H,#0 ;显示的位计数器
LJMP XIANSHIW ;转移到返回
NOP
NOP
D1W: MOV P0,#0FFH ;关闭显示划驱动,准备显示第一位 最左一位
MOV P2,#0FFH ;关闭显示位驱动
MOV A,31H ;SM8
LCALL YMQ ;调用译码器
MOV P0,A ;显示划驱动
CLR P2.7 ;显示第一位
INC 30H ;准备SM7
LJMP XIANSHIW ;转移到返回
NOP
NOP
D2W: MOV P0,#0FFH ;关闭显示划驱动,准备显示第二位
MOV P2,#0FFH ;关闭显示位驱动
MOV A,32H ;SM7
LCALL YMQ ;调用译码器
MOV P0,A ;显示划驱动
CLR P2.6 ;显示第二位
INC 30H ;准备下一位
LJMP XIANSHIW ;转移到返回
NOP
NOP
NOP
D3W: MOV P0,#0FFH ;关闭显示划驱动,准备显示第三位
MOV P2,#0FFH ;关闭显示位驱动
MOV A,33H ;SM6
LCALL YMQ ;调用译码器
MOV P0,A ;显示划驱动
CLR P2.5 ;显示第三位
INC 30H ;准备下一位
LJMP XIANSHIW ;转移到返回
NOP
NOP
NOP
D4W: MOV P0,#0FFH ;关闭显示划驱动,准备显示第四位
MOV P2,#0FFH ;关闭显示位驱动
MOV A,34H ;SM5
LCALL YMQ ;调用译码器
MOV P0,A ;显示划驱动
CLR P2.4 ;显示第四位
INC 30H ;准备下一位
LJMP XIANSHIW ;转移到返回
NOP
NOP
NOP
D5W: MOV P0,#0FFH ;关闭显示划驱动,准备显示第五位
MOV P2,#0FFH ;关闭显示位驱动
MOV A,35H ;SM4 这里不用译码 直接送
MOV P0,A ;显示划驱动
CLR P2.3 ;显示第五位
LCALL YMQ ;调用译码器 占用时间
INC 30H ;准备下一位
LJMP XIANSHIW ;转移到返回
NOP
NOP
NOP
D6W: MOV P0,#0FFH ;关闭显示划驱动,准备显示第六位
MOV P2,#0FFH ;关闭显示位驱动
MOV A,36H ;SM3
LCALL YMQ ;调用译码器
MOV P0,A ;显示划驱动
CLR P2.2 ;显示第六位
INC 30H ;准备下一位
LJMP XIANSHIW ;转移到返回
NOP
NOP
NOP
D7W: MOV P0,#0FFH ;关闭显示划驱动,准备显示第七位
MOV P2,#0FFH ;关闭显示位驱动
MOV A,37H ;SM2
LCALL YMQ ;调用译码器
MOV P0,A ;显示划驱动
CLR P2.1 ;显示第七位
INC 30H ;准备下一位
LJMP XIANSHIW ;转移到返回
NOP
NOP
D8W: MOV P0,#0FFH ;关闭显示划驱动,准备显示第八位
MOV P2,#0FFH ;关闭显示位驱动
MOV A,38H ;SM1
LCALL YMQ ;调用译码器
MOV P0,A ;显示划驱动
CLR P2.0 ;显示第八位
MOV 30H,#0 ;准备下一循环位
XIANSHIW: POP B ;累加器出栈
POP ACC ;累加器出栈
POP PSW ;程序状态字出栈
RETI ;从定时器0中断返回
NOP
NOP
YMQ: MOV DPTR,#YMSJ ;设置译码数据地址指针
MOVC A,@A+DPTR ;读取译码数据
RET
RET
NOP
YMSJ: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0C0H,0F7H,0FEH,0BFH,0H,0H
NOP
NOP
NOP
NOP
NOP
NOP
NOP
LJMP XIANSHIW
NOP
NOP
WDCS: NOP ;温度测试
RET ;返回
NOP
NOP
END
|