|
本人用AT89C51和DS1302 抄別人的軟件 制作了個(gè)時(shí)鐘,時(shí)鐘倒是可以正常走時(shí),只是有個(gè)問(wèn)題,斷電后重新通電,時(shí)間不能顯示當(dāng)時(shí)時(shí)間,會(huì)回到初始化時(shí)間,時(shí)間需要重新調(diào)整,感覺(jué)是程序中少了實(shí)時(shí)時(shí)間處理這個(gè)代碼,DS1302已經(jīng)安裝了電池,本人單片機(jī)不經(jīng)常使用,自學(xué)了匯編后只會(huì)匯編,C只能看個(gè)大概,哪個(gè)高手幫幫忙看看這程序需要如何改才可以時(shí)時(shí)顯示時(shí)間,只要顯示 秒分時(shí) 時(shí)間就可以了,其他功能不需要,謝謝!
T_CLK Bit P1.6 ;實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳
T_IO Bit P1.5 ;實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳
T_RST Bit P1.4 ;實(shí)時(shí)時(shí)鐘復(fù)位線引腳
D6 BIT P2.0 ;小時(shí)十位數(shù)碼管
D5 BIT P2.1 ;小時(shí)個(gè)位數(shù)碼管
D4 BIT P2.2 ;分鐘十位數(shù)碼管
D3 BIT P2.3 ;分鐘個(gè)位數(shù)碼管
D2 BIT P2.4 ;秒十位數(shù)碼管
D1 BIT P2.5 ;秒個(gè)位數(shù)碼管
D_OUT EQU P0 ;數(shù)碼管段位連接端
DOT BIT 20H.0
POT BIT 20H.1
second EQU 60h ;秒的緩沖區(qū)
minute EQU 61h ;分的緩沖區(qū)
hour EQU 62h ;小時(shí)的緩沖區(qū)
DAY EQU 63H
MONTH EQU 64H
WEEK EQU 65H
YEARL EQU 66H
;**************************************************************
;**************************************************************
ORG 00H
JMP START
ORG 0BH
JMP TIM0
ORG 30H
START: MOV SP,#70H
MOV SECOND,#36H
MOV MINUTE,#49H
MOV HOUR,#08H
MOV P2,#0FFH
MOV DPTR,#TAB
lcall SETDS1302 ;DS1302初始時(shí)間
lcall GET1302 ;DS1302讀取時(shí)間
lcall DSP ;顯示時(shí)間子程序
MOV R1,#5FH
mov r4,#00
mov ie,#82h
mov tmod,#01h
mov th0,#(65536-3000)/256
mov tl0,#(65536-3000)mod 256
setb tr0
;******************
DIR: NOP
JMP DIR
;******************
TIM0:push acc
push psw
mov th0,#(65536-2000)/256
mov tl0,#(65536-2000)mod 256
lcall DSP ;顯示時(shí)間子程序
lp2: djnz r3,lp1 ;未到1 S繼續(xù)循環(huán)
mov r3,#20
cpl dot
CJNE R1,#5FH,LP1
lcall GET1302 ;每過(guò)1s從DS1302讀取一次時(shí)間
lp1:pop psw
pop acc
reti
;****************************************************
;顯示時(shí)間掃描子程序
DSP: CJNE R1,#60H,SS
。。。。。。。此次有代碼省略
DSP3: RET
;---------------------------------------------------------------------------------------------------
;設(shè)置DS1302初始時(shí)間,并啟動(dòng)計(jì)時(shí)
SETDS1302:
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,#8EH ;寫控制命令字
LCALL INPUTBYTE
MOV B,#00H ;寫保護(hù)關(guān)閉
LCALL INPUTBYTE
SETB T_CLK
nop
CLR T_RST
MOV R0,#SECOND ;內(nèi)存中的時(shí)間首地址
MOV R2,#80H ;DS1302中的時(shí)間首地址
MOV R7,#7 ;字節(jié)數(shù)
SETLOOP:
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,R2 ;寫命令字
LCALL INPUTBYTE
MOV A,@R0 ;設(shè)置時(shí)間
MOV B,A
LCALL INPUTBYTE
INC R0
INC R2
INC R2
SETB T_CLK
nop
CLR T_RST
nop
DJNZ R7,SETLOOP
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,#8EH
LCALL INPUTBYTE
MOV B,#80H ;開(kāi)寫保護(hù)
LCALL INPUTBYTE
SETB T_CLK
nop
CLR T_RST
nop
RET
;---------------------------------------------------------------------------------------------------
;從DS1302讀取時(shí)間
GET1302:
MOV R0,#SECOND
MOV R2,#81H ;DS1302中讀時(shí)間的首地址
MOV R7,#7
GETLOOP:
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,R2
LCALL INPUTBYTE ;寫命令字
LCALL OUTPUTBYTE ;讀時(shí)間
MOV @R0,A ;將從DS1302中讀取的時(shí)間從內(nèi)存中保存
INC R0 ;修改地址指針
INC R2
INC R2
SETB T_CLK
nop
CLR T_RST
nop
DJNZ R7,GETLOOP
RET
;---------------------------------------------------------------------------------------------------
;向DS1302寫一個(gè)字節(jié)
INPUTBYTE:
MOV R4,#8
INPUTLOOP:
MOV A,B
RRC A
MOV B,A
MOV T_IO,C
SETB T_CLK
NOP
NOP
NOP
CLR T_CLK
DJNZ R4,INPUTLOOP
RET
;---------------------------------------------------------------------------------------------------
;從DS1302讀一個(gè)字節(jié)
OUTPUTBYTE:
clr a
clr c
MOV R4,#8
OUTPUTLOOP:
NOP
NOP
MOV C,T_IO
RRC A
SETB T_CLK
NOP
NOP
NOP
CLR T_CLK
DJNZ R4,OUTPUTLOOP
RET
DELAY: MOV R6,#10
DD1: MOV R7,#248
DJNZ R7,$
DJNZ R6,DD1
RET
DLAY:MOV R5,#100
DJNZ R5,$
RET
TAB: DB 03H,9FH,25H,0DH,99H,49H,41H,1FH,01H,09H;0123456789
end
|
|