DS1307中文说明(含程序)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DS1307 时钟芯片中文资料及程序
§1:实时时钟 DS1307 简介
DS1307 是低功耗、IIC 接口、日历和时钟数据,按 BCD 码存取的时钟/日历芯片。
它提供秒、分、小时、星期、日期、月和年等时钟日历数据。
§2:引脚与接线
DS1307 典型接线如图 1 所示。
BT1 为备用电池,3V,7 脚为方波输出,通常把该脚接到单片机的能够产生电平变化中断的引脚,如设置成每秒输出1个方波,则会每秒中断一次,读取时间用以显示。
图1中的R1、R2、R4是必须的上拉电阻。
图 1 DS1307典型接线图
§3:DS1307 RAM
DS1307 寄存器统一编址,其中的时间相关的和寄器数据组织格式如表 1。
表1时间相关的寄存器说明
注:存放时的单元02的位6为12/24小时设置位,1为12时制,0为24时制。
位5为上午/
下午(AM/PM)指示位,0为上午(AM),1为下午(PM),在24时制中,该位为10倍时位。
在读写过程中DS1307内部有一个地址指针,通过写操作可对它赋值,读和写每一字节时自动加一,当指针越过DS1307内部RAM尾时指针将返回到0地址处。
DS1307 的时钟和日历数据按 BCD 码存储。
§4:方波信号输出功能
方波信号输出功能从SQW/OUT引脚输出设置频率的方波,CONTROL寄存器用于控制SQW/OUT脚的输出,其地址为07,每位的内容如表2。
表2CONTROL寄存器位
BIT7(OUT):此位表示在方波输出被禁止时(BIT4=0),SQW/OUT 引脚的逻辑电平,在BIT4=0(SQWE=0方波输出禁止)时,若BIT7(OUT)为1则SQL/OUT引脚为高电平,反之亦然。
BIT4(SQWE)方波输出允许/禁止控制位,SQWE =1 允许方波输出(有效);BIT4=0
禁止方波输出。
BIT0(RS0)、BIT1(RS1)于设定输出波形的频率,如表 3。
表 3 CONTROL寄存器说明
由于DS1307的方波输出脚为集电极开路,故要在外部加上上拉电阻!要注意的是,00h地址的第7位为器件时钟允许位(CH),此位为1则芯片未开
始工作,即时钟未走时,所以在上电时单片机要先读出秒,并判断位7(CH)是否为1,如为 1 要把该位清零写入秒寄存器(地址为 0),并把其他的时间单元设定为默认值。
如果上电复位时读出的秒的最高位CH为0,说明时钟已工作(前已对CH 清0,且停电后有备用电池),此时不能重写时间单元!
§5:IIC 时序
DS1307 在 IIC 总线上是从器件,地址固定为”11010000”
DS1307 写操作,被控接收模式主控器件按如下顺序将数据写入
到DS1307寄存器或内部RAM中:
1.S TART 信号。
2.写地址+W(0xd0)字节,DS1307应答(ACK)。
3.写1字节的内存地址(在以下步4写入的第一字节数据将存入到内该地址处),DS1307 应答。
4.写数据,可写多个字节,每一字节写入后DS1307内部地址计数器加一,DS1307应答。
5.S TOP 信号。
写DS1707就是修改时间(除写地址为7的单元外),其时序图如图2。
图2单片机对DS1307写时序图
DS1307 读操作,被控发送模式
主控器件按如下顺序将DS1307寄存器或内部RAM数据读取:
1.S TART 信号。
2.写地址+读写位0b11010001),DS1307应答(ACK)。
3.读数据,可读多个字节,读取数据的DS1307内部地址由上次写操作或读操作决定,读取每一字节数据DS1307内部地址计数器自动加一,主器件应答,读取最后一字节时主器件回应NACK信号(不应答)。
4.S TOP 信号。
读DS1307的地址0-6的内容就是读取时间,其时序图如图3。
图3单片机对DS1307读时序图
以上所说的主控器件通常为单片机。
§6:编程要点
可以按如下宏定义:
//产生起始位,检测完成起始位?
#define Start_bit\
SEN=1;\
while (SEN==1)
//停止位,检查至停止位结束
#define Stop_bit\
PEN=1;\
while (PEN==1)
//发送重复开始,确定重复开始已完成?
#define Re_start_bit \
RSEN=1;\
while(RSEN==1)
//接收使能模式,确定接收使能?
#define Receive_enable_bit
\ RCEN=1; \ while
(RCEN==1)
//自动应答,检查是否完成应答?
#define Ack_bit \
ACKDT=0; \
ACKEN=1; \ while
(ACKEN==1)
//不应答,检查是否完成无应答?
#define Not_Ack_bit
\ ACKDT=1; \
ACKEN=1; \ while
(ACKEN==1)
有了以上的宏定义,我们就可以这样写程序://写 DS1307,地址为 address,数为 data
void WRITE_DS1307(char address,char data) { Start_bit;
IIC_SEND(ADDR);
IIC_SEND(address);
IIC_SEND(data);
Stop_bit;
}
其中的ADDR定义如下:
#define ADDR 0b11010000
其中的IIC_SEND函数如下:
//发送数 R 并等待发送完成,收到从机的应答
信号 void IIC_SEND(char R)
{SSPBUF=R; //发送 while
(RW==1);
while (SSPIF==0);//等待发送完成
while (ACKSTAT==1);//等待从机发送应答信号
NOP();
}
而读DS1307则可如下:
//读 DS1307,读出的结果在 AAAA[],初始地址为 START_ADDR,要读的数字
节数为 n //当 START_ADDR=0,n=7 时为时间
void READ_DS1307(char START_ADDR,char n)
{ char i;
Start_bit;
IIC_SEND(ADDR); //写寄存器地址
IIC_SEND(START_ADDR); //设定寄存器初始
地址 Stop_bit;
NOP();
Re_start_bit;
IIC_SEND(ADDR+1);//最后低位为 1 表示读
for (i=0;i<n;i++)//共年个数
{ Receive_enable_bit;
AAAA[i]=SSPBUF; //读 1 字
节 if (i<n-1)
{Ack_bit;}
else
{Not_Ack_bit;} //最后一字节不应答
}
Stop_bit;
}
关于IIC接口编程,详见《PIC16系列单片机C程序设计与PROTEUS仿真》中的第四章和第六章。