智能电子钟LCD显示LED电子钟设计Word格式文档下载.docx

上传人:b****6 文档编号:21959063 上传时间:2023-02-01 格式:DOCX 页数:27 大小:274.40KB
下载 相关 举报
智能电子钟LCD显示LED电子钟设计Word格式文档下载.docx_第1页
第1页 / 共27页
智能电子钟LCD显示LED电子钟设计Word格式文档下载.docx_第2页
第2页 / 共27页
智能电子钟LCD显示LED电子钟设计Word格式文档下载.docx_第3页
第3页 / 共27页
智能电子钟LCD显示LED电子钟设计Word格式文档下载.docx_第4页
第4页 / 共27页
智能电子钟LCD显示LED电子钟设计Word格式文档下载.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

智能电子钟LCD显示LED电子钟设计Word格式文档下载.docx

《智能电子钟LCD显示LED电子钟设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《智能电子钟LCD显示LED电子钟设计Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。

智能电子钟LCD显示LED电子钟设计Word格式文档下载.docx

89C52CPU

控制模块

按键处理模块

LCD显示模块

图2-1

2.3器件连接

2.3.1LCD1602引脚对应开发板连接图:

2.3.2DS1302引脚对应开发板连接图:

2.4原理图及仿真

2.4.1原理图

2.4.2仿真图:

3、实验结果

3.1整体实现展示:

3.1.1开发板上实现电子钟功能,LCD屏为亮状态:

3.1.2开发板上实现电子钟功能,LCD屏为灭状态:

3.2电子钟功能实现,LCD屏正常走时展示:

3.2.1屏亮

3.2.2屏灭

3.3调节功能实现展示:

3.3.1自动开关屏实现展示:

附:

自动开关屏程序代码:

voidkeyscan()

inth=0;

{

if(key4==0)

delay(5);

if(key4==0)

{

switch(h)

{

case0:

bla=0;

delay(5000);

h++;

break;

case1:

bla=1;

delay(5000);

h=0;

break;

}

}

3.3.2时钟调节功能实现展示:

在该电子钟的设计中修改定时或调整时间时采用了闪烁,在编程上,首先进行了初始化定义了程序的入口地址以及中断的入口地址,在主程序的开始定义了一组固定单元用来存储计数的秒,分,时以及定时时间的序号等。

其次,时,分,秒显示用了软件译码(查表)的方式,再用了一段固定的程序段进行进制转化。

最后,用查询方式对按键进行判断,若有键按下,则进行软件延时消抖,避免了抖动引起的干扰,执行相应的定时,选时或调时程序段。

对当前时间或定时时间修改后又返回到最初的显示程序段,如此循环下去。

3.3.3自动判别闰年功能展示:

自动判别闰年功能程序代码:

voiddeal_3day()

if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12)

day=32;

elseif(mon==4||mon==6||mon==9||mon==11)

day=31;

elseif(mon==2&

&

(year%4==0&

year%100!

=0||year%400==0))

day=30;

else

day=29;

}

4、设计总计

4.1调试过程中遇到的问题

(1)自动开关屏调节按键时,按下开关,屏幕闪烁过快,得不到理想效果。

解决办法:

在程序中加入延时程序,消除抖动

(2)调节时间时,原本设计的是逆序(按照秒、分、时、星期、天、月、年的次序)调节,调节误差过大,而且时钟走时不稳定。

将调节功能改为正序(按照年、月、日、星期、时、分、秒的次序)调节,实现了误差最小化,得到了理想的调节效果。

4.2心得体会

通过本次智能电子时钟的课程设计,我学习将理论和实践相结合,初步掌握综合运用所学知识分析和设计一般数字系统的基本方法,增强动手解决实际问题的能力。

通过这次设计,我学会了了初步设计电路的整体思想。

学会了怎样查找资料,设计电路。

熟悉了绘制电路原理图和电路的调试整个过程,是所学的知识应用到实践,进一步所学的知识。

整个设计过程让我收获很多,前所学过的理论知识又再次重现在我们的脑海中,经过了自己的亲手实践使我们更好的理解和掌握了那些知识。

同时,经过这短短几天的课程设计也使我提高了自己与其他同学交流沟通的能力。

这次课程设计也使我明白了“实践是检验真理的唯一标准”,要想更好的掌握以前学过的知识除了定期的“温故知新”外,还需要进行一些实验和实践。

使我们的理论和实践能力同步提高,这次课程设计也使我深刻的认识到了团队合作的重要性。

5、参考文献

[1]张毅刚.单片机原理及应用[J].高等教育出版社,2009.2

[2].孙育才,王荣兴,孙华芳,新型AT89S52系列单片机及其应用.北京:

清华大学出版社,2005.1.1

[3].朱清慧,张凤蕊,王志奎,Proteus教程—电子线路设计、制版与仿真,北京:

清华大学出版社,2008.9.1

[4].侯玉宝,陈忠平,李成群等,基于Proteus的51系列单片机设计与仿真,北京:

电子工业出版社,2008.9.1

[5].彭小军.用单片机实现电子时钟[J].新余高专学报,2004,9

(2):

54-57.

[6].徐宏亮,艾学忠等.实现多功能电子时钟设计[J].吉林化工学院学报,2001,5

(1):

26-29.

[7].朱路,朱清慧,连续补充充电实时时钟芯片DS1302及其应用,河南:

南阳理工出版社,2006

[8].杨将军,李华军,刘东骏,单片机程序设计及应用,北京:

电子工业出版社,2006.3

附录:

源程序

#include<

reg52.h>

#defineuintunsignedint

#defineucharunsignedchar

#defineyh0x80//第一行的初始位置

#defineer0x80+0x40//第二行初始位置

#definetrue(x)x=1

#definefals(x)x=0

ucharh=0;

sbitbla=P2^7;

sbitwr=P2^5;

sbitrs=P2^4;

sbiten=P2^6;

sbitSCLK=P3^6;

sbitIO=P3^4;

sbitRST=P3^5;

sbitACC0=ACC^0;

sbitACC7=ACC^7;

sbitkey1=P3^0;

sbitkey2=P3^1;

sbitkey3=P3^2;

sbitkey4=P3^3;

ucharcodetab1[]={"

20--"

};

ucharcodetab2[]={"

:

"

uchara,sec,hour,min,day,mon,year,week,flag,temp,key1n=0;

voiddelay(ucharxms)//延时函数

uchary;

while(xms--)

for(y=0;

y<

110;

y++);

/******************液晶写入************************/

voidwrite_1602com(ucharcom)//给液晶1602写入命令函数

fals(rs);

//置为写入命令

P0=com;

//送入数据

delay

(1);

true(en);

//拉高使能端

fals(en);

//完成高脉冲

voidwrite_1602dat(uchardat)//向液晶1602中写入数据

true(rs);

//置为写入数据

P0=dat;

/********************ds1302****************************/

voidwriteds1302_1byte(uchardat)//向ds1302中写入1个字节数据

ACC=dat;

true(RST);

ucharreadds1302_1byte()//读出ds1302的一个数据

{

for(a=8;

a>

0;

a--)

ACC7=IO;

true(SCLK);

fals(SCLK);

ACC=ACC>

>

1;

return(ACC);

voidwrite_ds1302(ucharadd,uchardat)//向ds1302中写入数据

fals(RST);

fals(SCLK);

writeds1302_1byte(add);

//给ds1302输入寻址指令

writeds1302_1byte(dat);

//ds1302寻到上面地址后写入相应数据

true(SCLK);

ucharBCD_Decimal(ucharbcd)//将相应的BCD码转换为10进制(各个位上不会出现大于9的数)

ucharDecimal;

Decimal=bcd>

4;

return(Decimal=Decimal*10+(bcd&

=0x0F));

voidwrite_1602sfm(ucharadd,uchardat)//写时分秒

uchargw,sw;

gw=dat%10;

sw=dat/10;

write_1602com(er+add);

write_1602dat(0x30+sw);

write_1602dat(0x30+gw);

voidwrite_1602nyr(ucharadd,uchardat)

write_1602com(yh+add);

//给液晶1602写入一个地址

//给那个地址上写入一个2位数

voidwrite_1602week(ucharweek)//写星期函数

write_1602com(yh+0x0d);

//要写星期的地址

switch(week)

case1:

write_1602dat('

M'

);

write_1602dat('

O'

N'

break;

case2:

T'

U'

E'

case3:

W'

D'

case4:

H'

case5:

F'

R'

I'

case6:

S'

A'

case7:

{

if(key1==0)//key1为功能键

if(key1==0)

while(!

key1);

delay(10);

//松手检测

key1n++;

switch(key1n)

fals(TR0);

//关闭定时器

write_1602com(er+0x0b);

//写入光标位置

write_1602com(0x0f);

//设置光标为闪烁

write_ds1302(0x8e,0x00);

write_1602com(yh+0x05);

//年

write_ds1302(0x8e,0x80);

break;

case2:

write_1602com(yh+0x08);

//月

write_1602com(yh+0x0b);

//日

case4:

write_1602com(yh+0x0f);

//星期

case5:

write_1602com(er+5);

//时

case6:

write_1602com(er+8);

//分

case7:

write_1602com(er+0x0b);

case8:

write_1602com(0x0c);

//设置光标不闪烁

true(TR0);

//打开定时器

temp=(sec)/10*16+(sec)%10;

write_ds1302(0x80,0x00|temp);

//秒

key1n=0;

}

if(key1n!

=0)//当key1按下以下。

再按以下键才有效

if(key2==0)//上调键

delay(5);

if(key2==0)

while(!

key2);

delay(10);

switch(key1n)

{

case1:

year++;

if(year==100)

year=0;

write_1602nyr(4,year);

temp=(year)/10*16+(year)%10;

write_ds1302(0x8e,0x00);

write_ds1302(0x8c,temp);

write_ds1302(0x8e,0x80);

write_1602com(yh+5);

break;

case2:

mon++;

if(mon==13)

mon=1;

write_1602nyr(7,mon);

temp=(mon)/10*16+(mon)%10;

write_ds1302(0x88,temp);

write_1602com(yh+8);

case3:

day++;

if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12)

{if(day==32)

day=1;

}

elseif(mon==4||mon==6||mon==9||mon==11)

if(day==31)

elseif(mon==2&

{

if(day==30)

}

Else{

if(day==29)

write_1602nyr(10,day);

temp=(day)/10*16+(day)%10;

write_ds1302(0x86,temp);

write_1602com(yh+11);

case4:

week++;

if(week==8)

week=1;

write_1602week(week);

write_ds1302(0x8a,week);

write_1602com(yh+0x0f);

case5:

hour++;

if(hour==24)

hour=0;

write_1602sfm(4,hour);

temp=(hour)/10*16+(hour)%10;

write_ds1302(0x84,temp);

write_1602com(er+5);

case6:

min++;

if(min==60)

min=0;

write_1602sfm(0x07,min);

temp=(min)/10*16+(min)%10;

write_ds1302(0x82,temp);

write_1602com(er+8);

case7:

sec++;

if(sec==60)

sec=0;

write_1602sfm(0x0a,sec);

//写入新的秒数

temp=(sec)/10*16+(sec)%10;

write_ds1302(0x80,0x80|temp);

write_1602com(er+0x0b);

//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置

}

if(key3==0)

if(key3==0)

key3);

case1:

year--;

if(year==-1)

year=99;

mon--;

if(mon==0)

mon=12;

wri

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

当前位置:首页 > 表格模板 > 合同协议

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

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