秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。
控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。
2)读写时序说明
DS1302是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。 要想与DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如图4.5所示。
图4.5 DS1302控制字(即地址及命令字节)
位7:控制字的最高有效位,必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;
位5至位1(A4~A0):指示操作单元的地址;
位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。
控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位[10]。数据读写时序如图4.6,4.7所示。
图4.6 单字节读时序图
图4.7 单字节写时序图
实时时钟读写一字节数据的程序如下:
/************函数功能:实时时钟写入一字节(内部函数)***************/
void DS1302InputByte(unsigned char d)
{ unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{ DS1302_IO = ACC0; //将IO线上的数据存放在ACC中
DS1302_CLK = 1;//特别注意,DS1302写一数据时,CLK要产生一负脉冲
DS1302_CLK = 0;
ACC = ACC >> 1; } //每次移位一位
}
/************函数功能:实时时钟读取一字节(内部函数)***************/
unsigned char DS1302OutputByte(void)
{ unsigned char i;
for(i=8; i>0; i--)
{ACC = ACC >>1;//将前一个下降沿读出的数据右移一位从而读出该次读出的数放入ACC7
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0; } //SCLK下降沿读出DS1302的数
return(ACC);
}
在某地址写数据程序:
/********函数功能:写数据,其中Addr为 DS1302地址, ucData为要写的数据***************/
void Write1302(unsigned char ucAddr, unsigned char ucDa)
{ DS1302_RST = 0; //写数据时,要注意RST产生一上升沿,CLK为低电平
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 写1字节数据
DS1302_CLK = 1;
DS1302_RST = 0;
}
/************函数功能:写数据,其中Addr为 DS1302地址, ucData为要写的数据
***************/
unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据 AT89S52单片机的家庭智能浇花器设计+源程序(9):http://www.751com.cn/zidonghua/lunwen_2625.html