DS1302中文资料

?----------------------- Page 1-----------------------

DS1302中文资料
DS1302中文资料
DDSS11330022中中文文资资料料

DS1302 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时

时钟/日历和31字节静态RAM

可通过简单的串行接口与单片机进行通信

可提供:

--秒分时日日期月年的信息

--每月的天数和闰年的天数可自动调整

--可通过AM/PM 指示决定采用24 或12小时格式

--保持数据和时钟信息时功率小于1mW

----------------------- Page 2-----------------------

DS1302引脚
DS1302引脚
DDSS11330022引引脚脚

X1X232.768KHz 晶振管脚

GND地

CE 复位脚

I/O 数据输入/输出引脚

SCLK 串行时钟

Vcc1,Vcc2电源供电管脚

各引脚的功能为
各引脚的功能为
各各引引脚脚的的功功能能为为:

Vcc1 Vcc2 Vcc2>Vcc1+0.2V Vcc2
Vcc1 Vcc2 Vcc2>Vcc1+0.2V Vcc2
VVcccc11:主电源;VVcccc22:备份电源。当VVcccc22>>VVcccc11++00..22VV时,由VVcccc22

DS1302 Vcc2DS1302 Vcc2向DDSS11330022供电,当VVcccc22<
SCLK
SCLK
SSCCLLKK:串行时钟,输入,控制数据的输入与输出;

I/O
I/O
II//OO:三线接口时的双向数据线;

CE
CE
CCEE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:

CE
CE
第一,CCEE开始控制字访问移位寄存器的控制逻辑;其次,

CE
CE
CCEE提供结束单字节或多字节数据传输的方法。

----------------------- Page 3-----------------------

参考电路
参考电路
参参考考电电路路:

如上图所示:

DS1302 3 CE SCLK
DS1302 3 CE SCLK
DDSS11330022与单片机的连接也仅需要33条线:CCEE引脚、SSCCLLKK串行时钟

I/O Vcc2 32.768kHz
I/O Vcc2 32.768kHz
引脚、II//OO串行数据引脚,VVcccc22为备用电源,外接3322..776688kkHHzz晶振,

为芯片提供计时脉冲。

----------------------- Page 4-----------------------

实际电路:
实际电路:
实实际际电电路路::

Vcc_5V:为电路中的主电源;Vcc2,也就是BT1为备份电源。当
Vcc_5V:为电路中的主电源;Vcc2,也就是BT1为备份电源。当
VVcccc__55VV::为为电电路路中中的的主主电电源源;;VVcccc22,,也也就就是是BBTT11为为备备份份电电源源。。当当

Vcc2>Vcc1

+0.2V 时,
Vcc2>Vcc1+0.2V 时,
VVcccc22>>VVcccc11++00..22VV时时,,

由 Vcc2向 DS1302供电,当 Vcc2由 Vcc2向 DS1302供电,当 Vcc2由由 VVcccc22向向 DDSS11330022供供电电,,当当 VVcccc22<
DS1302供电
DS1302供电
DDSS11330022供供电电

CLK和I/O虽然和IIC总线接在一条引脚上,但DS1302其实并不是
CLK和I/O虽然和IIC总线接在一条引脚上,但DS1302其实并不是
CCLLKK和和II//OO虽虽然然和和IIIICC总总线线接接在在一一条条引引脚脚上上,,但但DDSS11330022其其实实并并不不是是

使用IIC总线,而是一种三线式总线,
使用IIC总线,而是一种三线式总线,
使使用用IIIICC总总线线,,而而是是一一种种三三线线式式总总线线,,

----------------------- Page 5-----------------------

DS1302内部结构:
DS1302内部结构:
DDSS11330022内内部部结结构构::

DS1302内部包括:
DS1302内部包括:
DDSS11330022内内部部包包括括::

Powercontrol:电源控制模块

Inputshiftregisters:输入移位寄存器

Commandandcontrollogic:通讯与逻辑控制器

Oscillatoranddivider:晶体振荡器及分频器

DS1302的内部主要组成部分虽然有:移位寄存器、控制逻辑、振荡器、实时时

钟以及 RAM。虽然数据分成两种,但是对单片机的程序而言,其实是一样的,

就是对特定的地址进行读写操作。

----------------------- Page 6-----------------------

DS1302控制字:
DS1302控制字:
DDSS11330022控控制制字字::

7 1 0
7 1 0
控制字的最高有效位(位77)必须是逻辑11,如果它为00,则不能把数据写入

DS1302
DS1302
到DDSS11330022中。

6 0 1 RAM
6 0 1 RAM
位66:如果为00,则表示存取日历时钟数据,为11表示存取RRAAMM数据;

5 1 A4 A0
5 1 A4 A0
位55至位11(AA44~AA00):指示操作单元的地址;

0 0 1
0 0 1
位00(最低有效位):如为00,表示要进行写操作,为11表示进行读操作。

SCLK
SCLK
控制字总是从最低位开始输出。在控制字指令输入后的下一个SSCCLLKK时钟的上

DS1302 0
DS1302 0
升沿时,数据被写入DDSS11330022,数据输入从最低位(0

0位)开始。同样,在紧跟

8 SCLK DS1302
8 SCLK DS1302
88位的控制字指令后的下一个SSCCLLKK脉冲的下降沿,读出DDSS11330022的数据,读

出的数据也是从最低位到最高位。

----------------------- Page 7-----------------------

DS1302时序:
DS1302时序:
DDSS11330022时时序序::

如图,所示

CE输入驱动高启动所有的数据传输。

CE输入有两个功能。首先,CE打开控制逻辑,允许访问的移位寄存器的地址

/命令序列。其次,CE提供了一个终止单字节或多字节数据传输方法。

一个时钟周期是由一个下降沿之后的上升沿序列。对于数据传输而言,数据必

须在有效的时钟的上升沿输入,在时钟的下降沿输出。如果CE为低,所有的I

/O引脚变为高阻抗状态,数据传输终止。

对于数据输入:

开始的8个SCLK周期,输入写命令字节,数据字节在后8个SCLK周期的

----------------------- Page 8-----------------------

上升沿输入。数据输入位0开始。

对于数据输出:

开始的8个SCLK周期,输入一个读命令字节,数据字节在后8个SCLK周

期的下降沿输出。注意,第一个数据字节的第一个下降沿发生后,命令字的最

后一位被写入(Notethatthefirstdatabittobetransmittedoccurson

the first falling edge after the last bit of the command byte is

written. ),命令字节的最后一位被写入。当CE仍为高时。如果还有额外的

SCLK周期,DS1302将重新发送数据字节,这使DS1302具有连续突发读取的

能力。

----------------------- Page 9-----------------------

DS1302
DS1302
DDSS11330022驱动程序分析

开 始

设 置 C E 为 高

在上升沿按位传输
地 址 字

读取或写入相应地
址的数据

设 置 C E 为 低

结 束

/************************************************
/************************************************
//************************************************************************************************
* :ucharDS1302Read()
* :ucharDS1302Read()
**名称::uucchhaarrDDSS11330022RReeaadd(())
* :
* :
**说明:: 先写地址,后读数据
* : cmd
* : cmd
**功能:: 从ccmmdd相应地址中读取一个字节的数据
* :DS1302Wr

iteByte(),DS1302ReadByte()
* :DS1302WriteByte(),DS1302ReadByte()
**调用::DDSS11330022WWrriitteeBByyttee(()),,DDSS11330022RReeaaddBByyttee(())
* :cmd:
* :cmd:
**输入::ccmmdd::要写入的控制字节
* :dat:
* :dat:
**输出::ddaatt::读取的数据
*************************************************/
*************************************************/
**************************************************************************************************//
ucharDS1302Read(ucharcmd)
{
uchardat;
// CE 0
// CE 0
RST=0;////初始CCEE线置为00
// 0
// 0
SCLK=0;////初始时钟线置为00
// CE 1
// CE 1
RST=1;////初始CCEE置为11,传输开始
// /
// /
DS1302WriteByte(cmd);////传输命令字,要读取的时间//日历地址
// /
// /
dat=DS1302ReadByte();////读取要得到的时间//日期

----------------------- Page 10-----------------------

//
//
SCLK=1;////时钟线拉高
// CE 0
// CE 0
RST=0;////读取结束,CCEE置为00,结束数据的传输
// /
// /
returndat;////返回得到的时间//日期
}
/************************************************
/************************************************
//************************************************************************************************
* :DS1302Write
* :DS1302Write
**名称::DDSS11330022WWrriittee
* :
* :
**说明:: 先写地址,后写数据
* : cmd
* : cmd
**功能:: 向ccmmdd相应地址中写一个字节的数据
* :DS1302WriteByte()
* :DS1302WriteByte()
**调用::DDSS11330022WWrriitteeBByyttee(())
* :cmd: ,dat:
* :cmd: ,dat:
**输入::ccmmdd::要写入的控制字,,ddaatt::要写入的数据
* :
* :
**输出:: 无
*************************************************/
*************************************************/
**************************************************************************************************//
voidDS1302Write(ucharcmd,uchardat)
{
// CE 0
// CE 0
RST=0;////初始CCEE线置为00
// 0
// 0
SCLK=0;////初始时钟线置为00

// CE 1
// CE 1
RST=1;////初始CCEE置为11,传输开始
DS1302WriteByte(cmd);//传输命令字,要写入的时间//日历地址// //
// /
// /
DS1302WriteByte(dat);////写入要修改的时间//日期
//
//
SCLK=1;////时钟线拉高
// CE 0
// CE 0
RST=0;////读取结束,CCEE置为00,结束数据的传输
}
/************************************************
/************************************************
//************************************************************************************************
* :DS1302WriteByte
* :DS1302WriteByte
**名称::DDSS11330022WWrriitteeBByyttee
* :
* :
**说明:: 无
* : 8bit
* : 8bit
**功能:: 写入88bbiitt数据
* :delayus()
* :delayus()
**调用::ddeellaayyuuss(())
* :dat:
* :dat:
**输入::ddaatt::要写入的数据
* :
* :
**输出:: 无
*************************************************/
*************************************************/
**************************************************************************************************//
voidDS1302WriteByte(uchardat)
{
uchari;
// 0
// 0
SCLK=0;////初始时钟线置为00
delayus(2);
// 8
// 8
for(i=0;i<8;i++)////开始传输88个字节的数据
{
// DS1302
// DS1302
SDA=dat&0x01;////取最低位,注意DDSS11330022的数据和地址都是从最低位开始传输的
delayus(2);
// SDA
// SDA
SCLK=1;////时钟线拉高,制造上升沿,SSDDAA的数据被传输
delayus(2);
//
//
SCLK=0;////时钟线拉低,为下一个上升沿做准备
//
//
dat>>=1;////数据右移一位,准备传输下一位数据
}

----------------------- Page 11-----------------------

}
/************************************************
/************************************************
//************************************************************************************************
* :DS1302ReadByte()
* :DS1302ReadByte()
**名称::DDSS11330022RReeaaddBByyttee(())
* :
* :
**说明:: 无
* : 8bit
* : 8bit
**功能::

读取88bbiitt的数据
* :delayus()
* :delayus()
**调用::ddeellaayyuuss(())
* :
* :
**输入:: 无
* :dat:
* :dat:
**输出::ddaatt::读取的数据
*************************************************/
*************************************************/
**************************************************************************************************//
ucharDS1302ReadByte()
{
uchari,dat;
delayus(2);
for(i=0;i<8;i++)
{
//
//
dat>>=1;////要返回的数据左移一位
// 1
// 1
if(SDA==1)////当数据线为高时,证明该位数据为11
// 1, , 0
// 1, , 0
dat|=0x80;////要传输数据的当前值置为11,,若不是,,则为00
SCLK=1;//拉高时钟线
delayus(2);
//
//
SCLK=0;////制造下降沿
delayus(2);
}
//
//
returndat;////返回读取出的数据
}

----------------------- Page 12-----------------------

寄存器和RAM
寄存器和RAM
寄寄存存器器和和RRAAMM

对 DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,

其中有:

7个寄存器与日历、时钟相关,存放的数据位为 BCD码形式。

此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器

及与RAM 相关的寄存器等。

时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。

如下所示:

DS1302
DS1302
DDSS11330022数据地址和传输格式

如图所示,时钟日历包含在7个读/写寄存器内,读/写寄存器中的数据是二—

—十进制的BCD码。

秒寄存器的BIT7定义为时间暂停位,当BIT1为1时,时钟振荡器停止工作,

DS1302进入低功耗模式,电源消耗小于100微安,当BIT1为0时,时钟振荡

器启动,DS1302正常工作。

小时寄存器的BIT7定义为12或24小时工作模式选择位,当BIT7为高时,

----------------------- Page 13-----------------------

为12小时工作模式,此时BIT5为AM/PM位,低电平标示AM,高电平标示

PM,在24小时模式下,BIT5为第二个10小时位标示(20~23时)。

写保护寄存器的BIT7:WP是写保护位,工作时,出WP外的其他位都置为

0,对时钟/日历寄存器或RAM进行写操作之前,WP必须为0,当WP为高电

平的时候,不能对任何时钟/日历寄存器或RAM进行写操作。

关于突发模式(burstmode或称

多字节传输模式),突发模式可以指定任

何的时钟/日历或者RAM寄存器为突发模式,和以前一样,第6位指定时钟或

RAM而0位指定读或写。突发模式的实质是指一次传送多个字节的时钟信号和

RAM 数据。如下图所示

在时钟/日历寄存器中的9至31和在RAM寄存器的地址31不能存储数据。

突发模式的读取或写入从地址的位0开始。

如下程序所示:
如下程序所示:
如如下下程程序序所所示示::

/*---------------------------------------------------------------------------------------------------
/*---------------------------------------------------------------------------------------------------
//**------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
:DS1302_NReadRam(unsignedchar*rstr)
:DS1302_NReadRam(unsignedchar*rstr)
函数名称::DDSS11330022__NNRReeaaddRRaamm((uunnssiiggnneeddcchhaarr**rrssttrr))
: RAM
: RAM
函数功能:: 多字节突发模式读RRAAMM,
DS1302_NRRAM 31 RAM
DS1302_NRRAM 31 RAM
DDSS11330022__NNRRRRAAMM 一次可进行3311个片内RRAAMM单元读
:*rstr N
:*rstr N
输入参数::**rrssttrr:存放读到的NN个数据
输出参数: 无
------------------------------------------------------------------------------------------------------*/
------------------------------------------------------------------------------------------------------*/
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------**//
voidDS1302_burst_Read(unsignedchar*rstr)
voidDS1302_burst_Read(unsignedchar*rstr)
vvooiiddDDSS11330022__bbuurrsstt__RReeaadd((uunnssiiggnneeddcchhaarr**rrssttrr))
{{
{{
unsignedchari;
unsignedchari;
uunnssiiggnneeddcchhaarrii;;
RST=0;
RST=0;
RRSSTT==00;;
SCLK=0;
SCLK=0;
SSCCLLKK==00;;
RST=1; //CE
RST=1; //CE
RRSSTT==11;; ////CCEE拉高,传输开始
DS1302_WriteByte(0XFF); // 0XFF RAM
DS1302_WriteByte(0XFF); // 0XFF RAM
DDSS11330022__WWrriitteeBByyttee((00XXFFFF));; //// 写00XXFFFF,多字节突发方式读RRAAMM具体细节见上一节

----------------------- Page 14-----------------------

for(i=0;i<31;i++) // 31
for(i=0;i<31;i++) // 31
ffoorr((ii==00;;ii<<3311;;ii++++)) ////连续读取个3

311 字节
{{
{{
*rstr=DS1302ReadByte(address);// ADDRESS
*rstr=DS1302ReadByte(address);// ADDRESS
**rrssttrr==DDSS11330022RReeaaddBByyttee((aaddddrreessss));;////此处的AADDDDRREESSSS指的是你需要进行连续读取的地址
rstr++;
rstr++;
rrssttrr++++;;
}}
}}
RST=0;//CE
RST=0;//CE
RRSSTT==00;;////CCEE信号拉低,传输结束
CLK=1;
CLK=1;
CCLLKK==11;;
}}
}}

/*---------------------------------------------------------------------------------------------------------
/*---------------------------------------------------------------------------------------------------------
//**------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
:DS1302_NReadRam(unsignedchar*rstr)
:DS1302_NReadRam(unsignedchar*rstr)
函数名称::DDSS11330022__NNRReeaaddRRaamm((uunnssiiggnneeddcchhaarr**rrssttrr))
: RAM
: RAM
函数功能:: 多字节突发模式写RRAAMM,
DS1302_NRRAM 31 RAM
DS1302_NRRAM 31 RAM
DDSS11330022__NNRRRRAAMM 一次可进行3311个片内RRAAMM单元写
:*wstr N
:*wstr N
输入参数::**wwssttrr:要被写入的NN个数据
输出参数:无
---------------------------------------------------------------------------------------------------------------*/
---------------------------------------------------------------------------------------------------------------*/
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------**//

voidDS1302_burstWrite(unsignedchar*wstr)
voidDS1302_burstWrite(unsignedchar*wstr)
vvooiiddDDSS11330022__bbuurrssttWWrriittee((uunnssiiggnneeddcchhaarr**wwssttrr))
{{
{{
unsignedchari;
unsignedchari;
uunnssiiggnneeddcchhaarrii;;
unsignedchar*tmpstr;
unsignedchar*tmpstr;
uunnssiiggnneeddcchhaarr**ttmmppssttrr;;
tmpstr=wstr;
tmpstr=wstr;
ttmmppssttrr==wwssttrr;;
DS1302Write(0x8e,0x00);//
DS1302Write(0x8e,0x00);//
DDSS11330022WWrriittee((00xx88ee,,00xx0000));;////写保护关
RST=0;
RST=0;
RRSSTT==00;;
SCLK=0;
SCLK=0;
SSCCLLKK==00;;
RST=1;
RST=1;
RRSSTT==11;;
DS1302_WriteByte(0XFE);

// 0XFE RAM,
DS1302_WriteByte(0XFE); // 0XFE RAM,
DDSS11330022__WWrriitteeBByyttee((00XXFFEE));; ////写 00XXFFEE ,多字节突发方式写 RRAAMM,,具体细节见上节
for(i=0;i<31;i++) // 31
for(i=0;i<31;i++) // 31
ffoorr((ii==00;;ii<<3311;;ii++++)) ////连续写入3311 字节
{{
{{
DS1302_WriteByte(*tmpstr);
DS1302_WriteByte(*tmpstr);
DDSS11330022__WWrriitteeBByyttee((**ttmmppssttrr));;
tmpstr++;
tmpstr++;
ttmmppssttrr++++;;
}}
}}
RST=0;
RST=0;
RRSSTT==00;;
SCLK=1;
SCLK=1;
SSCCLLKK==11;;
DS1302Write(0x8e,0x80); //
DS1302Write(0x8e,0x80); //
DDSS11330022WWrriittee((00xx88ee,,00xx8800));; ////开写保护
}}
}}

----------------------- Page 15-----------------------

此 寄 存 器 为 DS1302 充 电 模 式 控 制 位 , 结 构 如 下 所 示

TCS位:涓流充电选择位(BIT4至7)控制涓流充电器的选择。为防止偶

然的因素使其工作,只有1010模式才能使涓流充电器工作。所有其它的模式

将禁止涓流充电。在DS1302上电后。涓流充电将被禁止。

DS位:该二极管选择(BIT2和3)选择是一个二极管还是两个二极管之间在

Vcc2和Vcc1连接。如果DS为01,则选择一个二极管。如果DS为10,则

两个二极管被选中。如果DS为00或11,充电器被禁止,与TCS无关。

RS位(BIT0和1):选择是在Vcc2和Vcc1之间的连接电阻。电阻的选择

如下所示:

----------------------- Page 16-----------------------

程序流程设计

开 始

初 始 化

读 取 D S 1302

在L CD上 显 示

几个数组,用来定义要显示的汉字信息

unsignedcharChinese_1[17]={0xc4,0xea, 0xd4,0xc2, 0xc8,0xd5, 0xca,0xb1, 0xb7,0xd6, 0xc3,0xeb,
0xd0,0xc7,0xc6,0xda,''};//年月日 时 分 秒星 期
unsignedcharChinese_2[15]={0xd2,0xbb, 0xb6,0xfe, 0xc8,0xfd, 0xcb,0xc4, 0xce,0xe5, 0xc1,0xf9,
0xcc,0xec,''};//一二三四五六天
unsignedcharCursor[6]={0x81,0x83,0x85,0x90,0x92,0x94};//定义光标移动的位置

----------------------- Page 17-----------------------

主函数部分
主函数部分
主主函函数数部部分分

主函数部分只需要按照流程图的需要调用各个模块即可

/************************************************
/************************************************
//************************************************************************************************
* :voidmain()

* :voidmain()
**名称::vvooiiddmmaaiinn(())
* :
* :
**说明:: 无
* : 8bit
* : 8bit
**功能:: 读取88bbiitt的数据
* :delayms()
* :delayms()
**调用::ddeellaayymmss(())
* :
* :
**输入:: 无
* :dat:
* :dat:
**输出::ddaatt::读取的数据
*************************************************/
*************************************************/
**************************************************************************************************//
voidmain()
{
Delayms(50);
//
//
EX1=1;////外部中断开
//
//
EA=1; ////全局中断开
// CH452LCDDS1302
// CH452LCDDS1302
Initialize_device();////初始化CCHH445522LLCCDDDDSS11330022等器件
/while
/while
while(1)///wwhhiillee中的值只循环显示小时,分钟,秒这几个常变量,有其他需要,可以继续添加
{
/ DS1302
/ DS1302
Display_Clock();///显示你需要从DDSS11330022中读取的值
Delayms(500);
}
};
}

DS1302的初始化部分
DS1302的初始化部分
DDSS11330022的的初初始始化化部部分分

只需要调用一次,写入一个初始值即可

/************************************************
/************************************************
//************************************************************************************************
* :voidInit_DS1302(void)
* :voidInit_DS1302(void)
**名称::vvooiiddIInniitt__DDSS11330022((vvooiidd))
* : 1302
* : 1302
**说明:: 给11330022写入一个初始的值
* :
* :
**功能:: 写入日期,和时钟的值
* :DS1302Write
* :DS1302Write
**调用::DDSS11330022WWrriittee()
* :
* :
**输入:: 无
* :
* :
**输出:: 无

----------------------- Page 18-----------------------

*************************************************/
*************************************************/
**************************************************************************************************//
voidInit_DS1302(void)
voidInit_DS1302(void)
vvooiiddIInniitt__DDSS11330022((vvooiidd))
{{
{{
DS1302Write(0x8e,0x00);//
DS1302Write(0x8e,0x00);//
DDSS11330022WWrriittee((00xx88ee,,00xx0000));;////写保护关
DS1302Write(DS1302_SECOND_WRITE,0x00); // 0
DS1302Write(DS1302_SECOND_WRITE,0x00); // 0
DDSS11330022WWrriittee((DDSS11330022__SSEECCOONNDD__WWRRIITTEE,,00xx0000));; ////初始秒值为00
DS1302Write(DS1302_MINUTE_WRITE,0x20);

// 0
DS1302Write(DS1302_MINUTE_WRITE,0x20);// 0
DDSS11330022WWrriittee((DDSS11330022__MMIINNUUTTEE__WWRRIITTEE,,00xx2200));;////初始分钟值为00
DS1302Write(DS1302_HOUR_WRITE,0x09);// 24 0
DS1302Write(DS1302_HOUR_WRITE,0x09);// 24 0
DDSS11330022WWrriittee((DDSS11330022__HHOOUURR__WWRRIITTEE,,00xx0099));;////初始为2244小时模式初始时间为00点
DS1302Write(DS1302_DAY_WRITE,0x25); //2011 1 1 6
DS1302Write(DS1302_DAY_WRITE,0x25); //2011 1 1 6
DDSS11330022WWrriittee((DDSS11330022__DDAAYY__WWRRIITTEE,,00xx2255));; ////22001111年11月11日星期66
DS1302Write(DS1302_MONTH_WRITE,0x12);
DS1302Write(DS1302_MONTH_WRITE,0x12);
DDSS11330022WWrriittee((DDSS11330022__MMOONNTTHH__WWRRIITTEE,,00xx1122));;
DS1302Write(DS1302_YEAR_WRITE,0x10);
DS1302Write(DS1302_YEAR_WRITE,0x10);
DDSS11330022WWrriittee((DDSS11330022__YYEEAARR__WWRRIITTEE,,00xx1100));;
DS1302Write(DS1302_WEEK_WRITE,0x06);
DS1302Write(DS1302_WEEK_WRITE,0x06);
DDSS11330022WWrriittee((DDSS11330022__WWEEEEKK__WWRRIITTEE,,00xx0066));;
DS1302Write(0x90,0x01); //
DS1302Write(0x90,0x01); //
DDSS11330022WWrriittee((00xx9900,,00xx0011));; ////充电
DS1302Write(0xc0,0xf0); //
DS1302Write(0xc0,0xf0); //
DDSS11330022WWrriittee((00xxcc00,,00xxff00));; ////初始化一次标示
DS1302Write(0x8e,0x80);
DS1302Write(0x8e,0x80);
DDSS11330022WWrriittee((00xx88ee,,00xx8800));;
}}
}}
/************************************************
/************************************************
//************************************************************************************************
* :Initialize_device()
* :Initialize_device()
**名称::IInniittiiaalliizzee__ddeevviiccee(())
* :
* :
**说明:: 无
* :
* :
**功能:: 初始化实验用到的器件
* :delayms() Init_1602();Dispaly_Menu();Init8259a();
* :delayms() Init_1602();Dispaly_Menu();Init8259a();
**调用::ddeellaayymmss(()),IInniitt__11660022(());;DDiissppaallyy__MMeennuu(());;IInniitt88225599aa(());;
* :
* :
**输入:: 无
* :
* :
**输出::无
*************************************************/
*************************************************/
**************************************************************************************************//
VoidInitialize_device()
{

// CH452
// CH452
CH452_Write(CH452_SYSON2);////初始化CCHH445522
// LCD
// LCD
Init_1602(); ////初始化LLCCDD
// 8259a
// 8259a
Init8259a(); ////初始化88225599aa
//
//
Dispaly_Menu();////显示年月日等文字
Delayms(50);
// // DS1302
// // DS1302
//// Init_DS1302();////初始化DDSS11330022,只需要执行一次,设定好后,不需要再次执行
}}
}}

由于DS1302的很多数值都是十位数,所以需要把十位数分
由于DS1302的很多数值都是十位数,所以需要把十位数分
由由于于DDSS11330022的的很很多多数数值值都都是是十十位位数数,,所所以以需需要要把把十十位位数数分分

成2次在LCD12864上显示
成2次在LCD12864上显示
成成22次次在在LLCCDD1122886644上上显显示示

//----------------------------------------------------------------
//----------------------------------------------------------------
////--------------------------------------------------------------------------------------------------------------------------------
// voidSplit_display()
// voidSplit_display()
//// 函数名称:vvooiiddSSpplliitt__ddiissppllaayy(())
//
//
//// 函数功能:把一个十位数分二次显示至传递来的位置
// unsignedcharaddress
// unsignedcharaddress
//// 入口参数:uunnssiiggnneeddcchhaarraaddddrreessss
//
//
//// 出口参数:无
//-----------------------------------------------------------------
//-----------------------------------------------------------------
////----------------------------------------------------------------------------------------------------------------------------------
voidSplit_display(unsignedcharaddress)
voidSplit_display(unsignedcharaddress)
vvooiiddSSpplliitt__ddiissppllaayy((uunnssiiggnneeddcchhaarraaddddrreessss))

----------------------- Page 19-----------------------

{{
{{
unsignedchari;
unsignedchari;
uunnssiiggnneeddcchhaarrii;;
i=DS1302Read(address);//
i=DS1302Read(address);//
ii==DDSS11330022RReeaadd((aaddddrreessss));;////读取 十位
i=i/16+'0';
i=i/16+'0';

ii==ii//1166++''00'';;
Write_data(i);//
Write_data(i);//
WWrriittee__ddaattaa((ii));;////显示十位
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
i=DS1302Read(address);//
i=DS1302Read(address);//
ii==DDSS11330022RReeaadd((aaddddrreessss));;////读取 个位
i=i%16+'0';
i=i%16+'0';
ii==ii%%1166++''00'';;
Write_data(i);//
Write_data(i);//
WWrriittee__ddaattaa((ii));;////显示个位
Delayms(5);
Delayms(5);
DDeellaayymmss((55));;
}}
}}

----------------------- Page 20-----------------------

屏幕显示部分
屏幕显示部分
屏屏幕幕显显示示部部分分

显示屏幕上的文字信息

显示效果为:

20XX年XX月XX日

XX时XX分XX秒

星期X

//----------------------------------------------------------------
//----------------------------------------------------------------
////--------------------------------------------------------------------------------------------------------------------------------
// voidDispaly_Menu()
// voidDispaly_Menu()
//// 函数名称:vvooiiddDDiissppaallyy__MMeennuu(())
//
//
//// 函数功能:显示屏幕上的所有元素
//
//
//// 入口参数:无
//
//
//// 出口参数:无
//-----------------------------------------------------------------
//-----------------------------------------------------------------
////----------------------------------------------------------------------------------------------------------------------------------
voidDispaly_Menu()
voidDispaly_Menu()
vvooiiddDDiissppaallyy__MMeennuu(())
{{
{{
Write_com(0x01);
Write_com(0x01);
WWrriittee__ccoomm((00xx0011));;
Delayms(100);
Delayms(100);
DDeellaayymmss((110000));;
Write_com(0x80);
Write_com(0x80);
WWrriittee__ccoomm((00xx8800));;
Delayms(100);
Delayms(100);
DDeellaayymmss((110000));;
Write_data('2');
Write_data('2');
WWrriittee__ddaattaa((''22''));;
Delayms(5);
Delayms(5);
DDeellaayymmss((55));;
Write_data('0');
Write_data('0');
WWrriittee__ddaattaa((''00''));;
Delayms(1);
Delayms(1);
DDeellaayymmss((11));;

Split_display(DS1302_YEAR_READ);//
Split_display(DS1302_YEAR_READ);//
SSpplliitt__ddiissppllaayy((DDSS11330022__YYEEAARR__RREEAADD));;//// 显示年份
Write_data(Chinese_1[0]);//
Write_data(Chinese_1[0]);//
WWrriittee__ddaattaa((CChhiinneessee__11[[00]]));;////显

示“年”
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Write_data(Chinese_1[1]);
Write_data(Chinese_1[1]);
WWrriittee__ddaattaa((CChhiinneessee__11[[11]]));;
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;

----------------------- Page 21-----------------------

Split_display(DS1302_MONTH_READ);//
Split_display(DS1302_MONTH_READ);//
SSpplliitt__ddiissppllaayy((DDSS11330022__MMOONNTTHH__RREEAADD));;////显示月份
Write_data(Chinese_1[2]);//
Write_data(Chinese_1[2]);//
WWrriittee__ddaattaa((CChhiinneessee__11[[22]]));;////显示“月”
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Write_data(Chinese_1[3]);
Write_data(Chinese_1[3]);
WWrriittee__ddaattaa((CChhiinneessee__11[[33]]));;
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;

Split_display(DS1302_DAY_READ);//
Split_display(DS1302_DAY_READ);//
SSpplliitt__ddiissppllaayy((DDSS11330022__DDAAYY__RREEAADD));;////显示日期
Write_data(Chinese_1[4]);//
Write_data(Chinese_1[4]);//
WWrriittee__ddaattaa((CChhiinneessee__11[[44]]));;////显示“日”
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Write_data(Chinese_1[5]);
Write_data(Chinese_1[5]);
WWrriittee__ddaattaa((CChhiinneessee__11[[55]]));;
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Write_data(Chinese_1[16]);
Write_data(Chinese_1[16]);
WWrriittee__ddaattaa((CChhiinneessee__11[[1166]]));;
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;

Write_com(0x90);//
Write_com(0x90);//
WWrriittee__ccoomm((00xx9900));;////换第二行
Split_display(DS1302_HOUR_READ);//
Split_display(DS1302_HOUR_READ);//
SSpplliitt__ddiissppllaayy((DDSS11330022__HHOOUURR__RREEAADD));;////显示小时
Write_data(Chinese_1[6]);//
Write_data(Chinese_1[6]);//
WWrriittee__ddaattaa((CChhiinneessee__11[[66]]));;////显示“时”
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Write_data(Chinese_1[7]);
Write_data(Chinese_1[7]);
WWrriittee__ddaattaa((CChhiinneessee__11[[77]]));;
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;

Split_display(DS1302_MINUTE_READ);//
Split_display(DS1302_MINUTE_READ);//
SSpplliitt__ddiissppllaayy((DDSS11330022__MMIINNUUTTEE__RREEAADD));;////显示分钟
Write_data(Chinese_1[8]);//
Write_data(Chinese_1[8]);//
WWrriittee__ddaattaa((CChhiinneessee__11[[88]]));;////显示“分”
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Write_data(Chinese_1[9]);
Write_data(Chinese_1[9]);
WWrriittee__ddaattaa((CChhiinneessee__11[[99]]));;
Delayms(3);//
Delayms(3);//
DDeellaayymmss((33));;////

c=DS1302Read(DS1302_SECOND_READ);//
c=DS1302Read(DS1302_SECOND_READ);//
cc==DDSS11330022RReeaadd((DDSS11330022__SSEECCOONNDD__RREEAADD));;////读取秒的十位
c=c&0x7f;
c=c&0x7f;
cc==cc&&00xx77ff;;
c=c/16+'0';
c=c/16+'0';
cc==cc//1166++''00'';;
Write_data(c);//
Write_data(c);//
WWrriittee__ddaattaa((cc));;////显示秒的十位
Del

ayms(3);
Delayms(3);
DDeellaayymmss((33));;
c=DS1302Read(DS1302_SECOND_READ);//
c=DS1302Read(DS1302_SECOND_READ);//
cc==DDSS11330022RReeaadd((DDSS11330022__SSEECCOONNDD__RREEAADD));;////读取秒的个位
c=c%16+'0';
c=c%16+'0';
cc==cc%%1166++''00'';;
Write_data(c);
Write_data(c);
WWrriittee__ddaattaa((cc));;
Delayms(5);//
Delayms(5);//
DDeellaayymmss((55));;////显示秒
Write_data(Chinese_1[10]);//
Write_data(Chinese_1[10]);//
WWrriittee__ddaattaa((CChhiinneessee__11[[1100]]));;////显示“秒”
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Write_data(Chinese_1[11]);
Write_data(Chinese_1[11]);
WWrriittee__ddaattaa((CChhiinneessee__11[[1111]]));;
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Write_data(Chinese_1[16]);
Write_data(Chinese_1[16]);
WWrriittee__ddaattaa((CChhiinneessee__11[[1166]]));;

----------------------- Page 22-----------------------

Delayms(3);
Delayms(3);
DDeellaayymmss((33));;

Write_com(0x88);//
Write_com(0x88);//
WWrriittee__ccoomm((00xx8888));;////换第三行
// " "
// " "
////显示""星期""
Write_data(Chinese_1[12]);
Write_data(Chinese_1[12]);
WWrriittee__ddaattaa((CChhiinneessee__11[[1122]]));;
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Write_data(Chinese_1[13]);
Write_data(Chinese_1[13]);
WWrriittee__ddaattaa((CChhiinneessee__11[[1133]]));;
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Write_data(Chinese_1[14]);
Write_data(Chinese_1[14]);
WWrriittee__ddaattaa((CChhiinneessee__11[[1144]]));;
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Write_data(Chinese_1[15]);
Write_data(Chinese_1[15]);
WWrriittee__ddaattaa((CChhiinneessee__11[[1155]]));;
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Write_data(Chinese_2[(DS1302Read(0x8b)-1)*2]);
Write_data(Chinese_2[(DS1302Read(0x8b)-1)*2]);
WWrriittee__ddaattaa((CChhiinneessee__22[[((DDSS11330022RReeaadd((00xx88bb))--11))**22]]));;
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Write_data(Chinese_2[(DS1302Read(0x8b)-1)*2+1]);
Write_data(Chinese_2[(DS1302Read(0x8b)-1)*2+1]);
WWrriittee__ddaattaa((CChhiinneessee__22[[((DDSS11330022RReeaadd((00xx88bb))--11))**22++11]]));;
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Write_data(Chinese_1[16]);
Write_data(Chinese_1[16]);
WWrriittee__ddaattaa((CChhiinneessee__11[[1166]]));;
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;

Write_com(0x81);
Write_com(0x81);
WWrriittee__ccoomm((00xx8811));;
Delayms(5000);
Delayms(5000);
DDeell

aayymmss((55000000));;
}}
}}

/************************************************
/************************************************
//************************************************************************************************
* :voidDisplay_Clock();
* :voidDisplay_Clock();
**名称::vvooiiddDDiissppllaayy__CClloocckk(());;
* :
* :
**说明:: 无
* :
* :
**功能:: 显示屏幕上改变的数值
* :delayms() Write_com();
* :delayms() Write_com();
**调用::ddeellaayymmss(()),WWrriittee__ccoomm(());;
* :
* :
**输入:: 无
* :dat:
* :dat:
**输出::ddaatt::读取的数据
*************************************************/
*************************************************/
**************************************************************************************************//
VoidDisplay_Clock()
VoidDisplay_Clock()
VVooiiddDDiissppllaayy__CClloocckk(())
{{
{{
Write_com(Cursor[3]);//
Write_com(Cursor[3]);//
WWrriittee__ccoomm((CCuurrssoorr[[33]]));;////小时的位置,再次紧紧列出了几个最长改变的时间变量,如果有需
要,可以另外加上其他的变量,如年,月
Split_display(DS1302_HOUR_READ);//
Split_display(DS1302_HOUR_READ);//
SSpplliitt__ddiissppllaayy((DDSS11330022__HHOOUURR__RREEAADD));;////显示小时
Delayms(5);//
Delayms(5);//
DDeellaayymmss((55));;////

Write_com(Cursor[4]);//
Write_com(Cursor[4]);//
WWrriittee__ccoomm((CCuurrssoorr[[44]]));;////分钟的位置
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
Split_display(DS1302_MINUTE_READ);//
Split_display(DS1302_MINUTE_READ);//
SSpplliitt__ddiissppllaayy((DDSS11330022__MMIINNUUTTEE__RREEAADD));;////显示分钟
Delayms(5);//
Delayms(5);//
DDeellaayymmss((55));;////

----------------------- Page 23-----------------------

Write_com(Cursor[5]);//
Write_com(Cursor[5]);//
WWrriittee__ccoomm((CCuurrssoorr[[55]]));;////秒的位置
c=DS1302Read(DS1302_SECOND_READ);//
c=DS1302Read(DS1302_SECOND_READ);//
cc==DDSS11330022RReeaadd((DDSS11330022__SSEECCOONNDD__RREEAADD));;////读取秒的十位
c=c&0x7f;
c=c&0x7f;
cc==cc&&00xx77ff;;
c=c/16+'0';
c=c/16+'0';
cc==cc//1166++''00'';;
Write_data(c);//
Write_data(c);//
WWrriittee__ddaatt

aa((cc));;////显示秒的十位
Delayms(3);
Delayms(3);
DDeellaayymmss((33));;
c=DS1302Read(DS1302_SECOND_READ);//
c=DS1302Read(DS1302_SECOND_READ);//
cc==DDSS11330022RReeaadd((DDSS11330022__SSEECCOONNDD__RREEAADD));;////读取秒的个位
c=c%16+'0';
c=c%16+'0';
cc==cc%%1166++''00'';;
Write_data(c);//
Write_data(c);//
WWrriittee__ddaattaa((cc));;////显示秒
}}
}}

思考题:
思考题:
思思考考题题::

1.如何用4*4键盘动态改变DS1302中的时间/日
历?
提示:

----------------------- Page 24-----------------------

2.如何显示日历式日期,如:

提示:

//----------------------------------------------------------------
//----------------------------------------------------------------
////--------------------------------------------------------------------------------------------------------------------------------
// intWeekDay(intyear,intmonth,intday)
// intWeekDay(intyear,intmonth,intday)
//// 函数名称:iinnttWWeeeekkDDaayy((iinnttyyeeaarr,,iinnttmmoonntthh,,iinnttddaayy))
//
//
//// 函数功能:由日期计算今天为星期几
// intyear,intmonth,intday
// intyear,intmonth,intday
//// 入口参数:iinnttyyeeaarr,,iinnttmmoonntthh,,iinnttddaayy
// (int)sum%7
// (int)sum%7
//// 出口参数:((iinntt))ssuumm%%77
//-----------------------------------------------------------------
//-----------------------------------------------------------------
////----------------------------------------------------------------------------------------------------------------------------------

//
//
intWeekDay(intyear,intmonth,intday)////根据输入的日期,返回对应的星期
{
inti;
intrun=0,ping=0;
longsum;
for(i=1;i{
if(i%4==0&&i%100!=0||i%400==0)
run++;
else
ping++;
}
sum=366*run+365*ping;
for(i=1;isum+=MonthDays(year,i);
//
//
sum=sum+day;////计算总天数
return(int)sum%7;
}
//----------------------------------------------------------------
//----------------------------------------------------------------
////--------------------------------

------------------------------------------------------------------------------------------------
// intMonthDays(intyear,intmonth)
// intMonthDays(intyear,intmonth)
//// 函数名称:iinnttMMoonntthhDDaayyss((iinnttyyeeaarr,,iinnttmmoonntthh))
//
//
//// 函数功能:根据输入的年号和月份,返回该月的天数
// intyear,intmonth,intday
// intyear,intmonth,intday
//// 入口参数:iinnttyyeeaarr,,iinnttmmoonntthh,,iinnttddaayy
// (int)sum%7
// (int)sum%7
//// 出口参数:((iinntt))ssuumm%%77
//-----------------------------------------------------------------
//-----------------------------------------------------------------
////----------------------------------------------------------------------------------------------------------------------------------

intMonthDays(intyear,intmonth)//
{
switch(month)
{

----------------------- Page 25-----------------------

case1:
case3:
case5:
case7:
case8:
case10:
//
//
case12:return31;////一三五七八十腊,三十一天永不差
case4:
case6:
case9:
// 30
// 30
case11:return30;////其他月份自然是3300了
case2://计算闰月
if(year%4==0&&year%100!=0||year%400==0)
return29;
else
return28;
default:
Return0;
}

相关主题
相关文档
最新文档