本帖最后由 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
|