|
下面是此電瓶車充電保護器作品的外觀圖:
這是一個電瓶車充電器的附加裝置,不對充電器做任何變動,而是將充電器插在該保護器上連成一體代替原充電器進行電瓶車的充電。
功能:1、充電達到設(shè)定的電壓,自動斷電停充,防過充。
2、滿十小時自動停充電,電瓶有故障充不到設(shè)定電壓,經(jīng)十小時也停充。
3、能根據(jù)氣溫設(shè)定充電電壓檔次,能記憶設(shè)定的檔次,無須每次設(shè)定。
4、用二進制數(shù)循環(huán)顯示電壓的十位個位小數(shù)位值。
用法:將充電器插在該保護器上連成一體,代替原充電器進行電瓶車的充電。插上220V交流后在15秒內(nèi)左右慢搖保護器,使內(nèi)置水銀開關(guān)接通又斷開(按鍵作用),溫度檔次依次增加,共分1~8檔,對應(yīng)環(huán)境溫度是5℃-40℃。水銀開關(guān)斷開15秒后進入充電程序,水銀開關(guān)不再起作用。
充足電的斷充電指示可從原充電器指示燈看出,不另加指示燈。
讀電壓:顯示過程是--四燈全亮(提示開始)、滅、十位、滅、個位、滅、小數(shù)一位、滅,循環(huán)不斷。用四位二進制數(shù)表示0到9,讀出數(shù)不難,記得四燈分別代表8、4、2、1,將亮燈的數(shù)相加就是了。0也顯示為滅,可從時間上判別出來。
例:54.9顯示為
○○○○ 開始
●○●○ 5
●○●● 4
○●●○ 9
為省事沒用數(shù)碼管,自己用的東西,簡單實用為好。四個發(fā)光管也合用一個限流電阻,單片機復(fù)位用的電容電阻也省了,晶振也省了。
工作原理:用手機充電器拆來的電路板為裝置提供5V電源。單片機AD轉(zhuǎn)換測電壓,每15秒進行一次。測得的電壓與設(shè)定的終止電壓比較,達到了就給繼電器模塊送一信號,收到信號繼電器就斷開充電器電源。單片機同時計時,滿十時也發(fā)出停充電信號,滿十天自動重啟單片機進行充電管理(暑假長時間人不在家也沒問題了)。
為避免單片機工作電壓變動對電壓測量的影響,用TL431提供一個基準(zhǔn)電壓,P1.1對其進行AD轉(zhuǎn)換。電瓶電壓1/15分壓后用P1.0進行AD轉(zhuǎn)換,然后用下式算出電瓶電壓。
十五分之一電瓶電壓:基準(zhǔn)電壓=電瓶AD值:基準(zhǔn)電壓的AD值
實測TL431穩(wěn)壓后是2.524伏,程序中采用的具體算法是:
電瓶電壓伏特數(shù)=(電瓶AD值×37+電瓶AD值×86÷100)÷基準(zhǔn)電壓AD值
被除數(shù)是兩個8位,除數(shù)是一個8位,我是用循環(huán)做減法的辦法來求商。具體見源碼。
分壓電阻的調(diào)整,借助萬用表反復(fù)細心調(diào)精密可調(diào)電阻,使阻值之比為14:1。
材料:單片機STC12C5204AD 繼電器模塊,手機充電器,交流插座等。
電路原理圖:
單片機電路圖
接線示意圖:
組裝接線示意圖
制作過程:
裝飾邊角料做的外殼
拆解手機充電器
繼電器模塊
單片機正面
單片機背面
組裝好
單片機編程源碼如下:
- ;1/15取樣,單片機工作電壓約5V,能測電壓達75V。
- ;改成最多充電10小時。十天后重啟。
- ;使用EEPROM保存溫度檔。 ;2016年7月6日修改:
- ;使用汞開關(guān)設(shè)定溫度檔,使用EEPROM保存溫度檔。
- ;開機16秒內(nèi)(大約)按鍵設(shè)定溫度檔數(shù),若不按鍵,則默認上次的檔數(shù)。有1,2,3,4,5,6,7,8共八檔。
- ;設(shè)溫度檔后接通220V
- ;從溫度5度起為第1檔,10度為第2檔,15度為第3檔,……35度為第7檔,40度為第8 檔,0檔同第8檔。停下不按鍵約15秒自動進入下一環(huán)節(jié)。
- ;顯示電瓶伏特數(shù),按四燈亮、黑、十位、黑、個位、黑、小數(shù)位、黑,循環(huán)顯示。四燈亮和黑是半秒,數(shù)字是1秒
- ;20H.0設(shè)置溫度檔[WENDU]子程序控制位,初值賦1,在等待按鍵的子程序[xunhuan]中清0.僅在開機初用一次。
- ;20H.2 顯示控制位.走時置1,顯示后清0,使得半秒進行一次顯示。
- ;20H.3 秒標(biāo)志
- ;21H.0
- ;21H.2 [Tuoliu]程序控制位,使程序只運行一次。
- ;21H.3
- ;21H.4是電瓶正常標(biāo)志,初值賦1(正常),檢測到電瓶充滿或不正常將其清0,清0后要重啟才能置1.
- ;21H.6充電10小時標(biāo)志,初值為1,充電達10小時將其清0.清0后要重啟才能置1.
- ;22H.0 走時用的20ms標(biāo)志,在中斷置1,走時中清0。
- ;22H.3 時標(biāo)志
- ;22H.5 每15秒運行一次的標(biāo)志位,走時置1.
- ;22H.7
- ;用檢測到的電壓AD值與設(shè)定的終止電壓AD值進行比較,確定電瓶滿或不正常(電壓太低或無電瓶)關(guān)斷220V供電。
- ;開機接通220V,電瓶充滿(或不正常)關(guān)斷,充電10小時關(guān)斷,十天后單片機重啟。
- ;P1.0--A/D轉(zhuǎn)換
- ;P1.1--A/D轉(zhuǎn)換測TL431電壓
- ;P1.2--鍵,每按一次溫度檔數(shù)加1,在0--8之中循環(huán),停下不按鍵約15秒自動進入下一環(huán)節(jié)。
- ;P1.7,P1.6,P1.5,P1.4接LED做溫度檔顯示,點亮分別表示8,4,2,1,二進制數(shù)。
- ;P3.2--通過光耦控制220V通斷 0-通 1-斷
- ;***************
-
- ;***
- U_zhongzhixiao EQU 5EH ;終止電壓小數(shù)寄存器
- U_zhongzhizheng EQU 5FH ;終止電壓整數(shù)寄存器
- JSHQ_WEI EQU 65H ;顯示第幾位計數(shù)器
- XUN_JSHQ EQU 67H ;循環(huán)次數(shù)
- wendudang EQU 68H ;溫度檔數(shù)
- v_ZH EQU 5DH ;電瓶伏特整數(shù)寄存器
- V_XAO EQU 5CH ;電瓶伏特小數(shù)寄存器
- TL431_AD EQU 5BH ;TL431的AD值
- TL431_AD1 EQU 5AH ;TL431的AD值(第一次)
- jiace_adzhi1 EQU 58H ;第一次檢測到的AD值
- ;xiu_adzhi EQU 6CH ;(修)終止電壓AD值
- Jiace_ADzhi EQU 59H ;檢測AD值 檢測到的AD值
- JSHQ_15 EQU 6EH ;15秒計數(shù)器
- JSHQ_20mS EQU 70H ;20mS計數(shù)器 計20mS的個數(shù)
- JSHQ_S EQU 71H ;半秒計數(shù)器
- JSHQ_M EQU 72H ;分計數(shù)器
- JSHQ_H EQU 73H ;時計數(shù)器
- ;60H,61H,62H,63H,64H 用在顯緩中
- beichushugao equ 75h ;被除數(shù)高位
- beichushudi EQU 76H ;被除數(shù)低位
- chushu EQU 77H ;除數(shù)
- zhengshang EQU 78H ;整數(shù)商
- XIAOSHUSHANG EQU 79H ;小數(shù)商
- YUSHU EQU 7AH ;余數(shù)
- LSSHU EQU 7BH ;臨時存
- DISHU EQU 7CH ;低數(shù) 第二次的被除數(shù)的低位
- GAOSHU EQU 7DH ;高數(shù) 第二次的被除數(shù)的高位
- ADC_CONTR EQU 0BCH ;ADC控制寄存器
- ADC_RES EQU 0BDH ;A/D轉(zhuǎn)換結(jié)果寄存器
- P1ASF EQU 09DH ;p1口模擬功能控制寄存器
- WDT_CONTR EQU 0C1H ;看門狗
- ;AUXR DATA 8EH ;選擇1T與12T的寄存器
- IAP_CONTR EQU 0C7H ;下載/復(fù)位控制器
- jian EQU p1.2 ;鍵
- kong EQU p3.2 ;控 220V 0-通 1-斷
- p1m1 equ 91h
- p1m0 equ 92h
- ;EEPROM有關(guān)的寄存器
- dat equ 0C2H
- drh equ 0C3H
- drl equ 0C4H
- cmd equ 0C5H
- trig equ 0C6H
- contr equ 0C7H
- ;****************
- ORG 0000H
- AJMP START
- ORG 000BH
- LJMP TIME_0
- ; ORG 001BH
- ORG 0030H
- START:
- ;其它初始化寫在此
- MOV P1M1,#00000011B
- MOV P1M0,#00000000B ;P1.0 P1.1兩個高阻輸入做AD
- MOV P1,#00001111B
- setb kong ;斷220V交流 設(shè)溫度檔后接通
- MOV 22H,#00100000B ;檢測標(biāo)志 1-檢 0-不檢 每15秒檢測AD一次和處理顯緩一次的標(biāo)志位,走時置1,處理顯緩后清0
- MOV 21H,#01010000B ;21h.4 電瓶 1-能充 0-不能充電(含無、充滿)
- ;21H.6 初值1,充電10小時清0 。
- ;*用計數(shù)器0 初步設(shè)置定時中斷 20MS中斷 20毫秒@10.911MHz
- MOV SP,#80H ;設(shè)置堆棧區(qū)域
- ; ANL AUXR,#7FH ;定時器時鐘12T模式 默認是12T模式 省略本句
- MOV TMOD,#00010001B ;定時器0定時器1都是 16位
- MOV TL0,#0F7H
- MOV TH0,#0B8H
- SETB EA
- SETB ET0
- SETB TR0 ;開放中斷
-
- setb 20h.0 ;控制設(shè)置溫度檔程序的循環(huán)用
- ;*****************
- ;設(shè)置溫度檔 從EEPROM中讀出保存值,一段時間內(nèi)不按鍵,則使用該檔值;如按鍵則改之,停下不動,過會兒保存并啟用。
- LCALL DOUEEPROM ;讀EEPROM中的保存值
- WENDU:
- jnb 20H.0,WENDUret ;0-跳
- LCALL doujian ;讀鍵和健值處理
- LCALL XIANSHI ;顯示
- LCALL xunhuan ;循環(huán) 次數(shù)
- AJMP WENDU
- WENDUret:
- LCALL clear_write ;先擦除EEPROM再寫EEPROM保存溫度檔,然后關(guān)閉EEPROM
- nop
- ;********************
- ;設(shè)AD檔 據(jù)wendudang中數(shù)字,設(shè)定終止電壓
- ADdang:
- MOV A,wendudang
- cjne a,#1,ADdang1
- MOV U_zhongzhizheng,57
- mov U_zhongzhixiao,1 ;對應(yīng)是57.11V 5度以下
- JMP ADdangRET
- ADdang1:
- cjne a,#2,ADdang2
- MOV U_zhongzhizheng,56
- mov U_zhongzhixiao,6 ;對應(yīng)是56.64V 10度以下
- JMP ADdangRET
- ADdang2:
- cjne a,#3,ADdang3
- MOV U_zhongzhizheng,56
- mov U_zhongzhixiao,1 ;對應(yīng)是56.16V 15度以下
- JMP ADdangRET
- ADdang3:
- cjne a,#4,ADdang4
- MOV U_zhongzhizheng,55
- mov U_zhongzhixiao,6 ;對應(yīng)是55.68V 20度以下
- JMP ADdangRET
- ADdang4:
- cjne a,#5,ADdang5
- MOV U_zhongzhizheng,55
- mov U_zhongzhixiao,2 ;對應(yīng)是55.20V 25度以下
- JMP ADdangRET
- ADdang5:
- cjne a,#6,ADdang6
- MOV U_zhongzhizheng,54
- mov U_zhongzhixiao,7 ;對應(yīng)是54.72V 30度以下
- JMP ADdangRET
- ADdang6:
- cjne a,#7,ADdang7
- MOV U_zhongzhizheng,54
- mov U_zhongzhixiao,2 ;對應(yīng)是54.24V 35度以下
- JMP ADdangRET
- ADdang7:
- cjne a,#8,ADdang8
- MOV U_zhongzhizheng,53
- mov U_zhongzhixiao,7 ;對應(yīng)是53.76V 40度以下
- JMP ADdangRET
- ADdang8: ;剩下的就是 a=0了 同a=8 檔
- MOV U_zhongzhizheng,53
- mov U_zhongzhixiao,7 ;對應(yīng)是53.76V 40度以下
- ADdangRET:
- clr kong ;接通220V
- nop
- NOP
- ;進入主程序之前不能有RET,否則運行到此止。
- ;*****************
- ;主程序
- ZhuPRO:
- LCALL PRO_ZOUSHI ;走時 統(tǒng)計20mS的個數(shù),計時,設(shè)立半秒標(biāo)志、分標(biāo)志、時標(biāo)志 檢測標(biāo)志
- LCALL KAIJISHISHU ;開機時數(shù) 開機10小時停充電,開機240小時重新啟動單片機。
- jnb 22h.5,zhu_a
- clr 22h.5 ;每15秒一次的標(biāo)志位,走時置1,在此清0
- lcall jiaceTL431 ;檢測TL431做基準(zhǔn)電壓的AD值
- LCALL jiacesheding ;檢測(電瓶)設(shè)定 測出電瓶AD
- LCALL JISUAN ;計算 電瓶電壓伏特數(shù)=(電瓶AD值×37+電瓶AD值×0.5)÷基準(zhǔn)電壓AD值 求出伏特整數(shù)和小數(shù)
- LCALL probijiao ;比較 電瓶電壓與基準(zhǔn)電壓做比較 標(biāo)記是否充滿電
- lcall XIANhuan ;顯緩 存放好要顯示的十位、個位、小數(shù)位
- zhu_a:
- LCALL xiu_V ;顯示電瓶電壓
-
- lcall PROKongZhi ;控制 充滿斷電 十小時斷電
- mov WDT_CONTR,#00111110B ;喂狗
- jmp ZhuPRO
-
- ;*************************** WENDU 溫度 設(shè)溫度檔 *********************************
- ;DOUEEPROM ;讀EEPROM中0000H處的保存值
- DOUEEPROM:
- mov contr,#84h ;設(shè)定操作時間
- mov cmd,#01h ;設(shè)定讀操作
- mov drl,#00h ;設(shè)定存儲單元地址低四位
- mov drh,#00h ;設(shè)定存儲單元地址高四位 這里設(shè)0000h,也可選用其他單元
- mov trig,#5Ah ;準(zhǔn)備觸發(fā)
- mov trig,#0A5h ;觸發(fā)
- nop
- mov wendudang,dat ;讀數(shù)據(jù)寫到RAM指定處
- ; mov wendudang,A ;讀數(shù)據(jù)寫到RAM指定處
- DOUEEPROMret:
- ret
- ;*************
- ;doujian ;讀鍵
- doujian:
- setb jian
- nop
- nop
- lcall DELAY
- JB jian,doujianret ;未按下(p1.2), 1-跳
- lcall DELAY ;延時
- JB jian,doujianret
- inc wendudang ;溫度檔加1
- mov XUN_JSHQ,#0 ;循環(huán)計數(shù)清0
- mov a,#9
- cjne a,wendudang,doujian_1 ; 分0,1,2,3,4,5,6,7,8九檔,最高8檔
- mov wendudang,#0
- doujian_1:
- nop
- jb jian,doujian_1 ;1-跳 等待釋放鍵
- lcall DELAY
- lcall DELAY
- doujianret:
- ret
- ;****************
- ;XIANSHI ;顯示
- XIANSHI:
- mov a,wendudang
- cpl a ;取反
- swap a ;高低四位交換
- ANL A,#11110000B ;獲高四位
- mov R0,a
- mov a,p1
- anl a,#00001111B ;獲低四位
- orl a,R0 ;整合高低八位
- mov p1,a ;驅(qū)動LED
- XIANSHIret:
- ret
- ;****************
- ;xunhuan ;循環(huán) 次數(shù)
- xunhuan:
- lcall DELAY ;延時
- INC XUN_JSHQ ;循環(huán)計數(shù)加1
- mov a,XUN_JSHQ
- cjne a,#200,xunhuanret
- mov XUN_JSHQ,#0
- clr 20h.0 ;停止按鍵后循環(huán)200次約??秒,結(jié)束設(shè)溫度檔程序
- xunhuanret:
- RET
- ;******************
- ;延時 0.04秒
- DELAY:
- MOV R7,#250
- D1: MOV R6,#250
- DJNZ R6,$
- DJNZ R7,D1
- RET
- ;*****************
- ;先擦除再寫入,然后關(guān)閉
- clear_write:
- mov contr,#84h ;設(shè)定操作時間
- mov cmd,#03h ;設(shè)定擦除操作
- mov drl,#00h ;設(shè)定存儲單元地址低四位
- mov drh,#00h ;設(shè)定存儲單元地址高四位 這里設(shè)0000h
- mov trig,#5AH ;準(zhǔn)備觸發(fā)
- mov trig,#0A5h ;觸發(fā)
- nop
- nop
- ;---------寫-------------------
- write:
- mov contr,#84h ;設(shè)定操作時間
- mov cmd,#02h ;設(shè)定寫操作
- mov drl,#00h ;設(shè)定存儲單元地址低四位
- mov drh,#00h ;設(shè)定存儲單元地址高四位 這里設(shè)0000h
- ; MOV A,wendudang
- mov dat,wendudang ;wendudang中為準(zhǔn)備寫入的數(shù)據(jù)
- mov trig,#5AH ;準(zhǔn)備觸發(fā)
- mov trig,#0A5H ;觸發(fā)
- nop
- nop
- ;=========關(guān)閉EEPROM====================
- off:
- mov contr,#0 ;禁止操作
- mov cmd,#0 ;去除操作命令
- mov trig,#0 ;防止命令誤觸發(fā)
- mov drl,#0 ;指向非EEPROM區(qū)
- mov drh,#80H ;指向非EEPROM區(qū)
- ret
-
- ;*********************************** 充電有關(guān)的計時 ******************************
- ;****************
- ;走時 統(tǒng)計20mS的個數(shù),計時,設(shè)立半秒標(biāo)志、分標(biāo)志、時標(biāo)志
- PRO_ZOUSHI:
- JNB 22H.0,PROARET ;20mS標(biāo)志位
- INC JSHQ_20MS
- CLR 22H.0
- mov A,#25 ;25個20mS為半秒
- CJNE A,JSHQ_20mS,PROARET
- MOV JSHQ_20mS,#0
- inc jshq_S
- setb 20h.2 ;控制顯示的半秒標(biāo)志
- PROA_1:
- MOV A,#30
- CJNE A,JSHQ_S,PROARET
- MOV JSHQ_S,#0
- SETB 22H.5 ;15秒檢測一次
- INC JSHQ_15
- MOV A,#4
- CJNE A,JSHQ_15,PROARET
- MOV JSHQ_15,#0
- INC JSHQ_M
- MOV A,#60 ;60分為1小時
- CJNE A,JSHQ_M,PROARET
- MOV JSHQ_M,#0
- setb 22h.3 ;時標(biāo)志
- PROARET:
- RET
- ;********************
- ;開機時數(shù) 開機10小時停充電,開機240小時重新啟動單片機。
- KAIJISHISHU:
- JNB 22H.3,KAIJISHISHURET
- clr 22h.3
- INC JSHQ_H
- MOV A,#10 ;最多充電10小時
- CJNE A,JSHQ_H,KAIJISHISHU_1
- CLR 21H.6 ;初值1,充電10小時清0。
- setb kong ;斷220V交流
- JMP KAIJISHISHURET
- KAIJISHISHU_1:
- mov a,#240 ;十天重啟
- cjne a,jshq_h,KAIJISHISHURET
- MOV IAP_CONTR,#00100000B ;熱重啟
- KAIJISHISHURET:
- RET
- ;*******************
- ;檢測設(shè)定 每15秒進行一次 兩次測電壓相同 確定占空比 溫度檢測沒使用
- jiacesheding:
- ; MOV P1,#11111111B ;關(guān)顯示 再延時 防止電壓波動對AD轉(zhuǎn)換的影響
- ; LCALL DELAY ;延時0.4秒
- dianya:
- lcall PRO_ad ;AD轉(zhuǎn)換測電瓶電壓
- MOV jiace_adzhi1,jiace_adzhi
- mov jiace_adzhi,#0
- lcall PRO_ad ;AD轉(zhuǎn)換測電瓶電壓
- BiJiao: ;比較兩次測電壓結(jié)果 同-進入下一步 不同-重測
- mov a,jiace_adzhi1
- cjne a,jiace_adzhi,dianya
-
- jiaceshedingret:
- ret
- ;********************
- ;AD轉(zhuǎn)換測電瓶電壓
- PRO_ad:
- MOV P1ASF,#0000001B ;P1.0做AD檢測
- MOV ADC_RES,#0 ;轉(zhuǎn)換結(jié)果寄存器清零
- MOV ADC_CONTR,#11100000B
- nop
- nop
- nop
- nop
- mov a,#11101000b
- MOV ADC_CONTR,A ;開始A/D轉(zhuǎn)換
- NOP ;在質(zhì)詢之前一定等候
- NOP
- NOP
- NOP
- WAIT:
- MOV A,ADC_CONTR ;等候完成的標(biāo)志
- JNB ACC.4,WAIT ;轉(zhuǎn)換完成標(biāo)志位 不是1就轉(zhuǎn)
- MOV ADC_CONTR,#01100000B ;關(guān)轉(zhuǎn)換 清標(biāo)志位
-
- MOV jiace_adzhi,ADC_RES ;讀出AD值保存
- PRO_adRET:
- RET
- ;********************
- jiaceTL431:
- ; MOV P1,#11111111B ;關(guān)顯示 再延時 防止電壓波動對AD轉(zhuǎn)換的影響
- ; LCALL DELAY ;延時0.4秒
- dianyaTL:
- lcall prTL431_ad ;AD轉(zhuǎn)換測TL431的AD
- MOV TL431_AD1,TL431_AD
- mov TL431_AD,#0
- lcall prTL431_ad ;AD轉(zhuǎn)換測TL431的AD
- BiJiaoTL: ;比較兩次測電壓結(jié)果 同-進入下一步 不同-重測
- mov a,TL431_AD1
- cjne a,TL431_AD,dianyaTL
- jiaceTL431ret:
- ret
- ;******************
- ;AD轉(zhuǎn)換測TL431
- prTL431_ad:
- MOV P1ASF,#0000010B ;P1.1做AD檢測
- MOV ADC_RES,#0 ;轉(zhuǎn)換結(jié)果寄存器清零
- MOV ADC_CONTR,#11100001B
- nop
- nop
- nop
- nop
- mov a,#11101001b
- MOV ADC_CONTR,A ;開始A/D轉(zhuǎn)換
- NOP ;在質(zhì)詢之前一定等候
- NOP
- NOP
- NOP
- TL431WAIT:
- MOV A,ADC_CONTR ;等候完成的標(biāo)志
- JNB ACC.4,TL431WAIT ;轉(zhuǎn)換完成標(biāo)志位 不是1就轉(zhuǎn)
- MOV ADC_CONTR,#11100001B ;關(guān)轉(zhuǎn)換 清標(biāo)志位
-
- MOV TL431_AD,ADC_RES ;讀出AD值保存
- TL431_adRET:
- RET
- ;*******************
- ;比較 ;通過電瓶電壓整數(shù)與終止電壓整數(shù)比較,電瓶電壓小數(shù)與終止電壓小數(shù)比較,確定并標(biāo)記電瓶有無充滿.
- probijiao:
- clr c
- mov a,v_ZH ;電瓶電壓整數(shù)
- CJNE A,U_zhongzhizheng,bijiao_1 ;電瓶電壓整數(shù)與終止電壓整數(shù)比較
- MOV A,V_XAO
- CJNE A,U_zhongzhixiao,bijiao_1 ;電瓶電壓小數(shù)與終止電壓小數(shù)比較
-
- bijiao_0:
- clr 21h.4 ;電瓶正常標(biāo)志位 1--正常 0--充滿(或不能充電)
- JMP bijiao_ret
- bijiao_1:
- JC bijiao_0 ;超過終止電壓 C=1
-
- bijiao_ret:
- ret
-
- ;******************
- ; ;控制充斷電
- PROKongZhi:
- jb 21h.4,pro_a ;電瓶正常標(biāo)志 1-正常 0-不正常 無電瓶 或充滿
- setb kong ;通過光耦控制220V通斷 0-通 1-斷
- pro_a:
- JB 21H.6,PROKongZhiRET
- setb kong ;通過光耦控制220V通斷 0-通 1-斷
- PROKongZhiRET:
- RET
- ;****************
- ;顯緩
- XIANhuan:
- MOV A,v_ZH ;電瓶伏特整數(shù)
- MOV B,#10
- DIV AB
- MOV 61H,B ;個位
- MOV 60H,A ;十位
- MOV 62H,V_XAO ;小數(shù)
-
- MOV 63H,#0 ;黑屏的數(shù)字
- mov 64h,#00001111B ;四燈全亮
- XIANhuan_ret:
- ret
- ;***************
- ; xiu_V 顯伏特數(shù) 十、個位、小數(shù)位分別顯示,每位顯示2秒,黑屏1秒,三位顯示完黑屏3秒。
- xiu_V:
- JNB 20H.2,XianZ ;每秒運行一次
- CLR 20H.2
- INC JSHQ_WEI
- MOV A,#11
- CJNE A,JSHQ_WEI,xiu_V_1
- MOV JSHQ_WEI,#0
- mov R1,60H ;顯十位
- LCALL PROXIAN
- JMP xiu_VRET
- xiu_V_1:
- MOV A,#1 ;顯示十位
- CJNE A,JSHQ_WEI,xiu_V_2
- nop ;保持原顯示就行了
- ;mov R1,60H
- ;LCALL PROXIAN
- XianZ: jmp xiu_VRET ;中間跳板
- xiu_V_2:
- MOV A,#2 ;黑屏
- CJNE A,JSHQ_WEI,xiu_V_3
- mov R1,63H
- LCALL PROXIAN
- JMP xiu_VRET
- xiu_V_3:
- MOV A,#3 ;顯示個位
- CJNE A,JSHQ_WEI,xiu_V_4
- mov R1,61H
- LCALL PROXIAN
- JMP xiu_VRET
- xiu_V_4:
- MOV A,#4 ;顯示個位
- CJNE A,JSHQ_WEI,xiu_V_5
- nop ;保持原顯示就行了
- ;mov R1,61H
- ;LCALL PROXIAN
- JMP xiu_VRET
- xiu_V_5:
- MOV A,#5 ;黑屏
- CJNE A,JSHQ_WEI,xiu_V_6
- mov R1,63H
- LCALL PROXIAN
- JMP xiu_VRET
- xiu_V_6:
- MOV A,#6 ;顯示小數(shù)位
- CJNE A,JSHQ_WEI,xiu_V_7
- mov R1,62H
- LCALL PROXIAN
- JMP xiu_VRET
- xiu_V_7:
- MOV A,#7 ;顯示小數(shù)位
- CJNE A,JSHQ_WEI,xiu_V_8
- nop ;保持原顯示就行了
- ;mov R1,62H
- ;LCALL PROXIAN
- JMP xiu_VRET
- xiu_V_8:
- MOV A,#8 ;黑屏
- CJNE A,JSHQ_WEI,xiu_V_9
- mov R1,63H
- LCALL PROXIAN
- JMP xiu_VRET
- xiu_V_9:
- MOV A,#9 ;四燈全亮
- CJNE A,JSHQ_WEI,xiu_V_10
- mov R1,64H
- LCALL PROXIAN
- JMP xiu_VRET
- xiu_V_10:
- nop ;保持原顯示就行了
- ;mov R1,63H ;黑屏
- ;LCALL PROXIAN
- xiu_VRET:
- RET
- ;***************
- ;顯示
- PROXIAN:
- MOV A,R1
- cpl a ;取反
- swap a ;高低四位交換
- ANL A,#11110000B ;獲高四位
- mov R0,a
- mov a,p1
- anl a,#00001111B ;獲低四位
- orl a,R0 ;整合高低八位
- mov p1,a ;驅(qū)動LED
- RET
- ;*******************************
- ;計算 jì suàn 電瓶電壓伏特數(shù)=(電瓶AD值×37+電瓶AD值×0.86)÷基準(zhǔn)電壓AD值 TL431穩(wěn)壓后是2.524伏
- ;求出伏特整數(shù)和一位小數(shù)
- JISUAN:
- MOV v_ZH,#0 ;存伏特整數(shù) 先清0
- mov V_XAO,#0 ;伏特小數(shù) 先清0
- mov r2,#0
- mov r3,#0
- ;電瓶AD值×37
- MOV A,Jiace_ADzhi ;電瓶AD值
- MOV B,#37
- MUL AB
- MOV R2,A ;37倍的積的低8位 存R2
- MOV R3,B ;37倍的積的高8位 存R3
- ;電瓶AD值×86
- MOV A,Jiace_ADzhi
- mov b,#86 ;
- MUL AB ;86倍的積高位在B低位在A 高位在B
- ;除以100
- MOV beichushugao,B ;被除數(shù)高位
- MOV beichushudi,A ;被除數(shù)低位
- MOV chushu,#100 ;除數(shù)
- mov zhengshang,#0 ;整數(shù)商
- mov XIAOSHUSHANG,#0 ;小數(shù)商
- mov YUSHU,#0 ;余數(shù)
-
- LCALL PROCHU
- ;電瓶AD值×0.86的整數(shù)部分已經(jīng)在zhengshang
- ;電瓶AD值×37與電瓶AD值×0.86兩積之和
- mov a,zhengshang
- ADD A,R2
- MOV R2,A
- JNC JISUAN_1 ;0-跳
- INC R3
- clr c ;以上完成了(電瓶AD值×37+電瓶AD值×0.86) 值的高位在R3,低位在R2
- JISUAN_1:
- ;下面用減法代除法做[÷基準(zhǔn)電壓AD值]部分
- MOV beichushugao,R3 ;被除數(shù)高位
- MOV beichushudi,R2 ;被除數(shù)低位
- MOV chushu,TL431_AD ;除數(shù)
- mov zhengshang,#0
- mov XIAOSHUSHANG,#0
- mov YUSHU,#0
-
- LCALL PROCHU
- MOV v_ZH,zhengshang ;伏特整數(shù)
- MOV V_XAO,XIAOSHUSHANG ;伏特小數(shù)
- RET
- ;*********************
- ;除法 被除數(shù)有高8位低8位,除數(shù)只有8位,商有8位整數(shù)1位小數(shù)
- ;beichushugao ;被除數(shù)高位
- ;beichushudi ;被除數(shù)低位
- ;chushu ;除數(shù)
- ;zhengshang EQU 78H ;整數(shù)商
- ;XIAOSHUSHANG EQU 79H ;小數(shù)商
- ;YUSHU EQU 7AH ;余數(shù)
- ;LSSHU EQU 7BH ;臨時存
- ; DISHU 低位 第二次的被除數(shù)低位
- ;GAOSHU 高位 第二次的被除數(shù)高位
- PROCHU:
- MOV A,#0
- CJNE A,beichushugao,PROCHU_0 ;高位不是0 跳
- MOV A,beichushudi
- jmp PROCHU_A ;跳到高位是0,求低位的商
- PROCHU_0: ;求高位不是0部分的商
- MOV A,beichushudi
- PROCHU_01:
- SUBB A,chushu
- INC zhengshang
- JNC PROCHU_01
- DJNZ beichushugao,PROCHU_01
- PROCHU_A: ;高位是0,求低位的商
- ; MOV LSSHU,A ;備份
- SUBB A,chushu
- INC zhengshang
- JNC PROCHU_A ;c=0 循環(huán)再減
- CLR C ;有借位,表示多減了一次
- ; DEC zhengshang ;恢復(fù)
- ; MOV A,LSSHU ;恢復(fù)
- ;*************求小數(shù)**********
- MOV B,#10 ;求小數(shù),先將被除數(shù)乘10
- MUL AB
- MOV GAOSHU,B ;高位
- MOV DISHU,A ;低位
- PROCHU_B:
- MOV A,#0
- CJNE A,GAOSHU,PROCHU_B0
- MOV A,DISHU
- JMP PROCHU_C ;跳到高位是0 求低位商
- PROCHU_B0:
- MOV A,DISHU
- PROCHU_B01:
- SUBB A,chushu
- INC XIAOSHUSHANG
- JNC PROCHU_B01
- DJNZ GAOSHU,PROCHU_B01
- PROCHU_C: ;高位是0 求低位商
- MOV LSSHU,A
- SUBB A,chushu
- INC XIAOSHUSHANG
- JNC PROCHU_C ;c=0 循環(huán)再減
- CLR C ;有借位,表示多減了一次
- ; DEC XIAOSHUSHANG ;恢復(fù) 實測顯示數(shù)據(jù)偏小所以刪此句
- MOV A,LSSHU ;恢復(fù)
- MOV YUSHU,A ;余數(shù)
- ret
- ;****************
-
- ;**********************************************************************
- TIME_0: ;20毫秒@10.911MHz
- PUSH ACC
- PUSH PSW
- MOV TL0,#0F7H
- MOV TH0,#0B8H
- SETB 22H.0 ;20mS標(biāo)志 專供走時用
- POP PSW
- POP ACC
- RETI
- ;************************
- pppuuu:
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- lcall START
- nop
- nop
- nop
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
源碼和hex.rar
(8.02 KB, 下載次數(shù): 41)
2018-3-2 10:03 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|