第三节-实时时钟DS1302的原理与应用知识课件

上传人:yuzo****123 文档编号:140762402 上传时间:2020-08-01 格式:PPT 页数:31 大小:398KB
返回 下载 相关 举报
第三节-实时时钟DS1302的原理与应用知识课件_第1页
第1页 / 共31页
第三节-实时时钟DS1302的原理与应用知识课件_第2页
第2页 / 共31页
第三节-实时时钟DS1302的原理与应用知识课件_第3页
第3页 / 共31页
第三节-实时时钟DS1302的原理与应用知识课件_第4页
第4页 / 共31页
第三节-实时时钟DS1302的原理与应用知识课件_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《第三节-实时时钟DS1302的原理与应用知识课件》由会员分享,可在线阅读,更多相关《第三节-实时时钟DS1302的原理与应用知识课件(31页珍藏版)》请在金锄头文库上搜索。

1、在许多的单片机系统中,通常进行一些与时间有关的控制,这就需要使用实时时钟。例如在测量控制系统中,特别是长时间无人值守的测控系统中,经常需要记录某些具有特殊意义的数据及其出现的时间。在系统中采用实时时钟芯片能很好的解决这个问题。,4.3 实时时钟DS1302的原理与应用,实时时钟(RTC)是一个由晶体控制精度的,向主系统提供BCD码表示的时间和日期的器件。主系统与RTC间的通信可通过并行口也可通过串行口,并行器件速度快但需较大的底 板空间和较昂贵,串行器件体积较小且价格也相对便宜。读者在学完本节后,应能完成相关的电路设计,并掌握如下知识点: (1)掌握时钟芯片DS1302的原理、特性及选择; (

2、2) 51单片机和时钟芯片DS1302的接口电路设计; (3)掌握时钟芯片DS1302的C51程序设计。,4.3.1 DS1302简介,DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。 DS1302内部有一个318的用于临时性存放 数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充

3、电的能力。,图4-3-1示出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为高电平时,所有的数据

4、传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向), SCLK始终是输入端。,4.3.2 DS1302的寄存器和控制命令,对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历和时钟有关,存放的数据位为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读

5、写除充电寄存器以外的寄存器,日历、时钟寄存器及其控制字如下表4-3-1所示,DS1302内部主要寄存器功能如下表4-3-2所示。,表4-3-1 日历、时钟寄存器及其控制字对照表,表4-3-2 DS1302内部主要寄存器功能表,其中CH:时钟停止位;为0时振荡器工作;为1时振荡器停止;AP=1时为下午模式,为0时上午模式;DS1302的控制字节说明如下: 1DS1302的控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中:位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址:最低有效位(位0)如为0表示要进行写操作,为1表

6、示进行读操作,控制字节总是从最低位开始输出。,2在控制指令字输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位至高位7。,4.3.3 DS1302的读写时序,不仅要向寄存器写入控制字。还需要读取相应寄存器的数据。4.3.3 DS1302的读写时序要想与DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字见6.5.4节内容。控制字的最高有效位(位7)必须是逻辑1,如果它为0。则不能把数据写入到DS1302中。位6:如果为0,则表示存取日历时

7、钟数据,为1表示存取RAM数据;位5至位1(A4A0):指示操作单元的地址;位0(最低有效位):如为0。,表示要进行写操作,为1表示进行读操作。 控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据。读出的数据也是从最低位到最高位。数据读写时序如下图4-3-3所示。具体操作见驱动程序。,图43-3-3 DS1302数据读写时序图,4.3.4 DS1302应用,利用DS1302时钟芯片可以设计一个比较完整的电子日历,本案例可以利用六个数

8、码管显示从DS1302读取的当前时间,时间显示的格式:“时分秒”。 一、电路原理 电路采用6为数码管显示,电子表电路连接一样,这里不再画出。DS1302的SCL接P11, IO端口接P12,复位端接P13,DS1302的X1和X2接32768赫兹的标准时钟晶振。DS1302和单片机连接示意图如下图4-3-4所示,图4-3-4 DS1302和单片机连接示意图,二、程序清单 此程序的结构和上述单闹钟程序结构一样,对功能进行了加强和扩展,部分程序进行了优化。其中,DS1302驱动程序包含在主程序中。 /*/ / 读取DS1302的时间,然后通过数码管显示 /*/ #include #define u

9、char unsigned char uchar 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;,/定义引脚连接 sbit rtc_clk=P11; sbit rtc_data=P12; sbit rtc_rst=P13; sbit a0=ACC0; sbit a7=ACC7; void write_rt

10、c(uchar date) /写一字节 uchar i; ACC=date; for(i=8;i0;i-) rtc_data=a0; rtc_clk=1; rtc_clk=0; ACC=ACC1; ,uchar read_rtc()/读一字节 uchar i; for(i=8;i0;i-) ACC=ACC1; a7=rtc_data; rtc_clk=1; rtc_clk=0; return(ACC); ,/写1302数据 void write1302(uchar address,uchar date) rtc_rst = 0; rtc_clk = 0; rtc_rst = 1; write_

11、rtc(address); write_rtc(date); rtc_clk = 1; rtc_rst = 0; ,uchar read1302(uchar address)/读1302数据 uchar temp; rtc_rst = 0; rtc_clk = 0; rtc_rst = 1; write_rtc(address); temp=read_rtc(); rtc_clk = 1; rtc_rst = 0; return(temp); ,void init1302()/1302初始化 write1302(0 x8e,0 x00);/写操作 write1302(0 x80,0 x56);

12、/写秒 write1302(0 x82,0 x34);/写分 write1302(0 x84,0 x12);/写时 write1302(0 x86,0 x10);/写月 write1302(0 x88,0 x10);/写日 write1302(0 x8a,0 x06);/写星期 write1302(0 x8c,0 x10);/写年 write1302(0 x8e,0 x80);/写保护 ,void get_time()/获取1302的时间数据(时、分、秒),存入time1数组中 uchar d; d = read1302(0 x81); time10 = d ,void time0() int

13、errupt 1 uchar i; TR0=0; TH0 = (65536 - 2000) / 256; TL0 = (65536 - 2000) % 256; TR0 = 1; tt +; if(tt = 500) tt = 0; dot = !dot; flash = 0 x7f | (dot 7); P0 = 0 xff; P2 = bit_selecti; if(i = 2) P0 = seven_tabtime1i ,void init_timer0()/Timer0初始化 TMOD = 0 x01; TH0 = (65536-2000) / 256; TL0 = (65536-20

14、00) % 256; TR0 = 1; ET0 = 1; EA = 1; void main() init_timer0(); init1302(); while(1) get_time(); ,4.3.5指针,指针(pointer)实际上就是存储器的地址,因为我们可以把它想像成一个指向存储器的箭头,所以称为指针。而指针变量就是储存存储器地址的变量。内存单元的指针和内存单元的内容是两个不同的概念。使用指针变量时也必须预先声明。 对于一个内存单元来说,它的地址即为指针,其中存放的数据是该单元的内容。在c语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元

15、的地址,或称为某内存单元的指针。,指针变量也是一个变量,它和普通变量一样占用一定的存储空间。但与普通变量不同之处在于,指针变量的存储空间存放的不是普通的数据,而是另一个变量的地址。因此,指针变量是一个地址变量。声明指针变量的格式为 数据类型 *指针变量名; 在指针定义中,“指针变量”前的“*”仅是一个符号,并不是指针运算符;“基类型”表示该项指针变量所指向变量的数据类型,并非指针变量自身的数据类型,因为所有指针变量都是地址,所以所有指针变量的类型相同,只是所指向的变量的数据类型不同。,例如:char *p; p是一个指针变量,其值是个整型变量的地址,或者说p指向一个整型变量。至于p究竟指向哪一

16、个整型变量,应由向p赋予的地址来决定。指针也可以指向用户自定义的数据类型变量,如: typedef struct char year; char moth; char day; date; date *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)指针变量前面上*号

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号