|
發(fā)布時間: 2017-9-2 20:51
正文摘要:本帖最后由 jianwei2030 于 2017-9-3 21:12 編輯 自己做了一個萬年歷時鐘,利用STC15W408AS單片機,時鐘芯片采用DS1302。當前自己參考網(wǎng)上寫了時間讀取的程序,在實驗板走時正常,但是斷電再上電后無法保存時間, ... |
黑暗人才 發(fā)表于 2017-9-2 23:08 我是這樣檢測的,第一次上電后是我的初始化時間,但是第二次上電后時間從0開始,說明我的備用電源正常,應(yīng)為向存儲器寫的內(nèi)容沒有丟失,但是時間為啥不對呢,請問遇到過同類型的問題嗎,新手已被逼瘋。 |
| 這個問題啊,時間初始化是程序的問題,要設(shè)置一下那個什么命令,不太記得了,我DS1302,都是直接調(diào)用程序,改一下IO口就可以用了,你找的程序不對,你這個是程序初始化的時候把時間給初始化了。 |
|
軟件你已經(jīng)寫好了,而且是可以正常使用的,現(xiàn)在最簡單的方法就是用一個IO口來判斷是否需要初始化即可, 例如你的P55腳是空的,在初始化前面先判斷P55,是0的話初始化,是1就不初始化,你燒錄好程序,如果想要初始化就把P55接地再上電就會初始化了,不需要初始化時懸空即可,多簡單啊 |
|
不明白你說的不成都什么不成 也沒太看明白你要求什么 1302這東西 掉電就沒時間了 必須要重新寫入時間 往1302的RAM寫校驗標記是可以的 完全沒問題 我正在用 寫的是第一個地址 注意 因為1302是BCD格式寫入 如果你寫的值超過6位讀出來就只有6位 比如寫0xaa進去出來是0x2a 如果你的板子沒設(shè)計后備電池 可以在供電線路上并聯(lián)一個電池 電池的正極串聯(lián)一個二極管 和后備電池意思一樣 如果是片子斷電后再上電 也不一定非要去讀1302 寫個預(yù)處理函數(shù) 在主循環(huán)的while之前執(zhí)行 只要是第一次上電 都先從1302讀時間到緩沖區(qū) 然后再到主循環(huán)里顯示 當然 這樣做的前提是1302不能斷電 否則讀出來的肯定是錯誤的時間 讀1302的RAM方法只是為了判斷是否執(zhí)行調(diào)表 |
| 我以上方法都試了都不行 |
|
我還看到過說1302的vcc2連接一個10000uF的電容,就可以斷電也能繼續(xù)計時,說再加一個write1302_time(0x90,0xa6);就可以 這個說法是真的嗎? 為什么我的板是連了一個10 0000uF的電容,試了,失敗了,還是說一定要加一個3v的備用電池才能做到斷電繼續(xù)計時? |
|
DS1302掉電后內(nèi)部RAM的值不等于3,可以判斷后初始化時間,然后標記為3即可。 |
| 你們也太厲害了吧 |
jianwei2030 發(fā)表于 2017-9-7 21:53 換進口的DS1302,同樣的程序,進口的芯片可以,有些國產(chǎn)的芯片就是不行 |
|
我修改了上電檢測部分的程序(如下), 思路是:上電后檢測RAM中存儲的數(shù)據(jù)十位是否為7,如果是則跳過初始化程序(什么也不執(zhí)行),如果不是則執(zhí)行初始化子程序 可是不管我怎么修改,修改后的時間就是無法保存,每次上電后依然是初始化的時間 ,要怒了。。。void init_1302() //初始化函數(shù) 設(shè)置時間 { write1302_time(write_control_add,0x00); //保護取消,可以進行讀寫操作 write1302_time(write_sec_add,0x30);//寫入初始秒時間 0101 0110 write1302_time(write_min_add,0x05);//寫入初始分時間 0101 0110 write1302_time(write_hr_add,0x21); //寫入初始時時間 0101 0110 write1302_time(write_week_add,0x07); //寫入初始周時間 0101 0110 write1302_time(write_month_add,0x09); //寫入初始月時間 0101 0110 write1302_time(write_day_add,0x03); //寫入初始日時間 0101 0110 write1302_time(write_year_add,0x17); //寫入初始年時間 0101 0110 write1302_time(write_RAM0_add,0x17); //往RAM寄存器中寫入0xf0數(shù)據(jù),因為RAM有掉電丟失特點,所以進入初始化函數(shù)的時候首先判斷這個寄存器是否還有數(shù)據(jù) write1302_time(write_charger_add,0xab); //使能涓流充電,兩個二極管+8k電阻 1010 1011 write1302_time(write_control_add,0x80); //保護啟動,禁止對1302寫操作 } void ram_flag() { read_ram_data = read1302_time(read_RAM0_add); ram_data = ((read_ram_data&0x70)>>4)*10+(read_ram_data&0x0f); if((ram_data%10) == 7) { write1302_time(write_control_add,0x80); //保護啟動,禁止對1302寫操作 } else if((ram_data%10) != 7) { init_1302(); } } |
黑暗人才 發(fā)表于 2017-9-2 23:08 網(wǎng)上也是這么說的,我是檢測1302內(nèi)部的31字節(jié)的第一位,初始化時給這一位寫入一個數(shù)據(jù),再上電時讀取這一位是不是之前寫入的值,但是根據(jù)網(wǎng)上的程序修改沒有效果。 |
mengx 發(fā)表于 2017-9-5 10:48 換過了,前后都是用達拉斯的芯片 |
| 電路沒問題,不同公司的1302驅(qū)動方法上可能存在不同,我也遇到過同樣的問題,換個1302就好了 |
| 屏蔽掉初始化 |
cjjcjj1 發(fā)表于 2017-9-2 21:31 后備電池是有加3V紐扣電池的;刪掉初始化函數(shù)后第一次上電就什么也不顯示了,我希望第一次上電時顯示一個初始時間,用戶在這個時間的基礎(chǔ)上再修改。 |
黑暗人才 發(fā)表于 2017-9-2 23:08 網(wǎng)上的說法也是這樣做,初始化時在1302的ram中寫入一個數(shù)值,以后每次上電都檢測這個數(shù)值,如果檢測到就不執(zhí)行初始化程序,檢測不到就執(zhí)行初始化程序。但是我想知道怎么寫這個檢測程序。 |
| 你可以修改一下你的初始化函數(shù),DS1302里面不是有好多空著的寄存器嘛,你可以先檢測某一個寄存器是否為0,為零就初始化,初始化完畢后給這個寄存器寫1,這樣就可以了 |
| 參與人數(shù) 1 | 黑幣 +30 | 收起 理由 |
|---|---|---|
|
| + 30 | 回帖助人的獎勵! |
Powered by 單片機教程網(wǎng)