三線通信
(不稱爲一種通信協議,只是因爲此芯片由三根線接在板子上)
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); //使處於不可操作狀態
}