DS1302是由美國DALLAS公司推出的具有涓細電流充電能力的低功耗實時時鐘芯片。我們知道DS1302 是實時時鐘芯片,既然是時鐘芯片它肯定還可以用作一般意義上的定時器(定時時間以秒為單位)。
DS1302的特點
DS1302是DALLAS(達拉斯)公司出的一款涓流充電時鐘芯片,2001年DALLAS被MAXIM(美信)收購,因此我們看到的DS1302的數(shù)據(jù)手冊既有DALLAS的標志,又有MAXIM的標志,大家了解即可。DS1302實時時鐘芯片廣泛應用于電話、傳真、便攜式儀器等產(chǎn)品領(lǐng)域,他的主要性能指標如下:
1、DS1302是一個實時時鐘芯片,可以提供秒、分、小時、日期、月、年等信息,并且還有軟件自動調(diào)整的能力,可以通過配置AM/PM來決定采用24小時格式還是12小時格式。
2、擁有31字節(jié)數(shù)據(jù)存儲RAM。
3、串行I/O通信方式,相對并行來說比較節(jié)省IO口的使用。
4、DS1302的工作電壓比較寬,大概是2.0V~5.5V都可以正常工作。
5、DS1302這種時鐘芯片功耗一般都很低,它在工作電壓2.0V的時候,工作電流小于300nA。
6、DS1302共有8個引腳,有兩種封裝形式,一種是DIP-8封裝,芯片寬度(不含引腳)是300mil,一種是SOP-8封
裝,有兩種寬度,一種是150mil,一種是208mil.我1]看一下DS1302的引腳封裝圖,如圖1所示。
ds1302做計時器準確嗎
ds1302是一塊高性能芯片,是專用的時鐘芯片,它的內(nèi)部有31個寄存器,具有閏年自動補充功能,非常適合做計時器,那么ds1302是否準確了?理論上來說是沒有絕對準確,只是誤差小而已 上面說的定時 并不是讓你用定時器去讀取,定時不等于定時器只是讓你一定時間讀取一次時鐘芯片的時間。
網(wǎng)友關(guān)于ds1302做計時器是否準確的問答
問:單片機需要定時去讀取1302內(nèi)部寄存器的數(shù)據(jù),就是時間,秒,分,時,年,月,日等。
答:它是專業(yè)的時鐘芯片,內(nèi)部實現(xiàn)準確計時功能,只有晶振搞準了,負載電容對了就可以。
追問1:單片機的定時器本身不準確,嗯,我有點不明白定時器既然不準確,為什么還需要定時從時鐘芯片讀取時間數(shù)據(jù)??
? ? ? ? ? 2:時鐘芯片本身是否能實現(xiàn)準確定時,還是需要單片機的定時器配合才能完成定時?
追答定時從時鐘芯片讀取數(shù)據(jù),并一定要用定時器哦。時鐘芯片計時是比較準確的,但也有誤差,不是絕對準確。但比單片機定時器要好很多了。
程序功能:
1定時最大范圍:小時
2 隨時通過控制按鍵輸入定時時間
3一直顯示DS1302的實時時間
分析如F: 用DS1302 作為定時器首先需要定義兩個數(shù)組,一個用作讀取DS1302 的實
時時間now[]; 另一個用作需要定時時間暫存time[]; 我們知道從DS1302 中讀取的數(shù)據(jù)格
式是壓縮BCD碼,即now[7]={秒,分,時,日,月,周,年}; 當控制按鍵按下時time[]存放
的應該是主觀定時時問,之后要將其修改成壓縮BCD碼并與當前時間now[]的數(shù)據(jù)相加;
需要修正數(shù)據(jù)。
在控制按鍵按下后,一次輸入時兩位分兩位秒兩位; 若想要定時1分59秒,那么對
應輸入的鍵值應該是time[6]= {0,0,0,1,5,9}_》_-=[0Oltime[1]= 時time[2]time[3]= 分
time[4]time[5]= 秒這樣的表示與從DS1302讀出的數(shù)據(jù)不一致,需要如下修改:
1秒處理:
time[4]《《= 4;
time[4]= time[4]+ time[]//time[4] 為秒的BCD 石馬
time[2] 《《= 4;
2 分處理:
time[2]=time[2]+ timc[3];//ime[2] 為分的BCD 5 馬
time[0]《《= 4;
3 時處理:
time[0]= time[O] + time[ ];/im[O] 為時的BCD 碼
time[5]=time[0];
time[0]= time[4;秒
time[1]= time[2];分
docin.com
time[2]= time[$]/時
time[3]= time[4]= time[5]=0;
接下來就是要處理進位關(guān)系:
for( DATA_A= 0; DATA_A 《 3 ;DATA_A++)
time[DATA_A]=time[DATA_A] +now[DATA_A];// 當前8 間與定時時間相加
if(ime[DATA_A]&0x0)》0x09 )
if( DATA_A== 2 )break;
time[DATA_A] +=6;// 加6 修正
}
if(carry_flag )
time[DATA_A] += 1;
if(time[ DATA_A]&0x0f)== 0x0a)
{
time[DATA_A] &=0xf0;
time[DATA_A] +=0x10;
if((ime[DATA_A]&0xf0)》0X50)
{
time[DATA_A]-= 0x60;
carry_flag=1;
elsecarry_flag= 0;
}這樣基本上完成對DS1302的數(shù)據(jù)處理。
評論