项目12简易万年历.docx

上传人:b****5 文档编号:2937426 上传时间:2022-11-16 格式:DOCX 页数:15 大小:133.68KB
下载 相关 举报
项目12简易万年历.docx_第1页
第1页 / 共15页
项目12简易万年历.docx_第2页
第2页 / 共15页
项目12简易万年历.docx_第3页
第3页 / 共15页
项目12简易万年历.docx_第4页
第4页 / 共15页
项目12简易万年历.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

项目12简易万年历.docx

《项目12简易万年历.docx》由会员分享,可在线阅读,更多相关《项目12简易万年历.docx(15页珍藏版)》请在冰豆网上搜索。

项目12简易万年历.docx

项目12简易万年历

项目12简易万年历

学习目标

1、通过对万年历的设计,进一步熟练掌握单片机编程的方法和思想;

2、通过对万年历的设计,掌握时钟芯片DS1302的使用方法;

3、通过对万年历的设计,增强对单片机的兴趣及动手能力,并在此过程中学会对程序的逐步调试;

项目导入

图1总体框架图

利用DS1302芯片进行计时,并且可以与单片机进行数据交换;8位8段数码管作为显示部分。

相关知识

DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟、日历和31字节静态RAM,通过简单的串行接口与单片机进行通信实时时钟/日历电路。

提供秒分时日日期.月年的信息,每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM指示决定采用24或12小时格式。

DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:

1-RES复位,2-I/O数据线,3-SCLK串行时钟。

时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。

DS1302应用原理图如图2所示:

图2DS1302原理图

各引脚功能如下:

Vcc1:

主电源;Vcc2:

备份电源。

当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2

SCLK:

串行时钟,输入,控制数据的输入与输出;

I/O:

三线接口时的双向数据线;

CE:

输入信号,在读、写数据期间,必须为高。

该引脚有两个功能:

第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。

表-1DS1302管脚

X1X2

32.758KHz晶振管脚

GND

RST

复位

I/O

数据输入/输出引脚

SCLK

串行时钟

Vcc1Vcc2

电源供电管脚

(1)时钟芯片DS1302的工作原理:

DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图所示。

为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。

对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。

位1至位5指操作单元的地址。

位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。

控制字节总是从最低位开始输入/输出的。

表6为DS1302的日历、时间寄存器内容:

“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。

“WP”是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。

当“WP”为1时,写保护位防止对任一寄存器的写操作。

(2)DS1302的控制字节

DS1302的控制字如表-1所示。

控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出

表-2DS1302的控制字格式

RAMRD

1A4A3A2A1A0

/CK/WR

(3)数据输入输出(I/O)

在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。

同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

如下图1所示

图3DS1302读/写时序图

(4)DS1302的寄存器

DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表-3。

 

表-3DS1302的日历、时间寄存器

写寄存器

读寄存器

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

80H

81H

CH

10秒

82H

83H

10分

84H

85H

12/

0

10

/PM

86H

87H

0

0

10日

88H

89H

0

0

0

10月

8AH

8BH

0

0

0

0

0

星期

8CH

8DH

10年

8EH

8FH

WP

0

0

0

0

0

0

0

此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。

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

DS1302与RAM相关的寄存器分为两类:

一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

任务实施

(1)硬件设计

工作原理最基本部分是利用DS1302芯片的时钟功能,单片机只需要给DS1302初值,然后不断的从DS1302中读取数据并在数码管中显示,减少了单片机内部资源的占用。

图4系统硬件原理图

(2)软件设计

程序文件1:

//1)---DS1302.H

#ifndef__DS1302_H_

#define__DS1302_H_

//---包含头文件---//

#include

#include

//---重定义关键词---//

#ifndefuchar

#defineucharunsignedchar

#endif

#ifndefuint

#defineuintunsignedint

#endif

//---定义ds1302使用的IO口---//

sbitDSIO=P3^4;

sbitRST=P3^5;

sbitSCLK=P3^6;

//---定义全局函数---//

voidDs1302Write(ucharaddr,uchardat);

ucharDs1302Read(ucharaddr);

voidDs1302Init();

voidDs1302ReadTime();

//---加入全局变量--//

externucharTIME[7];//加入全局变量

#endif

程序文件2:

//2)---DS1302.c

#include"ds1302.h"

//---DS1302写入和读取时分秒的地址命令---//

//---秒分时日月周年最低位读写位;-------//

ucharcodeREAD_RTC_ADDR[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

ucharcodeWRITE_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};

//---DS1302时钟初始化2013年1月1日星期二12点00分00秒。

---//

//---存储顺序是秒分时日月周年,存储格式是用BCD码---//

ucharTIME[7]={0,0,0x12,0x01,0x01,0x02,0x13};

/*****************************************************************

*函数名:

Ds1302Write

*函数功能:

向DS1302命令(地址+数据)

*输入:

addr,dat

*输出:

**********************************************************************/

voidDs1302Write(ucharaddr,uchardat)

{

ucharn;

RST=0;

_nop_();

SCLK=0;//先将SCLK置低电平。

_nop_();

RST=1;//然后将RST(CE)置高电平。

_nop_();

for(n=0;n<8;n++)//开始传送八位地址命令

{

DSIO=addr&0x01;//数据从低位开始传送

addr>>=1;

SCLK=1;//数据在上升沿时,DS1302读取数据

_nop_();

SCLK=0;

_nop_();

}

for(n=0;n<8;n++)//写入8位数据

{

DSIO=dat&0x01;

dat>>=1;

SCLK=1;//数据在上升沿时,DS1302读取数据

_nop_();

SCLK=0;

_nop_();

}

RST=0;//传送数据结束

_nop_();

}

/*******************************************************************************

*函数名:

Ds1302Read

*函数功能:

读取一个地址的数据

*输入:

addr

*输出:

dat

*******************************************************************************/

ucharDs1302Read(ucharaddr)

{

ucharn,dat,dat1;

RST=0;

_nop_();

SCLK=0;//先将SCLK置低电平。

_nop_();

RST=1;//然后将RST(CE)置高电平。

_nop_();

for(n=0;n<8;n++)//开始传送八位地址命令

{

DSIO=addr&0x01;//数据从低位开始传送

addr>>=1;

SCLK=1;//数据在上升沿时,DS1302读取数据

_nop_();

SCLK=0;//DS1302下降沿时,放置数据

_nop_();

}

_nop_();

for(n=0;n<8;n++)//读取8位数据

{

dat1=DSIO;//从最低位开始接收

dat=(dat>>1)|(dat1<<7);

SCLK=1;

_nop_();

SCLK=0;//DS1302下降沿时,放置数据

_nop_();

}

RST=0;

_nop_();//以下为DS1302复位的稳定时间,必须的。

SCLK=1;

_nop_();

DSIO=0;

_nop_();

DSIO=1;

_nop_();

returndat;

}

/*******************************************************************************

*函数名:

Ds1302Init

*函数功能:

初始化DS1302.

*输入:

*输出:

******************

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 专升本

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1