下面是此電瓶車充電保護器作品的外觀圖:
IMG_20180301_095151.jpg (2.42 MB, 下載次數: 95)
下載附件
2018-3-2 10:19 上傳
這是一個電瓶車充電器的附加裝置,不對充電器做任何變動,而是將充電器插在該保護器上連成一體代替原充電器進行電瓶車的充電。
功能:1、充電達到設定的電壓,自動斷電停充,防過充。
2、滿十小時自動停充電,電瓶有故障充不到設定電壓,經十小時也停充。
3、能根據氣溫設定充電電壓檔次,能記憶設定的檔次,無須每次設定。
4、用二進制數循環顯示電壓的十位個位小數位值。
用法:將充電器插在該保護器上連成一體,代替原充電器進行電瓶車的充電。插上220V交流后在15秒內左右慢搖保護器,使內置水銀開關接通又斷開(按鍵作用),溫度檔次依次增加,共分1~8檔,對應環境溫度是5℃-40℃。水銀開關斷開15秒后進入充電程序,水銀開關不再起作用。
充足電的斷充電指示可從原充電器指示燈看出,不另加指示燈。
讀電壓:顯示過程是--四燈全亮(提示開始)、滅、十位、滅、個位、滅、小數一位、滅,循環不斷。用四位二進制數表示0到9,讀出數不難,記得四燈分別代表8、4、2、1,將亮燈的數相加就是了。0也顯示為滅,可從時間上判別出來。
例:54.9顯示為
○○○○ 開始
●○●○ 5
●○●● 4
○●●○ 9
為省事沒用數碼管,自己用的東西,簡單實用為好。四個發光管也合用一個限流電阻,單片機復位用的電容電阻也省了,晶振也省了。
工作原理:用手機充電器拆來的電路板為裝置提供5V電源。單片機AD轉換測電壓,每15秒進行一次。測得的電壓與設定的終止電壓比較,達到了就給繼電器模塊送一信號,收到信號繼電器就斷開充電器電源。單片機同時計時,滿十時也發出停充電信號,滿十天自動重啟單片機進行充電管理(暑假長時間人不在家也沒問題了)。
為避免單片機工作電壓變動對電壓測量的影響,用TL431提供一個基準電壓,P1.1對其進行AD轉換。電瓶電壓1/15分壓后用P1.0進行AD轉換,然后用下式算出電瓶電壓。
十五分之一電瓶電壓:基準電壓=電瓶AD值:基準電壓的AD值
實測TL431穩壓后是2.524伏,程序中采用的具體算法是:
電瓶電壓伏特數=(電瓶AD值×37+電瓶AD值×86÷100)÷基準電壓AD值
被除數是兩個8位,除數是一個8位,我是用循環做減法的辦法來求商。具體見源碼。
分壓電阻的調整,借助萬用表反復細心調精密可調電阻,使阻值之比為14:1。
材料:單片機STC12C5204AD 繼電器模塊,手機充電器,交流插座等。
電路原理圖:
IMG_20180301_152823.jpg (1.86 MB, 下載次數: 86)
下載附件
單片機電路圖
2018-3-2 09:56 上傳
接線示意圖:
IMG_20180301_152530.jpg (1.95 MB, 下載次數: 95)
下載附件
組裝接線示意圖
2018-3-2 09:56 上傳
制作過程:
IMG_1.jpg (2.24 MB, 下載次數: 82)
下載附件
裝飾邊角料做的外殼
2018-3-2 09:48 上傳
IMG_2.jpg (2.53 MB, 下載次數: 94)
下載附件
2018-3-2 09:50 上傳
IMG_3.jpg (3.23 MB, 下載次數: 98)
下載附件
拆解手機充電器
2018-3-2 09:50 上傳
IMG_4.jpg (3.2 MB, 下載次數: 99)
下載附件
繼電器模塊
2018-3-2 09:51 上傳
IMG_5.jpg (2.96 MB, 下載次數: 101)
下載附件
2018-3-2 09:52 上傳
IMG_6.jpg (2.16 MB, 下載次數: 90)
下載附件
2018-3-2 09:52 上傳
IMG_7.jpg (1.57 MB, 下載次數: 98)
下載附件
2018-3-2 09:52 上傳
IMG_9.jpg (2.11 MB, 下載次數: 97)
下載附件
2018-3-2 09:53 上傳
IMG_10.jpg (2.02 MB, 下載次數: 89)
下載附件
單片機正面
2018-3-2 09:53 上傳
IMG_11.jpg (2.14 MB, 下載次數: 107)
下載附件
單片機背面
2018-3-2 09:53 上傳
IMG_13.jpg (2.19 MB, 下載次數: 100)
下載附件
組裝好
2018-3-2 09:54 上傳
IMG_20180301_095125.jpg (2.21 MB, 下載次數: 87)
下載附件
2018-3-2 09:55 上傳
單片機編程源碼如下:
- ;1/15取樣,單片機工作電壓約5V,能測電壓達75V。
- ;改成最多充電10小時。十天后重啟。
- ;使用EEPROM保存溫度檔。 ;2016年7月6日修改:
- ;使用汞開關設定溫度檔,使用EEPROM保存溫度檔。
- ;開機16秒內(大約)按鍵設定溫度檔數,若不按鍵,則默認上次的檔數。有1,2,3,4,5,6,7,8共八檔。
- ;設溫度檔后接通220V
- ;從溫度5度起為第1檔,10度為第2檔,15度為第3檔,……35度為第7檔,40度為第8 檔,0檔同第8檔。停下不按鍵約15秒自動進入下一環節。
- ;顯示電瓶伏特數,按四燈亮、黑、十位、黑、個位、黑、小數位、黑,循環顯示。四燈亮和黑是半秒,數字是1秒
- ;20H.0設置溫度檔[WENDU]子程序控制位,初值賦1,在等待按鍵的子程序[xunhuan]中清0.僅在開機初用一次。
- ;20H.2 顯示控制位.走時置1,顯示后清0,使得半秒進行一次顯示。
- ;20H.3 秒標志
- ;21H.0
- ;21H.2 [Tuoliu]程序控制位,使程序只運行一次。
- ;21H.3
- ;21H.4是電瓶正常標志,初值賦1(正常),檢測到電瓶充滿或不正常將其清0,清0后要重啟才能置1.
- ;21H.6充電10小時標志,初值為1,充電達10小時將其清0.清0后要重啟才能置1.
- ;22H.0 走時用的20ms標志,在中斷置1,走時中清0。
- ;22H.3 時標志
- ;22H.5 每15秒運行一次的標志位,走時置1.
- ;22H.7
- ;用檢測到的電壓AD值與設定的終止電壓AD值進行比較,確定電瓶滿或不正常(電壓太低或無電瓶)關斷220V供電。
- ;開機接通220V,電瓶充滿(或不正常)關斷,充電10小時關斷,十天后單片機重啟。
- ;P1.0--A/D轉換
- ;P1.1--A/D轉換測TL431電壓
- ;P1.2--鍵,每按一次溫度檔數加1,在0--8之中循環,停下不按鍵約15秒自動進入下一環節。
- ;P1.7,P1.6,P1.5,P1.4接LED做溫度檔顯示,點亮分別表示8,4,2,1,二進制數。
- ;P3.2--通過光耦控制220V通斷 0-通 1-斷
- ;***************
-
- ;***
- U_zhongzhixiao EQU 5EH ;終止電壓小數寄存器
- U_zhongzhizheng EQU 5FH ;終止電壓整數寄存器
- JSHQ_WEI EQU 65H ;顯示第幾位計數器
- XUN_JSHQ EQU 67H ;循環次數
- wendudang EQU 68H ;溫度檔數
- v_ZH EQU 5DH ;電瓶伏特整數寄存器
- V_XAO EQU 5CH ;電瓶伏特小數寄存器
- 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秒計數器
- JSHQ_20mS EQU 70H ;20mS計數器 計20mS的個數
- JSHQ_S EQU 71H ;半秒計數器
- JSHQ_M EQU 72H ;分計數器
- JSHQ_H EQU 73H ;時計數器
- ;60H,61H,62H,63H,64H 用在顯緩中
- beichushugao equ 75h ;被除數高位
- beichushudi EQU 76H ;被除數低位
- chushu EQU 77H ;除數
- zhengshang EQU 78H ;整數商
- XIAOSHUSHANG EQU 79H ;小數商
- YUSHU EQU 7AH ;余數
- LSSHU EQU 7BH ;臨時存
- DISHU EQU 7CH ;低數 第二次的被除數的低位
- GAOSHU EQU 7DH ;高數 第二次的被除數的高位
- ADC_CONTR EQU 0BCH ;ADC控制寄存器
- ADC_RES EQU 0BDH ;A/D轉換結果寄存器
- P1ASF EQU 09DH ;p1口模擬功能控制寄存器
- WDT_CONTR EQU 0C1H ;看門狗
- ;AUXR DATA 8EH ;選擇1T與12T的寄存器
- IAP_CONTR EQU 0C7H ;下載/復位控制器
- jian EQU p1.2 ;鍵
- kong EQU p3.2 ;控 220V 0-通 1-斷
- p1m1 equ 91h
- p1m0 equ 92h
- ;EEPROM有關的寄存器
- 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交流 設溫度檔后接通
- MOV 22H,#00100000B ;檢測標志 1-檢 0-不檢 每15秒檢測AD一次和處理顯緩一次的標志位,走時置1,處理顯緩后清0
- MOV 21H,#01010000B ;21h.4 電瓶 1-能充 0-不能充電(含無、充滿)
- ;21H.6 初值1,充電10小時清0 。
- ;*用計數器0 初步設置定時中斷 20MS中斷 20毫秒@10.911MHz
- MOV SP,#80H ;設置堆棧區域
- ; 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 ;控制設置溫度檔程序的循環用
- ;*****************
- ;設置溫度檔 從EEPROM中讀出保存值,一段時間內不按鍵,則使用該檔值;如按鍵則改之,停下不動,過會兒保存并啟用。
- LCALL DOUEEPROM ;讀EEPROM中的保存值
- WENDU:
- jnb 20H.0,WENDUret ;0-跳
- LCALL doujian ;讀鍵和健值處理
- LCALL XIANSHI ;顯示
- LCALL xunhuan ;循環 次數
- AJMP WENDU
- WENDUret:
- LCALL clear_write ;先擦除EEPROM再寫EEPROM保存溫度檔,然后關閉EEPROM
- nop
- ;********************
- ;設AD檔 據wendudang中數字,設定終止電壓
- ADdang:
- MOV A,wendudang
- cjne a,#1,ADdang1
- MOV U_zhongzhizheng,57
- mov U_zhongzhixiao,1 ;對應是57.11V 5度以下
- JMP ADdangRET
- ADdang1:
- cjne a,#2,ADdang2
- MOV U_zhongzhizheng,56
- mov U_zhongzhixiao,6 ;對應是56.64V 10度以下
- JMP ADdangRET
- ADdang2:
- cjne a,#3,ADdang3
- MOV U_zhongzhizheng,56
- mov U_zhongzhixiao,1 ;對應是56.16V 15度以下
- JMP ADdangRET
- ADdang3:
- cjne a,#4,ADdang4
- MOV U_zhongzhizheng,55
- mov U_zhongzhixiao,6 ;對應是55.68V 20度以下
- JMP ADdangRET
- ADdang4:
- cjne a,#5,ADdang5
- MOV U_zhongzhizheng,55
- mov U_zhongzhixiao,2 ;對應是55.20V 25度以下
- JMP ADdangRET
- ADdang5:
- cjne a,#6,ADdang6
- MOV U_zhongzhizheng,54
- mov U_zhongzhixiao,7 ;對應是54.72V 30度以下
- JMP ADdangRET
- ADdang6:
- cjne a,#7,ADdang7
- MOV U_zhongzhizheng,54
- mov U_zhongzhixiao,2 ;對應是54.24V 35度以下
- JMP ADdangRET
- ADdang7:
- cjne a,#8,ADdang8
- MOV U_zhongzhizheng,53
- mov U_zhongzhixiao,7 ;對應是53.76V 40度以下
- JMP ADdangRET
- ADdang8: ;剩下的就是 a=0了 同a=8 檔
- MOV U_zhongzhizheng,53
- mov U_zhongzhixiao,7 ;對應是53.76V 40度以下
- ADdangRET:
- clr kong ;接通220V
- nop
- NOP
- ;進入主程序之前不能有RET,否則運行到此止。
- ;*****************
- ;主程序
- ZhuPRO:
- LCALL PRO_ZOUSHI ;走時 統計20mS的個數,計時,設立半秒標志、分標志、時標志 檢測標志
- LCALL KAIJISHISHU ;開機時數 開機10小時停充電,開機240小時重新啟動單片機。
- jnb 22h.5,zhu_a
- clr 22h.5 ;每15秒一次的標志位,走時置1,在此清0
- lcall jiaceTL431 ;檢測TL431做基準電壓的AD值
- LCALL jiacesheding ;檢測(電瓶)設定 測出電瓶AD
- LCALL JISUAN ;計算 電瓶電壓伏特數=(電瓶AD值×37+電瓶AD值×0.5)÷基準電壓AD值 求出伏特整數和小數
- LCALL probijiao ;比較 電瓶電壓與基準電壓做比較 標記是否充滿電
- lcall XIANhuan ;顯緩 存放好要顯示的十位、個位、小數位
- zhu_a:
- LCALL xiu_V ;顯示電瓶電壓
-
- lcall PROKongZhi ;控制 充滿斷電 十小時斷電
- mov WDT_CONTR,#00111110B ;喂狗
- jmp ZhuPRO
-
- ;*************************** WENDU 溫度 設溫度檔 *********************************
- ;DOUEEPROM ;讀EEPROM中0000H處的保存值
- DOUEEPROM:
- mov contr,#84h ;設定操作時間
- mov cmd,#01h ;設定讀操作
- mov drl,#00h ;設定存儲單元地址低四位
- mov drh,#00h ;設定存儲單元地址高四位 這里設0000h,也可選用其他單元
- mov trig,#5Ah ;準備觸發
- mov trig,#0A5h ;觸發
- nop
- mov wendudang,dat ;讀數據寫到RAM指定處
- ; mov wendudang,A ;讀數據寫到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 ;循環計數清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 ;驅動LED
- XIANSHIret:
- ret
- ;****************
- ;xunhuan ;循環 次數
- xunhuan:
- lcall DELAY ;延時
- INC XUN_JSHQ ;循環計數加1
- mov a,XUN_JSHQ
- cjne a,#200,xunhuanret
- mov XUN_JSHQ,#0
- clr 20h.0 ;停止按鍵后循環200次約??秒,結束設溫度檔程序
- xunhuanret:
- RET
- ;******************
- ;延時 0.04秒
- DELAY:
- MOV R7,#250
- D1: MOV R6,#250
- DJNZ R6,$
- DJNZ R7,D1
- RET
- ;*****************
- ;先擦除再寫入,然后關閉
- clear_write:
- mov contr,#84h ;設定操作時間
- mov cmd,#03h ;設定擦除操作
- mov drl,#00h ;設定存儲單元地址低四位
- mov drh,#00h ;設定存儲單元地址高四位 這里設0000h
- mov trig,#5AH ;準備觸發
- mov trig,#0A5h ;觸發
- nop
- nop
- ;---------寫-------------------
- write:
- mov contr,#84h ;設定操作時間
- mov cmd,#02h ;設定寫操作
- mov drl,#00h ;設定存儲單元地址低四位
- mov drh,#00h ;設定存儲單元地址高四位 這里設0000h
- ; MOV A,wendudang
- mov dat,wendudang ;wendudang中為準備寫入的數據
- mov trig,#5AH ;準備觸發
- mov trig,#0A5H ;觸發
- nop
- nop
- ;=========關閉EEPROM====================
- off:
- mov contr,#0 ;禁止操作
- mov cmd,#0 ;去除操作命令
- mov trig,#0 ;防止命令誤觸發
- mov drl,#0 ;指向非EEPROM區
- mov drh,#80H ;指向非EEPROM區
- ret
-
- ;*********************************** 充電有關的計時 ******************************
- ;****************
- ;走時 統計20mS的個數,計時,設立半秒標志、分標志、時標志
- PRO_ZOUSHI:
- JNB 22H.0,PROARET ;20mS標志位
- 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 ;控制顯示的半秒標志
- 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 ;時標志
- PROARET:
- RET
- ;********************
- ;開機時數 開機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
- ;*******************
- ;檢測設定 每15秒進行一次 兩次測電壓相同 確定占空比 溫度檢測沒使用
- jiacesheding:
- ; MOV P1,#11111111B ;關顯示 再延時 防止電壓波動對AD轉換的影響
- ; LCALL DELAY ;延時0.4秒
- dianya:
- lcall PRO_ad ;AD轉換測電瓶電壓
- MOV jiace_adzhi1,jiace_adzhi
- mov jiace_adzhi,#0
- lcall PRO_ad ;AD轉換測電瓶電壓
- BiJiao: ;比較兩次測電壓結果 同-進入下一步 不同-重測
- mov a,jiace_adzhi1
- cjne a,jiace_adzhi,dianya
-
- jiaceshedingret:
- ret
- ;********************
- ;AD轉換測電瓶電壓
- PRO_ad:
- MOV P1ASF,#0000001B ;P1.0做AD檢測
- MOV ADC_RES,#0 ;轉換結果寄存器清零
- MOV ADC_CONTR,#11100000B
- nop
- nop
- nop
- nop
- mov a,#11101000b
- MOV ADC_CONTR,A ;開始A/D轉換
- NOP ;在質詢之前一定等候
- NOP
- NOP
- NOP
- WAIT:
- MOV A,ADC_CONTR ;等候完成的標志
- JNB ACC.4,WAIT ;轉換完成標志位 不是1就轉
- MOV ADC_CONTR,#01100000B ;關轉換 清標志位
-
- MOV jiace_adzhi,ADC_RES ;讀出AD值保存
- PRO_adRET:
- RET
- ;********************
- jiaceTL431:
- ; MOV P1,#11111111B ;關顯示 再延時 防止電壓波動對AD轉換的影響
- ; LCALL DELAY ;延時0.4秒
- dianyaTL:
- lcall prTL431_ad ;AD轉換測TL431的AD
- MOV TL431_AD1,TL431_AD
- mov TL431_AD,#0
- lcall prTL431_ad ;AD轉換測TL431的AD
- BiJiaoTL: ;比較兩次測電壓結果 同-進入下一步 不同-重測
- mov a,TL431_AD1
- cjne a,TL431_AD,dianyaTL
- jiaceTL431ret:
- ret
- ;******************
- ;AD轉換測TL431
- prTL431_ad:
- MOV P1ASF,#0000010B ;P1.1做AD檢測
- MOV ADC_RES,#0 ;轉換結果寄存器清零
- MOV ADC_CONTR,#11100001B
- nop
- nop
- nop
- nop
- mov a,#11101001b
- MOV ADC_CONTR,A ;開始A/D轉換
- NOP ;在質詢之前一定等候
- NOP
- NOP
- NOP
- TL431WAIT:
- MOV A,ADC_CONTR ;等候完成的標志
- JNB ACC.4,TL431WAIT ;轉換完成標志位 不是1就轉
- MOV ADC_CONTR,#11100001B ;關轉換 清標志位
-
- MOV TL431_AD,ADC_RES ;讀出AD值保存
- TL431_adRET:
- RET
- ;*******************
- ;比較 ;通過電瓶電壓整數與終止電壓整數比較,電瓶電壓小數與終止電壓小數比較,確定并標記電瓶有無充滿.
- probijiao:
- clr c
- mov a,v_ZH ;電瓶電壓整數
- CJNE A,U_zhongzhizheng,bijiao_1 ;電瓶電壓整數與終止電壓整數比較
- MOV A,V_XAO
- CJNE A,U_zhongzhixiao,bijiao_1 ;電瓶電壓小數與終止電壓小數比較
-
- bijiao_0:
- clr 21h.4 ;電瓶正常標志位 1--正常 0--充滿(或不能充電)
- JMP bijiao_ret
- bijiao_1:
- JC bijiao_0 ;超過終止電壓 C=1
-
- bijiao_ret:
- ret
-
- ;******************
- ; ;控制充斷電
- PROKongZhi:
- jb 21h.4,pro_a ;電瓶正常標志 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 ;電瓶伏特整數
- MOV B,#10
- DIV AB
- MOV 61H,B ;個位
- MOV 60H,A ;十位
- MOV 62H,V_XAO ;小數
-
- MOV 63H,#0 ;黑屏的數字
- mov 64h,#00001111B ;四燈全亮
- XIANhuan_ret:
- ret
- ;***************
- ; xiu_V 顯伏特數 十、個位、小數位分別顯示,每位顯示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 ;顯示小數位
- CJNE A,JSHQ_WEI,xiu_V_7
- mov R1,62H
- LCALL PROXIAN
- JMP xiu_VRET
- xiu_V_7:
- MOV A,#7 ;顯示小數位
- 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 ;驅動LED
- RET
- ;*******************************
- ;計算 jì suàn 電瓶電壓伏特數=(電瓶AD值×37+電瓶AD值×0.86)÷基準電壓AD值 TL431穩壓后是2.524伏
- ;求出伏特整數和一位小數
- JISUAN:
- MOV v_ZH,#0 ;存伏特整數 先清0
- mov V_XAO,#0 ;伏特小數 先清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 ;被除數高位
- MOV beichushudi,A ;被除數低位
- MOV chushu,#100 ;除數
- mov zhengshang,#0 ;整數商
- mov XIAOSHUSHANG,#0 ;小數商
- mov YUSHU,#0 ;余數
-
- LCALL PROCHU
- ;電瓶AD值×0.86的整數部分已經在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:
- ;下面用減法代除法做[÷基準電壓AD值]部分
- MOV beichushugao,R3 ;被除數高位
- MOV beichushudi,R2 ;被除數低位
- MOV chushu,TL431_AD ;除數
- mov zhengshang,#0
- mov XIAOSHUSHANG,#0
- mov YUSHU,#0
-
- LCALL PROCHU
- MOV v_ZH,zhengshang ;伏特整數
- MOV V_XAO,XIAOSHUSHANG ;伏特小數
- RET
- ;*********************
- ;除法 被除數有高8位低8位,除數只有8位,商有8位整數1位小數
- ;beichushugao ;被除數高位
- ;beichushudi ;被除數低位
- ;chushu ;除數
- ;zhengshang EQU 78H ;整數商
- ;XIAOSHUSHANG EQU 79H ;小數商
- ;YUSHU EQU 7AH ;余數
- ;LSSHU EQU 7BH ;臨時存
- ; DISHU 低位 第二次的被除數低位
- ;GAOSHU 高位 第二次的被除數高位
- 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 循環再減
- CLR C ;有借位,表示多減了一次
- ; DEC zhengshang ;恢復
- ; MOV A,LSSHU ;恢復
- ;*************求小數**********
- MOV B,#10 ;求小數,先將被除數乘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 循環再減
- CLR C ;有借位,表示多減了一次
- ; DEC XIAOSHUSHANG ;恢復 實測顯示數據偏小所以刪此句
- MOV A,LSSHU ;恢復
- MOV YUSHU,A ;余數
- ret
- ;****************
-
- ;**********************************************************************
- TIME_0: ;20毫秒@10.911MHz
- PUSH ACC
- PUSH PSW
- MOV TL0,#0F7H
- MOV TH0,#0B8H
- SETB 22H.0 ;20mS標志 專供走時用
- 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黑下載附件…………
復制代碼
0.png (3.96 KB, 下載次數: 91)
下載附件
2018-3-2 17:47 上傳
所有資料51hei提供下載:
源碼和hex.rar
(8.02 KB, 下載次數: 41)
2018-3-2 10:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|