《课程设计基于AT89S51单片机微机控制的电子钟系统设计.doc》由会员分享,可在线阅读,更多相关《课程设计基于AT89S51单片机微机控制的电子钟系统设计.doc(16页珍藏版)》请在三一办公上搜索。
1、题目 微机控制的电子时钟系统设计学院 机械工程及自动化专业 机械设计制造及其自动化学号 姓名 指导教师 完成日期 2010年12月18日微机控制的电子时钟系统摘要 单片机即单片微型计算机,有RAM、ROM、CPU构成吗,定时;计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。而51系列单片机是各单片机中最为典型和最有代表性的一种。本设计是基于微机控制的电子钟系统,以AT89S51芯片为核心,辅以必要的外围电路(电源模块,实时显示模块,键盘输入模块),利用定时器准确定时产生中断,采用六位LED实时显示时钟的秒,分,时,同时利用3个独立按键控制时钟的开始、
2、暂停和结束。经测试,系统整体指标良好,测量误差和实时显示等各项指标均达到设计要求。 关键字:AT89S51单片机,LED显示,按键目录摘要.1一、电子时钟.3 1、电子时钟的简介.3 2、电子时钟的特点.3 3、电子时钟的原理.3二、设计的总体方案3三、硬件设计41、器件清单42、芯片介绍43、核心电路原理图74、数码管的显示原理及设计75、总体电路原理图9四、软件设计91、主程序流程图92、系统程序分析9五、系统特点分析9六、心得体会10 参考文献10附录一 附录二 一、电子时钟 1、电子时钟的简介 1957年,Vcntura发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅
3、速发展起来。现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计时方式进行满六十秒奋进一,满六十分钟小时进一,满二十四小时清零,从而达到计时的功能,是人们生活中不可缺少的工具。 2、电子时钟的基本特点 现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减少了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。 3、电子时钟的原理 该电子
4、时钟由89S51,独立键盘,六位数码管等构成,采用晶振电路作为驱动电路,由中断延时程序和循环程序产生一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。而电路当中三个独立按键分别控制电子时钟的开始,暂停和结束,同时通过六位数码管显示时间。二、 设计的总体方案 本设计为微机电子时钟系统,主控芯片采用89S51单片机。配合软件延时实现时、分、秒的计时。本系统设计采用此种软件控制方法来实现计时,通过定时器定时中断,使时间缓存单元数据加一,提供系统时间。同时可以通过独立键盘对电子时钟开始计时,暂停计时和结束计时的控制。单片机内的数据通过并行I/O接口输入输出。并驱动六位L
5、ED数码管(时、分、秒分别用量为数码管显示),动态显示数据。晶振及复位电路为单片机提供工作脉冲及复位信号。在单片机应用系统中,键盘和显示往往需要同时使用,为节省I/O口线,可将键盘和显示电路做在一起,构成实用的键盘、显示电路。由于该系统较为简单,无需扩展I/O口,可直接使用51芯片的引脚控制键盘和显示。该电子时钟的整体框图如图1所示:图1 系统的整体框图有图可知本设计组要是以89S51单片机为核心,外围电路组要包括电源模块,键盘输入模块和实时显示模块。三、 硬件设计 1、器件清单器件名称数量器件名称数量89S511电源1电阻若干电容若干晶振1按键4三极管若干发光LED22、 芯片介绍 该设计设
6、计内容较为简单,只需要用到核心芯片89S51单片机。 AT89S51/LS51单片机是低功耗的、具有4KB在线课编程Flash存储器的单片机。它与通用80C51系列单片机的指令系统和引脚兼容。片内的Flash可允许在线重新编程,也可使用非易失性存储器编程。他将通用CPU和在线可编程Flash集成在一个芯片上,形成了功能强大、使用灵活和具有较高性能性价比的微控制器。 89S51单片机引脚图如图2所示: 图2 89S51引脚图AT89S51/LS具有PDIP,TQFP和PLCC三种封装形式。图示为双列直插式封装。引脚功能如下: P0口8位、开漏极、双向I/O口。P0口可作为通用I/O口,但必须外接
7、上拉电阻;作为输出口,每个引脚课吸收8个TTL的灌电流。作为输入时,首先应将引脚置1。P0口也可用作外部程序存储器和数据存储器是的低八位地址/数据总线的复用线。在该模式下,P0口含有内部上拉电阻。 在Flash编程时,Po口接受代码数据;在编程校验时,P0口输出代码字节数据(需要外接上拉电阻)。P1口8位、双向I/O口、内部含有行拉电阻。P1可作为普通I/O口。输出缓冲器可驱动4个TTL负载;用作输入时,先交引脚置1,有片内上拉电阻将其抬到高电平。P1口的引脚可由外部负载拉倒低电平,通过上拉电阻提供拉电流。在Flash并行编程和校验时,P1口可输入低字节地址。在串行编程和校验时,P1.0/MO
8、SI,P1.6/OSI和P1.7/SCK分别是串行数据输入、输出和移位脉冲引脚。I/O具有内部拉电阻的8位双向I/O。 P2口用作输出口时,可驱动四个TTL负载;用作输入口时,先将引脚置1,由内部上拉电阻将其提高到高电平。若负载为低电平,则通过内部上拉电阻向外输出电流。CPU访问外部16位地址的存储器时,P2口提供高8位的地址。当CPU用8位地址寻址外部存储器时,P2口为P2特殊功能寄存器内容。在FLASH并行编程和校检时,P2口可输入高字节地址和某些控制信号。 P3口局有内部上拉电阻8位双向口。P3口左忽出口时,输出缓冲器可吸收4个TTL的灌电流;用作输入口时,手先将引脚置1,有内部上拉电阻
9、抬为高电平。若外部负载是低电平,则通过内部上拉电阻向外输出电流。 在与FLASH并行编程和校检时,P3口可输入某些控制信号。 P3口除了通用I/O功能外,还有替代功能,如下表所示:P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通) P3口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
10、 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
11、但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 3、核心电路原理图 设计中核心的电路即为51单片机的最小系统电路,如图3所示:图3 核心电路原理图4、数码管显示原理及设计 LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编
12、程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。图四(a)是共阴和共阳极数码管的内部电路图,它们的发光原理是一样的,只是它们的电源极性不同而已。将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。当然,LED的电流通常较小,一般均需在回路中接上限流电阻。假如我们将b和c段接上正电源,其它端接地或悬空,那么b和c段发光,此时,数码管显示将显示数字“1”。而将a、b、d、e和g段都接上正电源,其它引脚悬空,此时数码管将显示“2”。其它数字的显示原理与此类同。LED的7段
13、数码管利用单只LED组合排列成“8”字型的数码管,分别引出它们的电极,点亮相应的点划来显示出0-9的数字。在这次的设计中采用的均是共阴极的LED显示,当I/O口输出为高电平的时候,对应段就被点亮。LED数码管的结构图如图四(b)所示图四 数码管原理和结构图这次设计的显示部分采用AT89S51单片机动态扫描完成, 在多数的应用场合中,我们并不希望使用多I/O端口的单片机,原则上是使用尽量少引脚的器件。在没有富余端口的情况下,应通过优化设计程序和扩展电路达到预期的目的。动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,肉眼无法看
14、清,所以一般均取几个ms左右为宜,这就要求在编写程序时,选通某一位LED使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。LED显示电路(1) 静态显示电路LDE显示器工作在静态显示时,其公共阳极(或阴极) 接VCC(或GND) ,一直处于显示有效状态,所以每一位的显示内容必须由锁存器加以锁存,显示各位相互独立。(2) 动态显示电路 将所有位的段选线的同名端联在一起,由一个8位I/O口控制,形成段选线的多位复用。而各位的公共阳极或公共阴极则分别由相应的I/O口线控制,实现各位的分时选通,即同一时刻只有被选通位是能显示相应的字符,而其他所有位都是熄灭的。由于人眼有视觉暂留现象,只要每位显
15、示间隔足够短,则会造成多位同时点亮的假象。这就需要单片机不断地对显示进行控制,CPU需要不断地进行显示刷新。设计中通过六位共阳的数码管用于时分秒的显示,详细的连接线路见附录。5、 总体电路原理图见附录一。四、软件设计1、主程序流程图图五 主程序流程图 2、 系统程序分析见附录二五、 系统特点分析由于电路设计合理,功能电路基本能实现设计要求,程序简单明了,基本上达到了题目要求的各项指标。时钟控制,按键1实现时钟复位,按键2实现时钟的计时功能,按键3和按键4分别实现分和时的调整。时钟显示,时、分、秒反别有两位数码管显示。六、 心得体会在编程中遇到的最大困难就是延时的计算和数码管显示的程序段,在整体
16、程序来看,我们采用程序的结构话,使程序明朗,各功能程序段都以子程序的方式调用,所以在主程序中是相当的简单明朗的。在硬件和软件的结合过程中也遇到比较大的问题,就是一开始数码管全不老是显示8,或是乱码之类的,进过调试,现在没有出现中现象了。这也是我们的一大攻关吧。参 考 文 献1高锋. 单片微机应用系统设计及实用技术M. 北京:机械工业出版社,2004.2谭浩强. C程序设计M.北京:清华大学出版社,1999. 3温海,张友. C语言精彩编程百例M. 北京:中国水利水电出版社,2003.4吴亦锋,吴海彬,胡步发,薛昭武. 单片微机原理与接口技术实验指导书M. 福州大学机械工程及自动化学院机电工程系
17、,2006.5胡汉才主编.单片机原理及接口技术M.清华大学出版社,2007.6彭伟编著.单片机C语言程序设计实训100例基于8051+Proteus仿真M. 北京:电子工业出版社, 2009.附录一系统整体电路原理图附录二系统程序: #include #define uchar unsigned char /宏定义#define uint unsigned intuchar code TB=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/共阴极数码管显示字形码uchar code TB1=0x81,0x82,0x84,0x88,0x90,0
18、xa0; /控制那个数码管亮npnuchar dispbuf6; /中间变量uchar t,a,second,minite,hour;sbit k0=P10; /复位sbit k1=P11; /开始计时sbit k2=P12; /分调节sbit k3=P13; /时调节void display(); /显示子程序void keyscan(); /按键子程序void delay(uint z) /延时1ms子程序uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void init() /初始化程序TMOD=0x10; /设置定时器1为工作方式1TH1=(65536-
19、50000)/256;TL1=(65536-50000)%256; /50ms初值EA=1; /开总中断ET1=1; /开定时器1中断hour=0;minite=0;second=0;P2=0;void main()init();while(1)keyscan();display();void exter1() interrupt 3 / 定时器1中断TH1=(65536-50000)/256;TL1=(65536-50000)%256;t+;if(t=20)t=0;second+;if(second=60)second=0;minite+;if(minite=60)minite=0;hour
20、+;if(hour=24)hour=0; void display() dispbuf0=TBsecond%10; dispbuf1=TBsecond/10; dispbuf2=TBminite%10; dispbuf3=TBminite/10; dispbuf4=TBhour%10; dispbuf5=TBhour/10; P2=TB1a; P0=dispbufa; a+; if(a=6)a=0; delay(5); void keyscan() /按键设置if(k0=0)delay(5);if(k0=0)TR1=0;second=0; minite=0; hour=0; while(k0=0); delay(5); while(k0=0);if(k1=0)delay(5);if(k1=0)TR1=1; /启动定时器1 while(k1=0); delay(5); while(k1=0);if(k2=0) /调分delay(5); if(k2=0) minite+; if(minite=60) minite=0; while(k2=0);delay(5); while(k2=0); if(k3=0) /调时 delay(5); if(k3=0) hour+; if(hour=24) hour=0; while(k3=0); delay(5); while(k3=0);