DS1302目录
一、DS1302简介
RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片。现在流行的串行时钟电路很多,如DS1302、 DS1307、PCF8485等。
DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片 。主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
引脚定义与推荐电路
DS1302的引脚排列,其中Vcc2为主电源,VCC1为后备电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。 R S T ‾ \overline{RST} RST是复位/片选线,通过把 R S T ‾ \overline{RST} RST输入驱动置高电平来启动所有的数据传送。
引脚名 | 作用 |
---|---|
VCC2 | 主电源 |
VCC1 | 备用电池 |
GND | 电源地 |
X1、X2 | 32.768KHz晶振 |
R S T ‾ \overline{RST} RST | 芯片使能 |
IO | 数据输入/输出 |
SCLK | 串行时钟 |
二、芯片手册
1.操作寄存器的定义
1、秒寄存器(80H和81H)的位7 (CH)为时钟暂停标志。
CH为0时,时钟振荡停止;
CH为1时,时钟开始运行。
2、控制寄存器(8EH 和8FH)的位7 (WP)为写保护位。
WP为0时,可对任何的时钟或RAM寄存器进行写操作;
WP为1时,禁止对任一寄存器进行写操作。
2.时序定义
dc1302.c
c
#include <STC15F2K60S2.H>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SCK=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
RST=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SCK=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
RST=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SCK=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SCK=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
return (temp);
}
ds1302.h
c
#ifndef __DS1302_H
#define __DS1302_H
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
#endif
三、蓝桥杯实践
*将ds1302.c文件中改写成_nop_();nop ();nop ();nop ();nop ();nop ();nop ();nop();
c
void Init_Ds1302(uchar hour,uchar min,uchar sec)
{
Write_Ds1302_Byte(0x8e,0x00); //关写保护,不然无法写数据
Write_Ds1302_Byte(0x80,(sec/10)*16+sec%10);
Write_Ds1302_Byte(0x82,(min/10)*16+min%10);
Write_Ds1302_Byte(0x84,(hour/10)*16+hour%10);
Write_Ds1302_Byte(0x8e,0x80); //开启写保护
}
void Get_Ds1302()
{
miao = Read_Ds1302_Byte(0x81);
fen = Read_Ds1302_Byte(0x83);
shi = Read_Ds1302_Byte(0x85);
shi = (shi>>4)*10+(shi&0x0f);
fen = (fen>>4)*10+(fen&0x0f);
miao = (miao>>4)*10+(miao&0x0f);
}
调用说明:设置初始时间为8:30:00->Init_Ds1302(08,30,00);