找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2270|回复: 1
收起左侧

DS1302中文资料与源码

[复制链接]
ID:312165 发表于 2018-5-25 14:51 | 显示全部楼层 |阅读模式

DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式。

  DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需三根I/O线:复位(RST)、I/O数据线、串行时钟(SCLK)。时钟/RAM的读/写数据以一字节或多达31字节的字符组方式通信。DS1302工作时功耗很低,保持数据和时钟信息时,功耗小于1mW。

2362487-1G020092121418.jpg

  DS1302内部结构

  DS1302的外部引脚功能说明如图3所示:

2362487-1G020092134c5.jpg

  DS1302的内部结构如图4所示,主要组成部分为:移位寄存器、控制逻辑、振荡器、实时时钟以及RAM。虽然数据分成两种,但是对单片机的程序而言,其实是一样的,就是对特定的地址进行读写操作。

  DS1302含充电电路,可以对作为后备电源的可充电电池充电,并可选择充电使能和串入的二极管数目,以调节电池充电电压。不过对我们目前而言,最需要熟悉的是和时钟相关部分的功能,对于其它参数请参阅数据手册。

2362487-1G020092145132.jpg

  DS1302特点

  时钟计数功能,可以对秒、分钟、小时、月、星期、年的计数。年计数可达到2100 年。

  有31*8 位的额外数据暂存寄存器(即RAM,掉电丢失)最少I/O 引脚传输,通过三引脚控制、作电压:2.0-5.5V、工作电流小于320 纳安(2.0V)。

  读写时钟寄存器或内部RAM(31*8 位的额外、数据暂存寄存)可以采用单字节模式(一次读写单个字节)和突发模式(一次读写多个字节)、8-pin DIP (直插封装)或8-pin SOICs(贴片封装)。

2362487-1G020092201606.jpg

  DS1302寄存器简介

  DS1302的寄存器(读时81h~8Dh,写时80h~8Ch)是存放秒、分,小时、日、月、年、周数据的,存放的数据格式为BCD码形式。它的内部时间寄存器如下表:

2362487-1G020092334919.jpg

  上表是DS1302内部的7个与时间、日期有关的寄存器图和一个写保护寄存器,我们要做的就是将初始设置的时间、日期数据写入这几个寄存器,然后再不断地读取这几个寄存器来获取实时时间和日期。现对这几个寄存器的说明如下:

  ①、秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当初始上电时该位置为1,时钟振荡器停止,DS1302处于低功耗状态;只有将秒寄存器的该位置改写为0时,时钟才能开始运行,一般我们在用的时候是在设置时间完成后吧秒寄存器写入0,这样就启动了芯片的计时功能。

  ②、小时寄存器(85h、84h)的位7定义为DS1302是运行于12小时模式还是24小时模式。当为1时,选择12小时模式,为0时选择24小时模式。在12小时模式时,位5是标志位 ,为0时表示AM,为1时表示PM。在24小时模式时,位5是第二个10小时位。

  ③、控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的时候对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。也就是说在电路上电的初始态WP是1,这时是不能改写上面任何一个时间寄存器的,只有首先将WP改写为0,才能进行其它寄存器的写操作。

  其余的寄存器没有什么特殊的说明。对于DS1302芯片还有一个控制字,该控制字控制这芯片的读写操作。具体的内容如下:

2362487-1G02009234UB.jpg

  如上表所示,位0就是读写位,当位0为1时,就是告诉DS1302,下面是进行读出操作,而当位0为0时就是写入操作。

  位0-位5是要进行操作的DS1302寄存器地址。

  位6就是告诉DS1302,是要对RAM进行操作还是对时间寄存器进行操作,0就是对时间寄存器操作,一般我们都是对时间寄存器进行操作。

  位7就是固定的1。

  现在就知道为什么控制字80H是写秒寄存器,而81H是读秒寄存器了吧。80H换成二进制就是10000000。而81H的二进制就是10000001,一个是写操作,另一个是读操作嘛!

  DS1302操作步骤

  1)首先要通过8eH将写保护去掉,这样我们才能将日期,时间的初值写时各个寄存器。

  2)然后就可以对80H、82H、84H、86H、88H、8AH、8CH进行初值的写入。同时也通过秒寄存器将位7的CH值改成0,这样DS1302就开始走时运行了。

  3)将写保护寄存器再写为80H,防止误改写寄存器的值。

  4)不断读取80H-8CH的值,将他们转化为十进制后显示出来就可以啦,之前我们说过,DS1302读出的数据是BCD码,所以需要转换一下。

2362487-1G02009241L44.jpg

  DS1302的数据读写是通过I/O串行进行的。当进行一次读写操作时最少得读写两个字节,第一个字节是控制字节,就是一个命令,告诉DS1302是读还是写操作,是对RAM还是对CLOK寄存器操作,以及操作的地址。第二个字节就是要读或写的数据了。

  我们先看单字节写:在进行操作之前先得将CE(也可说是RST)置高电平,然后单片机将控制字的位0放到I/O上,当I/O的数据稳定后,将SCLK置高电平,DS1302检测到SCLK的上升沿后就将I/O上的数据读取,然后单片机将SCLK置为低电平,再将控制字的位1放到I/O上,如此反复,将一个字节控制字的8个位传给DS1302。接下来就是传一个字节的数据给DS1302,当传完数据后,单片机将CE置为低电平,操作结束。

  单字节读操作的一开始写控制字的过程和上面的单字节写操作是一样,但是单字节读操作在写控制字的最后一个位,SCLK还在高电平时,DS1302就将数据放到I/O上,单片机将SCLK置为低电平后数据锁存,单机机就可以读取I/O上的数据。如此反复,将一个字节的数据读入单片机。读与写操作的不同就在于,写操作是在SCLK低电平时单片机将数据放到IO上,当SCLK上升沿时,DS1302读取。而读操作是在SCLK高电平时DS1302放数据到IO上,将SCLK置为低电平后,单片机就可从IO上读取数据。

  在单字节读操作时,在写控制字的最后一个位也就是位7时,DS1302已将它的寄存器数据位0放到IO上了,要是控制字的位7是0的话,DS1302就无法将它的随后的数据放到IO上了,所以控制字的7位为固定的1,原因在这里哦。

  DS1302的读写操作代码
  1.   void Write1302(unsigned char dat)

  2.   {

  3.   unsigned char i;

  4.   SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备

  5.   delaynus(2); //稍微等待,使硬件做好准备

  6.   for(i=0;i《8;i++) //连续写8个二进制位数据

  7.   {

  8.   DATA=dat&0x01; //取出dat的第0位数据写入1302

  9.   delaynus(2); //稍微等待,使硬件做好准备

  10.   SCLK=1; //上升沿写入数据

  11.   delaynus(2); //稍微等待,使硬件做好准备

  12.   SCLK=0; //重新拉低SCLK,形成脉冲

  13.   dat》》=1; //将dat的各数据位右移1位,准备写入下一个数据位

  14.   }

  15.   }

  16.   void WriteSet1302(unsigned char Cmd,unsigned char dat)

  17.   {

  18.   RST=0; //禁止数据传递

  19.   SCLK=0; //确保写数据前SCLK被拉低

  20.   RST=1; //启动数据传输

  21.   delaynus(2); //稍微等待,使硬件做好准备

  22.   Write1302(Cmd); //写入命令字

  23.   Write1302(dat); //写数据

  24.   SCLK=1; //将时钟电平置于已知状态

  25.   RST=0; //禁止数据传递

  26.   }

  27.   unsigned char Read1302(void)

  28.   {

  29.   unsigned char i,dat;

  30.   delaynus(2); //稍微等待,使硬件做好准备

  31.   for(i=0;i《8;i++) //连续读8个二进制位数据

  32.   {

  33.   dat》》=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位

  34.   if(DATA==1) //如果读出的数据是1

  35.   dat|=0x80; //将1取出,写在dat的最高位

  36.   SCLK=1; //将SCLK置于高电平,为下降沿读出

  37.   delaynus(2); //稍微等待

  38.   SCLK=0; //拉低SCLK,形成脉冲下降沿

  39.   delaynus(2); //稍微等待

  40.   }

  41.   return dat; //将读出的数据返回

  42.   }

  43.   unsigned char ReadSet1302(unsigned char Cmd)

  44.   {

  45.   unsigned char dat;

  46.   RST=0; //拉低RST

  47.   SCLK=0; //确保写数居前SCLK被拉低

  48.   RST=1; //启动数据传输

  49.   Write1302(Cmd); //写入命令字

  50.   dat=Read1302(); //读出数据

  51.   SCLK=1; //将时钟电平置于已知状态

  52.   RST=0; //禁止数据传递

  53.   return dat; //将读出的数据返回

  54.   }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:345003 发表于 2018-6-6 19:55 | 显示全部楼层
谢谢 懂了很多
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表