如何自動決定 DS1302 是否需要初始化
針對本論壇供應的 51HEI-5 帶有的 DS1302 實驗,同時瀏覽了本實驗中朋友們提及的實時時鐘初始化的問題.進行一些補充:
1.例程可以正常顯示時分秒 6 位數字,
但是例程不是從 00:00:00 開始,先修改為每次都是從 00:00:00 開始.
例程僅僅讀取/初始化寫入 時分秒 3 個數據,也修改為 讀取/初始化寫入 年月日星期時分秒 全部數據.
不論數碼管是否可以顯示這么多內容,都應該這么做.------例程也許起到一種引路的作用,上面修改都很容易.
2.深入一步增加花樣:
設置好一個標志.例如:F_XS5S.由它來輪流顯示年月日 或 時分秒.
在讀取秒信號時,做一個秒數值的實時備份.如果讀取的新值與備份值相同.就說明顯示數據無需更新.(不用運行 BCD 到 BIN 顯示數據的查表).-------沒有不要反反復復對同樣的數據做顯示準備.可以節省大量運行時間.
如果讀取的新值與備份值不同,就運行一次 年月日時分秒 數據到顯示的處理,刷新一次顯示數據.
同時,對這個每秒信號進行計數,當計數值≥5(也可以其它數值)時,清零這個計數器,同時反轉一次標志 F_XS5S .
當 F_XS5S =0 就顯示年月日.當 F_XS55=1 就顯示時分秒.
3.每次上電,程序會進行一次對 1302 初始化,就必然都會從初始化數據可以運行實時時鐘.-----在沒有電池保護時,實際上當 1302 完全失電后,原來的運行數據會全部丟失.必須重新初始化!
但是,如果在調試時,板子沒有失電,1302 也沒有失電,就不應該進行實時時鐘的初始化.
如何自動決定 DS1302 是否需要初始化?
方法很簡單:程序重新運行時,在 1302 初始化子程序之前,首先讀取一次 1302 的信息,然后,對其信息進行分析或比較,以此來決定是否需要初始化!
我們利用 1302 自帶的 31 個RAM ,僅僅使用一個 RAM 就可以了.在第一次上電 1302 讀取數據后,同時也讀取一個 RAM 的數據,拿這個數據去比較一個特征碼,相同則不用運行 1302 初始化程序,不相同則需要運行 1302 的初始化程序.
示例程序:
;------------------------------------------
ORG 0000H
JMP B_REST
;==================================================
ORG 050H
B_REST:
MOV WDTCR,#WDTOF
MOV SP,#0E0H;SP[81H],范圍: RAM 在 00H--0FFH.
CALL Z_CRAM
CALL Z_OFF8X8 ;關閉8*8點陣----僅僅51hei-5 使用
CALL GET_TIME ;讀取1302
MOV A,4FH ;特征碼在 4FH
CJNE A,#0ABH,Z_INIT1302 ;特征碼是 #0abh (也可以其它啊!)
JMP Z_LOOP ;特征碼相同跳轉到 Z_LOOP
Z_INIT1302:
CALL DS1302_INIT ;特征碼不同運行 1302 初始化程序
;==========================================================
Z_LOOP:
CALL GET_TIME ;讀取1302
JNB F_1302,Z_LOOP0 ;F_1302=1刷新顯示數據
CLR F_1302
CALL Z_RTCBIN
Z_LOOP0:
CALL B_LEDXS
JMP Z_LOOP
;_________________________
DS1302_INIT:
CLR RST
CLR CLK
NOP
NOP
SETB RST
;實時時鐘寫入
ZM0 07FH
MOV R1,#80H
Z_WR1302: ;秒,分,時,天,月份,星期,年度==81H,83H,85H,97H,89H,8BH,8DH
MOV R0,#00H
CALL WRITE
INC2 R1
COM_ R1,#86H,Z_WR1302
MOV R0,#01H ;天
CALL WRITE
INC2 R1
MOV R0,#01H ;月份
CALL WRITE
INC2 R1
MOV R0,#06H ;星期
CALL WRITE
INC2 R1
MOV R0,#11H ;年度
CALL WRITE
ZB1 F_1302
MOV R1,#0C8H
MOV R0,#0ABH ;寫入特征碼
CALL WRITE
RET
;=====================================
;讀時間 數據子程序
GET_TIME: ; ;秒,分,時,天,月份,星期,年度==81H,83H,85H,97H,89H,8BH,8DH
MOV R0,#40H
MOV R1,#81H; 讀秒
Z_GET_TIME0:
CALL READ
MOV @R0,A;41H,
INC R1
INC R1
INC R0
COM_ R0,#047H,Z_GET_TIME0
MOV R1,#0C9H ;讀出特征碼;內部RAM命令與地址:C0H--FDH.奇數=讀,偶數=寫.
CALL READ
MOV 4FH,A ;讀出特征碼保存到4FH
MOV A,40H
CJNE A,7FH,Z_F1302 ;7fh 是上一次秒數值的備份
RET
Z_F1302:
MOV 7FH,A ;7fh 是秒數值的備份
ZB1 F_1302 ;設置刷新顯示標志
INC 7EH
COM_ 7EH,#5,Z_7EH
ZM0 7EH
CPL FRLSZ ;反轉輪流顯示標志
Z_7EH:
RET
;============================================
經過這樣補充,就可以增加顯示年月日(輪流顯示),以及自動判斷是否需要對 DS1302 進行初始化.
僅供參考!
用LCM1602來年月日時分秒星期一起顯,豈不更好?
歡迎光臨 (http://m.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |