单片机at89c51电子时钟论文.docx
《单片机at89c51电子时钟论文.docx》由会员分享,可在线阅读,更多相关《单片机at89c51电子时钟论文.docx(24页珍藏版)》请在冰豆网上搜索。
单片机at89c51电子时钟论文
河南工业职业技术学院
HenanPolytechnicInstitute
课程设计说明书
题目单片机电子时钟
班级电子信息0701
姓名王勇贵
指导教师席东河
时间2009.05.25——2009.06.01
目录
摘要1
第一章系统设计要求2
1.1基本功能2
1.2扩展功能2
第二章硬件总体设计方案3
2.1系统功能实现总体设计思路3
2.2各部分功能实现4
2.3系统工作原理5
2.4时钟各功能分析及图解6
2.4.1电路各功能图解分析6
2.4.2电路功能使用说明10
第三章软件总体设计方案11
3.1主程序流程图11
3.2总中断程序流程12
3.3控制电路的C语言源程序16
第四章课程设计结果分析23
第五章总结24
致谢25
参考文献26
单片机电子时钟
摘要:
单片机即单片微型计算机。
(Single-ChipMicrocomputer),是集CPU,RAM,ROM,定时,计数和多种接口于一体的微控制器。
他体积小,成本低,功能强,广泛应用于工业自动化上和智能产品。
时钟,自从它被发明的那天起,就成为了人类的好朋友,但随着时间的推移,科学技术的不断发展,时钟的应用越来越广范,人们对时间计量的精度要求也越来越高。
怎样让时钟更好的为人民服务,怎样让我们的老朋友再次焕发青春呢?
这就要求我们不断设计出新型的时钟,来不断满足人们的日常生活需要。
然而市场上的时钟便宜的比较笨重,简单实用的又比较昂贵。
那么,有没有一款既简单实用价格又便宜的时钟呢?
我们课程设计小组设想:
可不可以利用单片机功能集成化高,价格又便宜的特点设计一款结构既简单,价格又便宜的单片机电子时钟呢?
基于这种情况,我们课程设计小组成员多方查阅资料,反复论证设计出了这款既简单实用,又价格便宜的——单片机电子时钟。
关键词:
单片机时钟计时
第一章系统设计要求
1.1基本功能
(1)能够显示时分秒
(2)能够调整时分秒
1.2扩展功能
(1)能够任意设置定时时间
(2)定时时间到闹铃能够报警
(3)实现了秒表功能
第二章硬件总体设计方案
本次设计时钟电路,使用了AT89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,用一扬声器来进行定时提醒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:
键盘、芯片、扬声器、显示屏即可满足设计要求。
2.1系统功能实现总体设计思路
此设计原理框图如图2-1所示,此电路包括以下四个部分:
单片机,键盘,闹铃电路及显示电路。
图2-1设计原理框图
经多方论证硬件我们小组采用AT89C51单片机和7SED八位共阳极数码管等来实现单片机电子时钟的功能。
详细元器件列表如表2.1所示:
表2.1详细元器件列表
AT89c51
1片
7SED八位共阳极数码管
1片
NPN三极管
1个
104p电容
6个
30p电容
2个
10K电阻
6个
560欧姆电阻
8个
200欧姆电阻
1个
100欧姆电阻
6个
2.2各部分功能实现
(1)单片机发送的信号通过程序控制最终在数码管上显示出来。
(2)单片机通过输出各种电脉冲信号来驱动控制各部分正常工作。
(3)为使时钟走时与标准时间一致,校时电路是必不可少的,键盘用来校正数码管上显示的时间。
(4)单片机通过控制闹铃电路来完成定时闹钟的功能。
2.3系统工作原理
设计的电路主要由四模块构成:
单片机控制电路,显示电路、闹铃电路以及校正电路。
详细电路功能图如图2-2:
图2-2详细电路功能图
本设计采用C语言程序设计,使单片机控制数码管显示时、分、秒,当秒计数计满60时就向分进位,分计数器计满60后向时计数器进位,小时计数器按“23翻0”规律计数。
时、分、秒的计数结果经过数据处理可直接送显示器显示。
当计时发生误差的时候可以用校时电路进行校正。
设计采用的是时、分、秒显示,单片机对数据进行处理同时在数码管上显示。
2.4时钟各功能分析及图解
2.4.1电路各功能图解分析
(1)时钟运行图
仿真开始运行时,或按下key4键时,时钟从12:
00:
00开始运行,其中key2键对分进行调整,key3对小时进行调整,key6可以让时钟暂停。
时钟运行图如图2-3所示:
图2-3时钟运行图
(2)秒表计时图
当按下key1键进入秒表计时状态,key6是秒表暂停键,可按key4键跳出秒表计时状态。
如图2-4:
图2-4秒表计时图
(3)闹铃设置图及运行图
当按下key5,开始定时,分别按key2调分,key3调时设置闹铃时间,然后按下key4键恢复时钟运行状态(图2-5)当闹铃设置时间到时,蜂鸣器将发出10秒中蜂鸣声(图2-6)。
图2-5闹铃时间设置图
图2-6闹铃运行图
该数字钟是用一片AT89C51单片机通过编程去驱动8个数码管实现的。
通过6个开关控制,从上到下6个开关KEY1-KEY6的功能分别为:
KEY1,切换至秒表;KEY2,调节时间,每调一次时加1;KEY3,调节时间,每调一次分加1;KEY4,从其它状态切换至时钟状态;KEY5,切换至闹钟设置状态,也可以对秒表清零;KEY6,秒表暂停.控制键分别与P1.0~P1.5口连接.其中:
A通过P2口和P3口去控制数码管的显示如图所示P2口接数码管的a——g端,是控制输出编码,P3口接数码管的1——8端,是控制动态扫描输出.
B从P0.0输出一个信号使二极管发光,二极管在设置的闹钟时间到了时候发光,若有乐曲可以去驱动扬声器实现。
2.4.2电路功能使用说明
(1)各个控制键的功能:
可对时间进行校准调节(只能加1);按下设置键数字时钟进入闹钟设置状态,设置闹钟的时间;时加1、分加1键是在校准时间时或设置闹钟时间对小时数或分钟数调节而设置的;按下秒切换键就可以进入秒表模式,同时秒表也开始计时,按下秒表暂停、复位键就暂停、归零,如果要重新对秒计时则可以按秒表开始、复位;清零键可以对闹钟清零。
(2)AT89C51单片机,通过编写程序对数码显示进行控制。
(3)八个7段数码管显示时钟和秒表信号。
第三章软件总体设计方案
3.1主程序流程图:
软件程序从开始执行,先通过初始化各个寄存器,经过扫描按键来决定是否设定参数来执行相应功能的程序,进而在数码管上显示。
如图3-1:
图3-1主程序流程图
3.2总中断程序流程
图3-2中断流程图
时间的显示通过此中断程序来控制,并且通过与设定的时间进行比较来判断是否让闹铃工作。
程序中包含时间的设定,如设定tcount来使秒等工作,进而来控制分和时。
如上图图3-2。
A.秒表中断程序流程
秒表功能通过另一个程序来实现。
通过保护主程序的数据来进行秒表功能。
程序中需要设置秒表的具体显示方法。
如图3-3:
N
Y
N
Y
图3-3秒表中断程序流程图
B.按键程序流程
图3-4为时钟和闹钟的调节,程序中通过扫描来判断按键是否按下进行时间和闹钟的调节。
图3-4按键程序流程图
图3-5为进入中断和清零图,程序中通过扫描来判断按键是否按下进行执行相应的中断来事实现相应的功能。
图3-5中断和清零程序流程图
3.3控制电路的C语言源程序
根据流程图,经过认真分析得出控制电路的源程序如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
#definedelay_time3/*宏定义*/
uchark,dat[]={0,0,0,0,0,0,0,0};
uinttcount,t,u;
uchardat1[]={0,0,0,0,0,0,2,1};
uchardat2[]={0,0,0,0,0,0,0,0};
ucharalarms[]={0,0,0,0,0,0,0,0};
uchardis_bit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsignedcharcodeSEG7[11]={0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/0xBF,/*-*/
};/*数字显示数组*/
sbitmiaobiao1=P1^0;
sbittminute=P1^1;
sbitthour=P1^2;
sbitmiaobiao2=P1^3;
sbitalarm=P1^4;
sbitP0_0=P0^0;
sbitP1_5=P1^5;
sbitP1_6=P1^6;
sbitP1_7=P1^7;/*端口定义*/
ucharms=0;
ucharflag=0;
ucharsec=0;
ucharminit=0;
structtime{ucharsecond;ucharminute;ucharhour;}time1;
ucharn,i;
voiddelay(n)
{while(n--)
{
for(i=120;i>0;i--);
}
}
/*延时子程序*/
voidmodify(void)
{
EA=0;
if(thour==0)
{
if(flag==0)
{
dat1[6]++;delay(280);
if(dat1[6]>9)
{
dat1[6]=0;
dat1[7]++;
}
elseif((dat1[7]>1)&&(dat1[6]>3))
{dat1[7]=0;dat1[6]=0;}
}
if(flag==1)
{
alarms[6]++;delay(300);
if(alarms[6]>9)
{
alarms[6]=0;alarms[7]++;
if(alarms[7]>2)
{
alarms[7]=0;
}
}
dat[6]=alarms[6];
dat[7]=alarms[7];
}
}
if(tminute==0)
{
if(flag==0)
{
dat1[3]++;delay(280);
if(dat[3]>=9)
{
dat1[4]++;dat1[3]=0;
if(dat1[4]>5)
{
dat1[4]=0;
}
}
}
if(flag==1)
{
alarms[3]++;delay(300);
if(alarms[3]>9)
{
alarms[4]++;alarms[3]=0;
if(alarms[4]>5)
{
alarms[4]=0;
}
}
dat[3]=alarms[3];
dat[4]=alarms[4];
}
}
if(miaobiao1==0)
{TR0=0;ET0=0;TR1=1;ET1=1;
}
if(miaobiao2==0)
{
TR0=1;ET0=1;TR1=0;ET1=0;
dat2[0]=0;
dat2[1]=0;
dat2[3]=0;
dat2[4]=0;
dat2[6]=0;
dat2[7]=0;
ms=0;
sec=0;
minit=0;
}
if(P1_5==0)
{
TR0=0;ET0=0;TR1=0;ET1=0;
}
if(alarm==0)
{
TR0=0;ET0=0;TR1=0;ET1=0;flag=1;
dat[0]=0;
dat[1]=0;
dat[2]=10;
dat[3]=0;
dat[4]=0;
dat[5]=10;
dat[6]=0;
dat[7]=0;
}
EA=1;
}/*按键扫描*/
voidinit(void)
{
TMOD=0x11;
TH0=0xDB;
TL0=0xFF;
TH1=0xDB;
TL1=0xFF;
ET0=1;//10ms
ET1=1;
//TR1=1;
TR0=1;
tcount=0;
ms=0;
sec=0;
minit=0;
EA=1;
}/*初始化*/
voidtest(void){
for(k=0;k<8;k++)
{
P3=dis_bit[k];
P2=SEG7[dat[k]];delay
(1);
P3=0X00;
}
}/*数字显示*/
voidmain()
{init();
delay(10);
while
(1)
{
modify();
test();
}
}/*主函数*/
Voiddiplay()interrupt1
{
ET0=0;
TR0=0;
TH0=0xDB;
TL0=0xff;
TR0=1;
tcount++;
if(tcount==100)
{
time1.second++;
tcount=0;
dat1[0]=(time1.second)%10;
dat1[1]=(time1.second)/10;
}
if(time1.second==60)
{dat1[0]=0;dat1[1]=0;
time1.second=0;
time1.minute++;
dat1[3]=(time1.minute)%10;
dat1[4]=(time1.minute)/10;
}
if(time1.minute==60)
{
time1.minute=0;
time1.hour++;
dat1[6]=time1.hour%10;
dat1[7]=time1.hour/10;
}
if(time1.hour>23)
{
time1.hour=0;
}
dat[5]=10;
dat[2]=10;
dat[0]=dat1[0];
dat[1]=dat1[1];
dat[3]=dat1[3];
dat[4]=dat1[4];
dat[6]=dat1[6];
dat[7]=dat1[7];
flag=0;
P0=0x01;
if((alarms[7]==dat1[7])&&(alarms[6]==dat1[6])&&(alarms[4]==dat1[4])&&(alarms[3]==dat1[3])&&(dat1[1]<1))
{
P0=0x00;
}
ET0=1;
}
voidtime_2(void)interrupt3
{
EA=0;
TR0=0;
TH1=0xDB;
TL1=0xFF;
TR1=1;
ms++;
dat2[0]=ms%10;
dat2[1]=ms/10;
if(ms>=100)
{
ms=0;
sec++;
dat2[3]=sec%10;
dat2[4]=sec/10;
if(sec>=60)
{
sec=0;
minit++;
dat2[6]=minit%10;
dat2[7]=minit/10;
}
}
dat[5]=10;
dat[2]=10;
dat[0]=dat2[0];
dat[1]=dat2[1];
dat[3]=dat2[3];
dat[4]=dat2[4];
dat[6]=dat2[6];
dat[7]=dat2[7];
EA=1;
第四章课程设计结果分析
此时钟设计是利用protues仿真软件进行仿真,基本上实现了课程设计要求实现的功能。
硬件部分设置了的六个按键。
当按键一按下时,进入秒表显示状态,秒表开始计时,当按键六按下时,秒表暂停;当按键四按下时恢复到时间显示功能;当按键二按下时,进入调分状态,按一次,分加一,60一循环;按键三按下时,进入调时状态,按一次,时加一,60一循环;按键五按下时,进入闹铃设置功能,紧接着按下按键二和按键三进行时和分的设置,再按下按键4恢复显示时间,当显示的时间和定时设置的时间一致时,蜂鸣器发出蜂鸣声,蜂鸣时间我们设置为10秒。
另外,闹铃电路有音乐闹钟的扩展的功能(可以将蜂鸣器换成扬声器再加一段音乐程序即可实现)。
调试阶段,出现一些问题。
比如,实际小时显示到29才归零,分钟显示到60才进一……经过软件调试,以上问题均一一排除,结果达到预期目标。
但时间有限,部分扩展功能不能及时实现,比如音乐闹铃。
第五章总结
经过一周的单片机课程设计,我组成员已基本完成课题要求。
功能上基本达标:
时钟的显示,秒表显示,定时功能,调时功能。
时钟显示功能,精确度完全可以满足日常生活显示时间的需要;秒表功能,可以满足比赛计时的需要;调时功能,方便快捷;定时功能准确可靠,还有扩展成音乐闹钟的余地。
硬件设施合乎要求,软件设计可以配合硬件实现要求功能。
但是由于时间比较短,出现部分不足:
使用定时和秒表功能时时间显示功能停止运行。
经讨论只是软件部分还不完善。
不过,我们相信,如果时间充足,将软件改进,我们完全可以很好实现所有功能。
另外,在本次设计的过程中,我们发现很多的问题,虽然以前没有做过这样的设计但通过这次设计我学会了很多东西,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我们觉的写好一个程序并不是一件简单的事,比如写一个程序看其功能很少认为编写程序简单,但到编的时候才发现一些细微的知识或低级错误经常犯做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解的,更谈不上掌握。
从这次的课程设计中,我们真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高,我想这就是我在这次课程设计中的最大收获。
致谢
本课题在选题及进行过程中得到了席东河老师的悉心指导。
在硬件电路设计当中席老师帮助分析思路,开拓视角;在软件设计中席老师帮助调试及修改程序。
席老师严谨求实的治学态度,踏实坚韧的工作精神将使我们终身受益。
再多华丽的言语也显得苍白。
在此,谨向席东河老师致以诚挚的谢意和崇高的敬意!
参考文献
[1]李叶紫.王喜斌.胡辉.孙东辉.编著MCS_51单片机应用教程清华大学出版社.2008.6.
[2]陆剑.单片机应用技术指导书河南工业职业技术学院2005.12.
[3]汪道辉.单片机系统设计与实践.电子工业出版社
(50页时、分、秒计时器设计,59页键盘及接口技术).
[4]第二版.51系列单片机设计实例.北京航空航天大学出版社(81—89页数码管时钟电路的设计).
[5]辛友顺、胡永生、薛小玲.单片机应用系统设计与实现.福建科学技术出版社(184-186页LED显示接口,190-193页键盘接口).
[6]黄庆华、张永格.单片机开发与实例.电子工业出版社(127-162页数字式电子时钟的设计).
[7]闫玉德、俞红.MCS-51单片机原理与应用(C语言版).机械工业出版社(49-104页单片机的C程序设计).
[8]求是科技.单片机典型模块设计实例导航.人民邮电出版社(85-90页单片机数字时钟).
[9]刘守义,王静霞。
《单片机应用技术》.西安电子科技大学出版社,2002.