
DS实时时钟芯片.doc
8页DS1302 实时时钟芯片实时时钟芯片DS1302 简简介介DS1302是美国 DALLAS 公司推出的一种高性能、低功耗能提供涓流充电的时钟芯片内含一个实时时钟/日历和 31 个字节的静态 RAM,采用 SPI 三线接口与 单片机进行同步通信实时时钟可以对年、月、日、周、日、时、分、秒进行 计时,一个月小于 31 天时可以自动调整,且具有闰年补偿功能DS1302 是 DS1202 的升级产品,与 DS1202 兼容,但增加了主电源/后备电源双电源引脚, 同时提供了对后备电源进行涓细电流充电的能力,当主电源掉电后由后备电源 进行供电,主电源再次上电后,对后备电源进行充电 DS1302 引引脚脚功功能能实物图X1,X232.768kHz 晶振引脚 GND接地引脚 RST复位引脚 I/O数据输入/输出引脚 SCLK串行时钟引脚 VCC1后备电池引脚图3 DS1302封装图VCC2主电源引脚Vcc1、 Vcc2—DS1302 由 Vcc1 或 Vcc2 两者中的较大者供电当 Vcc2 大于 Vcc1+0.2V 时,Vcc2 给 DS1302 供电当 Vcc2 小于 Vcc1 时,DS1302 由 Vcc1 供 电。
X1 和 X2—外接 32.768kHz 晶振GND—接地 RST—在读、写数据期间,必须输入 高电平,通过把 RST 置高电平来启动所 有的数据传送 RST 输入有两种功能:首先, RST 接通控制逻辑,允许地址 /命令字节序列送入移位寄存器;其次, RST 提供终止单字节或多字节数据 的传送手段, 当 RST 为高电平时,所有的数据传送被初始化,允许对 DS1302 进行操作如果在传送过程中 RST 置为低电平,则会终止此次数据 传送上电运行时,在 Vcc>2.0V 之前,RST 必须保持低电平只有在 SCLK 为低电平时,才能将 RST 置为高电平 I/O—串行数据输入输出端 SCLK—控制数据的输入与输出 DS1302 接接线线图图注:CE 口是 RST 引脚 DS1302 的的寄寄存存器器DS1302 有关日历/时间的寄存器共有 12 个,其中有 7 个寄存器分别存储秒、分、 时、日、月、周、年的数据,数据格式为 BCD 码其读、写地址如下图:秒寄存器秒寄存器(81h、80h)的最高位(BIT 7)定义为时钟暂停标志(CH) 当该位 置为 1 时,时钟振荡器停止,DS1302 处于低功耗状态;当该位置为 0 时,时钟开始运行。
小时寄存器小时寄存器(85h、84h)的最高位(BIT 7)用于定义 DS1302 是运行于 12 小时 模式还是 24 小时模式当为高时,选择 12 小时模式,当为低时,选择 24 小时 模式在 12 小时模式时,BIT 5 位是 AM/PM 选择位,当为 1 时,表示 PM在 24 小时模式时,BIT 5 位是第二个 10 小时位 控制寄存器控制寄存器(8Fh、8Eh)的最高位(BIT 7)是写保护位(WP) ,其它位均置为 0在任何对时钟和 RAM 的写操作之前,WP 位必须为 0当 WP 位为 1 时,写保 护位禁止对任一寄存器的写操作 DS1302 有关 31 字节 RAM 的地址DS1302 的工作模式寄存器所谓突发模式是指 一次性读/写多个字节的时钟数据和 RAM 数据在时钟 突发模式下可一次性 依次读/写有关日历/时间的 8 个寄存器(从秒寄存器秒寄存器到 控制寄存器控制寄存器)的数据; 在 RAM 突发模式下 ,可一次性依次读 /写 RAM31 个字节的数据DS1302 的充电寄存器 充电寄存器要根据外围电路来设置,寄存器地址是 0x90,其高 4 位为 1010 时 充电(其他组合均不能充电) ,低 4 位的首 2 位是选择内部降压二极管的个数的, 01 代表在充电回路串入 1 个二极管,10 代表串入 2 个(注:即使高 4 位位 1010,但低 4 位的首 2 位是 00 或 11 时,充电功能被禁止) ;最后 2 位可设定串 入的电阻的数值:00 为 0 欧,01 为 2k 欧,10 为 4k 欧,11 为 8k 欧。
充电原理图如下:原理图 DS1302 的的控控制制DS1302 是 SPI 总线驱动方式它不仅要向寄存器写入控制字节,还需要读取相 应寄存器的数据 DS1302 控制字节格式如下:最高位(位 7)必须是逻辑 1,如果是 0,则不能向 DS1302 写入数据 位 6 为 0 表示存取日历/时间数据,为 1 表示存取 RAM 数据 位 5-位 1(A4-A0)表示操作单元的地址 最低位(位 0)为 0 进行写操作,为 1 进行读操作 一个完整的控制字节就是由以上内容组成由于 DS1302 只有一个 I/O 口,所以 数据是串行传输的,每次只传输一位控制字节总是从最低位开始由单片机输 出(即 DS1302 接收) 在控制字节输入后的下一个 SCLK 时钟的上升沿上升沿,数据被 写入写入 DS1302,数据的输入也是从最低位开始同样,在控制字节输入后的下一 个 SCLK 时钟的下降沿,读出下降沿,读出 DS1302 的数据,数据的读出也是从最低位开始读DS1302 读/写时序图如下:写数据读数据注意:写数据是在 SCLK 的上升沿,读数据是在 SCLK 的下降沿 DS1302 实列实列列列 1 1 用 C 语言编程, Proteus 进行仿真,用 52 单片机结合 DS1302 实时时钟芯片 在两位 数码管上显示秒的内容: 程序代码如下:#include #define uchar unsigned char #define uint unsigned int sbit ds1302_rst=P3^4; sbit ds1302_io=P3^6; sbit ds1302_sclk=P3^5; uchar code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管 0~9 的段码uint miao; /*延时函数*/void delay(uchar z) { uchar x,y; for(x=z;z>0;z--)for(y=225;y>0;y--); } /*BCD 转化成十进制*/ //因为 DS1302 时钟寄存器里的数据是以 BCD 码的形式存储 的,我们 uchar BCDtoDec(uchar bcd)//把读出的 BCD 码转化成十进制数再进行处理{ uchar c; c=((bcd return(c); } /*DS1302 写操作命令*/ void write_byte(uchar dat) //此函数向 DS1302 写入操作指令/地址 {uchar i;for(i=0;i>1;ds1302_sclk=1;} } /*向 DS1302 的某个地址写入数据*/void ds1302_write(uchar add,uchar date) { ds1302_rst=0; ds1302_sclk=0; ds1302_rst=1; write_byte(add); //调用写操作命令函数,指定将要操作的地址 write_byte(date); //再次调用写操作命令函数,向 DS1302 某地址写入数据ds1302_sclk=1; ds1302_rst=0; } /*读取 DS1302 的某地址的数据*/uchar ds1302_read(uchar add) {uchar i,value;ds1302_rst=0;delay(0);ds1302_sclk=0;delay(0);ds1302_rst=1;delay(0);write_byte(add); //调用写操作命令函数,指定将要操作的地址for(i=0;i>1;ds1302_sclk=0; if(ds1302_io)value=value|0x80;ds1302_sclk=1; }return value; } /*DS1302 的初始化*/void ds1302_init() { ds1302_rst=0; ds1302_sclk=1; ds1302_write(0x8e,0x80);//DS1302 控制寄存器的最高位 WP=1,写保护禁止写入} /*显示函数*/void display() { //秒十位P0=0xfe;P2=a[miao/10];delay(5);P0=0xfd; //秒个位P0=0xfd;P2=a[miao%10];delay(5);P0=0xff; } /*主函数*/void main() {uchar m;ds1302_init();while(1) //不断读取 DS1302 秒寄存器的数据,转换数制之后显示{m=ds1302_read(0x81);//读取秒寄存器的数据miao=BCDtoDec(m); //把秒的 BCD 码数据转换成十进制数display(); //调用显示函数,显示秒的内容} }仿真效果图如下:练习练习用 C 语言编程, Proteus 进行仿真,用 52 单片机结合 DS1302 实时时钟芯片在 六位数码管上显示时、分、秒的内容。
用 C 语言编程, Proteus 进行仿真,制作流水灯,间隔时间 为 1s,亮 500ms, 灭 500ms(尝试结合 DS1302 和外部中断 )。












