LCD电子钟课程设计.docx
《LCD电子钟课程设计.docx》由会员分享,可在线阅读,更多相关《LCD电子钟课程设计.docx(32页珍藏版)》请在冰豆网上搜索。
LCD电子钟课程设计
课程设计(论文)
课程名称 微机原理与单片机综合设计与实践
题目名称 LCD显示的电子钟
2011年01月10日
广东工业大学华立学院
课程设计(论文)任务书
题目名称
LCD显示的电子钟
学系学部
专业班级
姓名
学号
一、课程设计(论文)的内容
以89C52单片机控制的时钟,在LCD显示器上显示当前的时间。
设计要求:
使用文字型LCD显示器显示当前时间。
设计能支持年月日星期时分秒的时钟,时钟要具有时间调整功能。
用4个功能键操作来设置当前时间。
功能键K1~K4功能如下。
(1)K1-改变时间。
(2)K2-增加。
(3)K3-减少。
(4)K4-清零。
二、课程设计(论文)的要求与数据
1.总体设计方案、系统原理框图;
2.硬件电路各部分的电路原理图;
3.程序流程图;
4.源程序;
5.结论
三、课程设计(论文)应完成的工作
1.分析任务书,给出总体设计方案,画出系统原理框图;
2.硬件电路设计,给出主要电路原理图;
3.软件设计,给出程序流程图,完成程序设计和软件调试;
4.完成调试;
5.完成课程设计报告的撰写,及时上交课程设计报告。
四、课程设计(论文)进程安排
序号
设计(论文)各阶段内容
地点
起止日期
1
下达设计任务书,理解设计要求,查阅资料
1-107
12.30
2
给出方案设计,完成系统总体设计
1-107
1.3
3
硬件电路设计
1-107
1.4-1.5
4
软件设计:
先给出各部分的程序流程图
1-107
1.6
5
软件设计:
编写代码
1-107
1.7-1.8
6
撰写课程设计报告
1-112
1.9-1.10
五、应收集的资料及主要参考文献
[1]张毅刚,彭喜源,谭晓昀.MCS-5系列单片机实用设计[M].哈尔滨工业大学出版社,2008.
[2]胡汉才.单片机原理及接口技术[M].清华大学出版社,2004.
[3]何立民.MCS-51系列单片机应用系统设计[M].北京航空航天大学出版社,2006.
[4]杨亭.电子CAD职业技能鉴定教程[M].广东科技出版社,2007.
发出任务书日期:
2010年12月30日指导教师签名:
计划完成日期:
2011年01月10日教学单位责任人签章:
1系统需求分析
1.1电子时钟研究的背景和意义
20实际末,电子技术获得了飞速的发展。
再起推动下现代电子产品几乎渗透到了社会的哥哥领域,有力的推动和提高的社会生产力的发展与信息化程度,同时也是现代电子产品性能进一步提升,产品的更新换代节奏谱也越来越快。
时间对人们来说是那么的宝贵,工作的忙碌性和繁杂容易使人们忘记当前的时间。
然而遇到重大事情的时候,一旦忘记时间,就会给自己或者是他人造成很大的麻烦。
平时我们要求上班准时,约会或者召开会议必然要提及时间、火车要准点到达,航班要准时起飞,工业生产中,很多环节都需要时间来确定工序替换时刻。
所以说能随时准确的指导时间并利用时间,是我们生活中必不可少的。
想知道时间,手表当然是很好的选择,但是在忙碌当中,我们还需要一个“助理”时不时的给我们体形式将,所以,计时器最好能够用有一个定时系统,随时提醒容易忘记时间的人。
最早能够定时、宝石的时钟属于机械式钟表,但这种时钟受到机械结构、动力合体技的限制,在功能性能以及在造价上都没有办法与电子时钟相比。
电子时钟是采用电子电路实现对时、分、秒进行数字显示的即使装置,广泛应用月个人家庭、车站、码头办公室等公共场所,成为人们日常生活活动中不可少的必须品。
由于数字集成电路的发展和石英晶体振荡器的广泛使用,是的数字时钟的精度远远查过老师钟表,钟表的数字化跟人们生产生活带来了极大的方便,而且大大的扩展了钟表原先的时钟功能。
诸如整点提示、定时报警、定时广播、自动启闭路灯,定时开关烘箱、同多动力设备、甚至各种定时电气的自动启动等,所有这些,都是以钟表数字化为基础的。
因此研究数字钟及扩大其应用,有着非常现实的意义。
1.2系统实用功能分析
单片机模块中最常见的是数字时钟,数字时钟是一种用单片机原理实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
数字时钟是采用单片机原理实现对.年、月、日、周、时、分、秒,数字显示及到时提醒的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字时钟及扩大其应用,有着非常现实的意义。
2设计要求与方案
2.1设计要求
2.1.1基本要求
1设计能支持年月日星期时分秒的时钟,时钟要具有时间调整功能。
2.1.2发挥部分
1闹钟时间精度。
2时钟功耗小于0.5MA/5V。
2.2系统基本方案选择
本时钟的设计具体有两种方法。
一是通过单纯的数字电路来实现;二是使用单片机来控制实现。
本次设计选取了较为简单的单片机控制;而选择这一方法后还要进行各个芯片的选择。
以下是我在这次设计中所用的方案。
2.2.1芯片的选择
采用AT89C52芯片,其为高性能CMOS8位单片机,该芯片内含有4kbytes的可反复擦写的只读程序存储器(PEROM)、128bytes的随机存取数据存储器(RAM)、32位可编程I/O口线、2个16位定时/计数器、6个中断源、可编程串行UART通道及低功耗空闲和掉电模式,其最大的优势就是AT89C52提供了8K字节可擦写Flash闪速存储器空间、8个中断源、及256*8字节内部存储器(RAM),解决了我们对可反复擦写的Flash闪速存储器空间大小与中断源的不够问题的担心。
2.2.2显示模块选择方案
方案一:
采用LED数码管显示,显示较为清楚,但是由于设计要求时钟功能比较重要,因此用如用LED进行显示会使得硬件电路较为复杂,且在软件实现上也较难,为实现功能带来了一定的困难。
方案二:
采用LCD,电路比较简单,且在软件设计上也相对简单,具有低功耗功能,能够满足设计最优的要求。
因此,在设计中我采用的显示模块是LCD显示。
2.2.3时钟信号的选择方案
方案一:
直接采用单片机定时计数器提供的秒信号,使用程序实现年、月、日、周、时、分、秒计数。
采用此种方案可减少芯片的使用,节约成本,实现的时间误差较小,但程序设计较为复杂。
方案二:
采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,256位的RAM作为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA。
且硬件电路连接较为简单,程序设计容易实现。
2.3电路设计最终方案决定
综上各方案所述,对此次数字时钟的方案选定为:
采用AT89C52作为主控制系统;并由其定时计数器提供时钟;LCD作为显示电路,来实现功能。
3系统的硬件设计与实现
3.1数字钟电路设计框图
图3-1电路设计框图
3.2系统硬件概述
该电路是由AT89C52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路也由AT89C52单片机提供,减少芯片的使用,节约成本,它可以对年、月、日、周、日、时、分、秒进行计时,具有闰年补偿功能。
时间显示部份采用液晶LM016L(LCD)。
3.3硬件电路结构的设计
3.3.1单片机主控制模块的设计
此次单片机数字时钟的设计采用AT89C52为主控制芯片,并由其定时器提供时钟,利用LCD进行时间按显示。
下图为用Proteus软件画的原理图:
图3-2仿真电路图
3.3.2显示模块的设计
如图(3-4)所示,该设计采用液晶显示装置即把时钟信号以及温度信号同时显示在液晶显示器上,不仅结构简单清新可见,而且省电也容易控制。
数据的传输采用P0口进行控制,其引脚VSS接地,VEE接VCC,RS和RW、E是显示器的控制端分别由单片机的引脚P1.0、P1.1、P1.3进行控制。
而VDD是作为液晶显示器的灰度调节引脚,接一变阻器来改变其显示的清晰度。
图3-3LM016L液晶显示器
3.3.3LCD原理说明
在实际应用中,用户很少直接设计LCD显示器驱动接口,一般是直接使用专用的LCD显示驱动器和LCD显示模块。
其中,LCD显示模块LCM(Liquid Crystal Display Module)是把LCD显示器、背景光源、线路板和驱动集成电路等部件构成一个整体,作为一个独立的部件使用,具有功能较强、易于控制、接口简单等优点,在单片机系统中应用较多。
其内部结构如图2-8所示。
LCD显示模块只留一个接口与外部通信。
显示模块通过这个接口接收显示命令和数据,并按指令和数据的要求进行显示。
外部电路通过这个接口读出显示模块的工作状态和显示数据。
LCD显示模块一般带有内部显示RAM和字符发生器,只要输入ASCII码就可以进行显示。
LCD显示模块按功能显示可分为:
LCD段式显示模块、LCD字符型显示模块、LCD图形显示块三类。
液晶显示器因其功耗低、重量轻而成为便携式应用中的主流显示技术。
这里所用的字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等。
液晶显示有点振式和字符式两种,在这里采用字符式液晶显示器1602来实现显示电路的功能。
图3-4LCD显示电路
由于1602液晶显示器是本身带有驱动模块的液晶屏,它只有并口线和一些控制线,与单片机的连接有两种不同的方法,直接访问方式和间接访问方式。
直接访问方式就是微处理器把液晶显示模块当作存储器或I/O设备直接挂在总线上,模块8位数据总线与微处理器的数据总线相连,用读操作 或写操作 信号与地址信号共同产生控制信号。
3.3.4开关模块说明
校时电路主要靠键盘来控制。
键盘是一组按键的集合。
共有四个按键,分别是:
改变时间、增加、减少、清零。
它是嵌入式计算机系统中不可缺少的外围电路。
是实现人机对话的纽带,借助键盘可以向计算机输入程序、置数、逻辑操作以及写入程序和程序检测等。
4系统的软件设计
4.1程序流程框图
图4-1主程序流程
4.2LCD的初始化与及显示程序
1LCD的初始化
voidini()/*LCD的初始化函数
{
rw=0;
en=0;
P1=0xff;
writeCG();
write_order(0x38);/*端口写入
write_order(0x0c);/*端口写入
write_order(0x06);/*端口写入
write_order(0x01);/*端口写入
}
2LCD的显示程序
voidopen()/*定义一个LCD显示函数
{
ucharnum;/*定义一个无符号的字符变量num
write_order(0x80+0x10);/*调用write_order函数
for(num=0;opens[num]!
='\0';num++)/*循环打开
{
write_date(opens[num]);
delay(20);
}
for(num=0;num<16;num++)/*对端口0x1c写入
{
write_order(0x1c);
delay(200);
}
for(num=0;num<5;num++)/*对端口0x18写入{
write_order(0x18);
delay(200);
}
for(num=0;num<4;num++)/*对端口0x18写入
{
write_order(0x1c);
delay(200);
}
for(num=0;num<3;num++)/*对端口0x18写入
{
write_order(0x18);
delay(200);
}
for(num=0;num<2;num++)/*对端口0x1c写入
{
write_order(0x1c);
delay(200);
}
for(num=0;num<1;num++)/*对端口0x18写入
{
write_order(0x18);
delay(100);
}
write_order(0x80+0x53);
for(num=0;opens1[num]!
='\0';num++)/*循环延时写入数据
{write_date(opens1[num]);
delay(500);}
5系统调试
5.1软件调试
打开程序调试软件keiluVision2,在里面新建一个工程,命名为:
数字时钟.Uv2。
接着新建文件,编写相应程序。
编写好的各个程序进行编译与连接。
但若是在该过程中,看见我们编好的程序有错误,那么就根据他相应的提示来修改错误,直到该程序能够正确编译为止。
能够正常编译的程序说明没有什么问题了,此时我们在点击相关栏目,让它生成我们在硬件仿真时所需要的.HEX文件。
到此步,我们的软件调试就完成了。
5.2硬件调试
打开Proteus7Professional软件,按照方案所选的电路元件来设计整体电路,线把个芯片按一定的位置放好,然后对相应的对象进行连接,连接时需仔细,以免调试时发生错误。
做好之后把编程所生成的。
HEX文件加载到AT89C52中,运行仿真软件,查看运行效果。
如果运行出错那么就根据他相应的提示来修改错误,直到仿真成功为止。
参考文献
[1]±ß´ºÔ¶、Íõ־ǿ,MCS-51µ¥Æ¬»úÓ¦Óÿª·¢ÊµÓÃ×Ó³ÌÐò[M],ÈËÃñÓʵç³ö°æÉç.
[2]ÂíÖÒ÷Ö÷±à,µ¥Æ¬»úµÄCÓïÑÔÓ¦ÓóÌÐòÉè¼Æ[M],±±¾©º½¿Õº½Ìì´óѧ³ö°æÉç.
[3]ÀÇàÖ÷±à,µ¥Æ¬»úÔÀí¼°½Ó¿Ú¼¼Êõ(µÚ3°æ)[M],±±¾©º½¿Õº½Ìì´óѧ³ö°æÉç.
[4]Ì·ºÆÇ¿,CÓïÑÔ³ÌÐòÉè¼Æ(µÚËÄ°æ)[M],Ç廪´óѧ³ö°æ.
[5]ÂíÖÒ÷、ÕÅ¿,µ¥Æ¬»úµÄCÓïÑÔÓ¦ÓóÌÐòÉè¼Æ[M],±±¾©º½¿Õº½Ìì´óѧ³ö°æÉç.
[6]廖先芸,电子技术实践与实训[M],高等教育出版社.
附录
主程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcdrs=P3^5;
sbitlcden=P3^4;
sbitdula=P2^6;
sbitwela=P2^7;
sbits0=P1^0;
sbits1=P1^1;
sbits2=P1^2;
sbits3=P1^3;
ucharcodetable1[]="2008-08-28Wen";
ucharcodetable2[]="21:
31:
30";
ucharnum,t0;
charsec,minute,hour,day,week,month;
uintyear;
voiddelay(ucharz)
{
ucharx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//写入指令子函数
voidwrite_order(ucharorder)
{
lcdrs=0;
P0=order;
delay
(2);
lcden=1;
delay
(2);
lcden=0;
}
//写入数据子函数
voidwrite_data(uchardata1)
{
lcdrs=1;
P0=data1;
delay
(2);
lcden=1;
delay
(2);
lcden=0;
}
//初始化子函数
voidinit()
{
sec=0;
minute=0;
hour=0;
week=0;
day=1;
month=1;
year=2008;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
wela=0;
dula=0;
lcden=0;
write_order(0x38);//设置显示模式
write_order(0x0c);//开显示开光标,光标闪烁
write_order(0x01);//显示清屏
write_order(0x06);//光标显示效果
write_order(0x80);//定义第一行写入数据的地址
for(num=0;num<14;num++)
{
write_data(table1[num]);
delay
(2);
}
write_order(0x80+0x43);//定义第一行写入数据的地址
for(num=0;num<8;num++)
{
write_data(table2[num]);
delay
(2);
}
}
voidchange(ucharaddr,uchardata1)//改变时分秒天月的子函数
{
ucharx,y;
x=data1/10;
y=data1%10;
write_order(0x80+addr);
delay
(1);
write_data(0x30+x);
delay
(1);
write_data(0x30+y);
delay
(1);
}
voidyearchange(ucharaddr,uintyear)//改变年的子函数
{
ucharx,y,z,w;
x=year/1000;
y=year%1000/100;
z=year%100/10;
w=year%10;
write_order(0x80+addr);
delay
(1);
write_data(0x30+x);
delay
(1);
write_data(0x30+y);
delay
(1);
write_data(0x30+z);
delay
(1);
write_data(0x30+w);
delay
(1);
}
voidweekchange(ucharz)//改变周数的子函数
{
switch(z)
{
case0:
{
write_order(0x80+0x0b);
delay
(1);
write_data('M');
delay
(1);
write_data('o');
delay
(1);
write_data('n');
delay
(1);
}
break;
case1:
{
write_order(0x80+0x0b);
delay
(1);
write_data('T');
delay
(1);
write_data('u');
delay
(1);
write_data('e');
delay
(1);
}
break;
case2:
{
write_order(0x80+0x0b);
delay
(1);
write_data('W');
delay
(1);
write_data('e');
delay
(1);
write_data('n');
delay
(1);
}
break;
case3:
{
write_order(0x80+0x0b);
delay
(1);
write_data('T');
delay
(1);
write_data('h');
delay
(1);
write_data('u');
delay
(1);
}
break;
case4:
{
write_order(0x80+0x0b);
delay
(1);
write_data('F');
delay
(1);
write_data('r');
delay
(1);
write_data('i');
delay
(1);
}
break;
case5:
{
write_order(0x80+0x0b);
delay
(1);
write_data('S');
delay
(1);
write_data('a');
delay
(1);
write_data('t');
delay
(1);
}
break;
case6:
{
write_order(0x80+0x0b);
delay
(1);
write_data('S');
delay
(1);
write_data('u');
delay
(1);
write_data('n');
delay
(1);
}
break;
default:
break;
}
}
voiddisplay()
{
if(t0==20)
{
t0=0;
sec++;
if(sec==60)
{
sec=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
day++;
week++;
if(week==7)
{
week=0;
}
if(day==31)
{
day=1;
month++;
if(month==13)
{
month=1;
year++;
yearchange(0,year);
}
change(0x05,month);
}
change(0x08,day);
weekchange(week);
}
change(0x43,hour);
}
change(0x46,minute);
}
change(0x49,sec);
}
}
//键盘扫描的子函数,修改时间
voidkeyscan()
{
ucharsnum;
if(s0==0)
{
delay(5);
if(s0==0)
{
while(!
s0);//松手检测
snum++;
}
if(snum==1)//选定秒
{
TR0=0;
write_order(0x80+0x40+9);
write_order(0x0f)