DS1302的驱动程序(9页).doc
-DS1302的驱动一、芯片介绍DALLAS公司推出的专用时钟芯片DS1302内含有一个实时时钟/日历和31 字节静态RAM ,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒分时日星期月年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信,DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mW,采用普通32.768kHz晶振。DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:RES 复位;I/O 数据线;SCLK串行时钟,其引脚图如图2-8所示。图2-8 DS1302引脚图其中VCC1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc10.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平,I/O为串行数据输入输出端,SCLK始终是输入端。1) DS1302的控制字节 DS1302 的控制字如图2-9所示。1RAMA4A3A2A1A0W/CK/R图2-9 DS1302 的控制字节控制字节的最高有效位必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。2) DS1302的数据输入输出 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。3) DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字如表2-12所示。表2-12 日历、时间寄存器及其控制字寄存器名称命令字取值范围各位内容写操作读操作76543210秒寄存器80H81H059CH秒十位秒个位分寄存器82H83H0590分十位分个位时寄存器84H85H023或012T010时时个位AP日寄存器86H87H028,29,30,3100日十位日个位月寄存器88H89H112000月月个位周寄存器8AH8BH1700000星期年寄存器8CH8DH099年十位年个位其中CH为时钟停止位,CH=0振荡器工作允许;CH=1振荡器工作停止。T为12小时制与24小时制选择位,T=0为24小时制;T=1为12小时制。AP为12小时制的上下午指示位,AP=0为上午;AP=1为下午。此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0HFDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。二、驱动程序分析接口定义:sbit IO=P34;/定义P3.4为DS1302的数据输出输入口;sbit RST=P31;/定义P3.1为DS1302的复位信号输入口;sbit CLK=P35; /定义P3.5为DS1302的串行时钟信号输入口。1) DS1302寄存器写操作SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。在对寄存器写操作是应先指明寄存器的地址。各寄存器的地址详见表2-12。DS1302写操作驱动函数代码如下:void WriteByte_1302(uchar d)uchar i;RST=1;/启动写操作for(i=0;i<8;i+)if(d&0x01) /送出写数据IO=1;else IO=0;CLK=0;delay_us(10);CLK=1;/上升沿,写入数据delay_us(10);d>>=1;寄存器写操作驱动函数代码如下:void D_W1302(uchar add,uchar Data)RST=0;CLK=0;delay_us(10);RST=1;WriteByte_1302(add);/指明寄存器地址WriteByte_1302(Data);/写寄存器CLK=1;RST=0;2) DS1302寄存器读操作 SCLK时钟的下降沿时,数据被读出DS1302,数据输入从低位即位0开始。在对寄存器读操作时应先指明寄存器的地址。各寄存器的地址详见表2-12。DS1302读操作驱动函数:uchar ReadByte_1302()uchar i;uchar rdata=0x00;IO=1;RST=1;for(i=0;i<8;i+)CLK=1;delay_us(10);CLK=0;delay_us(10);rdata>>=1;if(IO) rdata|=0x80;return(rdata);寄存器读操作驱动函数代码如下:uchar D_R1302(uchar add)uchar Data;RST=0;CLK=0;delay_us(1);RST=1;WriteByte_1302(add);Data=ReadByte_1302();CLK=1;RST=0;return(Data);2) DS1302读取时间和设置时间功能模块从DS1302读取时间是通过void gettime_1302(uchar times12)实现的。入口参数uchar times12用来存储从DS1302读取的时间和日期,从数据第0位开始分别存储秒、分、时、日、月、星期、年的个位和十位。其程序代码如下:void gettime_1302(uchar times14)uchar i,j=0;uchar time6;uchar add=0x81;for(i=0;i<7;i+,add+=2)timei=D_R1302(add);times2*i=(timei&0x0f);timei>>=4;times2*i+1=(timei&0x0f);对DS1302设置时间由void set_1302(uchar *p)来实现,入口参数uchar *p设置时间数组首地址指针。数组p7共7个元素分别对应秒、分、时、日、月、星期、年。程序代码如下:void set_1302(uchar *p)uchar i;uchar add=0x80;D_W1302(0x8e,0x00);/写控制寄存器位0x00,WP=0写允许for(i=0;i<7;i+,p+,add+=2)D_W1302(add,*p);D_W1302(0x8e,0x80);/写保护DS1302驱动程序各函数包含于头文件1302.h中,在主函数中加入宏定义#include"1302.h"。第 9 页-