新闻  |   论坛  |   博客  |   在线研讨会
单片机常用器件驱动及应用实例----DS1302
tvb2058 | 2007-09-16 15:27:08    阅读:13327   发布文章

单片机常用器件驱动及应用实例

                                                                                            

1 DS1302 简介:

DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如1所示及内部结构如2所示DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。

1   DS1302的外部引脚分配

 

2   DS1302的内部结构

      

各引脚的功能为:

       Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2DS1302供电,当Vcc2< Vcc1时,由Vcc1DS1302供电。

       SCLK:串行时钟,输入; 

       I/O:三线接口时的双向数据线;

       CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。

    DS1302有下列几组寄存器:

① DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch),存放的数据格式为BCD码形式,如3所示。

 

图 3   DS1302有关日历、时间的寄存器

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

    秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。

控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。

   DS1302有关RAM的地址

    DS1302中附加31字节静态RAM的地址如图4所示。

 

图4

③ DS1302的工作模式寄存器

所谓突发模式是指一次传送多个字节的时钟信号和RAM数据。突发模式寄存器如图5所示。

图5

④此外,DS1302还有充电寄存器等。

 

2 读写时序说明

DS1302SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。

       要想与DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如图6。

图6   控制字(即地址及命令字节)

 

控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。

6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;

5至位1A4A0):指示操作单元的地址;

0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。

控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。数据读写时序如图7

7   数据读写时序

 

   具体操作见驱动程序。

 

3 电路原理图:

电路原理图如图8DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟引脚、I/O串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计时脉冲。

 

8

 

4 驱动程序

 

//寄存器宏定义

#define WRITE_SECOND              0x80

#define WRITE_MINUTE        0x82

#define WRITE_HOUR                   0x84

#define READ_SECOND                0x81

#define READ_MINUTE                 0x83

#define READ_HOUR                     0x85

#define WRITE_PROTECT             0x8E

 

//位寻址寄存器定义

sbit ACC_7 = ACC^7;

//管脚定义

sbit SCLK = P3^5;                   // DS1302时钟信号         7

sbit DIO= P3^6;                      // DS1302数据信号         6

sbit CE = P3^7;                        // DS1302片选                 5

 

//地址、数据发送子程序

void Write1302 ( unsigned char addr,dat )    

{

       unsigned char i,temp;

       CE=0;                         //CE引脚为低,数据传送中止

       SCLK=0;                    //清零时钟总线

       CE = 1;                       //CE引脚为高,逻辑控制有效

       //发送地址

       for ( i=8; i>0; i-- ) //循环8次移位

       {    

              SCLK = 0;

              temp = addr;

              DIO = (bit)(temp&0x01);          //每次传输低字节

              addr >>= 1;                //右移一位

              SCLK = 1;

       }

      

//发送数据

       for ( i=8; i>0; i-- )

       {    

              SCLK = 0;

              temp = dat;

              DIO = (bit)(temp&0x01);         

              dat >>= 1;                  

              SCLK = 1;

       }

       CE = 0;        

}

 

//数据读取子程序

unsigned char Read1302 ( unsigned char addr )

{

       unsigned char i,temp,dat1,dat2;

       CE=0;          

       SCLK=0;            

       CE = 1; 

       //发送地址

       for ( i=8; i>0; i-- )                      //循环8次移位

       {    

              SCLK = 0;

              temp = addr;

              DIO = (bit)(temp&0x01);          //每次传输低字节

              addr >>= 1;                              //右移一位

              SCLK = 1;

       }

       //读取数据

       for ( i=8; i>0; i-- )

       {

              ACC_7=DIO;

              SCLK = 0;

             ACC>>=1;

              SCLK = 1;

       }    

       CE=0;

       dat1=ACC;

       dat2=dat1/16;                           //数据进制转换

       dat1=dat1%16;                         //十六进制转十进制

       dat1=dat1+dat2*10;

       return (dat1);

}

 

//初始化DS1302

void Initial(void)   

{

       Write1302 (WRITE_PROTECT,0X00);         //禁止写保护

       Write1302 (WRITE_SECOND,0x56);          //秒位初始化

       Write1302 (WRITE_MINUTE,0x34);         //分钟初始化

       Write1302 (WRITE_HOUR,0x12);                     //小时初始化

       Write1302 (WRITE_PROTECT,0x80);                 //允许写保护

}

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
rocysongSZ  2011-06-06 21:43:23 

2,Cylinder 2*6,3*8;【32.768KHz / 6pF】5ppm,10ppm,20ppm 以上! 晶帆电子有限公司 宋生 135 3012 9637 QQ 1491455048 [email]Xtalbanner@yeah.net

rocysongSZ  2011-06-06 21:41:50 

晶帆电子有限公司 专注偏门、工业级石英晶振供应与技术支持,我们与客户同在共创未来。 我们常备的现货如下,欢迎查询: 1,工作温度[工业级]:-40~85度,频率:12MHz,24MHz,25MHz,27MHz ,封装形式:49S,2*6,3*8; 2,Cylinder 2*6,3*8;【32.768KHz / 6pF】5ppm,10ppm,20ppm 3,Wireless Modules : 【ADI, Nordic,Ti,Silicon labs,Ubec,AMICCOM】 11.0592MHz,19.2MHz,19.68MHz,16MHz ,26Mhz ,30MHz ,32MHz ,24MHz ...封装形式:SMD5032,3225 4,RFID NXP方案用 27.12Mhz , 封装形式:49S,3*8,6035,5032等等 5,GPS Modules 用TCXO, 16.367667MHz,16.368Mhz,16.369Mhz,封装形式:5032,4025,3225 6,有源差分晶体振荡器(LVDS,LV-PECL输出),频率范围:30MHz~800MHz; LVDS器件主要用途为:电缆或PCB传输(点对点)、总线传输(BLVDS)、平板显示器(FPD) 【KHz晶振系列】 32.768KHz,40KHz, 40.003KHz,60KHz,60.003KHz,75KHz,76.8KHz,77.503KHz,102KHz,150KHz,【6pF/12pF/12.5pF, 5PPM,10PPM,20PPM】 以上! 晶帆电子有限公司 宋生 135 3012 9637 QQ 1491455048 [email]Xtalbanner@yeah.net

郁 [ 匿名]  2008-09-04 20:24:47 

程序有没有通过硬件调试?

林少鹏 [ 匿名]  2008-04-16 22:20:52 

读写地址不一致??

[ 匿名]  2008-04-06 16:11:25 

[ 匿名]  2007-12-13 20:53:45 

[ 匿名]  2007-11-12 19:36:06 

不错,顶一个,

推荐文章
最近访客