您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 第三节-实时时钟DS1302的原理与应用
在许多的单片机系统中,通常进行一些与时间有关的控制,这就需要使用实时时钟。例如在测量控制系统中,特别是长时间无人值守的测控系统中,经常需要记录某些具有特殊意义的数据及其出现的时间。在系统中采用实时时钟芯片能很好的解决这个问题。4.3实时时钟DS1302的原理与应用实时时钟(RTC)是一个由晶体控制精度的,向主系统提供BCD码表示的时间和日期的器件。主系统与RTC间的通信可通过并行口也可通过串行口,并行器件速度快但需较大的底板空间和较昂贵,串行器件体积较小且价格也相对便宜。读者在学完本节后,应能完成相关的电路设计,并掌握如下知识点:(1)掌握时钟芯片DS1302的原理、特性及选择;(2)51单片机和时钟芯片DS1302的接口电路设计;(3)掌握时钟芯片DS1302的C51程序设计。4.3.1DS1302简介DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。VCC1VCC2RETSCLKI/OX1X2DS13023281576GND4图4-3-1DS1302的实物图及引脚排列图4-3-1示出DS1302的实物图及引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器,其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),SCLK始终是输入端。4.3.2DS1302的寄存器和控制命令对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历和时钟有关,存放的数据位为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器,日历、时钟寄存器及其控制字如下表4-3-1所示,DS1302内部主要寄存器功能如下表4-3-2所示。表4-3-1日历、时钟寄存器及其控制字对照表寄存器名称765432101RAM/CKA4A3A2A1A0RD/W秒寄存器10000001/0分寄存器10000011/0时寄存器10000101/0日寄存器10000111/0月寄存器10001001/0周寄存器10001011/0年寄存器10001101/0写保护寄存器10001111/0慢充电寄存器10010001/0时钟突发秒寄存器10111111/0表4-3-2DS1302内部主要寄存器功能表名称命令字取值范围各位内容写读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。4.3.3DS1302的读写时序不仅要向寄存器写入控制字。还需要读取相应寄存器的数据。4.3.3DS1302的读写时序要想与DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字见6.5.4节内容。控制字的最高有效位(位7)必须是逻辑1,如果它为0。则不能把数据写入到DS1302中。位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1(A4~A0):指示操作单元的地址;位0(最低有效位):如为0。表示要进行写操作,为1表示进行读操作。控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据。读出的数据也是从最低位到最高位。数据读写时序如下图4-3-3所示。具体操作见驱动程序。图43-3-3DS1302数据读写时序图4.3.4DS1302应用利用DS1302时钟芯片可以设计一个比较完整的电子日历,本案例可以利用六个数码管显示从DS1302读取的当前时间,时间显示的格式:“时分秒”。一、电路原理电路采用6为数码管显示,电子表电路连接一样,这里不再画出。DS1302的SCL接P11,IO端口接P12,复位端接P13,DS1302的X1和X2接32768赫兹的标准时钟晶振。DS1302和单片机连接示意图如下图4-3-4所示图4-3-4DS1302和单片机连接示意图VCC1VCC2RETSCLKI/OX1X2P1.3P1.1P1.2+VCC32768HzDS1302P1.0P1.1P1.2P1.3P1.4P1.5P1.62345678P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8RESETXTAL2XTAL1EAALEPSEN39383736353433323130292827262524232221P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD1011121314151617P1.7119189C130PC230PCY12MHzR11KC310μICSTC89C51VCCP1.1P1.2P1.33281576二、程序清单此程序的结构和上述单闹钟程序结构一样,对功能进行了加强和扩展,部分程序进行了优化。其中,DS1302驱动程序包含在主程序中。/******************************************************///读取DS1302的时间,然后通过数码管显示/******************************************************/#includereg51.h#defineucharunsignedcharuchardot,time1[6],flash;unsignedinttt;codeseven_tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};codebit_select[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//定义引脚连接sbitrtc_clk=P1^1;sbitrtc_data=P1^2;sbitrtc_rst=P1^3;sbita0=ACC^0;sbita7=ACC^7;voidwrite_rtc(uchardate)//写一字节{uchari;ACC=date;for(i=8;i0;i--){rtc_data=a0;rtc_clk=1;rtc_clk=0;ACC=ACC1;}}ucharread_rtc()//读一字节{uchari;for(i=8;i0;i--){ACC=ACC1;a7=rtc_data;rtc_clk=1;rtc_clk=0;}return(ACC);}//写1302数据voidwrite1302(ucharaddress,uchardate){rtc_rst=0;rtc_clk=0;rtc_rst=1;write_rtc(address);write_rtc(date);rtc_clk=1;rtc_rst=0;}ucharread1302(ucharaddress)//读1302数据{uchartemp;rtc_rst=0;rtc_clk=0;rtc_rst=1;write_rtc(address);temp=read_rtc();rtc_clk=1;rtc_rst=0;return(temp);}voidinit1302()//1302初始化{write1302(0x8e,0x00);//写操作write1302(0x80,0x56);//写秒write1302(0x82,0x34);//写分write1302(0x84,0x12);//写时write1302(0x86,0x10);//写月write1302(0x88,0x10);//写日write1302(0x8a,0x06);//写星期write1302(0x8c,0x10);//写年write1302(0x8e,0x80);//写保护}voidget_time()//获取1302的时间数据(时、分、秒),存入time1数组中{uchard;d=read1302(0x81);time1[0]=d&0x0f;time1[1]=(d4)&0x0f;d=read1302(0x83);time1[2]=d&0x0f;time1[3]=(d4)&0x0f;d=read1302(0x85);time1[4]=d&0x0f;time1[5]=(d4)&0x0f;}voidtime0()interrupt1{uchari;TR0=0;TH0=(65536-2000)/256;TL0=(65536-2000)%256;TR0=1;tt++;if(tt==500){tt=0;dot=!dot;flash=0x7f|(dot7);}P0=0xff;P2=bit_select[i];if(i==2)P0=seven_tab[time1[i]]&flash;elseP0=seven_tab[time1[i]];i++;if(i==6)i=0;}voidinit_timer0()//Timer0初始化{TMOD=0x01;TH0=(65536-2000)/256;TL0=(65536-2000)%256;TR0=1;ET0
本文标题:第三节-实时时钟DS1302的原理与应用
链接地址:https://www.777doc.com/doc-2756906 .html