一.描述
DS1302時鐘芯片是由美國DALLAS公司推出的具有涓細電流充電能力的低功耗實時時鐘芯片。它可以對年、月、日、周、時、分、秒進行計時,且具有閏年補償等多種功能。DS1302芯片包含一個用於存儲實時時鐘/日曆的 31 字節的靜態 RAM,可通過簡單的串行接口與微處理器通訊,將當前的是時鐘存於RAM。DS1302芯片對於少於 31 天的月份月末會自動調整,並會自動對閏年進行校正。由於有一個 AM/PM 指示器,時鐘可以工作在 12 小時制或者 24小時制。
二.芯片參數
1.芯片特點
- 實時時鐘計算年、月、日、時、分、秒、星 期,直到 2100 年,並有閏年調節功能
- 31 x 8 位 通用暫存 RAM
- 串行輸入輸出,使管腳數最少
- 2.0V 至 5.5V 寬電壓範圍操作
- 在 2.0V 時工作電流小於 300nA
- 讀寫時鐘或 RAM 數據時有單字節或多字節(脈衝串模式)數據傳送方式
- 8 管腳 DIP 封裝或可選的 8 管腳表面安裝 SO 封裝
- 簡單的 3 線接口
- 與 TTL 兼容 (VCC = 5V)
- 可選的工業溫度範圍:-40°C to +85°C
2.引腳說明
DS1302採用的是三線接口的雙向數據通信接口,RST是片引腳,低電平有效;SCLK是時鐘芯片,爲通信提供時鐘源;I/O爲數據輸入輸出引腳,用於傳輸及接收數據;
DS1302還採用了雙電源供電模式,VCC1 連接到備用電源,在VCC2主電源失效時保持時間和日期數據.
三.參考電路
DS1302芯片基本電路如上圖,其中Y2爲32.768k外部晶振,爲芯片提供時鐘源;P2爲備用電池,以保證在主電源掉電後,芯片仍可繼續運行;D1爲二極管,保證電壓的單向導通,防止主電源電壓過高燒壞備用電池;R6爲上拉電阻,增強信號傳輸的穩定性。
四.控制程序
1.時鐘數據的讀寫地址
如上圖,爲DS1302芯片的時鐘數據的讀和寫的地址,也就是說要實現對芯片控制,就是往這些地址上寫入或讀出數據。其中:
讀地址爲0x81(秒), 0x83(分), 0x85(時), 0x87(日), 0x89(月), 0x8b(星期), 0x8d(年);
寫地址爲0x80(秒), 0x82(分), 0x84(時), 0x86(日), 0x88(月), 0x8a(星期), 0x8c(年)
2.控制時序
DS1302控制軟件最基本的操作爲寫函數和讀函數,其次就是實現初始化函數。
(1)讀時序
/*******************************************************************************
* 函數功能 : 讀取一個地址的數據
*******************************************************************************/
uchar Ds1302Read(uchar addr)
{
uchar n,dat,dat1;
RST = 0;
_nop_();
SCLK = 0;//先將SCLK置低電平。
_nop_();
RST = 1;//然後將RST(CE)置高電平。
_nop_();
for(n=0; n<8; n++)//開始傳送八位地址命令
{
DSIO = addr & 0x01;//數據從低位開始傳送
addr >>= 1;
SCLK = 1;//數據在上升沿時,DS1302讀取數據
_nop_();
SCLK = 0;//DS1302下降沿時,放置數據
_nop_();
}
_nop_();
for(n=0; n<8; n++)//讀取8位數據
{
dat1 = DSIO;//從最低位開始接收
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0;//DS1302下降沿時,放置數據
_nop_();
}
RST = 0;
_nop_(); //以下爲DS1302復位的穩定時間,必須的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
(2)寫時序
/*******************************************************************************
* 函數功能 : 向DS1302命令(地址+數據)
*******************************************************************************/
void Ds1302Write(uchar addr, uchar dat)
{
uchar n;
RST = 0;
_nop_();
SCLK = 0;//先將SCLK置低電平。
_nop_();
RST = 1; //然後將RST(CE)置高電平。
_nop_();
for (n=0; n<8; n++)//開始傳送八位地址命令
{
DSIO = addr & 0x01;//數據從低位開始傳送
addr >>= 1;
SCLK = 1;//數據在上升沿時,DS1302讀取數據
_nop_();
SCLK = 0;
_nop_();
}
for (n=0; n<8; n++)//寫入8位數據
{
DSIO = dat & 0x01;
dat >>= 1;
SCLK = 1;//數據在上升沿時,DS1302讀取數據
_nop_();
SCLK = 0;
_nop_();
}
RST = 0;//傳送數據結束
_nop_();
}
(3)初始化
/*******************************************************************************
* 函數功能 : 初始化DS1302.
*******************************************************************************/
void Ds1302Init()
{
uchar n;
Ds1302Write(0x8E,0X00); //禁止寫保護,就是關閉寫保護功能
for (n=0; n<7; n++)//寫入7個字節的時鐘信號:分秒時日月週年
{
Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
}
Ds1302Write(0x8E,0x80); //打開寫保護功能
}
3.參考例程
實現了DS1302的驅動程序,接下來就可以實現DS1302的報時功能了。
//---DS1302寫入和讀取時分秒的地址命令---//
//---秒分時日月週年 最低位讀寫位;-------//
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
//---DS1302時鐘初始化2013年1月1日星期二12點00分00秒。---//
//---存儲順序是秒分時日月週年,存儲格式是用BCD碼---//
uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};
/*******************************************************************************
* 函數功能 : 讀取時鐘信息
*******************************************************************************/
void Ds1302ReadTime()
{
uchar n;
for (n=0; n<7; n++)//讀取7個字節的時鐘信號:分秒時日月週年
{
TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
}
}
void main()
{
LcdInit();
Ds1302Init();
while(1)
{
Ds1302ReadTime(); //讀取此時的時間
LcdDisplay(); //顯示時間
}
}
如需DS1302相關資料及例程, 請關注公衆號,首頁回覆DS1302獲取資料