实时时钟DS1302的原理与应用.ppt
在许多的单片机系统中,通常进行一些与时在许多的单片机系统中,通常进行一些与时间有关的控制,这就需要使用实时时钟。例如在间有关的控制,这就需要使用实时时钟。例如在测量控制系统中,特别是长时间无人值守的测控测量控制系统中,特别是长时间无人值守的测控系统中,经常需要记录某些具有特殊意义的数据系统中,经常需要记录某些具有特殊意义的数据及其出现的时间。在系统中采用实时时钟芯片能及其出现的时间。在系统中采用实时时钟芯片能很好的解决这个问题。很好的解决这个问题。4.3 实时时钟实时时钟DS1302的原理与应用的原理与应用 实时时钟实时时钟(RTC)(RTC)是一个由晶体控制精度的是一个由晶体控制精度的,向向主系统提供主系统提供BCDBCD码表示的时间和日期的器件。主码表示的时间和日期的器件。主系统与系统与RTCRTC间的通信可通过并行口也可通过串行间的通信可通过并行口也可通过串行口,并行器件速度快但需较大的底口,并行器件速度快但需较大的底 板空间和较板空间和较昂贵,串行器件体积较小且价格也相对便宜。读昂贵,串行器件体积较小且价格也相对便宜。读者在学完本节后,应能完成相关的电路设计,并者在学完本节后,应能完成相关的电路设计,并掌握如下知识点:掌握如下知识点:(1)(1)掌握时钟芯片掌握时钟芯片DS1302DS1302的原理、特性及选择;的原理、特性及选择;(2)51(2)51单片机和时钟芯片单片机和时钟芯片DS1302DS1302的接口电路设计;的接口电路设计;(3)(3)掌握时钟芯片掌握时钟芯片DS1302DS1302的的C51C51程序设计。程序设计。4.3.1 DS1302简介简介 DS1302 DS1302 是美国是美国DALLASDALLAS公司推出的一种高性公司推出的一种高性能、低功耗、带能、低功耗、带RAMRAM的实时时钟电路,它可以对的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为闰年补偿功能,工作电压为2.5V2.5V5.5V5.5V。采用三。采用三线接口与线接口与CPUCPU进行同步通信,并可采用突发方式进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或一次传送多个字节的时钟信号或RAMRAM数据。数据。DS1302DS1302内部有一个内部有一个31318 8的用于临时性存放的用于临时性存放数据的数据的RAMRAM寄存器。寄存器。DS1302DS1302是是DS1202DS1202的升级产品,的升级产品,与与DS1202DS1202兼容,但增加了主电源兼容,但增加了主电源/后背电源双电后背电源双电源引脚,同时提供了对后背电源进行涓细电流充源引脚,同时提供了对后背电源进行涓细电流充电的能力。电的能力。图图4-3-1 DS1302的实物图及的实物图及引脚排列引脚排列 图图4-3-14-3-1示出示出DS1302DS1302的实物图及引脚排列的实物图及引脚排列,其其中中Vcc1Vcc1为后备电源,为后备电源,VCC2VCC2为主电源。在主电源关为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。闭的情况下,也能保持时钟的连续运行。DS1302DS1302由由Vcc1Vcc1或或Vcc2Vcc2两者中的较大者供电。当两者中的较大者供电。当Vcc2Vcc2大于大于Vcc1Vcc10.2V0.2V时,时,Vcc2Vcc2给给DS1302DS1302供电。当供电。当Vcc2Vcc2小于小于Vcc1Vcc1时,时,DS1302DS1302由由Vcc1Vcc1供电。供电。X1X1和和X2X2是振荡源,是振荡源,外接外接32.768kHz32.768kHz晶振。晶振。RSTRST是复位是复位/片选线,通过片选线,通过把把RSTRST输入驱动置高电平来启动所有的数据传送。输入驱动置高电平来启动所有的数据传送。RSTRST输入有两种功能:首先,输入有两种功能:首先,RSTRST接通控制逻接通控制逻辑,允许地址辑,允许地址/命令序列送入移位寄存器命令序列送入移位寄存器,其其次,次,RSTRST提供终止单字节或多字节数据的传送手段。提供终止单字节或多字节数据的传送手段。当当RSTRST为高电平时,所有的数据传送被初始化,为高电平时,所有的数据传送被初始化,允许对允许对DS1302DS1302进行操作。如果在传送过程中进行操作。如果在传送过程中RSTRST置为低电平,则会终止此次数据传送,置为低电平,则会终止此次数据传送,I/OI/O引脚引脚变为高阻态。上电运行时,在变为高阻态。上电运行时,在Vcc2.5VVcc2.5V之前,之前,RSTRST必须保持低电平。只有在必须保持低电平。只有在SCLKSCLK为低电平时,为低电平时,才能将才能将RSTRST置为高电平。置为高电平。I/OI/O为串行数据输入输出为串行数据输入输出端端(双向双向),SCLKSCLK始终是输入端。始终是输入端。4.3.2 DS13024.3.2 DS1302的寄存器和控制命令的寄存器和控制命令 对对DS1302DS1302的操作就是对其内部寄存器的操作,的操作就是对其内部寄存器的操作,DS1302DS1302内部共有内部共有1212个寄存器,其中有个寄存器,其中有7 7个寄存器个寄存器与日历和时钟有关,存放的数据位为与日历和时钟有关,存放的数据位为BCDBCD码形式。码形式。此外,此外,DS1302DS1302还有年份寄存器、控制寄存器、充还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与电寄存器、时钟突发寄存器及与RAMRAM相关的寄存相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电器等。时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器,日历、时钟寄存器及其控寄存器以外的寄存器,日历、时钟寄存器及其控制字如下表制字如下表4-3-14-3-1所示,所示,DS1302DS1302内部主要寄存器内部主要寄存器功能如下表功能如下表4-3-24-3-2所示。所示。表表4-3-1 日历、时钟寄存器及其控制字对照表日历、时钟寄存器及其控制字对照表寄存器名称寄存器名称765432101RAM/CKA4A3A2A1A0RD/W秒寄存器秒寄存器10000001/01/0分寄存器分寄存器10000011/01/0时寄存器时寄存器10000101/01/0日寄存器日寄存器10000111/01/0月寄存器月寄存器10001001/01/0周寄存器周寄存器10001011/01/0年寄存器年寄存器10001101/01/0写保护寄存器写保护寄存器10001111/01/0慢充电寄存器慢充电寄存器10010001/01/0时钟突发秒寄存器时钟突发秒寄存器10111111/01/0表表4-3-2 DS1302内部主要寄存器功能表内部主要寄存器功能表名称名称命令字命令字取值范围取值范围各位内容各位内容写写读读76543210秒寄秒寄存器存器80H81H00-59CHCH10SEC10SECSECSEC分寄分寄存器存器82H83H00-590 010MIN10MINMINMIN时寄时寄存器存器84H85H1-12或或0-2312/2412/240 0A/PA/PH HR RHRHR日寄日寄存器存器86H87H1-28,29,30,310 00 010DATE10DATEDATEDATE月寄月寄存器存器88H89H1-120 00 00 01 10 0M MMONTHMONTH周寄周寄存器存器8AH8BH1-70 00 00 00 00 0DAYDAY年寄年寄存器存器8CH8DH0-9910YEAR10YEARYEARYEAR 其中其中CHCH:时钟停止位;为:时钟停止位;为0 0时振荡器工作;为时振荡器工作;为1 1时时振荡器停止;振荡器停止;AP=1AP=1时为下午模式,为时为下午模式,为0 0时上午模时上午模式;式;DS1302DS1302的控制字节说明如下:的控制字节说明如下:1 1DS1302DS1302的控制字节的最高有效位的控制字节的最高有效位(位位7)7)必须是必须是逻辑逻辑1 1,如果它为,如果它为0 0,则不能把数据写入到,则不能把数据写入到DS1302DS1302中:位中:位6 6如果为如果为0 0,则表示存取日历时钟数据,为,则表示存取日历时钟数据,为1 1表示存取表示存取RAMRAM数据;位数据;位5 5至位至位1 1指示操作单元的地指示操作单元的地址:最低有效位址:最低有效位(位位0)0)如为如为0 0表示要进行写操作,表示要进行写操作,为为1 1表示进行读操作,控制字节总是从最低位开表示进行读操作,控制字节总是从最低位开始输出。始输出。2 2在控制指令字输入后的下一个在控制指令字输入后的下一个SCLKSCLK时钟的上升沿时钟的上升沿时数据被写入时数据被写入DS1302DS1302,数据输入从低位即位,数据输入从低位即位0 0开开始。同样,在紧跟始。同样,在紧跟8 8位的控制指令字后的下一个位的控制指令字后的下一个SCLKSCLK脉冲的下降沿读出脉冲的下降沿读出DS1302DS1302的数据,读出数据的数据,读出数据时从低位时从低位0 0位至高位位至高位7 7。4.3.3 DS1302的读写时序的读写时序 不仅要向寄存器写入控制字。还需要读取相不仅要向寄存器写入控制字。还需要读取相应寄存器的数据。应寄存器的数据。4.3.3 DS13024.3.3 DS1302的读写时序要想的读写时序要想与与DS1302DS1302通信,首先要先了解通信,首先要先了解DS1302DS1302的控制字。的控制字。DS1302DS1302的控制字见的控制字见6.5.46.5.4节内容。控制字的最高节内容。控制字的最高有效位有效位(位位7)7)必须是逻辑必须是逻辑1 1,如果它为,如果它为0 0。则不能。则不能把数据写入到把数据写入到DS1302DS1302中。位中。位6 6:如果为:如果为0 0,则表示,则表示存取日历时钟数据,为存取日历时钟数据,为1 1表示存取表示存取RAMRAM数据;位数据;位5 5至位至位1(A41(A4A0)A0):指示操作单元的地址;位:指示操作单元的地址;位0(0(最最低有效位低有效位):如为:如为0 0。表示要进行写操作,为表示要进行写操作,为1 1表示进行读操作。表示进行读操作。控制字总是从最低位开始输出。在控制字指令输控制字总是从最低位开始输出。在控制字指令输入后的下一个入后的下一个SCLKSCLK时钟的上升沿时,数据被写入时钟的上升沿时,数据被写入DS1302DS1302,数据输入从最低位,数据输入从最低位(0(0位位)开始。同样,开始。同样,在紧跟在紧跟8 8位的控制字指令后的下一个位的控制字指令后的下一个SCLKSCLK脉冲的脉冲的下降沿,读出下降沿,读出DS1302DS1302的数据。读出的数据也是从的数据。读出的数据也是从最低位到最高位。数据读写时序如下图最低位到最高位。数据读写时序如下图4-3-34-3-3所所示。具体操作见驱动程序。示。具体操作见驱动程序。图图43-3-3 DS1302数据读写时序图数据读写时序图4.3.4 DS1302应用应用 利用利用DS1302时钟芯片可以设计一个比较完时钟芯片可以设计一个比较完整的电子日历,本案例可以利用六个数码管显示整的电子日历,本案例可以利用六个数码管显示从从DS1302读取的当前时间,时间显示的格式:读取的当前时间,时间显示的格式:“时分秒时分秒”。一、电路原理一、电路原理电路采用电路采用6为数码管显示,电子表电路连接一样,为数码管显示,电子表电路连接一样,这里不再画出。这里不再画出。DS1302的的SCL接接P11,IO端端口接口接P12,复位端接,复位端接P13,DS1302的的X1和和X2接接32768赫兹的标准时钟晶振。赫兹的标准时钟晶振。DS1302和和单片机连接示意图如下图单片机连接示意图如下图4-3-4所示所示图图4-3-4 DS1302和单片机连接示意图和单片机连接示意图 二、程序清二、程序清单单 此程序的此程序的结结构和上述构和上述单闹钟单闹钟程序程序结结构一构一样样,对对功能功能进进行了加行了加强强和和扩扩展,部分程序展,部分程序进进行了行了优优化。其中,化。其中,DS1302驱动驱动程序包含在程序包含在主程序中。主程序中。/*/读读取取DS1302的的时间时间,然后通,然后通过过数数码码管管显显示示/*/#include#define uchar unsigned charuchar dot,time16,flash;unsigned int tt;code seven_tab10=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;code bit_select6=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf;o/定定义义引脚引脚连连接接osbit rtc_clk=P11;osbit rtc_data=P12;osbit rtc_rst=P13;osbit a0=ACC0;osbit a7=ACC7;ovoid write_rtc(uchar date)/写一字写一字节节oouchar i;oACC=date;ofor(i=8;i0;i-)oortc_data=a0;ortc_clk=1;ortc_clk=0;oACC=ACC1;oo ouchar read_rtc()/读读一字一字节节oouchar i;ofor(i=8;i0;i-)ooACC=ACC1;oa7=rtc_data;ortc_clk=1;ortc_clk=0;ooreturn(ACC);o o/写写1302数据数据ovoid write1302(uchar address,uchar date)oortc_rst=0;ortc_clk=0;ortc_rst=1;owrite_rtc(address);owrite_rtc(date);ortc_clk=1;ortc_rst=0;o ouchar read1302(uchar address)/读读1302数据数据oouchar temp;ortc_rst=0;ortc_clk=0;ortc_rst=1;owrite_rtc(address);otemp=read_rtc();ortc_clk=1;ortc_rst=0;oreturn(temp);o ovoid init1302()/1302初始化初始化oowrite1302(0 x8e,0 x00);/写操作写操作owrite1302(0 x80,0 x56);/写秒写秒owrite1302(0 x82,0 x34);/写分写分owrite1302(0 x84,0 x12);/写写时时owrite1302(0 x86,0 x10);/写月写月owrite1302(0 x88,0 x10);/写日写日owrite1302(0 x8a,0 x06);/写星期写星期owrite1302(0 x8c,0 x10);/写年写年owrite1302(0 x8e,0 x80);/写保写保护护o ovoid get_time()/获获取取1302的的时间时间数据(数据(时时、分、秒),存、分、秒),存入入time1数数组组中中oouchar d;od=read1302(0 x81);otime10=d&0 x0f;otime11=(d 4)&0 x0f;od=read1302(0 x83);otime12=d&0 x0f;otime13=(d 4)&0 x0f;od=read1302(0 x85);otime14=d&0 x0f;otime15=(d 4)&0 x0f;o ovoid time0()interrupt 1 oouchar i;oTR0=0;oTH0=(65536-2000)/256;oTL0=(65536-2000)%256;oTR0=1;ott+;oif(tt=500)oott=0;odot=!dot;oflash=0 x7f|(dot 7);oP0=0 xff;oP2=bit_selecti;oif(i=2)oP0=seven_tabtime1i&flash;oelseoP0=seven_tabtime1i;oi+;oif(i=6)i=0;o ovoid init_timer0()/Timer0初始化初始化ooTMOD=0 x01;oTH0=(65536-2000)/256;oTL0=(65536-2000)%256;oTR0=1;oET0=1;oEA =1;oovoid main()ooinit_timer0();oinit1302();owhile(1)ooget_time();oo4.3.5指针指针指针(指针(pointer)实际上就是存储器的地址,)实际上就是存储器的地址,因为我们可以把它想像成一个指向存储器的箭头,因为我们可以把它想像成一个指向存储器的箭头,所以称为指针。而指针变量就是储存存储器地址所以称为指针。而指针变量就是储存存储器地址的变量。内存单元的指针和内存单元的内容是两的变量。内存单元的指针和内存单元的内容是两个不同的概念。使用指针变量时也必须预先声明。个不同的概念。使用指针变量时也必须预先声明。对于一个内存单元来说,它的地址即为指针,对于一个内存单元来说,它的地址即为指针,其中存放的数据是该单元的内容。在其中存放的数据是该单元的内容。在c语言中,语言中,允许用一个变量来存放指针,这种变量称为指针允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单变量。因此,一个指针变量的值就是某个内存单元的地址,或称为某内存单元的指针。元的地址,或称为某内存单元的指针。指针变量也是一个变量,它和普通变量一样指针变量也是一个变量,它和普通变量一样占用一定的存储空间。但与普通变量不同之处在占用一定的存储空间。但与普通变量不同之处在于,指针变量的存储空间存放的不是普通的数据,于,指针变量的存储空间存放的不是普通的数据,而是另一个变量的地址。因此,指针变量是一个而是另一个变量的地址。因此,指针变量是一个地址变量。声明指针变量的格式为地址变量。声明指针变量的格式为数据类型数据类型 *指针变量名;指针变量名;在指针定义中,在指针定义中,“指针变量指针变量”前的前的“*”仅是一仅是一个符号,并不是指针运算符;个符号,并不是指针运算符;“基类型基类型”表示该项表示该项指针变量所指向变量的数据类型,并非指针变量指针变量所指向变量的数据类型,并非指针变量自身的数据类型,因为所有指针变量都是地址,自身的数据类型,因为所有指针变量都是地址,所以所有指针变量的类型相同,只是所指向的变所以所有指针变量的类型相同,只是所指向的变量的数据类型不同。量的数据类型不同。例如:例如:char*p;p是一个指针变量,其值是一个指针变量,其值是个整型变量的地址,或者说是个整型变量的地址,或者说p指向一个整型变指向一个整型变量。至于量。至于p究竟指向哪一个整型变量,应由向究竟指向哪一个整型变量,应由向p赋赋予的地址来决定。指针也可以指向用户自定义的予的地址来决定。指针也可以指向用户自定义的数据类型变量,如:数据类型变量,如:otypedef struct oochar year;o char moth;o char day;odate;odate*dispaly_date;一、一、指针与数组指针与数组 数组的名字后面没有加上任何索引值时,就是数组的名字后面没有加上任何索引值时,就是指向数组开始位置的地址值,所以数组的名字也是指向数组开始位置的地址值,所以数组的名字也是指针。例如:指针。例如:char filename80;char*p;p=filename;反之,指针也可以当成数组来使用,如下例所示。反之,指针也可以当成数组来使用,如下例所示。例如:例如:int x5=1,2,3,4,5;int*p,sum,i;p=x;/指指针针p存放数存放数组组x的开始地址的开始地址for(i=0;i5;i+)sum=sum+pi;二、二、指针的运算指针的运算(1)指针变量前面上)指针变量前面上*号就是取得指针所指向位号就是取得指针所指向位置的内容。例如:置的内容。例如:int x5=1,2,3,4,5;int*p;p=x;*p=10;(2)变量前面加上)变量前面加上&符号,可以取得一个变量符号,可以取得一个变量的位置。例如:的位置。例如:int x,y;int*p;p=&x;*p=1;(3)&符号也可以加在数组元数的前面。例如:符号也可以加在数组元数的前面。例如:int x5;int*p;p=&x2;*p=50;/相当于设置相当于设置x2等于等于50