- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
DS1302实现时钟
实验目的:
了解DS1302的结构及工作原理;
理解DS1302的寄存器;
掌握DS1302的读/写时序;
利用DS1032实现时钟功能。
实验原理:
DS1302的工作电压为2.5~5.5V,采用的是三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据,DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。其内部结构如下:
DS1302串行时钟由电源、输入移位寄存器、命令控制逻辑、振荡器、实时时钟以及RAM组成。
DS1302的控制字的最高有效位(D7)必须是逻辑1;如果它为0,则不能把数据写入DS1302中。D6如果为0,则表示存取日历时钟数据;为1表示存取RAM数据。D5~D1指示操作单元的地址。最低有效位(D0)如果为0表示进行写操作,为1表示进行读操作,控制字总是从最低位开始输出。
值得注意的是:在单片机从DS1302中读取数据时,从DS1302输出的第一个数据位发生在紧接着单片机输出的命令字节最后一位的第一个下降沿处;而且在读操作过程中,要保持RST时钟为高电平状态。当有额外的SCLK时钟周期时,DS1302将重新发送数据字节,这一输出特性使得DS1302具有多字节连续输出的能力。
在控制指令字输入之后下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即D0开始。同样,在紧跟8位控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位D0至高位D7。
下面为DS1302的单字节读/写时序图:
DS1302有12个寄存器,其中七个寄存器与日历、时钟相关,存放的数据位为BCD码形式。其日历、时间寄存器及其控制字如下表:
日历、时钟寄存器与控制字的对照表
可一次性顺序读/写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
实验原理图
实验程序:
/*****************************必要的变量声明***********************/
#includereg51.h
#define uint unsigned int
#define uchar unsigned char
sfr S2CON=0x9A; //在51单片机程序中没有,STC单片机程序中要加上
sfr S2BUF=0x9B; //在51单片机程序中没有,STC单片机程序中要加上
sbit ACC0=ACC^0; //取累加器的第一位单独操作
sbit ACC7=ACC^7; //取累加器的第八位单独操作
sbit scl=P0^2; //DS1302串行时钟控制位
sbit io=P0^1; // DS1302的I/O数据线
sbit RST=P0^0; // DS1302复位端控制位
uchar tab[6];
uchar a[7]={0x40,0x59,0x11,0x11,0x02,0x06,0x06};
uchar code table[10]={0x88,0Xbe,0Xc4,0X94,0Xb2,0X91,0X81,0Xbc,0X80,0X90}; //0~9
/*********************长延时子程序*******************/
void delay(uint z)
{
uint x,y;
for(x=z;x0;x--)
for(y=110;y0;y--);
}
/********************短延时子程序********************/
void DEL(uint z)
{
uint x,y;
for(x=z;x0;x--)
for(y=3;y0;y--);
}
/*********************写数据子程序*******************/
void write_byte(uchar date)
{
uchar i;
ACC=date;
for(i=8;i0;i--)
{
io=ACC0; //将累加器的第一位赋值给I/O口数据线
scl=1;
scl=0;
ACC=ACC1; //右移一位
}
}
/*********************读数
文档评论(0)