好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

第三节-实时时钟DS1302的原理与应用.ppt

31页
  • 卖家[上传人]:金**
  • 文档编号:204441405
  • 上传时间:2021-10-25
  • 文档格式:PPT
  • 文档大小:219KB
  • / 31 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 在许多的单片机系统中,通常进展一些与时间有关的控制,这就需要使用实时时钟例如在测量控制系统中,特别是长时间无人值守的测控系统中,经常需要记录某些具有特殊意义的数据及其出现的时间在系统中采用实时时钟芯片能很好的解决这个问题 4.3 实时时钟DS1302的原理与应用 实时时钟(RTC)是一个由晶体控制精度的,向主系统提供BCD码表示的时间和日期的器件主系统与RTC间的通信可通过并行口也可通过串行口,并行器件速度快但需较大的底 板空间和较昂贵,串行器件体积较小且价格也相对廉价读者在学完本节后,应能完成相关的电路设计,并掌握如下知识点:(1)掌握时钟芯片DS1302的原理、特性及选择;(2) 51单片机和时钟芯片DS1302的接口电路设计;(3)掌握时钟芯片DS1302的C51程序设计 DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进展计时,具有闰年补偿功能,工作电压为2.5V5.5V采用三线接口与CPU进展同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据 DS1302内部有一个318的用于临时性存放数据的RAM存放器。

      DS1302是DS1202的晋级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进展涓细电流充电的才能图4-3-1 DS1302的实物图及引脚排列 图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为高电平时,所有的数据传送被初始化,允许对DS1302进展操作假设在传送过程中RST置为低电平,那么会终止此次数据传送,I/O引脚变为高阻态上电运行时,在Vcc2.5V之前,RST必须保持低电平只有在SCLK为低电平时,才能将RST置为高电平I/O为串行数据输入输出端(双向), SCLK始终是输入端。

      对DS1302的操作就是对其内部存放器的操作,DS1302内部共有12个存放器,其中有7个存放器与日历和时钟有关,存放的数据位为BCD码形式此外,DS1302还有年份存放器、控制存放器、充电存放器、时钟突发存放器及与RAM相关的存放器等时钟突发存放器可一次性顺序读写除充电存放器以外的存放器,日历、时钟存放器及其控制字如下表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表示进展读操作,控制字节总是从最低位开始输出 2在控制指令字输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位即位0开始。

      同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位至高位7 表示要进展写操作,为1表示进展读操作控制字总是从最低位开始输出在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据读出的数据也是从最低位到最高位数据读写时序如以以以下图4-3-3所示详细操作见驱动程序图43-3-3 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();ooo指针pointer实际上就是存储器的地址,因为我们可以把它想像成一个指向存储器的箭头,所以称为指针。

      而指针变量就是储存存储器地址的变量内存单元的指针和内存单元的内容是两个不同的概念使用指针变量时也必须预先声明o 对于一个内存单元来说,它的地址即为指针,其中存放的数据是该单元的内容在c语言中,允许用一个变量来存放指针,这种变量称为指针变量因此,一个指针变量的值就是某个内存单元的地址,或称为某内存单元的指针 指针变量也是一个变量,它和普通变量一样占用一定的存储空间但与普通变量不同之处在于,指针变量的存储空间存放的不是普通的数据,而是另一个变量的地址因此,指针变量是一个地址变量声明指针变量的格式为数据类型 *指针变量名; 在指针定义中,“指针变量前的“*仅是一个符号,并不是指针运算符;“基类型表示该项指针变量所指向变量的数据类型,并非指针变量自身的数据类型,因为所有指针变量都是地址,所以所有指针变量的类型一样,只是所指向的变量的数据类型不同 例如:char *p; p是一个指针变量,其值是个整型变量的地址,或者说p指向一个整型变量至于p终究指向哪一个整型变量,应由向p赋予的地址来决定指针也可以指向用户自定义的数据类型变量,如:typedef struct char year; char moth; char day;date;date *dispaly_date;一、 指针与数组 数组的名字后面没有加上任何索引值时,就是指向数组开始位置的地址值,所以数组的名字也是指针。

      例如:char 80;char *p;p=; 反之,指针也可以当成数组来使用,如下例所示例如: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。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.