基于51单片机的电子时钟的设计.docx
《基于51单片机的电子时钟的设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机的电子时钟的设计.docx(18页珍藏版)》请在冰豆网上搜索。
![基于51单片机的电子时钟的设计.docx](https://file1.bdocx.com/fileroot1/2023-8/20/9bc1455a-cf75-40cf-9324-94941dad6464/9bc1455a-cf75-40cf-9324-94941dad64641.gif)
基于51单片机的电子时钟的设计
电子时钟的设计
许山沈阳航空航天大学自动化学院
摘要:
传统的数字电子时钟采用了较多的分立元器件,不仅占用了很大的空间而且利用率也比很低,随着系统设计复杂度的不断提高,用传统时钟系统设计方法很难满足设计需求。
单片机是集CPU、RAM、ROM、定时器/计数器和多种接口于一体的微控制器。
它体积小、成本低、功能强,广泛应用于智能产品和工业自动化上。
而51系列的单片机是各单片机中最为典型和最有代表性的一种。
,本次设计提出了系统总体设计方案,并设计了各部分硬件模块和软件流程,在用C语言设计了具体软件程序后,将各个模块完全编译通过过后,结果证明了该设计系统的可行性。
该设计给出了以AT89C2051为核心,利用单片机的运算和控制功能,并采用系统化LED显示模块实时显示数字的设计方案,适当地解决了实际生产和日常生活中对计时高精确度的要求,因此该设计在现代社会中具有广泛的应用性。
关键字:
AT89C2051,C语言程序,电子钟。
1前言
利用51单片机开发电子时钟,实现时间显示、调整和闹铃功能。
具体要求如下:
(1)按以上要求制定设计方案,并绘制出系统工作框图;
(2)按要求设计部分外围电路,并与单片机仿真器、单片机实验箱、电源等正确可靠的连接,给出电路原理图;
(3)用仿真器及单片机实验箱进行程序设计与调试;
(4)利用键盘输入调整秒、分和小时时刻,数码管显示时间;
(5)实现闹钟功能,在设定的时间给出声音提示。
1总体方案设计
该电子时钟由89C51,BUTTON,1602LCD液晶屏等构成,采用晶振电路作为驱动电路,利用单片机内部定时计数器0通过软件扩展产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。
闹钟和时钟的时分秒的调节是由一个按键控制,而另外一个按键控制时钟和闹钟的时间的调节。
图1系统结构框图
该电子时钟由STC89C51,BUTTON,1602LCD液晶屏等构成,采用晶振电路作为驱动电路,晶振电路的晶振频率为12MHZ,使用的定时器/计数器工作方式0,通过软件扩展产生的一秒定时,达到时分秒的计时,60秒为一分钟,60分钟为一小时,24小时为一天,又重00:
00:
00开始计时。
没有按键按键按下时,时钟正常运行,当按下调节时钟按键K1,就会关闭时钟,当按下闹钟按键K3时时钟就会进入设置时间界面,但是时钟不会停止工作,按K2键,,就可以对时钟和闹钟要设置的时间进行调整。
2硬件电路设计
(1)时钟电路设计
单片机利用外部12MHZ晶振构成振荡电路作为时钟源,时钟电路的原理如下图。
图2时钟电路图
(2)独立按键输入电路
按键处理设置为:
当有没键按下时,时钟正常运行;当按一次K1,时钟停止走动,按K2对秒进行调整;当K1按2次时,按K2对分进行调整;当K1按下3次时,按K2对小时进行调整,当按下4次K1时,校时完毕,时钟按设定的时间进行正常走时。
当按1次K3进入闹钟设置界面,时钟继续进行走时,按K2对秒进行设置;当按2次K3,按K2对分进行设置;当按3次K3,按K2对秒进行设置;当按下4次K3时,闹钟设置完毕进入时钟显示界面。
电路图如下图
图3独立按键电路
(3)单片机系统
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
外形及引脚排列如下图
图4单片机系统图
(4)LCD液晶显示
LCD1602采用标准的16脚接口,第1脚:
VSS为电源地;第2脚:
VDD接5V电源正极;第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高;第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器;第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作;第6脚:
E(或EN)端为使能(enable)端。
第7~14脚:
D0~D7为8位双向数据端;第15~16脚:
空脚或背灯电源。
电路如下图
图5LCD液晶显示图
3软件设计
本系统的软件系统主要可分为主程序、定时计数中断程序、时间调整程序、延时程序四大模块。
系统的流程图如下图
设计思路:
本系统主要可分为主程序、定时计数中断程序、时间调整程序、延时程序和LCD液晶驱动程序。
定时中断程序是利用单片机内部定时器0实现1秒的定时,然后利用软件延时实现分小时,时间调整程序是利用单片机的内部存贮器,把调整好的时间写到显示时间的存贮单元,然后启动定时器开始计时并显示,延时程序是利用软件实现延时达到去抖的目的。
液晶启动程序是为了把单片机的数据送到显示器的同时让显示器的第6脚使能断的电平实现由1到0的跳变,使显示器执行显示的命令。
主程序就是利用这些子程序中断程序实现显示、定时、闹钟等功能。
4调试分析及说明
(1)时钟正常运行调试仿真图
图6正常运行仿真图
(2)闹钟调试仿真图
图7对闹钟时间进行设置
图8设置好的闹钟时间
图9闹钟响铃
(3)时间调整仿真
图10对时分秒的调整
5结论
本次电子时钟的设计基本完成:
当没有键按下时,时钟正长运行;当按一次K1,时钟停止走动,按K2对秒进行调整;当K1按2次时,按K2对分进行调整;当K1按下3次时,按K2对分进行调整,当按下4次K1时,校时完毕,时钟按设定的时间进行正常走时。
当按1次K3进入闹钟设置界面,时钟继续进行走时,按K2对秒进行设置;当按2次K3,按K2对分进行设置;当按3次K3,按K2对秒进行设置;当按下4次K3时,闹钟设置完毕进入时钟显示界面。
参考文献
1、《单片机原理及应用》李建忠编西安电子科技大学出版社。
2、《单片微型计算机原理与接口技术》高峰编电子工业出版社。
3、《单片机应用新技术教程》邹逢兴编高等教育出版社。
4、《16位微型计算机原理接口及其应用》朱宇光编电子工业出版社。
5、《微型计算机原理与接口技术》吴秀清编中国科学技术出版社。
6、《微型计算机接口技术》邓亚平编清华大学出版社。
7、《单片机原理及及应用》王迎旭编机械工业出版社。
课设体会
两周的课程设计到目前为止可以说是告一段落了,我也顺利的完成了自己的课题简易电子时钟的设计,由于自己一心准备考研在这次课程设计上除了那些必要的时间其余也么有花太多的时间,本想改进的第三个跑表功能由于在程序上出了点问题就没花时间去做了,所以这次设计还不算很完美
刚开始被拿到这个课题的,感觉挺迷茫的,当时就只知道软件编程要用到定时器,自己也就在这方面懂一点,其余的关于硬件电路,液晶显示电路的驱动的什么都不知道,后来回来之后就看了一下51单片机课程设计那本书,在网上找了一些资料对硬件电路的设计有了一定的了解。
在大脑里面有了一个大致的思路了,于是就把仿真软件装好开始了我的课设。
本次课设让我对单片机有了更深入的认识,现代社会中几乎处处都有单片机的影子,电子产品离不开它。
课设提高了我的单片机实际运用能力,也发现了自己以前学习的不扎实,对问题不求甚解。
现在才知道“书到用时方少”啊!
学习还是得扎实。
本次课设能顺利完成,甚是感谢指导老师的帮助。
[2012年7月16日完成]
附录1电路原理
附录2程序清单
#include
#defineucharunsignedchar
#defineuintunsignedint
uchartable[]="TIME";
sbitlcden=P3^4;
sbitlcdrs=P3^5;
sbitbeep=P3^6;
externvoidkey1();
externvoidkey2();
externvoidkey3();
ucharnum,hour=12,minite,second,
ahour,aminite,asecond,a,F_k1,F_k2,F_k3;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_add(ucharadd,uchardate)
{
ucharaa,bb;
aa=date/10;
bb=date%10;
write_com(0x80+add);
write_data(0x30+aa);
write_data(0x30+bb);
}
voidinit()
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
voiddisplay(ucharh,ucharm,uchars)
{
write_com(0x80+0x04);
write_data(':
');
write_data(0x30+(h/10));
write_data(0x30+(h%10));
write_data(':
');
write_data(0x30+(m/10));
write_data(0x30+(m%10));
write_data(':
');
write_data(0x30+(s/10));
write_data(0x30+(s%10));
write_data('');
write_data('');
write_data('');
write_data('');
}
voidmain()
{
init();
TMOD=0X01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
TR0=1;
ET0=1;
for(num=0;num<4;num++)
{
write_data(table[num]);
}
while
(1)
{
key1();
key2();
key3();
if(ahour==hour&&aminite==minite&&second<10)
{
beep=~beep;
}
if(F_k1==0&F_k3==0)
display(hour,minite,second);
}
}
voidtimer0()interrupt1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
a++;
if(a==20)
{
a=0;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
#include"reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitk1=P1^0;
sbitk2=P1^1;
sbitk3=P1^2;
externucharF_k1,F_k3,second,minite,hour,ahour,aminite,asecond;
externvoidwrite_com(ucharcom);
externvoidwrite_add(ucharadd,uchardate);
externvoiddisplay(ucharh,ucharm,uchars);
voiddelay_key(inti)
{while(i--);}
voidkey1()
{
if(k1==0)
{
delay_key(100);
if(k1==0)
{
TR0=0;
while(!
k1);
F_k1++;
if(F_k1==4)
{
F_k1=0;
write_com(0x0c);
TR0=1;
}
}
}
if(F_k1==1|F_k3==1)
{
write_com(0x80+0x0c);
write_com(0x0f);
}
if(F_k1==2|F_k3==2)
write_com(0x80+0x09);
if(F_k1==3|F_k3==3)
write_com(0x80+0x06);
}
voidkey2()
{
if(k2==0)
{
delay_key(100);
{
while(!
k2);
if(F_k1==1)
{
second++;
if(second==60)
second=0;
write_add(0x0b,second);
}
if(F_k1==2)
{
minite++;
if(minite==60)
minite=0;
write_add(0x08,minite);
}
if(F_k1==3)
{
hour++;
if(hour==24)
hour=0;
write_add(0x05,hour);
}
if(F_k3==1)
{
asecond++;
if(asecond==60)
asecond=0;
write_add(0x0b,asecond);
}
if(F_k3==2)
{
aminite++;
if(aminite==60)
aminite=0;
write_add(0x08,aminite);
}
if(F_k3==3)
{
ahour++;
if(ahour==24)
ahour=0;
write_add(0x05,ahour);
}
}
}
}
voidkey3()
{
if(k3==0)
{
delay_key(100);
if(k3==0)
{
while(!
k3);
F_k3++;
if(F_k3==4)
{
F_k3=0;
write_com(0x0c);
}
if(F_k3==1)
display(ahour,aminite,asecond);
}
}
}