DS1302是DALLAS公司推出的涓流充電時鐘芯片,內含一個實時時鐘/日歷和31字節靜態RAM,可以通過串行接口與單片機進行通信。實時時鐘/日歷電路提供秒、分、時、日、星期、月、年的信息,每個月的天數和閏年的天數可自動調整,時鐘操作可通過AM/PM標志位決定采用24或12小時時間格式。
DS1302與單片機之間能簡單地采用同步串行的方式進行通信,僅需三根I/O線:復位(RST)、I/O數據線、串行時鐘(SCLK)。時鐘/RAM的讀/寫數據以一字節或多達31字節的字符組方式通信。DS1302工作時功耗很低,保持數據和時鐘信息時,功耗小于1mW。
DS1302內部結構
DS1302的外部引腳功能說明如圖3所示:
DS1302的內部結構如圖4所示,主要組成部分為:移位寄存器、控制邏輯、振蕩器、實時時鐘以及RAM。雖然數據分成兩種,但是對單片機的程序而言,其實是一樣的,就是對特定的地址進行讀寫操作。
DS1302含充電電路,可以對作為后備電源的可充電電池充電,并可選擇充電使能和串入的二極管數目,以調節電池充電電壓。不過對我們目前而言,最需要熟悉的是和時鐘相關部分的功能,對于其它參數請參閱數據手冊。
DS1302特點
時鐘計數功能,可以對秒、分鐘、小時、月、星期、年的計數。年計數可達到2100 年。
有31*8 位的額外數據暫存寄存器(即RAM,掉電丟失)最少I/O 引腳傳輸,通過三引腳控制、作電壓:2.0-5.5V、工作電流小于320 納安(2.0V)。
讀寫時鐘寄存器或內部RAM(31*8 位的額外、數據暫存寄存)可以采用單字節模式(一次讀寫單個字節)和突發模式(一次讀寫多個字節)、8-pin DIP (直插封裝)或8-pin SOICs(貼片封裝)。
DS1302寄存器簡介
DS1302的寄存器(讀時81h~8Dh,寫時80h~8Ch)是存放秒、分,小時、日、月、年、周數據的,存放的數據格式為BCD碼形式。它的內部時間寄存器如下表:
上表是DS1302內部的7個與時間、日期有關的寄存器圖和一個寫保護寄存器,我們要做的就是將初始設置的時間、日期數據寫入這幾個寄存器,然后再不斷地讀取這幾個寄存器來獲取實時時間和日期。現對這幾個寄存器的說明如下:
①、秒寄存器(81h、80h)的位7定義為時鐘暫停標志(CH)。當初始上電時該位置為1,時鐘振蕩器停止,DS1302處于低功耗狀態;只有將秒寄存器的該位置改寫為0時,時鐘才能開始運行,一般我們在用的時候是在設置時間完成后吧秒寄存器寫入0,這樣就啟動了芯片的計時功能。
②、小時寄存器(85h、84h)的位7定義為DS1302是運行于12小時模式還是24小時模式。當為1時,選擇12小時模式,為0時選擇24小時模式。在12小時模式時,位5是標志位 ,為0時表示AM,為1時表示PM。在24小時模式時,位5是第二個10小時位。
③、控制寄存器(8Fh、8Eh)的位7是寫保護位(WP),其它7位均置為0。在任何的時候對時鐘和RAM的寫操作之前,WP位必須為0。當WP位為1時,寫保護位防止對任一寄存器的寫操作。也就是說在電路上電的初始態WP是1,這時是不能改寫上面任何一個時間寄存器的,只有首先將WP改寫為0,才能進行其它寄存器的寫操作。
其余的寄存器沒有什么特殊的說明。對于DS1302芯片還有一個控制字,該控制字控制這芯片的讀寫操作。具體的內容如下:
如上表所示,位0就是讀寫位,當位0為1時,就是告訴DS1302,下面是進行讀出操作,而當位0為0時就是寫入操作。
位0-位5是要進行操作的DS1302寄存器地址。
位6就是告訴DS1302,是要對RAM進行操作還是對時間寄存器進行操作,0就是對時間寄存器操作,一般我們都是對時間寄存器進行操作。
位7就是固定的1。
現在就知道為什么控制字80H是寫秒寄存器,而81H是讀秒寄存器了吧。80H換成二進制就是10000000。而81H的二進制就是10000001,一個是寫操作,另一個是讀操作嘛!
DS1302操作步驟
1)首先要通過8eH將寫保護去掉,這樣我們才能將日期,時間的初值寫時各個寄存器。
2)然后就可以對80H、82H、84H、86H、88H、8AH、8CH進行初值的寫入。同時也通過秒寄存器將位7的CH值改成0,這樣DS1302就開始走時運行了。
3)將寫保護寄存器再寫為80H,防止誤改寫寄存器的值。
4)不斷讀取80H-8CH的值,將他們轉化為十進制后顯示出來就可以啦,之前我們說過,DS1302讀出的數據是BCD碼,所以需要轉換一下。
DS1302的數據讀寫是通過I/O串行進行的。當進行一次讀寫操作時最少得讀寫兩個字節,第一個字節是控制字節,就是一個命令,告訴DS1302是讀還是寫操作,是對RAM還是對CLOK寄存器操作,以及操作的地址。第二個字節就是要讀或寫的數據了。
我們先看單字節寫:在進行操作之前先得將CE(也可說是RST)置高電平,然后單片機將控制字的位0放到I/O上,當I/O的數據穩定后,將SCLK置高電平,DS1302檢測到SCLK的上升沿后就將I/O上的數據讀取,然后單片機將SCLK置為低電平,再將控制字的位1放到I/O上,如此反復,將一個字節控制字的8個位傳給DS1302。接下來就是傳一個字節的數據給DS1302,當傳完數據后,單片機將CE置為低電平,操作結束。
單字節讀操作的一開始寫控制字的過程和上面的單字節寫操作是一樣,但是單字節讀操作在寫控制字的最后一個位,SCLK還在高電平時,DS1302就將數據放到I/O上,單片機將SCLK置為低電平后數據鎖存,單機機就可以讀取I/O上的數據。如此反復,將一個字節的數據讀入單片機。讀與寫操作的不同就在于,寫操作是在SCLK低電平時單片機將數據放到IO上,當SCLK上升沿時,DS1302讀取。而讀操作是在SCLK高電平時DS1302放數據到IO上,將SCLK置為低電平后,單片機就可從IO上讀取數據。
在單字節讀操作時,在寫控制字的最后一個位也就是位7時,DS1302已將它的寄存器數據位0放到IO上了,要是控制字的位7是0的話,DS1302就無法將它的隨后的數據放到IO上了,所以控制字的7位為固定的1,原因在這里哦。
DS1302的讀寫操作代碼
void Write1302(unsigned char dat)
{
unsigned char i;
SCLK=0; //拉低SCLK,為脈沖上升沿寫入數據做好準備
delaynus(2); //稍微等待,使硬件做好準備
for(i=0;i《8;i++) //連續寫8個二進制位數據
{
DATA=dat&0x01; //取出dat的第0位數據寫入1302
delaynus(2); //稍微等待,使硬件做好準備
SCLK=1; //上升沿寫入數據
delaynus(2); //稍微等待,使硬件做好準備
SCLK=0; //重新拉低SCLK,形成脈沖
dat》》=1; //將dat的各數據位右移1位,準備寫入下一個數據位
}
}
void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
RST=0; //禁止數據傳遞
SCLK=0; //確保寫數據前SCLK被拉低
RST=1; //啟動數據傳輸
delaynus(2); //稍微等待,使硬件做好準備
Write1302(Cmd); //寫入命令字
Write1302(dat); //寫數據
SCLK=1; //將時鐘電平置于已知狀態
RST=0; //禁止數據傳遞
}
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2); //稍微等待,使硬件做好準備
for(i=0;i《8;i++) //連續讀8個二進制位數據
{
dat》》=1; //將dat的各數據位右移1位,因為先讀出的是字節的最低位
if(DATA==1) //如果讀出的數據是1
dat|=0x80; //將1取出,寫在dat的最高位
SCLK=1; //將SCLK置于高電平,為下降沿讀出
delaynus(2); //稍微等待
SCLK=0; //拉低SCLK,形成脈沖下降沿
delaynus(2); //稍微等待
}
return dat; //將讀出的數據返回
}
unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char dat;
RST=0; //拉低RST
SCLK=0; //確保寫數居前SCLK被拉低
RST=1; //啟動數據傳輸
Write1302(Cmd); //寫入命令字
dat=Read1302(); //讀出數據
SCLK=1; //將時鐘電平置于已知狀態
RST=0; //禁止數據傳遞
return dat; //將讀出的數據返回
}
評論
查看更多