第30章实时时钟芯片应用•对于一些测控系统或者手持式设备,经常需要显示以及设定时间。目前,市场上有多种实时时钟芯片提供了这类功能。这种可编程的实时时钟芯片内置了可编程的日历时钟以及一定的RAM存储器,用于设定以及保存时间。另外,实时时钟芯片一般内置闰年补偿系统,计时很准确。其采用备份电池供电,在系统断电时仍可以工作。实时时钟芯片的这些优点,使得其广泛应用于需要时间显示的场合。本章详细介绍了美国DALLAS公司推出实时时钟芯片DS1302的功能、控制指令以及时间的操作。本章通过一个具体的实例,讲解了如何使用51系列单片机来读写实时时钟芯片DS1302。30.1实时时钟芯片DS1302概述•DS1302是美国DALLAS公司推出的一款实时时钟芯片。其采用3线串行接口,芯片内部集成了可编程日历时钟和31个字节的静态RAM。DS1302的日历时钟可自动进行闰年补偿。DS1302芯片自身还具有对备份电池进行涓流充电功能,可有效长备份电池的使用寿命。•实时时钟芯片DS1302以其计时准确、接口简单、使用方便、工作电压范围宽和低功耗等优点,得到了广泛的应用。30.1.1实时时钟芯片DS1302概述•实时时钟芯片DS1302引脚排列,如图所示。其中各个引脚功能如下所述。30.1.2实时时钟芯片DS1302命令字节•实时时钟芯片DS1302为从器件,由外部微处理器来控制数据传输。每次传送时由8051向DS1302写入一个命令字节开始,后面是数据字节。30.1.3实时时钟芯片DS1302数据格式•实时时钟芯片DS1302数据格式分为RAM和时钟两种操作,下面分别进行介绍。30.1.4实时时钟芯片DS1302数据传输方式•实时时钟芯片DS1302与外部微处理器之间通过IO引脚和SCLK引脚传送同步串行数据。其中,SCLK为串行通信时的位同步时钟,一个SCLK脉冲传送一位数据。DS1302在每次数据传送时以字节为单位,先发送低位,再发送高位,因此传送一个字节需要8个SCLK脉冲。•DS1302的数据传输可采用单字节或多字节突发方式进行。下面分别进行介绍。30.2单片机读写实时时钟芯片实例•实时时钟芯片DS1302采用串行接口,只需3根引脚便可以完成操作,其使用非常方便。这里采用AT89S52单片机作为外部微处理器,来对DS1302进行控制。当然也可以选择其它兼容的8051单片机。30.2.1电路图•这里给出单片机AT89S52读写实时时钟芯片DS1302的电路图,如图所示。30.2.2建立项目•这里采用KeilC51语言编写AT89S52上的程序,来实现对DS1302的控制。首先在KeilμVison3集成开发环境中建立项目,具体操作步骤如下:30.2.3主程序•本例的程序功能是首先初始化DS1302,然后通过输入不同的字符来分别执行初始化、时钟操作和RAM操作。分别介绍如下:•输入字符c或者C,进入时钟操作。此时可以选择显示时间(输入字符d或者D)或者写时钟(输入字符w或者W);•输入字符i或者I,进入初始化操作。此时可以详细设置时间和日期等;•输入字符r或者R,进入RAM操作。此时可以选择单字节写RAM(输入字符b或者B)、多字节写RAM(输入字符w或者W)或者多字节读RAM(输入字符r或者R)。30.2.4复位函数•复位函数ResetDS1302()实现对实时时钟芯片DS1302的硬件复位操作。程序中使用RSTB引脚来进行复位操作,其程序代码示例如下:•voidResetDS1302()•{•SCLK=0;•RSTB=0;•RSTB=1;•}30.2.5字节读取函数•字节读取函数ReadByteDS1302()用于读取DS1302的内部数据。该函数中,在SCLK引脚时钟下,通过IO引脚逐位读取8位的字节数据,并通过return语句返回。30.2.6字节写入函数•字节写入函数WriteByteDS1302用于向DS1302写入寄存器地址或者数据。该函数中,在SCLK引脚时钟下,通过IO引脚逐位写入8位的字节数据。其程序代码示例如下:•voidWriteByteDS1302(ucharW_Byte)•{•uchari;•for(i=0;i8;++i)//循环逐位写入•{•I_O=0;•if(W_Byte&0x01)I_O=1;•SCLK=0;//时钟操作•SCLK=1;•W_Byte=1;//移位•}•}30.2.7初始化函数•初始化函数InitDS1302()用于对DS1302的时钟寄存器进行初始化操作。该函数中,分别输入需要设置的年、月、星期、日、小时、分钟和秒的数值,然后调用ResetDS1302()函数复位DS1302,并允许涓流充电,最后以多字节突发方式写入时钟数据。30.2.8时钟字节写入函数•时钟字节写入函数WriteClkByte()用于对时钟寄存器执行写操作。该函数中,首先获取时钟寄存器地址以及时钟数据,然后分别调用WriteByteDS1302()函数来执行写寄存器地址和写数据操作。30.2.9RAM字节写入函数•RAM字节写入函数WriteRamByte()用于对DS1302的片内RAM执行写操作。该函数中,首先获取RAM地址以及时钟RAM数据,然后分别调用WriteByteDS1302()函数来执行写寄存器地址和写数据操作。30.2.10时钟寄存器内容显示函数•时钟寄存器内容显示函数Display(ucharloop)用于读取并显示DS1302内部时钟寄存器中的数据。该函数中,首先复位DS1302,然后采用多字节突发方式读取时钟寄存器中的数据,然后每秒显示一次结果。30.2.11多字节突发方式读取RAM函数•多字节突发方式读取RAM函数BurstReadRAM()用于读取DS1302内部RAM的数据。该函数中,首先以多字节突发方式来读取DS1302的片内RAM,并将数据保存在数组中,接着将各个数据输出显示。30.2.12多字节突发方式写入RAM函数•多字节突发方式写入RAM函数BurstWriteRAM()用于对DS1302的片内RAM执行写操作。该函数中,首先获取RAM数据,然后采用多字节突发方式来写入RAM数据。30.3小结•本章详细介绍了实时时钟芯片DS1302的命令字节和数据格式,并介绍了两种数据传输方式:单字节传输方式和多字节突发传输方式。本章通过一个具体的实例,讲解了如何使用8051单片机来实现对DS1302的控制,在该实例中分别采用了单字节传输方式和多字节传输方式来对DS1302的时钟寄存器以及RAM进行操作。实时时钟常用于需要时间设定和显示的场合,在单片机应用系统中很常见,熟练掌握本章可以轻松实现单片机的时钟显示扩展。