ds1302时序图
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uchar read_ds1302(uchar add);
//从 ds1302 的 add 读出一个数据
void set_time(uchar *time);
//设置 ds1302 的初值即写入时间
void read_time();
//读 ds1302 的时间以字符形式放在 R_time[14]中
void delay(uint z);
return(temp);
}
/*设置时间即写入时间*/
voidset_time(uchar *time)
{
uchari,add,temp;
write_ds1302(0x8e,0x00);
for(i=0,add=0x8c;i<7;i++,add-=2) //将十进制转换为 BCD 码
{
temp=time[i]/10;
5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电
方式,提供了对后背电源进行涓细电流充电的能力。DS1302 的外部
引脚分配如图 1 所示及内部结构如图 2 所示。DS1302 用于数据记录,
特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该
数据的时间同时记录,因此广泛应用于测量系统中。
{
if(('0'<=str1[i])&&(str1[i]<='9'))
{
str1[i++]=R_time[j];
j++;
}
else
i++;
}
i=i+2;
str1[i]=temp;
//str1 中加星期
for(i=0,j=j+2;i<8;)
//str2[]中装入时分秒格式为 20:20:20
{
if(('0'<=str2[i])&&(str2[i]<='9'))
//11.0592m 1ms
void write_com(uchar com);
//向 1602 写入一个命令
void write_date(uchar date);
//向 1602 写入一个数据
void L1602_init();
//1602 初始化
void L1602_char(ucharhang,ucharlie,uchar sign); //在 1602 第 hang 行第 lie 列显示 sign
//算出十位
}
}
void L1602_init()
{
EN=0; write_com(0x38); //开显示点阵 write_com(0x01); //清屏 write_com(0x0e); //0000 1DCB 开显显标闪烁 write_com(0x06); //0000 01NS 指针光标加一整屏不移动 // write_com(0xd0); } void L1602_char(ucharhang,ucharlie,uchar sign) { uchar L1602_a; if(hang==1)
个功能:第一,CE 开始控制字访问移位寄存器的控制逻辑;其次,CE 提供结束单字节或
多字节数据传输的方法。
DS1302 有下列几组寄存器:
DS1302 ①有关日历、时间的寄存器共有 12 个,其中有 7 个寄存器
(读时 81h~8Dh,写时 80h~8Ch),存放的数据格式为 BCD 码形式,
如
图
3
IO=date&0x01; //输入低位
date=date>&g
//上升沿写入
}
}
/*向地址 add 写入数据 dat*/
void write_ds1302(ucharadd,uchardat)
{
RST=0;
SCLK=0;
RST=1;
write_ds1302_byte(add);
voidzhuan_h();
uchar str1[]="00-00-00 0";
uchar str2[]="00:00:00 ";
void main()
{
// set_time(time);
L1602_init();
while(1)
{
read_time();
zhuan_h();
L1602_string(1,3,str1);
各
引
脚
的
功
能
为
:
Vcc1:主电源;Vcc2:备份电源。当 Vcc2>Vcc1+0.2V 时,
由 Vcc2 向 DS1302 供电,当 Vcc2< Vcc1 时,由 Vcc1 向 DS1302 供电。
SCLK:串行时钟,输入,控制数据的输入与输出;
I/O:三线接口时的双向数据线;
CE:输入信号,在读、写数据期间,必须为高。该引脚有两
/*****************************************
// Header: main 文件
// File Name: 时钟 ds1302 与 lcd1602
// Author: 林永福
// Date:
2011-11-03
/****************************************/
//取十位
time[i]=time[i]%10+temp*16;
//整合为 BCD 码
write_ds1302(add,time[i]);
//向一个时间寄存器写入一个数据
}
write_ds1302(0x8e,0x80);
}
/*读出时间以字符形式放在数组 R_time[14]中*/
voidread_time()
L1602_string(2,4,str2);
}
}
voidzhuan_h()
{
uchari,j,temp;
temp=R_time[3];
//把周先调出来
for(i=2;i<6;i++)
//把月日往数组左调
R_time[i]=R_time[i+2];
for(i=0,j=0;i<8;)
//str1[]中装入年月日格式为 11-11-03
控制字总是从最低位开始输出。在控制字指令输入后的下一个
SCLK 时钟的上升沿时,数据被写入 DS1302,数据输入从最低位(0
位)开始。同样,在紧跟 8 位的控制字指令后的下一个 SCLK 脉冲的
下降沿,读出 DS1302 的数据,读出的数据也是从最低位到最高位。
数
据
读
写
时
序
如
图
7
。
具体操作见驱动程序。
str2[i++]=R_time[j++];
else
i++;
}
}
/*向 ds1302 写入一个字节 date*/
void write_ds1302_byte(uchar date)
{
uchar i;
for(i=0;i<8;i++) //写入八位从低位到高位
{
SCLK=0;
//SCLK 为低时准备数据
L1602_a=0x80+lie-1; else
L1602_a=0xc0+lie-1; write_com(L1602_a); for(;;s++)
{ if(*s=='\0') break; write_date(*s);
} }
voidwrite_com(uchar com) {
RS=0; RW=0; P0=com; delay(1); EN=1; delay(5); EN=0; } voidwrite_date(uchar date) { RS=1; RW=0; P0=date; delay(1); EN=1; delay(5); EN=0; } void delay(uint z) { uchar x; for(;z>0;z--)
for(i=0;i<8;i++) //读出八位数据从低位到高位
{
temp=temp>>1; //将前一下降沿读出的数据右移一位
SCLK=0;
//下降沿之后就可以读出数据
if(IO)
//读出数据
temp=temp|0x80;
SCLK=1;
}
RST=0;
SCLK=1;
//释放时钟线
IO=1;
//释放 IO 线
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsignedint
void write_ds1302_byte(uchardat); //向 ds1302 写入一个字节
void write_ds1302(ucharadd,uchardat);//向 ds1302 的 add 写入一个数据
DS1302 ②有关 RAM 的地址 DS1302 中附加 31 字节静态 RAM
DS1302 ③的工作模式寄存器 所谓突发模式是指一次传送多个字节的时钟信号和 RAM 数据。 突发模式寄存器如图 5 所示。 图5 ④此外,DS1302 还有充电寄存器等。
2 读写时序说明
DS1302 是 SPI 总线驱动方式。它不仅要向寄存器写入控制字, 还需要读取相应寄存器的数据。 要想与 DS1302 通信,首先要先了解 DS1302 的控制字。 DS1302 的控制字如图 6。
L1602_a=0x80+lie-1; else
L1602_a=0xc0+lie-1; write_com(L1602_a); write_date(sign); } void L1602_string(ucharhang,ucharlie,uchar *s) { uchar L1602_a; if(hang==1)
图 7 数据读写时序
3 电路原理图: 电路原理图如图 8, DS1302 与单片机的连接也仅需要 3 条线: CE 引脚、 SCLK 串行时钟引脚、I/O 串行数据引脚,Vcc2 为备用电源,外接 32.768kHz 晶振,为芯片提供计时脉冲。
这里有个 ds1302 结合 LCD1602 的程序可以参考一下
write_ds1302_byte(dat);
RST=0;
SCLK=1;
IO=1;
}
/*从地址 add 读出数据*/
uchar read_ds1302(uchar add)
{
uchari,temp;
RST=0;
SCLK=0;
RST=1;
write_ds1302_byte(add); //写入要读的地址
void L1602_string(ucharhang,ucharlie,uchar *s); //在 1602 第 hang 行第 lie 列开始显示*s
sbit RS=P2^5;
//1602 的数据/命令选择端
sbit RW=P2^6;
//1602 的读/写选择端
sbit EN=P2^7;
//1602 的使能端
sbit SCLK = P1^6; /*实时时钟时钟线引脚 */
sbit IO = P3^5; /*实时时钟数据线引脚 */
sbit RST = P1^7; /*实时时钟复位线引脚 */
uchar i;
uchar time[]={11,4,11,3,20,16,9};//初值年周月日时分秒
ucharR_time[14];
所
示
。
图
3
DS1302 有 关 日 历 、 时 间 的 寄 存 器
小时寄存器(85h、84h)的位 7 用于定义 DS1302 是运行于 12 小时 模式还是 24 小时模式。当为高时,选择 12 小时模式。在 12 小时模式时, 位 5 是,当为 1 时,表示 PM。在 24 小时模式时,位 5 是第二个 10 小时 位。 秒寄存器(81h、80h)的位 7 定义为时钟暂停标志(CH)。当该 位置为 1 时,时钟振荡器停止,DS1302 处于低功耗状态;当该位置为 0 时,时钟开始运行。 控制寄存器(8Fh、8Eh)的位 7 是写保护位(WP),其它 7 位均置 为 0。在任何的对时钟和 RAM 的写操作之前,WP 位必须为 0。当 WP 位为 1 时,写保护位防止对任一寄存器的写操作。
{
uchari,j,add,temp;
for(i=0,j=0,add=0x8d;i<7;i++,add-=2)//从年往下读
{
temp=read_ds1302(add);
//读出一个时间寄存器的数据
R_time[j++]=temp/16+0x30;
//算出个位
R_time[j++]=temp%16+0x30;
控制字的最高有效位(位 7)必须是逻辑 1,如果它为 0,则不能把
数据写入到 DS1302 中。
位 6:如果为 0,则表示存取日历时钟数据,为 1 表示存取 RAM 数
据;
位 5 至位 1(A4~A0):指示操作单元的地址;
位 0(最低有效位):如为 0,表示要进行写操作,为 1 表示进行读
操作。
1 DS1302 简介:
DS1302 是美国 DALLAS 公司推出的一种高性能、低功耗的实时
时钟芯片,附加 31 字节静态 RAM,采用 SPI 三线接口与 CPU 进行
同步通信,并可采用突发方式一次传送多个字节的时钟信号和 RAM
数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与
31 天时可以自动调整,且具有闰年补偿功能。工作电压宽达 2.5~