DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟 *** 作可通过AM/PM标志位决定采用24或12小时时间格式。
DS1302内部结构
DS1302的外部引脚功能说明如图3所示:
DS1302的内部结构如图4所示,主要组成部分为:移位寄存器、控制逻辑、振荡器、实时时钟以及RAM。虽然数据分成两种,但是对单片机的程序而言,其实是一样的,就是对特定的地址进行读写 *** 作。
DS1302含充电电路,可以对作为后备电源的可充电电池充电,并可选择充电使能和串入的二极管数目,以调节电池充电电压。不过对我们目前而言,最需要熟悉的是和时钟相关部分的功能,对于其它参数请参阅数据手册。
DS1302特点
时钟计数功能,可以对秒、分钟、小时、月、星期、年的计数。年计数可达到2100 年。
有31*8 位的额外数据暂存寄存器(即RAM,掉电丢失)最少I/O 引脚传输,通过三引脚控制、作电压:2.0-5.5V、工作电流小于320 纳安(2.0V)。
读写时钟寄存器或内部RAM(31*8 位的额外、数据暂存寄存)可以采用单字节模式(一次读写单个字节)和突发模式(一次读写多个字节)、8-pin DIP (直插封装)或8-pin SOICs(贴片封装)。
DS1302寄存器简介
DS1302的寄存器(读时81h~8Dh,写时80h~8Ch)是存放秒、分,小时、日、月、年、周数据的,存放的数据格式为BCD码形式。它的内部时间寄存器如下表:
上表是DS1302内部的7个与时间、日期有关的寄存器图和一个写保护寄存器,我们要做的就是将初始设置的时间、日期数据写入这几个寄存器,然后再不断地读取这几个寄存器来获取实时时间和日期。现对这几个寄存器的说明如下:
①、秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当初始上电时该位置为1,时钟振荡器停止,DS1302处于低功耗状态;只有将秒寄存器的该位置改写为0时,时钟才能开始运行,一般我们在用的时候是在设置时间完成后吧秒寄存器写入0,这样就启动了芯片的计时功能。
②、小时寄存器(85h、84h)的位7定义为DS1302是运行于12小时模式还是24小时模式。当为1时,选择12小时模式,为0时选择24小时模式。在12小时模式时,位5是标志位 ,为0时表示AM,为1时表示PM。在24小时模式时,位5是第二个10小时位。
③、控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的时候对时钟和RAM的写 *** 作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写 *** 作。也就是说在电路上电的初始态WP是1,这时是不能改写上面任何一个时间寄存器的,只有首先将WP改写为0,才能进行其它寄存器的写 *** 作。
其余的寄存器没有什么特殊的说明。对于DS1302芯片还有一个控制字,该控制字控制这芯片的读写 *** 作。具体的内容如下:
如上表所示,位0就是读写位,当位0为1时,就是告诉DS1302,下面是进行读出 *** 作,而当位0为0时就是写入 *** 作。
位0-位5是要进行 *** 作的DS1302寄存器地址。
位6就是告诉DS1302,是要对RAM进行 *** 作还是对时间寄存器进行 *** 作,0就是对时间寄存器 *** 作,一般我们都是对时间寄存器进行 *** 作。
位7就是固定的1。
现在就知道为什么控制字80H是写秒寄存器,而81H是读秒寄存器了吧。80H换成二进制就是10000000。而81H的二进制就是10000001,一个是写 *** 作,另一个是读 *** 作嘛!
DS1302 *** 作步骤1)首先要通过8eH将写保护去掉,这样我们才能将日期,时间的初值写时各个寄存器。
2)然后就可以对80H、82H、84H、86H、88H、8AH、8CH进行初值的写入。同时也通过秒寄存器将位7的CH值改成0,这样DS1302就开始走时运行了。
3)将写保护寄存器再写为80H,防止误改写寄存器的值。
4)不断读取80H-8CH的值,将他们转化为十进制后显示出来就可以啦,之前我们说过,DS1302读出的数据是BCD码,所以需要转换一下。
DS1302的数据读写是通过I/O串行进行的。当进行一次读写 *** 作时最少得读写两个字节,第一个字节是控制字节,就是一个命令,告诉DS1302是读还是写 *** 作,是对RAM还是对CLOK寄存器 *** 作,以及 *** 作的地址。第二个字节就是要读或写的数据了。
我们先看单字节写:在进行 *** 作之前先得将CE(也可说是RST)置高电平,然后单片机将控制字的位0放到I/O上,当I/O的数据稳定后,将SCLK置高电平,DS1302检测到SCLK的上升沿后就将I/O上的数据读取,然后单片机将SCLK置为低电平,再将控制字的位1放到I/O上,如此反复,将一个字节控制字的8个位传给DS1302。接下来就是传一个字节的数据给DS1302,当传完数据后,单片机将CE置为低电平, *** 作结束。
单字节读 *** 作的一开始写控制字的过程和上面的单字节写 *** 作是一样,但是单字节读 *** 作在写控制字的最后一个位,SCLK还在高电平时,DS1302就将数据放到I/O上,单片机将SCLK置为低电平后数据锁存,单机机就可以读取I/O上的数据。如此反复,将一个字节的数据读入单片机。读与写 *** 作的不同就在于,写 *** 作是在SCLK低电平时单片机将数据放到IO上,当SCLK上升沿时,DS1302读取。而读 *** 作是在SCLK高电平时DS1302放数据到IO上,将SCLK置为低电平后,单片机就可从IO上读取数据。
在单字节读 *** 作时,在写控制字的最后一个位也就是位7时,DS1302已将它的寄存器数据位0放到IO上了,要是控制字的位7是0的话,DS1302就无法将它的随后的数据放到IO上了,所以控制字的7位为固定的1,原因在这里哦。
DS1302的读写 *** 作代码void Write1302(unsigned char dat)
{
unsigned char i;
SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i《8;i++) //连续写8个二进制位数据
{
DATA=dat&0x01; //取出dat的第0位数据写入1302
delaynus(2); //稍微等待,使硬件做好准备
SCLK=1; //上升沿写入数据
delaynus(2); //稍微等待,使硬件做好准备
SCLK=0; //重新拉低SCLK,形成脉冲
dat》》=1; //将dat的各数据位右移1位,准备写入下一个数据位
}
}
void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
RST=0; //禁止数据传递
SCLK=0; //确保写数据前SCLK被拉低
RST=1; //启动数据传输
delaynus(2); //稍微等待,使硬件做好准备
Write1302(Cmd); //写入命令字
Write1302(dat); //写数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
}
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i《8;i++) //连续读8个二进制位数据
{
dat》》=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位
if(DATA==1) //如果读出的数据是1
dat|=0x80; //将1取出,写在dat的最高位
SCLK=1; //将SCLK置于高电平,为下降沿读出
delaynus(2); //稍微等待
SCLK=0; //拉低SCLK,形成脉冲下降沿
delaynus(2); //稍微等待
}
return dat; //将读出的数据返回
}
unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char dat;
RST=0; //拉低RST
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
Write1302(Cmd); //写入命令字
dat=Read1302(); //读出数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
return dat; //将读出的数据返回
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)