列兵 发表于 2020-5-6 09:28 怪不得用汇编 关键我看不懂啊 只能膜拜 |
老当益壮,这是楼主70周岁制作的生日纪念品,让我们祝福他!![]() |
本帖最后由 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 |
好东西,能分享一下资料吗![]() |
好东东 能分享下源程序吗 |
已经实验通过,性能满意,还有局部电路需要降低功耗 |
谢谢分享!!! |