時鐘芯片DS1302的原理及使用

一.描述

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獲取資料
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章