IO口实时时钟芯片DS1302的应用实例

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

项目6实时时钟芯片DS1302的应用实例6.1项目任务在许多的单片机系统中,通常进行一些与时间有关的控制,这就需要使用实时时钟。例如在测量控制系统中,特别是长时间无人值守的测控系统中,经常需要记录某些具有特殊意义的数据及其出现的时间。在系统中采用实时时钟芯片能很好的解决这个问题。实时时钟(RTC)是一个由晶体控制精度的,向主系统提BCD码表示的时间和日期的器件。主系统与RTC间的通信可通过并行口也可通过串行口,并行器件速度快但需较大的底板空间和较昂贵,串行器件体积较小且价格也相对便宜。希望读者在学完本节后,能完成相关的电路设计,并掌握如下知识点:◆掌握时钟芯片DS1302的原理、特性及选择;◆51单片机和时钟芯片DS1302的接口电路设计;◆掌握时钟芯片DS1302的C51程序设计。6.2DS1302的结构及工作原理DS1302是美国DALLAS公司推出的一种高性能、低功耗‘带RAM的实时时钟电路,它可以对年、月、日、周、日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。下图14-1示出DS1302的实物图及引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡6.3DS1302的引脚功能及内部结构DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),SCLK始终是输入端。图6-1DS1302的实物图及引脚排列其内部结构如下图6-2所示图6-2DS1302内部结构图6.4DS1302的寄存器和控制命令日历、时钟寄存器及其控制字对照表寄存器名称765432101RAM/CKA4A3A2A1A0RD/W秒寄存器10000001/0分寄存器10000011/0时寄存器10000101/0日寄存器10000111/0月寄存器10001001/0周寄存器10001011/0年寄存器10001101/0写保护寄存器10001111/0慢充电寄存器10010001/0时钟突发秒寄存器10111111/0DS1302内部主要寄存器功能如下表所示DS1302内部主要寄存器功能表名称命令字取值范围各位内容读写76543210秒寄存器80H81H00-59CH10SECSEC分寄存器82H83H00-59010MINMIN时寄存器84H85H1-12或0-2312/240A/PHRHR日寄存器86H87H1-28,29,30,310010DATEDATE月寄存器88H89H1-1200010MMONTH周寄存器8AH8BH1-700000DAY年寄存器8CH8DH0-9910YEARYEAR其中CH:时钟停止位;为0时振荡器工作;为1时振荡器停止;AP=1时为下午模式,为0时上午模式DS1302的控制字节说明1)DS1302的控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中:位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址:最低有效位(位0)为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。2)在控制指令字输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位至高位7。6.5DS1302的读写时序不仅要向寄存器写入控制字。还需要读取相应寄存器的数据。要想与DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字见5.4节内容。控制字的最高有效位(位7)必须是逻辑1,如果它为0。则不能把数据写入到DS1302中。位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1(A4~A0):指示操作单元的地址;位0(最低有效位):如为0。表示要进行写操作,为1表示进行读操作。控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据。读出的数据也是从最低位到最高位。数据读写时序如下图14-3所示。具体操作见驱动程序。图6-3DS1302数据读写时序图6.6DS1302的程序设计1)DS1302和单片机连接示意图如下图6-4DS1302和单片机连接示意图2)DS1302应用程序设计流程图如下所示:图6-5DS1302应用程序设计流程图3)应用程序清单如下:程序用按键设置秒、分、时,用液晶LCD1602显示设置的时间。/*************************************************程序描述:以下程序为DS1302的头函数文件,在建立项目的时候该部分要保存为DS1302.H。该头文件中有对DS1302基本的单字节读写函数,取时间函数,设置时间函数,在主函数中要调用这些函数。************************************************/#defineucharunsignedchar//宏定义sbitT_CLK=P1^0;//设置实时时钟时钟线引脚//sbitT_IO=P1^1;//设置实时时钟数据线引脚//sbitT_RST=P1^2;//设置实时时钟复位线引脚//sbitACC0=ACC^0;//定义ACC的位,利用ACC操作速度最快sbitACC7=ACC^7;uchartime1[6];charcounter[3];ucharsec,min,hou,day,mon,yea;voidInit1302(void);voidv_W1302(ucharucAddr,ucharucDa);ucharuc_R1302(ucharucAddr);voidget_time(void);voidset_time(void);/*********往DS1302写入1Byte数据**************/voidv_WTInputByte(ucharucDa){uchari;ACC=ucDa;for(i=8;i0;i--){T_IO=ACC0;//*相当于汇编中的RRCT_CLK=1;T_CLK=0;ACC=ACC1;}}/**********从DS1302读取1Byte数据********************/ucharuc_RTOutputByte(void){uchari;for(i=8;i0;i--){ACC=ACC1;//*相当于汇编中的RRCACC7=T_IO;T_CLK=1;T_CLK=0;}return(ACC);}/***往DS1302写入数据,先写地址,后写命令/数据*******/voidv_W1302(ucharucAddr,ucharucDa){T_RST=0;T_CLK=0;T_RST=1;v_WTInputByte(ucAddr);/*地址,命令*/v_WTInputByte(ucDa);/*写1Byte数据*/T_CLK=1;T_RST=0;}/*****读取DS1302某地址的数据,先写地址,后读命令/数据*********/ucharuc_R1302(ucharucAddr){ucharucDa;T_RST=0;T_CLK=0;T_RST=1;v_WTInputByte(ucAddr);/*地址,命令*/ucDa=uc_RTOutputByte();/*读1Byte数据*/T_CLK=1;T_RST=0;return(ucDa);}/***************初始化DS1302*******************/voidInit1302(void){v_W1302(0x8e,0x00);//控制写入WP=0v_W1302(0x90,0xa5);v_W1302(0x80,0x00);//秒v_W1302(0x82,0x59);//分v_W1302(0x84,0x10);//时v_W1302(0x86,0x01);//日v_W1302(0x88,0x08);//月v_W1302(0x8a,0x03);//星期v_W1302(0x8c,0x07);//年v_W1302(0x8e,0x80);}/*******取出时间并处理,以便送数码管显示*********/voidget_time(void){uchard;d=uc_R1302(0x81);counter[0]=d/16*10+d%16;//十六进制转换为BCD码time1[0]=d&0x0f;time1[1]=(d4)&0x0f;d=uc_R1302(0x83);counter[1]=d/16*10+d%16;//十六进制转换为BCD码time1[2]=d&0x0f;time1[3]=(d4)&0x0f;d=uc_R1302(0x85);counter[2]=d/16*10+d%16;//十六进制转换为BCD码time1[4]=d&0x0f;time1[5]=(d4)&0x0f;}voidset_time(void){v_W1302(0x8e,0x00);v_W1302(0x80,0x80);v_W1302(0x82,min);v_W1302(0x84,hou);v_W1302(0x86,day);v_W1302(0x88,mon);v_W1302(0x8c,yea);v_W1302(0x80,0x00);v_W1302(0x8e,0x80);}以上函数为DS1302.H文件,在主函数中要调用该函数/**************************************************************************程序描述:该程序能通过和单片机连接的按键调整并设置DS1302的时间,并能将从DS1302中读出的时间在六个七段数码管上显示,P0口驱动数码管的各段,P2口低六位连接到六个数码管的公共端,数码管为共阳。**************************************************************************/#includereg51.h#includeintrins.h#includeDS1302.h#defineucharunsignedchar#defineuintunsignedintcodeseven_tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};codebit_select[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};uintget_time_flag;uchardot,flash,a,b,c,d;ucharyear,month,day,hour,

1 / 38
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功