基于51单片机的电子时钟的设计同名9022.docx
《基于51单片机的电子时钟的设计同名9022.docx》由会员分享,可在线阅读,更多相关《基于51单片机的电子时钟的设计同名9022.docx(18页珍藏版)》请在冰豆网上搜索。
基于51单片机的电子时钟的设计同名9022
基于51单片机的电子时钟的设计(同名9022)
电子钟的设计与仿真
赵伟成都理工大学工程技术学院电气工程及其自动化3班
摘要:
传统的数字电子时钟采用了较多的分立元器件,不仅占用了很大的空间而且利用率也比很低,随着系统设计复杂度的不断提高,用传统时钟系统设计方法很难满足设计需求。
单片机是集CPU、RAM、ROM、定时器/计数器和多种接口于一体的微控制器。
它体积小、成本低、功能强,广泛应用于智能产品和工业自动化上。
而51系列的单片
软件扩展产生的一秒定时,达到时分秒的计时,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);
}
}
}