久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3558|回復: 19
打印 上一主題 下一主題
收起左側

DS1302時鐘求助

  [復制鏈接]
跳轉到指定樓層
樓主
       本人用AT89C51和DS1302 抄別人的軟件 制作了個時鐘,時鐘倒是可以正常走時,只是有個問題,斷電后重新通電,時間不能顯示當時時間,會回到初始化時間,時間需要重新調整,感覺是程序中少了實時時間處理這個代碼,DS1302已經安裝了電池,本人單片機不經常使用,自學了匯編后只會匯編,C只能看個大概,哪個高手幫幫忙看看這程序需要如何改才可以時時顯示時間,只要顯示 秒分時  時間就可以了,其他功能不需要,謝謝!

T_CLK Bit P1.6                    ;實時時鐘時鐘線引腳
T_IO  Bit P1.5                         ;實時時鐘數據線引腳
T_RST Bit P1.4                         ;實時時鐘復位線引腳

D6 BIT P2.0    ;小時十位數碼管
D5 BIT P2.1    ;小時個位數碼管
D4 BIT P2.2     ;分鐘十位數碼管
D3 BIT P2.3     ;分鐘個位數碼管
D2 BIT P2.4     ;秒十位數碼管
D1 BIT P2.5     ;秒個位數碼管


D_OUT EQU P0 ;數碼管段位連接端

DOT BIT 20H.0
POT BIT 20H.1
second     EQU     60h ;秒的緩沖區
minute     EQU     61h ;分的緩沖區
hour         EQU      62h ;小時的緩沖區
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初始時間
lcall GET1302          ;DS1302讀取時間
lcall  DSP               ;顯示時間子程序
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                  ;顯示時間子程序

lp2: djnz r3,lp1                 ;未到1 S繼續循環
     mov  r3,#20
     cpl dot
     CJNE R1,#5FH,LP1
     lcall GET1302                ;每過1s從DS1302讀取一次時間

lp1:pop psw
    pop acc
    reti

;****************************************************

;顯示時間掃描子程序
DSP:   CJNE R1,#60H,SS

。。。。。。。此次有代碼省略

DSP3: RET

;---------------------------------------------------------------------------------------------------
;設置DS1302初始時間,并啟動計時
SETDS1302:
        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,#8EH          ;寫控制命令字
        LCALL   INPUTBYTE      
        MOV     B,#00H          ;寫保護關閉
        LCALL   INPUTBYTE
        SETB    T_CLK
        nop
        CLR     T_RST

        MOV     R0,#SECOND      ;內存中的時間首地址
        MOV     R2,#80H         ;DS1302中的時間首地址
        MOV     R7,#7           ;字節數

SETLOOP:
        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,R2            ;寫命令字
        LCALL   INPUTBYTE
        MOV     A,@R0           ;設置時間
        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          ;開寫保護
        LCALL   INPUTBYTE
        SETB    T_CLK
        nop
        CLR     T_RST
        nop
        RET

;---------------------------------------------------------------------------------------------------
;從DS1302讀取時間
GET1302:
        MOV     R0,#SECOND   
        MOV     R2,#81H        ;DS1302中讀時間的首地址
        MOV     R7,#7
GETLOOP:
        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,R2
        LCALL   INPUTBYTE       ;寫命令字
        LCALL   OUTPUTBYTE      ;讀時間
        MOV     @R0,A           ;將從DS1302中讀取的時間從內存中保存
        INC     R0              ;修改地址指針
        INC     R2
        INC     R2
        SETB    T_CLK
        nop
        CLR     T_RST
        nop
        DJNZ    R7,GETLOOP
        RET

;---------------------------------------------------------------------------------------------------
;向DS1302寫一個字節
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讀一個字節
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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:86421 發表于 2022-8-9 08:22 | 只看該作者
匯編看不懂。但這一現象按C語言來說,可以看一下主程序中有個初始化DS1302的程序,看里面有沒有時間初始化,如有,去掉后再看看。
回復

使用道具 舉報

板凳
ID:16255 發表于 2022-8-9 11:43 | 只看該作者
你的程序應該了每次啟動都把1302給初始化了(我沒有仔細閱讀每一句),把時鐘寄存器覆蓋了。
我的做法是在初始化程序中讀取下圖寄存器的狀態,從而判斷要不要寫入初始化參數。



回復

使用道具 舉報

地板
ID:908826 發表于 2022-8-9 15:50 | 只看該作者
我記得我當時用3231的時候也是這種問題,我的解決辦法是先下載一次,然后把主程序的初始化時間注釋之后再下載一次。
回復

使用道具 舉報

5#
ID:386442 發表于 2022-8-9 17:27 | 只看該作者
lcall SETDS1302     ;DS1302初始時間
回復

使用道具 舉報

6#
ID:496636 發表于 2022-8-9 20:09 | 只看該作者
板凳說得對,RC的第0個寄存器的最高位表示是否正常計時,即時鐘停止標志,在程序的初始化步可以檢測一下這位是不是1,如果是1,就是表示掉電了,要執行時間的初始化,把保存的默認的時間值調出來作為現在的時間值 ,這樣開機后你得重新設置一下才能把它改為當前時間。
如果判斷它是0,就是跳過時間的初始化,就用DS1302的時間值。
回復

使用道具 舉報

7#
ID:16255 發表于 2022-8-11 10:28 | 只看該作者
13205495918 發表于 2022-8-9 15:50
我記得我當時用3231的時候也是這種問題,我的解決辦法是先下載一次,然后把主程序的初始化時間注釋之 ...

這種方法并不是最佳解決方案。
假如以后時鐘運行不正常了或者更換電池了,就不能自動初始化了。
回復

使用道具 舉報

8#
ID:72088 發表于 2022-8-11 15:49 | 只看該作者
開機讀取1302的秒,判斷最高位狀態,是1就初始化,是0就正常讀取1302,顯示時間。這樣就能正常工作了,
回復

使用道具 舉報

9#
ID:76044 發表于 2022-8-11 17:17 | 只看該作者
新鄉家電維修 發表于 2022-8-11 15:49
開機讀取1302的秒,判斷最高位狀態,是1就初始化,是0就正常讀取1302,顯示時間。這樣就能正常工作了,

能給例程嗎?DS1302我不熟,非常感謝
回復

使用道具 舉報

10#
ID:725922 發表于 2022-8-11 18:19 | 只看該作者
我現在也是這個問題,沒好意思發上來,拖延了很久,打開keil,然后玩手機,然后關電腦。。
回復

使用道具 舉報

11#
ID:603753 發表于 2022-8-12 15:47 | 只看該作者
主程序的初始化時間注釋之后再下載一次。
回復

使用道具 舉報

12#
ID:624769 發表于 2022-8-12 23:04 | 只看該作者
lxm41577 發表于 2022-8-11 17:17
能給例程嗎?DS1302我不熟,非常感謝

要抄也抄好點的呀,這還不如C寫的呢……

把你這段程序:
START: MOV SP,#70H
        MOV SECOND,#36H
MOV MINUTE,#49H
MOV HOUR,#08H
        MOV P2,#0FFH
        MOV DPTR,#TAB
lcall SETDS1302     ;DS1302初始時間
lcall GET1302          ;DS1302讀取時間
修改成下面的:

START: MOV SP,#70H
MOV P2,#0FFH
MOV DPTR,#TAB

lcall GET1302          ;DS1302讀取時間


MOV A,SECOND
JNB ACC.7,NOT_SET_Time
MOV SECOND,#36H
MOV MINUTE,#49H
MOV HOUR,#08H
lcall SETDS1302     ;DS1302初始時間
NOT_SET_Time:
lcall GET1302          ;DS1302讀取時間



回復

使用道具 舉報

13#
ID:76044 發表于 2022-8-14 08:17 | 只看該作者
188610329 發表于 2022-8-12 23:04
要抄也抄好點的呀,這還不如C寫的呢……

把你這段程序:

非常感謝您的幫忙,程序運行成功,不怕你笑話,我開始學的是匯編,C沒怎么學,所以C非常不熟悉,只能看個大概,匯編都是湊合用編程只是愛好,再次感謝
回復

使用道具 舉報

14#
ID:229502 發表于 2022-8-19 22:31 | 只看該作者
我也是網上抄別人的方法,斷電后時間仍在繼續走時。方法是單片機燒寫兩次,第一次把初始化時間設置好編譯后寫進單片機,二次把初始化時間注釋掉再次編譯燒寫進單片機。樓主可以試一下。方法在stc89c52上試過多遍時間主電源斷電后走時正常
回復

使用道具 舉報

15#
ID:76044 發表于 2022-8-20 14:12 | 只看該作者
huangjingjie 發表于 2022-8-19 22:31
我也是網上抄別人的方法,斷電后時間仍在繼續走時。方法是單片機燒寫兩次,第一次把初始化時間設置好編譯后 ...

這個方法我先前就試過,沒有成功,不過謝謝你
回復

使用道具 舉報

16#
ID:584814 發表于 2022-8-24 15:35 | 只看該作者
總結一下上面的回答,供參考:
1、問題出在每次啟動都先  lcall SETDS1302     ;DS1302初始時間
   解決方法:一是如14樓說的寫二次;二是如一眾所說直接刪除這句(可取下電池看好不好用);
                  三是給他句加個觸發條件,在需要調整時間時可以調整時間才有時鐘的樣子
2、感覺在壇子里;斓亩嗍菬嵝牡耐婕,也多不是科班出生的,至少俺是所以僅供參考
3、匯編和C各有千秋,只是C代碼如白話文但執行效率那個了點但有更多例程可以找更多樂子
回復

使用道具 舉報

17#
ID:683123 發表于 2023-3-16 14:20 | 只看該作者
DS1372供電端加一個47uf以上的電解電容,這樣通電的時候就時間就不會重置了。原來我也遇到這樣的問題,就是這樣解決的。
回復

使用道具 舉報

18#
ID:468209 發表于 2023-3-17 12:27 來自手機 | 只看該作者
滿足條件實行初始化 不滿足則跳過

Screenshot_20230317_122449_edit_1177395346551561.jpg (191.67 KB, 下載次數: 107)

Screenshot_20230317_122449_edit_1177395346551561.jpg
回復

使用道具 舉報

19#
ID:72088 發表于 2023-3-18 09:21 | 只看該作者
我給你個完美的解決方法吧,這是我的程序給你截取一段:

        LCALL GET1302      ;開機讀出DS1302的時間
        MOV A,SECOND     ;讀出的秒寄存器放入A
        ANL A,#80H               ;只保留秒寄存器最高位,判斷最高位狀態
        JZ MAIN                      ;A為0就轉移到主程序,否則就執行初始化DS1302程序
        LCALL CSHDS1302        ;執行初始化DS1302程序
;-----------------主程序-------------------------
MIAN:
.......



簡單高效,

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品成人无久久精品 | 欧美中国少妇xxx性高请视频 | 中文字幕国产一区 | 精品日韩一区 | 久久精品二区亚洲w码 | 99精品欧美一区二区蜜桃免费 | 美女天天操 | 欧美日韩高清免费 | 国产a视频 | h视频在线免费观看 | 国产精品免费高清 | 久久久久黑人 | 国产精品一区二区三区99 | 欧美a区 | 国产日韩欧美二区 | 99亚洲精品 | 久久99精品久久久久久狂牛 | 全免费a级毛片免费看视频免 | 日韩中文一区二区三区 | 久久久久国色av免费观看性色 | 欧美一区二区在线 | 青青久在线视频 | 一区二区三区欧美在线观看 | 日本超碰| 一级欧美一级日韩片免费观看 | 在线一区| 一级a性色生活片久久毛片 一级特黄a大片 | 国产精品国产 | 日韩在线免费观看视频 | 天天拍夜夜爽 | 国产精品美女久久久久久久网站 | 婷婷丁香激情 | 黄色大片免费观看 | 日本在线看片 | 久热免费| 欧美亚洲高清 | 亚洲色综合 | 色综合99 | 综合婷婷 | 久久久91精品国产一区二区三区 | 精品国产一区三区 |