一 : 时钟芯片DS1302中文资料
首页 在线计算 EDA技术 电路图库 嵌入式 经验心得 电子基础 电子制作 国外资源 技术文章 专利技术 下载频道二 : 实时时钟芯片DS1302
本节课的DS1302是个实时时钟芯片,我们可以用单片机写入时间或者读取当前的时间数据,我也会带着大家通过阅读这个芯片的数据手册来学习和掌握这个器件。
由于IT技术国际化比较强,因此数据手册绝大多数都是英文的,导致很多英语基础不好的同学看到英文手册头就大了。这里我要告诉大家的是,只要精神不退缩,方法总比困难多,很多英语水平不高的,看数据手册照样完全没问题,因为我们的专业词汇也就那么几个,多看几次就认识了。我们现在不是考试,因此大家可以充分利用一些英文翻译软件,翻译过来的中文意思有的时候可能不是那么准确,那你就把翻译的内容和英文手册里的一些图表比较参考学习。此外数据手册除了介绍性的说明外,一般还会配相关的图形或者表格,结合起来看也有利于理解手册所表达的意思。这节课我会把DS1302的英文资料尽可能的用比较便于理解的方式给大家表达出来,同学们可以把我的表达和英文手册多做一下对比,尽可能快的慢慢开始学会了解英文手册。
DS1302是DALLAS(达拉斯)公司出的1款涓流充电时钟芯片,2001年DALLAS被MAXIM(美信)收购,因此我们看到的DS1302的数据手册既有DALLAS的标志,又有MAXIM的标志,大家了解就可以。
DS1302实时时钟芯片广泛应用于电话、传真、便携式仪器等产品领域,他的主要性能指标如下:
1、DS1302是1个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软件自动调整的能力,可以通过配置AM/PM来决定采用24小时格式还是12小时格式。
2、拥有31字节数据存储RAM。
3、串行I/O通信方式,相对并行来说比较节省IO口的使用。
4、DS1302的工作电压比较宽,大概是2.0V~5.5V都可以正常工作。
5、DS1302这种时钟芯片功耗一般都很低,它在工作电压2.0V的时候,工作电流小于300nA。
6、DS1302共有八个引脚,有2种封装形式,1种是DIP-8封装,芯片宽度(不含引脚)是300mil,1种是SOP-8封装,有2种宽度,1种是150mil,1种是208mil。我们看一下DS1302的引脚封装图,如图1所示。
图1DS1302封装图所谓的DIP封装DualIn-linePackage,也叫做双列直插式封装技术,就如同我们开发板上的STC89C52RC单片机,就是个典型的DIP封装,当然这个STC89C52RC还有其他的封装,为了方便学习使用,我们采用的是DIP封装。而74HC245、74HC138、24C02、DS1302我们用的都是SOP封装SmallOut-LinePackage,是1种芯片两侧引出L形引脚的封装技术,大家可以看看开发板上的芯片,了解一下这些常识性知识。
7、当供电电压是5V的时候,兼容标准的TTL电平标准,这里的意思是,可以完美的和单片机进行通信。
8、由于DS1302是DS1202的升级版本,所以所有的功能都兼容DS1202。此外DS1302有2个电源输入,1个是主电源,另外1个是备用电源,比如可以用电池或者大电容,这样是为了保证系统掉电的情况下,我们的时钟还会继续走。如果使用的是充电电池,还可以在正常工作时,设置充电功能,给我们的备用电池进行充电。
DS1302的特点第二条“拥有31字节数据存储RAM”,这是DS1302额外存在的资源。这31字节的RAM相当于1个存储器一样,我们编写单片机程序的时候,可以把我们想存储的数据存储在DS1302里边,需要的时候读出来,这块功能和EEPROM有点类似,相当于1个掉电丢失数据的“EEPROM”,如果我们的时钟电路加上备用电池,那么这3一个字节的RAM即可替代EEPROM的功能了。这31字节的RAM功能使用很少,所以在这里我不讲了,大家了解就可以。
我们平时所用的不管是单片机,还是其他一些电子器件,根据使用条件的约束,可以分为商业级和工业级,DS1302的购买信息如下图2所示。
图2DS1302订购信息
我们在订购DS1302的时候,即可根据图15-4所标识的来跟销售厂家沟通,商业级的工作电压略窄,是0到70度,而工业级可以工作在零下40度到85度。TOPMARK就是指在芯片上印的字。
DS1302一共有八个引脚,下边要根据引脚分布图和典型电路图来介绍一下每个引脚的功能,如图3和图4所示。
图3DS1302引脚图
图4DS1302典型电路
1脚VCC2是主电源正极的引脚,2脚X1和3脚X2是晶振输入和输出引脚,4脚GND是负极,5脚CE是使能引脚,接单片机的IO口,6脚I/O是数据传输引脚,接单片机的IO口,7脚SCLK是通信时钟引脚,接单片机的IO口,8脚VCC1是备用电源引脚。考虑到KST-51开发板是一套以学习为目的的板子,加上备用电池对航空运输和携带不方便,所以8脚可以直接悬空,断电后不需要DS1302再运行了,或者是在8脚接1个10uF的电容,经过试验可以运行1分钟左右的时间,如果大家想运行时间再长,可以加大电容的容量,如图5和图6所示。
图5DS1302无备用电源
图6DS1302电容作备用电源
涓流充电功能,课程也不讲了,大家也作为选学就可以,我们使用的时候直接用5V电源接1个二极管,在有主电源的情况下给电容充电,在主电源掉电的情况下,这个电容可以给DS130两大约供电1分钟左右,这种电路的最大用处是在电池供电系统中更换主电池的时候保持实时时钟的运行不中断,1分钟的时间对于更换电池足够了。此外,通过我们的使用经验,在DS1302的主电源引脚串联1个1K电阻可以有效的防止电源对DS1302的冲击,R6就是,而R9,R26,R32都是上拉电阻。
我们把八个引脚功能分别介绍,如表1所示。
表1DS1302引脚功能图
引脚编号 | 引脚名称 | 引脚功能 |
1 | Vcc2 | 主电源引脚,当Vcc2比Vcc1高0.2V以上时,DS1302由VCC2供电,当Vcc2低于Vcc1时,由Vcc1供电。 |
2 | X1 | 这2个引脚需要接1个32.768K的晶振,给DS1302提供1个基准。特别注意,要求这个晶振的引脚负载电容必须是6pF,而不是要加6pF的电容。如果使用有源晶振的话,接到X1上就可以,X2悬空。 |
3 | X2 | |
4 | GND | 接地。 |
5 | CE | DS1302的输入引脚。当读写DS1302的时候,这个引脚必须是高电平,DS1302这个引脚内部有1个40k的下拉电阻。 |
6 | I/O | 这个引脚是1个双向通信引脚,读写数据都是通过这个引脚完成。DS1302这个引脚的内部含有1个40k的下拉电阻。 |
7 | SCLK | 输入引脚。SCLK是用来作为通信的时钟信号。DS1302这个引脚的内部含有1个40k的下拉电阻。 |
8 | Vcc1 | 备用电源引脚。 |
DS1302的电路1个重点就是时钟电路,它所使用的晶振是1个32.768k的晶振,晶振外部也不需要额外添加其他的电容或者电阻电路了。时钟的精度,首先取决于晶振的精度以及晶振的引脚负载电容。如果晶振不准或者负载电容过大过小,都会导致时钟误差过大。在这一切都搞定后,最终1个考虑因素是晶振的温漂。随着温度的变化,晶振往往精度会发生变化,因此,在实际的系统中,其中1种方法就是经常校对。比如我们所用的电脑的时钟,通常我们会设置1个选项“将计算机设置于internet时间同步”。选中这个选项后,一般可以过一段时间,我们的计算机就会和internet时间校准同步一次。
DS1302的一条指令1个字节8位,其中第七位(即最高位)是固定1,这一位如果是0的话,那写进去是无效的。第六位是选择RAM还是CLOCK的,我前边说过,我们这里主要讲CLOCK时钟的使用,它的RAM功能我们不用,所以如果选择CLOCK功能,第六位是0,如果要用RAM,那第六位就是1。从第五到第一位,决定了寄存器的5位地址,而第零位是读写位,如果要写,这一位就是0,如果要读,这一位就是1,如图7所示。
图7DS1302命令字节
DS1302时钟的寄存器,其中八个和时钟有关的,5位地址分别是00000一直到00111这八个地址,还有1个寄存器的地址是01000,这是涓流充电所用的寄存器,我们这里不讲。在DS1302的数据手册里的地址,直接把第七位、第六位和第零位值给出来了,所以指令就成了80H、81H那些了,最低位是1,那么表示读(www.61k.com],最低位是0表示写,如图8所示。
图8DS1302的时钟寄存器
寄存器一:最高位CH是1个时钟停止标志位。如果我们的时钟电路有备用电源部分,上电后,我们要先检测一下这一位,如果这一位是0,那说明我们的时钟在系统掉电后,由于备用电源的供给,时钟是持续正常运行的;如果这一位是1,那么说明我们的时钟在系统掉电后,时钟部分不工作了。若我们的Vcc1悬空或者是电池没电了,当我们下次重新上电时,读取这一位,那这一位就是1,我们可以通过这一位判断时钟在单片机系统掉电后是否持续运行。剩下的7位高3位是秒的十位,低4位是秒的个位,这里注意再提一次,DS1302内部是BCD码,而秒的十位最大是5,所以三个二进制位就够了。
寄存器二:bit7没意义,剩下的7位高3位是分钟的十位,低4位是分钟的个位。
寄存器三:bit7是1的话代表是12小时制,是0的话代表是24小时制,bit6固定是0,bit5在12小时制下0代表的是上午,1代表的是下午,在24小时制下和bit4一起代表了小时的十位,低4位代表的是小时的个位。
寄存器四:高2位固定是0,bit5和bit4是日期的十位,低4位是日期的个位。
寄存器五:高3位固定是0,bit4是月的十位,低4位是月的个位。
寄存器六:高5位固定是0,低3位代表了星期。
寄存器七:高4位代表了年的十位,低4位代表了年的个位。这里特别注意,这里的00到99年指的是2000年到2099年。
寄存器八:bit7是1个保护位,如果这一位是1,那么是禁止给任何其他的寄存器或者那3一个字节的RAM写数据的。因此在写数据之前,这一位必须先写成0。
DS1302我们前边也有提起过,是三根线,分别是CE、I/O和SCLK,其中CE是使能线,SCLK是时钟线,I/O是数据线。前边我们学过SPI通信,同学们发现没发现,这个DS1302的通信线定义和SPI怎么这么像呢?
事实上,DS1302的通信是SPI的变异种类,它用了SPI的通信时序,但是通信的时候没有完全按照SPI的规则来,下面我们一点点解剖一下DS1302的变异SPI通信方式。
先看一下单字节写入操作,如图9所示。
图9DS1302单字节写操作
然后我们在对比一下再对比一下CPOL=0并且CPHA=0的情况下的SPI的操作时序,如图10所示。
图10CPOL=0/CPHA=0通信时序
图9和图10的通信时序,其中CE和SSEL的使能控制是反的,对于通信写数据,都是在SCK的上升沿,从机进行采样,下降沿的时候,主机发送数据。DS1302的时序里,单片机要预先写1个字节指令,指明要写入的寄存器的地址以及后续的操作是写操作,然后再写入1个字节的数据。
对于单字节读操作,我就不做对比了,把DS1302的时序图贴出来给大家看一下,如图11所示。
图11DS1302单字节读操作
读操作有两处特别注意的地方。第一,DS1302的时序图上的箭头都是针对DS1302来说的,因此读操作的时候,先写第1个字节指令,上升沿的时候DS1302来锁存数据,下降沿我们用单片机发送数据。到了第二个字数据,由于我们这个时序过程相当于CPOL=0/CPHA=0,前沿发送数据,后沿读取数据,第二个字节是DS1302下降沿输出数据,我们的单片机上升沿来读取,因此箭头从DS1302角度来说,出现在了下降沿。
第二个需要注意的地方就是,我们的单片机没有标准的SPI接口,和I2C一样需要用IO口来模拟通信过程。在读DS1302的时候,理论上SPI是上升沿读取,但是我们的程序是用IO口模拟的,所以数据的读取和时钟沿的变化不可能同时了,必然就有1个先后顺序。通过实验发现,如果先读取IO线上的数据,再拉高SCLK产生上升沿,那么读到的数据一定是正确的,而颠倒顺序后数据就有可能出错。这个问题产生的原因还是在于DS1302的通信协议与标准SPI协议存在的差异造成的,如果是标准SPI的数据线,数据会一直保持到下1个周期的下降沿才会变化,所以读取数据和上升沿的先后顺序就无所谓了;但DS1302的IO线会在时钟上升沿后被DS1302释放,也就是撤销强推挽输出变为弱下拉状态,而此时在51单片机引脚内部上拉的作用下,IO线上的实际电平会慢慢上升,从而导致在上升沿产生后再读取IO数据的话就可能出错。因此这里的程序我们按照先读取IO数据,再拉高SCLK产生上升沿的顺序。
下面我们就写1个程序,先将2013年10月8号周二12点30分00秒这个时间写到DS1302内部,让DS1302正常运行,然后在不停的读取DS1302的当前时间,并显示在我们的液晶屏上。
三 : DS1302时钟芯片资料
我们继续向CEPARKAVR的第一个终点跨进,今天是倒数第二个内容,时钟芯片DS1302。以下是DS1302的一些概述(来自ZLG文档):
DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM指示决定采用24或12小时格式。DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:(1)RES复位(2)I/O数据线(3)SCLK串行时钟。时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。DS1302工作时功耗很低保持数据和时钟信息时功率小于1mW
DS1302是由DS1202改进而来增加了以下的特性:双电源管脚用于主电源和备份电源供应,Vcc1为可编程涓流充电电源,附加七个字节存储器。它广泛应用于电话、传真、便携式仪器以及电池供电的仪器仪表等产品领域下面。将主要的性能指标作一综合:
★实时时钟具有能计算2100年之前的秒、分、时、日、星期、月、年的能力,还有闰年调整的能力
★318位暂存数据存储RAM
★串行I/O口方式使得管脚数量最少
★宽范围工作电压2.05.5V
★工作电流2.0V时,小于300nA
★读/写时钟或RAM数据时有两种传送方式单字节传送和多字节传送字符组方式
★8脚DIP封装或可选的8脚SOIC封装根据表面装配
★简单3线接口
★与TTL兼容Vcc=5V
★可选工业级温度范围-40+85
★双电源管用于主电源和备份电源供应
以上是DS1302的一些全面的预览,以下为DS1302管脚图:
四 : 时钟芯片DS1302中文资料
首页 在线计算 EDA技术 电路图库 嵌入式 经验心得 电子基础 电子制作 国外资源 技术文章 专利技术 下载频道五 : 时钟芯片DS1302的驱动程序
1 ds1302的程序,不是很简洁,占的程序空间有点长 2 3 程序: 4 5 ////////////////////////////////// 6 //根据自己的接线改管脚定义 7 sbit DS1302_cs=P1^2; 8 sbit DS1302_data=P1^1; 9 sbit DS1302_clk=P1^0; 10 sbit ACC0=ACC^0; 11 sbit ACC7=ACC^7; 12 ////////////////////////////////// 13 #define uchar unsigned char 14 #define uint unsigned int 15 16 uchar year,month,date,hour,minute,second,week;//定义变量 17 18 ////////////////////////////////// 19 //函数声明 20 oid DS1302_init();//ds1302初始化 21 void DS1302_write(unsigned char DS1302_temp); //写入一个字节 22 uchar DS1302_read(void); //读一字节 23 void DS1302_write_time(int command,int dat);//写入second or minute or hour...... or 写入一个命令 24 uchar DS1302_read_time(int command);//读取second or minute or hour...... 25 void DS1302_readdate(); 26 void DS1302_writedate(); 27 void long_ds1302_delay() //长延时 28 void short_ds1302_delay();//短延时 29 ////////////////////////////////// 30 31 32 void short_ds1302_delay() 33 { 34 uchar i; 35 for(i=0;i<5;i++); 36 } 37 38 void long_ds1302_delay() 39 { 40 uchar i; 41 for(i=0;i<25;i++); 42 } 43 44 void DS1302_write(unsigned char DS1302_temp) //写入一个字节 45 { 46 uchar i,temp; 47 long_ds1302_delay(); 48 temp=DS1302_temp; 49 for(i=0;i<8;i++) 50 { 51 DS1302_data=temp&0x01; 52 short_ds1302_delay(); 53 DS1302_clk=1; 54 short_ds1302_delay(); 55 DS1302_clk=0; 56 temp=temp>>1; 57 } 58 } 59 60 unsigned char DS1302_read(void) //读一字节 61 { 62 uchar i,temp; 63 long_ds1302_delay(); 64 temp=0; 65 for(i=0;i<8;i++) 66 { 67 temp=temp>>1; 68 if(DS1302_data==1) 69 temp=temp+0x80; 70 DS1302_clk=1; 71 short_ds1302_delay(); 72 DS1302_clk=0; 73 short_ds1302_delay(); 74 } 75 return temp; 76 } 77 /* 78 /////////写操作设置,当a=0x80时禁止写操作,a=0x00时允许//////////////// 79 80 void DS1302_write_able(unsigned char a) 81 { 82 DS1302_cs=0; 83 84 DS1302_clk=0; 85 short_ds1302_delay(); 86 DS1302_cs=1; 87 DS1302_write(0x8e); 88 DS1302_data=1; 89 DS1302_write(a); 90 DS1302_cs=0; 91 short_ds1302_delay(); 92 DS1302_clk=1; 93 } 94 95 /////////读操作设置,当a=0x80时禁止读操作,a=0x00时允许//////////////// 96 97 void DS1302_read_able(unsigned char a) 98 { 99 DS1302_cs=0; 100 101 DS1302_clk=0; 102 short_ds1302_delay(); 103 DS1302_cs=1; 104 DS1302_write(0x8f); 105 DS1302_data=1; 106 DS1302_write(a); 107 DS1302_cs=0; 108 short_ds1302_delay(); 109 DS1302_clk=1; 110 } 111 */ 112 ////////////////////ds1302初始化//////////////////////// 113 void DS1302_init() 114 { 115 uchar i; 116 DS1302_write_time(0x8e,0x00); //允许写操作 117 118 DS1302_cs=0; 119 120 DS1302_clk=0; 121 short_ds1302_delay(); 122 DS1302_cs=1; 123 DS1302_write(0x81); 124 DS1302_data=1; 125 i=DS1302_read(); 126 DS1302_cs=0; 127 short_ds1302_delay(); 128 DS1302_clk=1; 129 second=((i>>4)&0x07)*10+(i&0x0f); 130 131 DS1302_clk=0; 132 short_ds1302_delay(); 133 DS1302_cs=1; 134 DS1302_write(0x80); 135 DS1302_data=1; 136 DS1302_write(0x7f&i); 137 DS1302_cs=0; 138 short_ds1302_delay(); 139 DS1302_clk=1; 140 141 DS1302_clk=0; //充电设置 142 short_ds1302_delay(); 143 DS1302_cs=1; 144 DS1302_write(0x90); 145 DS1302_data=1; 146 // DS1302_write(0xa6); //允许充电,一个二极管 4k电阻 147 DS1302_write(0x00); //禁止充电 148 DS1302_cs=0; 149 short_ds1302_delay(); 150 DS1302_clk=1; 151 152 DS1302_write_time(0x8e,0x80); //禁止写操作 153 } 154 155 unsigned char DS1302_read_time(int command)//读取second or minute or hour...... 156 { 157 uchar i; 158 DS1302_clk=0; 159 short_ds1302_delay(); 160 DS1302_cs=1; 161 DS1302_write(command); 162 DS1302_data=1; 163 i=DS1302_read(); 164 DS1302_cs=0; 165 short_ds1302_delay(); 166 DS1302_clk=1; 167 return i; 168 } 169 void DS1302_readdate() 170 { 171 uchar i; 172 DS1302_cs=0; 173 174 //读取second 175 i=DS1302_read_time(0x81); 176 second=((i>>4)&0x07)*10+(i&0x0f); 177 178 //读取分minute 179 i=DS1302_read_time(0x83); 180 minute=((i>>4)&0x07)*10+(i&0x0f); 181 182 //读取时hour 183 i=DS1302_read_time(0x85); 184 hour=((i>>4)&0x03)*10+(i&0x0f); 185 186 //读取日date 187 i=DS1302_read_time(0x87); 188 date=((i>>4)&0x03)*10+(i&0x0f); 189 190 //读取月份month 191 i=DS1302_read_time(0x89); 192 month=((i>>4)&0x01)*10+(i&0x0f); 193 194 //读取周week 195 i=DS1302_read_time(0x8b); 196 week=i&0x07; 197 198 //读取年份year 199 i=DS1302_read_time(0x8d); 200 year=((i>>4)&0x0f)*10+(i&0x0f); 201 } 202 203 204 void DS1302_write_time(int command,int dat)//写入second or minute or hour...... or 写入一个命令 205 { 206 DS1302_clk=0; 207 short_ds1302_delay(); 208 DS1302_cs=1; 209 DS1302_write(command); 210 DS1302_data=1; 211 DS1302_write(dat); 212 DS1302_cs=0; 213 short_ds1302_delay(); 214 DS1302_clk=1; 215 } 216 217 void DS1302_writedate() 218 { 219 220 DS1302_write_time(0x8e,0x00); //允许写操作 221 DS1302_cs=0; 222 DS1302_write_time(0x80,0x7f&(((second/10)<<4)+(second%10))); //写second 223 DS1302_write_time(0x82,0x7f&(((minute/10)<<4)+(minute%10))); //minute 224 DS1302_write_time(0x84,0x3f&(((hour/10)<<4)+(hour%10))); //hour 225 DS1302_write_time(0x86,0x3f&(((date/10)<<4)+(date%10))); //date 226 DS1302_write_time(0x88,0x1f&(((month/10)<<4)+(month%10))); //month 227 DS1302_write_time(0x8a,0x07&week); //week 228 DS1302_write_time(0x8c,((year/10)<<4)+(year%10)); //year 229 DS1302_write_time(0x8e,0x80); //禁止写操作 230 }本文标题:时钟芯片ds1302-时钟芯片DS1302中文资料
61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1