基于单片机的电子日历钟设计Word下载.docx

上传人:b****2 文档编号:3002521 上传时间:2023-05-01 格式:DOCX 页数:35 大小:308.25KB
下载 相关 举报
基于单片机的电子日历钟设计Word下载.docx_第1页
第1页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第2页
第2页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第3页
第3页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第4页
第4页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第5页
第5页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第6页
第6页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第7页
第7页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第8页
第8页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第9页
第9页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第10页
第10页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第11页
第11页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第12页
第12页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第13页
第13页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第14页
第14页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第15页
第15页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第16页
第16页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第17页
第17页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第18页
第18页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第19页
第19页 / 共35页
基于单片机的电子日历钟设计Word下载.docx_第20页
第20页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于单片机的电子日历钟设计Word下载.docx

《基于单片机的电子日历钟设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子日历钟设计Word下载.docx(35页珍藏版)》请在冰点文库上搜索。

基于单片机的电子日历钟设计Word下载.docx

参考文献.......................................................14

\

1前言

1.1设计任务

本设计实现一个小巧的电子日历钟,可以利用DS1302读取日期及时间并传至89C51,使之显示于LCD1602液晶显示屏上。

设有四个按键,可以进入设置菜单对电子日历钟进行时间设置。

开机时可以显示制作单位以及制作者名称。

1.2本设计的应用意义

此电子日历钟小巧便捷利于携带,界面清爽,一目了然,方便的使您知晓当前时间,并可对时间做出修改,实在是居家旅行日常生活之必备用品!

2总体设计方案

2.1 

设计原理及相关说明

设计原理:

利用DS1302实时时钟电路芯片来读取系统中的日期以及时间信息,并利用P1.6端口将相关信息传送至AT89C51主芯片之中,利用P2端口使之显示于LCD1602液晶显示屏上,四个按键分别置于P1口的0、1、2、3端口可以对时间进行控制修改。

详细请参阅第三节的芯片介绍。

相关说明:

点击确定按键可以进入LCD屏上方显示的主菜单,点击返回按键可以退出菜单,在时间修改菜单中点击修改“小时”按键可以修改时间中的小时数,点击修改“分钟”按键可以修改时间中的分钟数。

2.2总体设计框图

电子日历钟设计框图如图2.1所示:

图2.1电子日历钟设计框图

2.3电子日历钟电路图

电子日历钟电路图请见附件A

2.3电子日历钟程序

电子日历钟程序清单请见附件B

//SMC1602.h

#ifndef__SMC1602_H__

#define__SMC1602_H__

#definevdInitialize()vWriteCMD(0x01);

vWriteCMD(0x38);

vWriteCMD(0x0C);

//初始化//vWriteCMD(0x01);

清屏

//vWriteCMD(0x38);

显示模式设置:

8位2行5x7点阵

//vWriteCMD(0x0C);

(0x0C)文字不动,光标自动右移

//vWriteCMD(0x0F);

显示器开、光标开、闪烁开

voidvWriteCMD(unsignedcharucCommand);

//把1个命令写入LCD。

voidvWriteData(unsignedcharucData);

//把1个数据写入LCD。

voidvShowOneChar(unsignedcharucChar);

//在当前光标处显示1个字符。

voidvShowChar(unsignedcharucaChar[]);

//在当前光标处显示1个字符串

#endif

//KeyProcess.h

#ifndef__KEYPROCESS_H__

#define__KEYPROCESS_H__

voidvKeyProcess(unsignedcharucKeyCode);

//KeyScan.h

#ifndef__KEYSCAN_H__

#define__KEYSCAN_H__

unsignedcharucKeyScan();

//键盘扫描程序

#include<

at89x51.h>

//<

<

端口设置宏定义>

>

#defineLCDRSP3_5//寄存器选择信号:

//0--数据寄存器;

//1--指令寄存器。

#defineLCDRWP3_6//读写信号:

//1--读LCD;

//0--写LCD。

#defineLCDEP3_7//片选信号,当输入下降沿信号时,

//执行指令或传送数据。

#defineLCDPORTP0//LCD数据接口。

//*******************************延时函数

voidvDelay()

{

unsignedintuiCount;

for(uiCount=0;

uiCount<

250;

uiCount++);

}

//***************************把1个命令写入LCD

voidvWriteCMD(unsignedcharucCommand)

vDelay();

//先延时。

LCDE=1;

//然后把LCD改为写入命令状态。

LCDRS=0;

LCDRW=0;

LCDPORT=ucCommand;

//再输出命令。

LCDE=0;

//最后执行命令。

//***************************把1个数据写入LCD

voidvWriteData(unsignedcharucData)

//先延时。

//然后把LCD改为写入数据状态。

LCDRS=1;

LCDPORT=ucData;

//再输出数据。

//最后显示数据。

//***********************把1个字符显示到当前光标处

voidvShowOneChar(unsignedcharucChar)

switch(ucChar)

{

case'

'

:

vWriteData(0x20);

break;

!

'

vWriteData(0x21);

"

vWriteData(0x22);

#'

vWriteData(0x23);

$'

vWriteData(0x24);

%'

vWriteData(0x25);

&

vWriteData(0x26);

vWriteData(0x27);

('

vWriteData(0x28);

)'

vWriteData(0x29);

*'

vWriteData(0x2A);

+'

vWriteData(0x2B);

-'

vWriteData(0x2D);

.'

vWriteData(0x2E);

/'

vWriteData(0x2F);

='

vWriteData(0x3D);

vWriteData(0x3E);

?

vWriteData(0x3F);

^'

vWriteData(0x5E);

vWriteData(0x3A);

0'

vWriteData(0x30);

1'

vWriteData(0x31);

2'

vWriteData(0x32);

3'

vWriteData(0x33);

4'

vWriteData(0x34);

5'

vWriteData(0x35);

6'

vWriteData(0x36);

7'

vWriteData(0x37);

8'

vWriteData(0x38);

9'

vWriteData(0x39);

A'

vWriteData(0x41);

B'

vWriteData(0x42);

C'

vWriteData(0x43);

D'

vWriteData(0x44);

E'

vWriteData(0x45);

F'

vWriteData(0x46);

G'

vWriteData(0x47);

H'

vWriteData(0x48);

I'

vWriteData(0x49);

J'

vWriteData(0x4A);

K'

vWriteData(0x4B);

L'

vWriteData(0x4C);

M'

vWriteData(0x4D);

N'

vWriteData(0x4E);

O'

vWriteData(0x4F);

P'

vWriteData(0x50);

Q'

vWriteData(0x51);

R'

vWriteData(0x52);

S'

vWriteData(0x53);

T'

vWriteData(0x54);

U'

vWriteData(0x55);

V'

vWriteData(0x56);

W'

vWriteData(0x57);

X'

vWriteData(0x58);

Y'

vWriteData(0x59);

Z'

vWriteData(0x5A);

a'

vWriteData(0x61);

b'

vWriteData(0x62);

c'

vWriteData(0x63);

d'

vWriteData(0x64);

e'

vWriteData(0x65);

f'

vWriteData(0x66);

g'

vWriteData(0x67);

h'

vWriteData(0x68);

i'

vWriteData(0x69);

j'

vWriteData(0x6A);

k'

vWriteData(0x6B);

l'

vWriteData(0x6C);

m'

vWriteData(0x6D);

n'

vWriteData(0x6E);

o'

vWriteData(0x6F);

p'

vWriteData(0x70);

q'

vWriteData(0x71);

r'

vWriteData(0x72);

s'

vWriteData(0x73);

t'

vWriteData(0x74);

u'

vWriteData(0x75);

v'

vWriteData(0x76);

w'

vWriteData(0x77);

x'

vWriteData(0x78);

y'

vWriteData(0x79);

z'

vWriteData(0x7A);

default:

break;

}

//*********************把1个字符串显示到当前光标处

voidvShowChar(unsignedcharucaChar[])

unsignedcharucCount;

for(ucCount=0;

;

ucCount++)

vShowOneChar(ucaChar[ucCount]);

if(ucaChar[ucCount+1]=='

\0'

break;

#defineDSIOP1_2//实时时钟数据线引脚

#defineDSCLKP1_1//实时时钟时钟线引脚

#defineDSRSTP1_0//实时时钟复位线引脚

#defineDS_SECOND0x80//DS1302数据地址。

#defineDS_MINUTE0x82

#defineDS_HOUR0x84

#defineDS_WEEK0x8A

#defineDS_DAY0x86

#defineDS_MONTH0x88

#defineDS_YEAR0x8C

//********************************全局变量

sbitACC0=ACC^0;

sbitACC7=ACC^7;

typedefstructTIME//定义的时间类型

unsignedcharucSecond;

unsignedcharucMinute;

unsignedcharucHour;

unsignedcharucWeek;

unsignedcharucDay;

unsignedcharucMonth;

unsignedcharucYear;

unsignedcharucaDateString[9];

unsignedcharucaTimeString[9];

}TIME;

//*********************实时时钟写入一字节(内部函数)

voidvWriteByte(unsignedcharucByte)

{

ACC=ucByte;

for(ucCount=8;

ucCount>

0;

ucCount--)

{

DSIO=ACC0;

//把累加器第0位赋给DSIO口。

DSCLK=1;

//DSCLK下降沿,写入数据。

DSCLK=0;

ACC=ACC>

1;

//把累加器里的数据右移一位。

}

//**********************实时时钟读入一字节(内部函数)

unsignedcharucReadByte(void)

1;

//把累加器右移一位。

ACC7=DSIO;

//把DSIO的数据传给累加器最高位。

//DSCLK下降沿读出数据。

returnACC;

//*************************向实时时钟写入一字节

voidvDSWriteDirect(unsignedcharucAddr,unsignedcharucData)//ucAddr:

DS1302地址,ucData:

要写的数据

DSRST=0;

DSRST=1;

vWriteByte(ucAddr);

//地址,命令

vWriteByte(ucData);

//写1Byte数据

}

//**************************读取DS1302某地址的数据

unsignedcharvDSReadDirect(unsignedcharucAddr)

unsignedcharucData;

vWriteByte(ucAddr|0x01);

//地址,命令

ucData=ucReadByte();

//读1Byte数据

returnucData;

//*******************************是否写保护

voidvDSSetProtect(bitbFlag)

if(bFlag)

vDSWriteDirect(0x8E,0x10);

else

vDSWriteDirect(0x8E,0x00);

//******************************设置实时时钟时间

voidvDSSetTime(unsignedcharucAddress,unsignedcharucValue)

vDSSetProtect(0);

//取消保护。

vDSWriteDirect(ucAddress,((ucValue/10)<

4|(ucValue%10)));

//吧ucValue转换成BCD码,然后写入。

//*******************************读取实时时钟时间

voidvDSGetTime(TIME*stTime)//把读取的BCD码转换成2进制数然后存入时间数组。

unsignedcharucReadValue;

ucReadValue=vDSReadDirect(DS_SECOND);

//秒

stTime->

ucSecond=((ucReadValue&

0x70)>

4)*10+(ucReadValue&

0x0F);

ucReadValue=vDSReadDirect(DS_MINUTE);

//分

ucMinute=((ucReadValue&

ucReadValue=vDSReadDirect(DS_HOUR);

//小时

ucHour=((ucReadValue&

ucRe

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

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2