《IO口实时时钟芯片DS1302的应用实例》由会员分享,可在线阅读,更多相关《IO口实时时钟芯片DS1302的应用实例(39页珍藏版)》请在金锄头文库上搜索。
1、 项目6 实时时钟芯片实时时钟芯片DS1302DS1302的应用实例的应用实例 2021/6/316.1 6.1 项目任务项目任务在许多的单片机系统中,通常进行一些与时间有关的控制,这就需要使用实时时钟。例如在测量控制系统中,特别是长时间无人值守的测控系统中,经常需要记录某些具有特殊意义的数据及其出现的时间。在系统中采用实时时钟芯片能很好的解决这个问题。2021/6/32 实时时钟(RTC)是一个由晶体控制精度的,向主系统提BCD码表示的时间和日期的器件。主系统与RTC间的通信可通过并行口也可通过串行口,并行器件速度快但需较大的底板空间和较昂贵,串行器件体积较小且价格也相对便宜。 希望读者在学
2、完本节后,能完成相关的电路设计,并 掌握如下知识点:2021/6/33掌握时钟芯片DS1302的原理、特性及选择;51单片机和时钟芯片DS1302的接口电路设计;掌握时钟芯片DS1302的C51程序设计。6.2 DS13026.2 DS1302的结构及工作原理的结构及工作原理2021/6/34 DS1302 是美国DALLAS公司推出的一种高性能、低功耗带RAM的实时时钟电路,它可以对年、月、日、周、日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临
3、时性存放数据的RAM寄存器。2021/6/35 下图14-1示出DS1302的实物图及引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc10.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡6.3 DS13026.3 DS1302的引脚功能及内部结构的引脚功能及内部结构 DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。 2021/
4、6/36源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。 当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运2021/6/37行时,在Vcc2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向), SCLK始终是输入端。 图图6-1 DS1
5、302的实物图及引脚排列的实物图及引脚排列2021/6/38其内部结构如下图其内部结构如下图6-26-2所示所示图图6-2 DS1302内部结构图内部结构图2021/6/396.4 DS13026.4 DS1302的寄存器和控制命令的寄存器和控制命令2021/6/310DS1302DS1302内部主要寄存器功能如下表所示内部主要寄存器功能如下表所示2021/6/311 其中CH:时钟停止位;为0时振荡器工作;为1时振荡器停止;AP=1时为下午模式,为0时上午模式DS1302的控制字节说明 1)DS1302的控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中:
6、位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址:最低有效位(位0)为02021/6/312表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 2)在控制指令字输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位至高位7。2021/6/3136.5 DS13026.5 DS1302的读写时序的读写时序 不仅要向寄存器写入控制字。还需要读取相应寄存器的数据。要想与DS1302通信,首先要先了解DS130
7、2的控制字。DS1302的控制字见5.4节内容。控制字的最高有效位(位7)必须是逻辑1,如果它为0。则不能把数据写入到DS1302中。位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1(A4A0):指示操作单元的地址;位0(最低有效位):如为0。表示要进行写操作,为1表示进行读操作。控制字总是从最低位开始输出。2021/6/314在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。 同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据。读出的数据也是从最低位到最高位。数据读写时序如下图14
8、-3所示。具体操作见驱动程序。2021/6/315图图6-3 DS13026-3 DS1302数据读写时序图数据读写时序图2021/6/3166.6 DS13026.6 DS1302的程序设计的程序设计 1)DS1302和单片机连接示意图如下图图6-4 DS13026-4 DS1302和单片机连接示意图和单片机连接示意图2021/6/3172)DS1302应用程序设计流程图如下所示:图图6-5 DS13026-5 DS1302应用程序设计流程图应用程序设计流程图 2021/6/3183)应用程序清单如下: 程序用按键设置秒、分、时,用液晶LCD1602显示设置的时间。/*程序描述程序描述:以下
9、程序为DS1302的头函数文件,在建立项目的时候该部分要保存为DS1302.H。该头文件中有对DS1302基本的单字节读写函数,取时间函数,设置时间函数,在主函数中要调用这些函数。 * /#define uchar unsigned char /宏定义sbit T_CLK = P10; /设置实时时钟时钟线引脚 /sbit T_IO = P11; /设置实时时钟数据线引脚 /sbit T_RST = P12; /设置实时时钟复位线引脚 /sbit ACC0=ACC0; /定义ACC的位,利用ACC操作速度最快2021/6/319sbit ACC7=ACC7;uchar time16;char
10、counter3;uchar sec,min,hou,day,mon,yea;void Init1302(void);void v_W1302(uchar ucAddr, uchar ucDa);uchar uc_R1302(uchar ucAddr);void get_time(void);void set_time(void);/*往DS1302写入1Byte数据*/ void v_WTInputByte(uchar ucDa) uchar i;ACC= ucDa;for(i=8; i0; i-)T_IO = ACC0; /*相当于汇编中的 RRC T_CLK = 1; T_CLK = 0
11、;ACC =ACC 1; /*从DS1302读取1Byte数据*/2021/6/320uchar uc_RTOutputByte(void) uchar i;for(i=8; i0; i-)ACC = ACC1; /*相当于汇编中的 RRCACC7 = T_IO;T_CLK = 1; T_CLK = 0; return(ACC); /*往DS1302写入数据,先写地址,后写命令/数据*/void v_W1302(uchar ucAddr, uchar ucDa)T_RST = 0;T_CLK = 0;T_RST = 1;v_WTInputByte(ucAddr); /* 地址,命令 */v_W
12、TInputByte(ucDa); /* 写1Byte数据*/2021/6/321T_CLK = 1;T_RST =0;/*读取DS1302某地址的数据,先写地址,后读命令/数据*/uchar uc_R1302(uchar ucAddr)uchar ucDa;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*/void Init1302(void)v
13、_W1302(0x8e,0x00); /控制写入WP=0v_W1302(0x90,0xa5);2021/6/322v_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);/*取出时间并处理,以便送数码管显示*/ void get_time(void)uchar d;d=uc_R1302(0x81);cou
14、nter0=d/16*10+d%16; /十六进制转换为BCD码time10=d&0x0f;time11=(d4)&0x0f;d=uc_R1302(0x83);counter1=d/16*10+d%16; /十六进制转换为BCD码time12=d&0x0f;time13=(d4)&0x0f;d=uc_R1302(0x85);counter2=d/16*10+d%16; /十六进制转换为BCD码2021/6/323time14=d&0x0f;time15=(d4)&0x0f;void set_time(void)v_W1302(0x8e,0x00);v_W1302(0x80,0x80);v_W1
15、302(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文件,在主函数中要调用该函数2021/6/324/*程序描述程序描述:该程序能通过和单片机连接的按键调整并设置DS1302的时间,并能将从DS1302中读出的时间在六个七段数码管上显示,P0口驱动数码管的各段,P2口低六位连接到六个数码管的公共端,数码管为共阳。*/#include #include #include DS1
16、302.h#define uchar unsigned char#define uint unsigned intcode seven_tab10 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;code bit_select6 = 0xfe,0xfd,0xfb,0xf7,0xef,0xdf;uint get_time_flag;uchar dot,flash,a,b,c,d;uchar year,month,day,hour,minute,second,week;uchar key1_state,key2_state,key3_stat
17、e,key4_state,ttt;static uchar key1_flag=0;/定义静态变量sbit key1 = P30; /定义4个按键的端口sbit key2 = P31;sbit key3 = P32; sbit key4 = P33;/*时间延迟函数*/2021/6/325void delay(int delaytime)while(delaytime-) _nop_();void delayms(unsigned int delaytime)uint i,j;for( i = 0;i delaytime;i+ )for(j = 0;j = 60) counter0 = 0;
18、if(key3 = 0 ) key3 = 1; ;if(key3 = 0)key3_state = 1; if(key3 = 1 & key3_state = 1) key3_state = 0;counter0-; if(counter0 = 60) counter1 = 0; if(key3 = 0 ) key3 = 1; ;if(key3 = 0)2021/6/331key3_state = 1; if(key3 = 1 & key3_state = 1) key3_state = 0;counter1-; if(counter1 23 & d = 0) counter2 = 0;if(
19、counter2 12 & d = 1) counter2 = 1; if(key3 = 0) key3 = 1; ;if(key3 = 0)key3_state = 1; if(key3 = 1 & key3_state = 1) key3_state = 0;counter2-; if(counter2 0 & d = 0) counter2 = 23;if(counter2 1 & d = 1) counter2 = 12; c = dot*0xff; 2021/6/334else c = 0;if(key4 = 0) key4 = 1; ; if(key4 = 0) key4_stat
20、e = 1; if(key4 = 1 & key4_state = 1) d = !d;key4_state = 0;/*显示函数*/void display()uchar i;P0 = 0xff;P2 = bit_select0;P0 = a|seven_tabcounter0%10;delay(100);P0 = 0xff;P2 = bit_select1;2021/6/335P0 = a|seven_tabcounter0/10;delay(100);P0 = 0xff;P2 = bit_select2;P0 = b|seven_tabcounter1%10; delay(100);P0
21、 = 0xff;P2 = b|bit_select3;P0 = seven_tabcounter1/10;delay(100);i = 0x80*dot;i = 0x7f|i;P0 = 0xff; 2021/6/336P2 = bit_select4;P0 = c|seven_tabcounter2%10&i;delay(100); P0 = 0xff;P2 = bit_select5;P0 = c|seven_tabcounter2/10;delay(100); /*主函数*/void main()Init_mcu(); 2021/6/337while(1) /无限循环key_setup();if(key1_flag = 1 | key1_flag = 2 | key1_flag = 3)display();if(key1_flag = 4)TR0=0;key1_flag=0;sec=(counter0/10)*16+counter0%10; / BCD 码转换成 HEXmin=(counter1/10)*16+counter1%10; / BCD 码转换成 HEXhou=(counter2/10)*16+counter2%10; / BCD 码转换成 HEXset_time();TR0=1;2021/6/338部分资料从网络收集整理而来,供大家参考,感谢您的关注!