基于单片机的电子日历钟设计Word文档下载推荐.docx
- 文档编号:16452591
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:29
- 大小:308.47KB
基于单片机的电子日历钟设计Word文档下载推荐.docx
《基于单片机的电子日历钟设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子日历钟设计Word文档下载推荐.docx(29页珍藏版)》请在冰豆网上搜索。
3.2
LCD1602字符型液晶模块....................................7
3.2.1LCD1602模块介绍...................................7
3.2.2LCD1602的一些参数及操作指令..........................
4系统调试...............................................12
4.1
硬件电路调试.........................................12
4.2
软件程序调试.........................................12
4.3
综合调试.............................................12
参考文献.......................................................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=vDSRea
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 电子 日历 设计