日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【完美解决】ds1302外置时钟模块重复初始化时间问题(单片机掉电,模块电池供电)

發(fā)布時(shí)間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【完美解决】ds1302外置时钟模块重复初始化时间问题(单片机掉电,模块电池供电) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

芯片介紹:

DS1302是由美國DALLAS公司推出的具有涓細(xì)電流充電能力的低功耗實(shí)時(shí)時(shí)鐘芯片。它可以對年、月、日、周、時(shí)、分、秒進(jìn)行計(jì)時(shí),且具有閏年補(bǔ)償?shù)榷喾N功能。
模塊實(shí)物圖:
淘寶購買的模塊,物美價(jià)廉。

一、問題描述

DS1302時(shí)鐘模塊,通過單片機(jī)設(shè)置好時(shí)間后,由紐扣電池供電應(yīng)當(dāng)一直正常工作。但是單片機(jī)掉電再重新上電后,會(huì)導(dǎo)致模塊重復(fù)初始化,使時(shí)間回到起點(diǎn),與實(shí)際需求不符。單片機(jī)單純上電直接初始化時(shí)間,有些不妥。

二、解決方法

方案一:
1.先燒錄正常初始化時(shí)間的代碼。
2.注釋初始化時(shí)間的代碼再次燒錄。
點(diǎn)評(píng):此方案可以解決問題,需要重復(fù)燒錄兩次,不夠方便,故不作重點(diǎn)討論。

方案二:
每次設(shè)置時(shí)間后,使用一個(gè)eeprom或者flash等掉電不丟失數(shù)據(jù)的記憶芯片,寫入一個(gè)標(biāo)記,表明已經(jīng)初始化時(shí)間。系統(tǒng)重啟只需讀取是否這個(gè)標(biāo)記,若有,則不需初始化。反之,則初始化時(shí)間。
點(diǎn)評(píng):
此方案可以解決問題,需要額外芯片,有一定的局限性,故也不推薦。

仔細(xì)翻閱ds1302手冊,發(fā)現(xiàn)它本身是支持31字節(jié)的ram。在方案二的思路上,使用這些ram做標(biāo)記就很方便了。


地址C0到FC,讀地址是寫地址+1,儲(chǔ)存數(shù)值00~ff之間的任意值、
寫地址:c0 c2 c4 … fc
讀地址:c1 c3 c5 … fd
如:在c0地址寫入3a數(shù)值,讀c1地址若為3a,則說明上次已經(jīng)標(biāo)記。

方案三:
在方案二思路上,使用內(nèi)部ram空間做標(biāo)記。單片機(jī)重啟時(shí),讀取有無標(biāo)記,若有,則不需初始化。反之,則初始化時(shí)間。
點(diǎn)評(píng):推薦方案,方便快捷。缺點(diǎn)是代碼稍復(fù)雜。

筆者使用stm32f1系列單片機(jī)親測,切實(shí)可行。

關(guān)鍵代碼:

ds1302頭文件:

#define WRITE_FLAG_ADDR 0xc0 #define READ_FLAG_ADDR 0xc1 #define FLAG_VAL 0x3a

解釋:
定義三個(gè)宏,分別是寫地址,讀地址,和標(biāo)記數(shù)值。
注意:讀地址為寫地址+1。(數(shù)據(jù)手冊有圖)
ds1302頭文件:

設(shè)置時(shí)間函數(shù)

void ds1032_set_time(u16 year,u8 mon,u8 day,u8 hour,u8 min,u8 sec) {year -= 2000; //年默認(rèn)2000開始if(year > 100) year = 0; // 10轉(zhuǎn)為bdc碼year = ((year /10) << 4) + year %10;mon = ((mon /10) << 4) + mon %10;day = ((day /10) << 4) + day %10;hour = ((hour /10) << 4) + hour %10;min = ((min /10) << 4) + min %10;sec = ((sec /10) << 4) + sec %10;// 寫入寄存器,同時(shí)標(biāo)記一個(gè)地址ds1302_wirte_rig(0x8e,0x00);//關(guān)閉寫保護(hù)ds1302_wirte_rig(WRITE_FLAG_ADDR,FLAG_VAL);//寫入已經(jīng)設(shè)置時(shí)間標(biāo)記ds1302_wirte_rig(0x80,sec);//seconds秒ds1302_wirte_rig(0x82,min);//minutes分ds1302_wirte_rig(0x84,hour);//hours時(shí)ds1302_wirte_rig(0x86,day);//date日ds1302_wirte_rig(0x88,mon);//months月ds1302_wirte_rig(0x8c,(u8) year);//year年// ds1302_wirte_rig(0x8a,7);// 星期日ds1302_wirte_rig(0x8e,0x80);//開啟寫保護(hù) }

初始化時(shí)間函數(shù):

void ds1032_init_time(void) {if(ds1302_read_rig(READ_FLAG_ADDR)!= FLAG_VAL) // 如果未標(biāo)記,執(zhí)行初始化時(shí)間{ds1032_set_time(2020,12,31,23,59,30);// 2020年12月31日,23:59:30printf("Y時(shí)間初始化完成,標(biāo)記:%x\r\n",ds1302_read_rig(READ_FLAG_ADDR));}else{printf("N時(shí)間不用重復(fù)初始化,標(biāo)記:%x\r\n",ds1302_read_rig(READ_FLAG_ADDR));}}

解釋:
先判斷有無標(biāo)記,有則執(zhí)行ds1032_set_time,否則不執(zhí)行。

main源文件:
使用示例

實(shí)物效果圖:

總結(jié)

以上是生活随笔為你收集整理的【完美解决】ds1302外置时钟模块重复初始化时间问题(单片机掉电,模块电池供电)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。