一. 描述
DS1302時(shí)鐘芯片是由美國(guó)DALLAS公司推出的具有涓細(xì)電流充電能力的低功耗實(shí)時(shí)時(shí)鐘芯片。 它可以對(duì)年、月、日、周、時(shí)、分、秒進(jìn)行計(jì)時(shí),且具有閏年補(bǔ)償?shù)榷喾N功能。
DS1302芯片包含一個(gè)用于存儲(chǔ)實(shí)時(shí)時(shí)鐘/日歷的 31 字節(jié)的靜態(tài) RAM,可通過(guò)簡(jiǎn)單的串行接口與微處理器通訊,將當(dāng)前的時(shí)鐘存于RAM。 DS1302芯片對(duì)于少于 31 天的月份月末會(huì)自動(dòng)調(diào)整,并會(huì)自動(dòng)對(duì)閏年進(jìn)行校正。 由于有一個(gè) AM/PM 指示器,時(shí)鐘可以工作在 12 小時(shí)制或者 24小時(shí)制。
二. 芯片參數(shù)
1.芯片特點(diǎn)
- 實(shí)時(shí)時(shí)鐘計(jì)算年、月、日、時(shí)、分、秒、星 期,直到 2100 年,并有閏年調(diào)節(jié)功能
- 31 x 8 位 通用暫存 RAM
- 串行輸入輸出,使管腳數(shù)最少
- 2.0V 至 5.5V 寬電壓范圍操作
- 在 2.0V 時(shí)工作電流小于 300nA
- 讀寫時(shí)鐘或 RAM 數(shù)據(jù)時(shí)有單字節(jié)或多字節(jié)(脈沖串模式)數(shù)據(jù)傳送方式
- 8 管腳 DIP 封裝或可選的 8 管腳表面安裝 SO 封裝
- 簡(jiǎn)單的 3 線接口
- 與 TTL 兼容 (VCC = 5V)
- 可選的工業(yè)溫度范圍:-40°C to +85°C
2.引腳說(shuō)明
DS1302采用的是三線接口的雙向數(shù)據(jù)通信接口,RST是片引腳,低電平有效; SCLK是時(shí)鐘芯片,為通信提供時(shí)鐘源; I/O為數(shù)據(jù)輸入輸出引腳,用于傳輸及接收數(shù)據(jù);
DS1302還采用了雙電源供電模式,VCC1 連接到備用電源,在VCC2主電源失效時(shí)保持時(shí)間和日期數(shù)據(jù).
三. 參考電路
DS1302芯片基本電路如上圖,其中Y2為32.768k外部晶振,為芯片提供時(shí)鐘源;P2為備用電池,以保證在主電源掉電后,芯片仍可繼續(xù)運(yùn)行;D1為二極管,保證電壓的單向?qū)?,防止主電源電壓過(guò)高燒壞備用電池;R6為上拉電阻,增強(qiáng)信號(hào)傳輸?shù)姆€(wěn)定性。
四. 控制程序
1.時(shí)鐘數(shù)據(jù)的讀寫地址
如上圖,為DS1302芯片的時(shí)鐘數(shù)據(jù)的讀和寫的地址,也就是說(shuō)要實(shí)現(xiàn)對(duì)芯片控制,就是往這些地址上寫入或讀出數(shù)據(jù)。 其中:
讀地址為: 0x81(秒), 0x83(分), 0x85(時(shí)), 0x87(日), 0x89(月), 0x8b(星期), 0x8d(年);
寫地址為: 0x80(秒), 0x82(分), 0x84(時(shí)), 0x86(日), 0x88(月), 0x8a(星期), 0x8c(年);
2.控制時(shí)序
DS1302控制軟件最基本的操作為寫函數(shù)和讀函數(shù),其次就是實(shí)現(xiàn)初始化函數(shù)。
(1)讀時(shí)序
/*******************************************************************************
* 函數(shù)功能 : 讀取一個(gè)地址的數(shù)據(jù)
*******************************************************************************/
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++)//開(kāi)始傳送八位地址命令
{
DSIO = addr & 0x01;//數(shù)據(jù)從低位開(kāi)始傳送
addr >>= 1;
SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
_nop_();
SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
_nop_();
}
_nop_();
for(n=0; n<8; n++)//讀取8位數(shù)據(jù)
{
dat1 = DSIO;//從最低位開(kāi)始接收
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
_nop_();
}
RST = 0;
_nop_(); //以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
(2)寫時(shí)序
/*******************************************************************************
* 函數(shù)功能 : 向DS1302命令(地址+數(shù)據(jù))
*******************************************************************************/
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++)//開(kāi)始傳送八位地址命令
{
DSIO = addr & 0x01;//數(shù)據(jù)從低位開(kāi)始傳送
addr >>= 1;
SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
_nop_();
SCLK = 0;
_nop_();
}
for (n=0; n<8; n++)//寫入8位數(shù)據(jù)
{
DSIO = dat & 0x01;
dat >>= 1;
SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
_nop_();
SCLK = 0;
_nop_();
}
RST = 0;//傳送數(shù)據(jù)結(jié)束
_nop_();
}
(3)初始化
/*******************************************************************************
* 函數(shù)功能 : 初始化DS1302.
*******************************************************************************/
void Ds1302Init()
{
uchar n;
Ds1302Write(0x8E,0X00); //禁止寫保護(hù),就是關(guān)閉寫保護(hù)功能
for (n=0; n<7; n++)//寫入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
{
Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
}
Ds1302Write(0x8E,0x80); //打開(kāi)寫保護(hù)功能
}
3. 參考示例
實(shí)現(xiàn)了DS1302的驅(qū)動(dòng)程序,接下來(lái)就可以實(shí)現(xiàn)DS1302的報(bào)時(shí)功能了。
//---DS1302寫入和讀取時(shí)分秒的地址命令---//
//---秒分時(shí)日月周年 最低位讀寫位;-------//
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時(shí)鐘初始化2013年1月1日星期二12點(diǎn)00分00秒。---//
//---存儲(chǔ)順序是秒分時(shí)日月周年,存儲(chǔ)格式是用BCD碼---//
uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};
/*******************************************************************************
* 函數(shù)功能 : 讀取時(shí)鐘信息
*******************************************************************************/
void Ds1302ReadTime()
{
uchar n;
for (n=0; n<7; n++)//讀取7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
{
TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
}
}
void main()
{
LcdInit();
Ds1302Init();
while(1)
{
Ds1302ReadTime(); //讀取此時(shí)的時(shí)間
LcdDisplay(); //顯示時(shí)間
}
}
-
電源
+關(guān)注
關(guān)注
184文章
17704瀏覽量
249959 -
芯片
+關(guān)注
關(guān)注
455文章
50714瀏覽量
423138 -
接口
+關(guān)注
關(guān)注
33文章
8575瀏覽量
151015 -
時(shí)鐘芯片
+關(guān)注
關(guān)注
2文章
249瀏覽量
39878 -
DS1302
+關(guān)注
關(guān)注
8文章
449瀏覽量
50676
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論