数字时钟论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字电子时钟设计
摘要:本系统以89C51单片机为核心,辅以晶振、键盘、LCD 显示、LED显示等电路组成,实现了一个由单片机控制的数字电子时钟系统。它外带年、月、日、星期的显示,更具有整点报时功能。主机使用LCD显示,用户界面友好。该设计较好地实现了数字时钟的所有要求功能。
1 系统设计
1.1 设计任务与要求
1、设计一个有“时”、“分”、“秒”显示的电子钟
2、闹钟与整点报时系统
3、日历系统
1.2各模块方案选择和论证
1.2.1 计时模块
方案一:采用555数字电路来作为计时器。用数字电路可以实现计时功能,功耗小,稳定性较高。但是电路复杂。
方案二:采用单片机作为计时器。51单片机功能比较广,虽然功耗大,但是它的定时器功能可以很好的实现本设计的计时模块,能够更好简化电路。
经比较在功耗无要求前提下,选择方案二。
1.2.2 闹钟和整点报时模块
方案一:采用数字电路实现闹钟和整点报时的功能。使用74HC30芯片,稳定性高,但是电路设计规模较大,不便于操作。
方案二:采用单片机作为闹钟和整点报时的部分。51单片机的定时器和中断功能可以实现闹钟和报时的功能。操作方便,控制简单。
基于上一步选择单片机的基础上,方案二是最佳选择。
1.2.3 显示模块
方案一:采用LED显示。LED数码管显示速度快,亮度高,显示清晰,控制也较为简单。但是是功耗较大,显示的位数有限。
方案二:采用低功耗LED显示。液晶有较低功耗,且能够较清晰的较多位数的数字和所有的字母。其美观的用户界面是一个很大的优势。
为了较好地显示功能,选择方案二。
1.2.4电源模块
考虑到保持电路的简洁,系统采用了外接电源的方法,通过电源线和插针接入5V电压。
1.3设计分析
1.3.1系统框图
1.3.2电路说明
a. 计时模块:使用89C52单片机,其最小系统电路图见系统图。
b. 闹钟和报时模块:蜂鸣器和LED 引脚与单片机的I/O 口相连,另外LED 的引脚上各接一个10k 的上拉电阻,蜂鸣器和电源引脚接一个0.1uF 的去耦电容。
c. 液晶显示电路:把液晶的各个引脚接到单片机的P0口的对应位置,在液晶显示的的引脚上接上10k 的排阻作为上拉电阻。
d. 按键的设置:本系统总共需要四个按键,三个按键用于调时,一个按键用于控制闹钟的开与关。
2 系统的硬件实现
2.1 系统电路图(如上)
2.1.1 显示单元
1602液晶显示器
1.1602液晶显示器的优越性
①1602显示器有自带的存储器和指令系统,应用时只需把要显示的内容和显示的方式指令写入其内部的存储器即可,不需要复杂的外部电路系统,也不会用到太多的控制器时钟,从而保证了频率的宽度。
②液晶显示优于数码管的另外一点就是可以方便的显示字母和各种字符,因为1602自带了大量的字符内容。这是数码管所办不到的。
③液晶显示器不需要复杂的外部电路,因为不用外部电路来实现其动态显示,这是应用1602液晶屏的重要原因之一。
2.1602基本信息
(1)读操作时序:
(2)写操作时序:
(3)外部电路:
2.2系统PCB图
3系统软件设计
3.1 软件实现功能:
用定时器实现计时功能,用中断实现闹钟,并输出到LCD显示。
3.2 软件流程图
3.3 系统程序
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit en=P2^4;
sbit rs=P2^3;
sbit rw=P2^2;
sbit alarm=P2^6;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table0[]=" 0000-00-00 ";
uchar code table1[]=" 00:00:00";
uchar code
table5[7][10]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
uchar code table4[]="alarm";
uchar
a,b,c,flag1,flag2,flag3,flag4,temp,numkey,numxq,num1=6,num2=5,numxq,n umalarm,num3;
int year1,year2,yue,ri,shi,fen,miao;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
rw=0;
rs=0;
en=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
void write_dat(uchar dat)
{
rw=0;
rs=1;
en=0;
P0=dat;
delay(5);
en=1;
delay(5);
en=0;
}
void YJinit()
{
uchar num,num1;
en=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);//清零
write_com(0x80);
for(num=0;num<12;num++)
{
write_dat(table0[num]);