![]() |
發布時間: 2020-5-3 15:17
正文摘要:本帖最后由 haikuotian 于 2020-5-5 19:45 編輯 突發奇想,自己DIY一個主要用于測試電池的充放電性能和繪制特性曲線的單片機制作 1.要能顯示電壓和電流,2.能充電和放電,3.能和計算機通信是主要的。 電路原理 ... |
列兵 發表于 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 |
好東西,能分享一下資料嗎![]() |
好東東 能分享下源程序嗎 |
已經實驗通過,性能滿意,還有局部電路需要降低功耗 |
謝謝分享!!! |