18.時鐘芯片DS1302

三線通信

(不稱爲一種通信協議,只是因爲此芯片由三根線接在板子上)
DS1302可以對年、月、日、周、時、分、秒進行計時,具有閏年補償功能,工作電壓爲2.0V~5.5V,採用三線接口與CPU進行同步通信,並可採用突發方式一次傳送多個字節的時鐘信號或RAM數據。DS1302內部有一個31*8的用於臨時存放數據的RAM寄存器。
原理圖如下:
在這裏插入圖片描述
RTC寄存器地址(控制指令字):
位7:必須爲邏輯1,爲0則不能把數據寫入DS1302;
位6:爲0存取日曆時鐘數據,爲1存取RAM數據;
位5~1:指示操作單元地址;
位0:爲0進行寫操作,爲1進行讀操作。
在這裏插入圖片描述
在控制指令字輸入後的下一個SCLK時鐘的上升沿時,數據被寫入DS1302,數據輸入從低位即位0開始。同樣,在緊跟8位的控制指令字後的下一個SCLK脈衝的下降沿讀出DS1302的數據,讀出數據時從低位0位到高位7。(即先寫入地址,然後下一個SCLK時鐘上升沿寫入數據或者下一個SCLK下降沿讀出數據,均爲從最低位到最高位)

相關寄存器地址及定義:
在這裏插入圖片描述
由表格知,BIT7~BIT0位被分爲兩部分,因此,以秒爲例,在寫入或讀出時,十位和個位要分別讀寫。

Write_DS1302(0X8E,0X00);			//使處於可操作狀態
或者
Write_DS1302(0X8E,0X80);			//使處於不可操作狀態(寫操作見後面)

DS1302寫操作:
在這裏插入圖片描述
寫字節函數:

void Write_Byte(uchar temp)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		SCK=0;
		SDA=temp&0X01;
		temp>>=1;
		SCK=1;
	}
}

DS1302寫函數:

void Write_DS1302(uchar address,uchar dat)
{
	RST=0;
	_nop_();
	SCK=0;
	_nop_();
	RST=1;
	Write_Byte(address);
	Write_Byte((dat/10)<<4|(dat%10));
}

DS1302讀操作:
在這裏插入圖片描述
DS1302讀函數:

uchar Read_DS1302(uchar address)
{
	uchar i,temp,dat1,dat2;
	RST=0;
	_nop_();
	SCK=0;
	_nop_();
	RST=1;
	Write_Byte(address);
	for(i=0;i<8;i++)
	{
		SCK=0;
		temp>>=1;
		if(SDA)temp|=0X80;
		SCK=1;
	}
	SDA=0;
	dat1=temp/16;
	dat2=temp%16;
	temp=dat1*10+dat2;
	return temp;
}

利用上面的讀寫函數,我們可以寫出下面的初始化函數,給DS1302一個初始時間值,以及在主函數中調用DS1302數值獲取函數,使此刻時間顯示在數碼管上並不斷進行計時。
DS1302初始化:

void DS1302_Init(void)
{
	uchar i;
	uchar add=0X80;
	Write_DS1302(0X8E,0X00);			//使處於可操作狀態
	for(i=0;i<7;i++)
	{
		Write_DS1302(add,Init_Time[i]);
		add=add+2;
	}
	Write_DS1302(0X8E,0X80);			//使處於不可操作狀態
}

DS1302數值獲取:

void DS1302_Get(void)
{
	uchar i;
	uchar add=0X81;
	Write_DS1302(0X8E,0X00);			//使處於可操作狀態
	for(i=0;i<7;i++)
	{
		shijian[i]=Read_DS1302(add);
		add=add+2;
	}
	Write_DS1302(0X8E,0X80);			//使處於不可操作狀態
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章