一、 首先看幾張圖片給大家一個(gè)整體印象:
1. 直插的DS1302時(shí)鐘芯片:
圖1
2. 貼片封裝的DS1302時(shí)鐘芯片:
圖2
3. 用DS1302和1602做的數(shù)字時(shí)鐘:
圖3
圖3為用單片機(jī)從DS1302中讀取時(shí)間,然后把時(shí)間顯示在1602液晶上。1602上第一行顯示的是年月日和星期,第二行顯示的為時(shí)分秒。
二、 DS1302概述:
1. 通俗易懂言詮釋DS1302:
DS1302是時(shí)鐘芯片,那它就有計(jì)時(shí)的作用。他和我們?nèi)粘=佑|的電子表差不多,可以對(duì)年月日、時(shí)分秒、星期計(jì)時(shí)。我們可以用單片機(jī)往DS1302里面寫(xiě)入時(shí)間進(jìn)行時(shí)間設(shè)置,也可以用單片機(jī)從DS1302中讀取時(shí)間,讀出來(lái)的時(shí)間也可以放在液晶上顯示。這樣我們就可以實(shí)現(xiàn)一塊電子表的功能了。
2. DS1302封裝及引腳分布:
從圖1和圖2我們看到DS1302有兩種封裝,一種是直插式的,另
一種為貼片式封裝,而且DS1302有八個(gè)管腳。介紹如下:
好了, 看了芯片的引腳圖是不是覺(jué)得挺簡(jiǎn)單的啊! 晶振兩個(gè)腳, GND一個(gè)腳, VCC兩個(gè)腳, 我們盡需要關(guān)心的只剩下三個(gè)腳了. RST引腳的操作非常簡(jiǎn)單,給它高電平表示啟動(dòng)芯片讓芯片工作(低電平復(fù)位,高電平時(shí)芯片正常),給它低電平表示不讓芯片工作。SCLK引腳表示時(shí)鐘引腳,它給IO引腳數(shù)據(jù)的傳輸提供時(shí)序。
3. DS1302的特點(diǎn):
� 時(shí)鐘計(jì)數(shù)功能,可以對(duì)秒、分鐘、小時(shí)、月、
星期、年的計(jì)數(shù)。年計(jì)數(shù)可達(dá)到2100 年。
� 有31*8 位的額外數(shù)據(jù)暫存寄存器(即RAM,掉電丟失)
� 最少I/O 引腳傳輸,通過(guò)三引腳控制
� 工作電壓:2.0-5.5V
� 工作電流小于320 納安(2.0V)
� 讀寫(xiě)時(shí)鐘寄存器或內(nèi)部RAM(31*8 位的額外
數(shù)據(jù)暫存寄存)可以采用單字節(jié)模式(一次讀寫(xiě)單個(gè)字節(jié))和突發(fā)模式(一次讀寫(xiě)多個(gè)字節(jié))
� 8-pin DIP (直插封裝)或8-pin SOICs(貼片封裝)
三、 DS1302操作:
1. 開(kāi)發(fā)板電路圖:
圖4 開(kāi)發(fā)板電路圖
從電路圖中我們可以看到,RST片選使能引腳接到了單片機(jī)的P3.0引腳,SCLK時(shí)鐘引腳接到而來(lái)單片機(jī)的P3.3引腳,IO引腳接到了單片機(jī)的P2.4引腳。
2.時(shí)序與數(shù)據(jù)讀寫(xiě):
對(duì)于操作一個(gè)芯片而言,最重要的應(yīng)該是如何根據(jù)它的時(shí)序圖向它里面寫(xiě)入數(shù)據(jù)和讀取數(shù)據(jù)。時(shí)序就是高低電平隨時(shí)間的變化,和我們見(jiàn)到的波形隨時(shí)間變化差不多。下面教大家如何往芯片里面寫(xiě)數(shù)據(jù),如何從芯片里面讀數(shù)據(jù)。溫馨提示:在讀寫(xiě)芯片時(shí),一般需要先寫(xiě)入寄存器或RAM的地址(有時(shí)也成為寫(xiě)入命令),然后才能對(duì)芯片的寄存器或RAM進(jìn)行讀寫(xiě)操作!
2.1 往芯片里寫(xiě)數(shù)據(jù):
因?yàn)樾酒蛔R(shí)別0和1,所以寫(xiě)數(shù)據(jù)無(wú)非就是往芯片里面寫(xiě)0和1。那芯片又是如何識(shí)別0和1的呢?其實(shí)我們只要在特定的時(shí)間把控制線置為高電平或拉為低電平就可以了。下面看下時(shí)序圖:
圖5 DS1302寫(xiě)時(shí)序
先看RST引腳(復(fù)位引腳),標(biāo)號(hào)上面的一個(gè)橫杠表示此引腳低電平有效,也即給它低電平后芯片復(fù)位,不能正常工作。所以欲使芯片正常工作,此引腳應(yīng)該給高電平,從時(shí)序圖中也可以看出,我們進(jìn)行寫(xiě)操作的時(shí)候RST引腳應(yīng)該置為高電平。
再看SCLK時(shí)鐘引腳和IO引腳。圖中的黑色箭頭表示寫(xiě)入的數(shù)據(jù)在上升沿鎖存。也就是說(shuō)如果我們要往DS1302里面寫(xiě)入一位二進(jìn)制數(shù)據(jù),首先應(yīng)該把SCLk引腳拉低,然后把我們要寫(xiě)入的一位二進(jìn)制數(shù)據(jù)送到IO口,再把SCLK時(shí)鐘線拉高,此時(shí)數(shù)據(jù)就被送到DS1302中了。還有一點(diǎn)需要注意,寫(xiě)數(shù)據(jù)的時(shí)候先寫(xiě)低位,后讀寫(xiě)高位。讀寫(xiě)的時(shí)候,先寫(xiě)地址,后寫(xiě)數(shù)據(jù)。大家可能會(huì)有點(diǎn)暈了吧,呵呵,分析下下面的代碼大家就明白了:
寫(xiě)操作的代碼:
//地址、數(shù)據(jù)發(fā)送子程序
void Write1302 ( uchar addr,dat )
{
uchar i,temp,m,n;
RST=0; //RST引腳為低,數(shù)據(jù)傳送中止
SCLK=0; //清零時(shí)鐘總線
RST = 1; //RST引腳為高,邏輯控制有效
//發(fā)送地址
for ( i=8; i>0; i-- ) //循環(huán)8次移位
{
SCLK = 0; //先把時(shí)鐘線拉低
temp = addr;
DIO = (bit)(temp&0x01); //每次傳輸?shù)妥止?jié),數(shù)據(jù)放到數(shù)據(jù)端口
addr >>= 1; //右移一位
SCLK = 1; //把時(shí)鐘線拉高,鎖存數(shù)據(jù)
}
//發(fā)送數(shù)據(jù)
m=dat/10; //存儲(chǔ)的時(shí)候,高四位存儲(chǔ)十位,低四位存儲(chǔ)個(gè)位,所以需要轉(zhuǎn)換
n=dat%10;
dat=m*16+n; //十進(jìn)制轉(zhuǎn)化為十六進(jìn)制,高四位存放十
位,第四位存放個(gè)位
for ( i=8; i>0; i-- )
{
SCLK = 0; //先把時(shí)鐘線拉低
temp = dat;
DIO = (bit)(temp&0x01); //只取最低一位
dat >>= 1; //右移一位
SCLK = 1; //把時(shí)鐘線拉高,鎖存數(shù)據(jù)
}
RST = 0; //數(shù)據(jù)傳送中止
}
2.2 從DS1302中讀取數(shù)據(jù):
圖6 DS1302的讀時(shí)序
先看RST引腳(復(fù)位引腳),標(biāo)號(hào)上面的一個(gè)橫杠表示此引腳低電平有效,也即給它低電平后芯片復(fù)位,不能正常工作。所以欲使芯片正常工作,此引腳應(yīng)該給高電平,從時(shí)序圖中也可以看出,我們進(jìn)行寫(xiě)操作的時(shí)候RST引腳應(yīng)該置為高電平。
再看SCLK時(shí)鐘引腳和IO引腳。圖中的前八位的黑色箭頭表示寫(xiě)入的數(shù)據(jù)在上升沿鎖存,后八位的黑色箭頭表示下降沿讀取數(shù)據(jù)。也就是說(shuō)如果我們要從DS1302里面讀出一位二進(jìn)制數(shù)據(jù),首先應(yīng)該把SCLk引腳拉高,然后把SCLK拉低(在SCLK拉低的一瞬間DS1302的數(shù)據(jù)送到了IO端口上),再把IO口上的數(shù)據(jù)存入變量,此時(shí)就讀到了一位二進(jìn)制數(shù)據(jù)。還有一點(diǎn)需要注意,讀數(shù)據(jù)的時(shí)候先讀低位,后讀高位。讀寫(xiě)的時(shí)候,先寫(xiě)地址,后讀寫(xiě)數(shù)據(jù)。大家可能會(huì)有點(diǎn)暈了吧,呵呵,分析下下面的代碼大家就明白了:
對(duì)應(yīng)代碼:
//數(shù)據(jù)讀取子程序
uchar Read1302 ( uchar addr )
{
uchar i,temp,dat1,dat2;
RST=0; //芯片處于復(fù)位狀態(tài)
SCLK=0; //清零
RST = 1; //芯片開(kāi)始工作
//發(fā)送地址
for ( i=8; i>0; i-- ) //循環(huán)8次移位
{
SCLK = 0; //時(shí)鐘線拉低
temp = addr;
DIO = (bit)(temp&0x01); //每次傳輸?shù)臀?/p>
addr >>= 1; //右移一位
SCLK = 1;
}
//讀取數(shù)據(jù)
for ( i=8; i>0; i-- )
{
SCLK = 1;//時(shí)鐘線拉高
SCLK = 0;//時(shí)鐘線拉低
ACC_7=DIO;//讀取數(shù)據(jù),ACC_7為存放數(shù)據(jù)變量的最高位一位
ACC>>=1;//右移一位
}
RST=0; //禁止芯片工作
dat1=ACC;
dat2=dat1/16; //數(shù)據(jù)進(jìn)制轉(zhuǎn)換,提取高四位,作為十位
dat1=dat1%16; //提取第四位,作為個(gè)位
dat1=dat1+dat2*10; //得到的十進(jìn)制數(shù)
return (dat1); //返回十進(jìn)制值
}