DS1302通过3根线与MCU连接串行数据发送,接收时钟信号由MCU发送,可外接备用电池以便主电源断电后不丢失数据,并可编程对备用电源充电。
DS1302的结构如下:
外部结构:
内部结构:
对DS1302的操作一般只有两种:读数据和写数据
读数据即读出芯片RAM中的日期,时间等信息,写数据即修改这些信息。
数据的读写是以字节为单位操作的,
读操作函数要完成的功能便是传入一个一字节表示特定的地址,函数返回该地址RAM中一字节或多字节的数据。
写操作函数需要传入两个参数:地址和要写的数据;函数将要写的一字节数据写入给定的地址。
对于同一个内容,读和写通过地址中一个标志位来区分,因此表现出来就是读和写的地址不一样,这样芯片通过地址来区分你是要还是要写;例如读秒的地址是0x81,而写秒的地址是0x80;
因此我们首先就要写读数据和写数据的两个函数:
首先要分析读操作的时序:
CE,SCLK,I/O是单片机与DS1302连接的三条线,要进行读操作,首先把CE和SCLK置0,准备读数据。
CE是使能信号,只有他为高才能进行操作。读数据操作实际上是先写后读的操作,因为要先写入地址,然后读该地址的数据。图中带箭头的脉冲跳变表示起作用的脉冲跳变,因此读数据时上升沿有效,即SCLK从0变1的瞬间,I/O线上的数据就会被写入DS1302。而读出是下降沿有效,即DS1302会在每个下降沿的时候修改数据线上的数据,因此,从此刻到下一个下降沿的这段时间内,MCU读数据线上的数据都是正确的。
要注意MCU写完一个字节后第一个下降沿DS1302就开始送出数据了读写都是从低位到高位。
所以就可以写程序了:
/********读DS1302,1字节**********/
uchar DS1302Read(uchar add)
{ uchar a, d=0;
TCE = 0;
TCLK = 0;
TCE=1;
for(a=0; a<8; a++) //发送控制字节
{
TCLK=0;
TIO= add & 0x01;
TCLK=1;//制造上升沿
add>>=1;
}
for(a=0; a<8; a++) //读1字节数据
{
TCLK=1;
d >>= 1;//右移1位
TCLK=0;//制造下降沿
if(TIO) {//如果读到1
d |= 0x80;//把最高位置1
}
}
TCE=0; //拉低TCE
//return dec(d); //读取的数据转换成十进制
return d;
}
写数据简单,一次性把两个字节全部写进去就行了:
写数据程序:
/*******向DS1302写入一字节数据*********/
void DS1302Write(uchar add,uchar d)
{
uchar a;
//d = hex(d); //转换为BCD码
TCE=0; //拉低TCE引脚,终止数据传输
TCLK=0; //拉低TCLK引脚,清零时钟线
TCE=1; //拉高TCE引脚,所有数据传输都要拉高TCE脚,启动控制逻辑
//先写入控制字节
for(a=0; a<8; a++)
{
TIO= add & 0x01; //TIO引脚准备好要写入的1位数据
TCLK=1; //TCLK上升沿,1位数据从TIO脚写入,低位先写入
add>>=1; //数据右移1位
TCLK=0; //拉低TCLK,为下次写入准备,循环8次写入1字节
}
//再写入数据字节
for(a=0; a<8; a++)
{
TIO= d & 0x01;
TCLK=1;
d>>=1;
TCLK=0;
}
TCE=0; //数据传输完拉低TCE
}
有了读数据和写数据功能,就成功了一半了,接下来就是要搞懂每个地址所对应数据的结构和含义:
首先是与时间有关的,一般也就操作这些寄存器就可以读写时间。
前两栏是地址,后面是各位所代表的含义:例如秒寄存器的最后一位bit7叫CH表示暂停时钟的,比如说用代码:
write1302(0x80,0x80) //写1000 0000
这样就把地址为0x80寄存器的CH位置为1,其他位为0,这样的操作就使时钟暂停了,并且秒也置为0;
但是单这样操作是不能修改数据的,DS1302只有地址为0x8e的WP即写保护开关可以随意修改,其他数据要在写保护开关关闭时才能写,如:
write1302(0x8e,0x00)//关闭写保护
write1302(0x80,0x01)//秒置为1
write1302(0x8e,0x80)//打开写保护
另外使用寄存器0xbf/0xbe可以批量读写数据:
如果备用电池是充电电池或者电容,可以通过寄存器90h设置涓流充电二极管(1~2个)和电阻(2k,4k,8k)可选,
要充电的话高四位必须是1010,低四位选择二极管和电阻:
控制方式:
只有这六种控制方式,只要不在这六中之内,则断电。
从表中可以看到,我们从寄存器取得的时分秒等信息不能直接使用,因为它的高四位一般代表一位代表10,而低四位代表1,也就是用BCD码表示的。如代表年的寄存器高四位以为就代表10年,而第四位只代表1年,所以在写入的时候和读取的时候还要做一些转换。
#define hex(dat) (dat / 10 * 16 + (dat % 10)) //十进制转BCD码
#define dec(dat) ((dat >> 4)* 10 + (dat & 0x0f)) //BCD码转十进制
所以,如果要在秒寄存器中写入23,可以直接写入0x23,
也可以使用上面写的预处理函数hex(23),效果一样(hex(23)的作用就是把23转换成0x23)。
- 大小: 42.8 KB
- 大小: 24.7 KB
- 大小: 40.1 KB
- 大小: 26.2 KB
- 大小: 27.5 KB
- 大小: 94.4 KB
- 大小: 6.4 KB
- 大小: 64.4 KB
- 大小: 38.1 KB
- 大小: 83 KB
分享到:
相关推荐
本文将深入探讨如何使用51单片机驱动DS1302时钟芯片,以及相关的keil工程文件和C源代码。DS1302是一款低功耗、高性能的实时时钟(RTC)芯片,它能够精确地跟踪时间,并提供日期和时间的存储功能。 首先,DS1302芯片...
本文将深入探讨如何使用51单片机、DS1302时钟芯片以及12864液晶显示器来构建一个功能完善的万年历系统。 51单片机是Intel公司开发的8051系列单片机的一种,以其易用性和广泛的硬件支持而著名。它内部集成了CPU、RAM...
电子万年历毕业设计(基于AT89C51单片机和DS1302时钟芯片) 根据给定的文件信息,本文将从给定的文件的标题、描述、标签和部分内容中生成相关知识点。下面是生成的知识点: 电子万年历毕业设计概述 电子万年历...
本文将详细讲解如何利用51单片机控制DS1302时钟芯片,并在LCD1602液晶显示屏上实现实时时钟的显示。 首先,DS1302是一款低功耗、高性能的实时时钟(RTC)芯片,它能够提供精确的时间信息,包括年、月、日、星期、...
通过本实例的分析,我们可以了解到如何利用51单片机配合DS1302时钟芯片和共阴数码管制作一个简易的数字时钟。从电路设计、程序编写到最终的调试验证,每一个环节都是开发过程中不可或缺的部分。通过这个实例,初学者...
51单片机 时钟芯片 ds1302 控制 有一定的程序描述,可以学习使用DS1302
电子万年历毕业设计(基于AT89C51单片机和DS1302时钟芯片) 本文档是关于电子万年历毕业设计的论文,基于AT89C51单片机和DS1302时钟芯片。该设计主要使用STC89C52RC单片机作为主控核心,并使用DS1302时钟芯片提供...
基于51系列单片机与DS1302时钟芯片的电子时钟C语言Proteus仿真报告 本报告从基于51系列单片机与DS1302时钟芯片的电子时钟的设计与实现出发,详细介绍了电子时钟的设计思想、硬件选择、电路设计、软件设计、仿真与...
电子万年历设计基于AT89C51单片机和DS1302时钟芯片 本文介绍了基于AT89C51单片机设计的电子万年历。以AT89C51单片机作为主控核心,与时钟芯片DS1302、按键、LED显示等模块组成硬件系统。在硬件系统中设有独立按键和...
在这个项目中,51单片机被用于控制DS1302实时时钟芯片,实现时间和日期的显示与管理功能。 DS1302是一款低功耗、高性能的串行实时时钟,能够提供精确的时间信息,包括小时、分钟、秒、年、月、日等。它通过三线接口...
【51单片机 DS1302时钟】是一种基于51系列单片机的实时时钟系统,其中DS1302是一款常见的串行实时时钟芯片。本文将详细探讨51单片机与DS1302的集成应用,以及相关的设计原理和编程方法。 DS1302是一款低功耗、高...
总结来说,基于51单片机的DS1302时钟仿真设计涵盖了51单片机的硬件接口设计、DS1302时钟芯片的使用、单片机编程以及仿真验证等多个方面。通过这个项目,学习者可以深入理解微控制器的I/O操作、实时时钟芯片的应用...
本程序还有三个子程序,分别为Key.c,LCD1602.c和DS1302.c,分别代表按键控制、LCD1602液晶屏和DS1302时钟芯片。直接运行main.c即可。 如果无法运行,请验证二个事项: 1.是否已安装LCD1602 2.是否已连接DS1302(我...
基于51单片机与DS1302时钟芯片和LCD1602液晶显示的数字时钟.doc
关键词:proteus仿真、51单片机、DS1302时钟芯片、DB18B20温度芯片、AT24C02_51MCU_stc89C52_ProjectDB18B20温度芯片、AT24C02_51MCU_stc89C52_Project.zip
【电子万年历设计基于AT89C51单片机和DS1302时钟芯片】 电子万年历是一种现代计时装置,代表了钟表行业的第三次革命,其精度远超传统的机械钟表和石英钟。电子万年历通过单片机数码计时技术,提供精确到1/600万秒的...