找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2713|回复: 6
收起左侧

用 STC 12C5A60S2 DIY可充电电池测试装置

[复制链接]
ID:280206 发表于 2020-5-3 15:17 | 显示全部楼层 |阅读模式
本帖最后由 haikuotian 于 2020-5-5 19:45 编辑

突发奇想,自己DIY一个主要用于测试电池的充放电性能和绘制特性曲线的单片机制作
1.要能显示电压和电流,2.能充电和放电,3.能和计算机通信是主要的。
电路原理图:
S01_01_01.JPG


印制板图


PCB_01_01.JPG


充电曲线_.JPG

绘制的放电曲线
放电曲线.JPG

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:253767 发表于 2020-5-4 07:05 | 显示全部楼层
谢谢分享!!!
回复

使用道具 举报

ID:280206 发表于 2020-5-5 06:26 | 显示全部楼层
已经实验通过,性能满意,还有局部电路需要降低功耗
回复

使用道具 举报

ID:328014 发表于 2020-5-5 14:21 | 显示全部楼层
好东东 能分享下源程序吗
回复

使用道具 举报

ID:624444 发表于 2020-5-5 17:04 | 显示全部楼层
好东西,能分享一下资料吗
回复

使用道具 举报

ID:280206 发表于 2020-5-5 20:17 | 显示全部楼层
本帖最后由 haikuotian 于 2020-5-5 20:40 编辑
51hei团团 发表于 2020-5-5 14:21
好东东 能分享下源程序吗
还在改写,完善中

                         ;可充电电池测试器程序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
回复

使用道具 举报

ID:117716 发表于 2020-5-6 09:28 | 显示全部楼层
老当益壮,这是楼主70周岁制作的生日纪念品,让我们祝福他!
回复

使用道具 举报

ID:514317 发表于 2020-5-6 10:07 | 显示全部楼层
列兵 发表于 2020-5-6 09:28
老当益壮,这是楼主70周岁制作的生日纪念品,让我们祝福他!

怪不得用汇编     关键我看不懂啊    只能膜拜
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表