《8位电子时钟课程设计报告.doc》由会员分享,可在线阅读,更多相关《8位电子时钟课程设计报告.doc(23页珍藏版)》请在三一办公上搜索。
1、-摘 要时钟是人类日常生活必不可少的工具,本设计从日常生活中常见的事物入手,通过对电子时钟的设计,让我们认识到单片机已经深入到我们生活的每个领域,该设计不仅可以锻炼我们的动手能力,而且可以加深我们对单片机的认识和激发我们对未知科学领域的探索。本文利用单片机实现数字时钟计时功能的主要容。它体积小,本钱低、功能强、使用方便、可靠性高等一系列优点,广泛应用于智能产业和工业自动化上。本次设计采用独立式按键进展时间调整,其中STC89C52是核心元件,同时采用数码管LED动态显示“时,“分,“秒的现代计时装置。与传统机械表相比,它具有走时准确,显示直观等特点。它的计时周期为24小时,显满刻度为“23时5
2、9分59秒。该系统同时具有硬件设计简单、工作稳定性高、价格低廉等优点。关键词:STC89C52 ;LED数码管。. z.-目录设计要求11设计方案12系统硬件电路的设计22.1单片机的选择及引脚功能介绍22.2显示电路设计42.3电源电路设计43控制系统的软件设计53.1主程序流程图53.2闹钟时间设定功能程序54系统功能调试与整体指标64.1软件调试与分析64.2性能分析65元器件及元器件介绍76总结与思考及致谢8参考文献9附录 程序10电路27. z.-电子时钟的设计设计要求利用单片机作为控制核心,完成一个时钟计时器。具体要求如下:(1)采用8位LED数码显示时、分、秒,开机流动显示*。(
3、2)时制式为24小时制,K1选择模式。(3)按键K1进展时钟调时 、调分、调年、调月、调日,闹钟调时、调分,均以按下K1键的次数进展模式改变,调整的位相应闪烁,闪烁时按K2键相应加1,K3则减1。(4)正常显示时钟时,按住K2不放显示年月日,松开显示时钟。(5)正常显示时钟时,按下K3切换到秒表模式,此时K2键对秒表进展控制,K3键则为复位键,再按K3退出该模式。(6)K0对闹钟起启停控制。1设计方案此方案采用单片机部定时器T0、T1进展计时、计数,STC89S52实时控制。外部用按键进展模式选择,时钟调整。2系统硬件电路的设计2.1单片机的选择及引脚功能介绍STC89C52具有如下特点:40
4、个引脚引脚图如图四所示,4k Bytes Flash片程序存储器,128 bytes的随机存取数据存储器RAM,32个外部双向输入/输出I/O口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗WDT电路,片时钟振荡器。此外,STC89C52RC设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停顿芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。图 2 STC89
5、C52芯片引脚图引脚功能介绍:VCC40:5V; GND20:接地; P0口3932:P0口为8位漏极开路双向I/O口,每引脚可吸收8个TTL门电流; P1口18:P1口是从部提供上拉电阻器的8位双向I/O口,P1口缓冲器能接收和输出4个TTL门电流; P2口2128:P2口为部上拉电阻器的8位双向I/O口,P2口缓冲器可接收和输出4个TTL门电流; P3口1017:P3口是8个带部上拉电阻器的双向I/O口,可接收和输出4个TTL门电流,P3口也可作为AT89C51的特殊功能口; RST9:复位输入。当振荡器复位时,要保持RST引脚2个机器周期的高电平时间; ALE/PROG30:当访问外部存
6、储器时,地址锁存允许的输出电平用于锁存地址的低位字节,在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6,它可用作对外部输出的脉冲或用于定时目的,要注意的是,每当访问外部数据存储器时,将跳过1个ALE脉冲; PSEN29:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期2次PSEN有效,但在访问外部数据存储器时,这2次有效的PSEN信号将不出现; EA/VPP31:当EA保持低电平时,外部程序存储器地址为0000HFFFFH不管是否有部程序存储器。FLASH编程期间,此引脚也用于施加12V编程电源VPP;
7、*TAL119:反向振荡器放大器的输入及部时钟工作电路的输入;*TAL218:来自反向振荡器的输出。2.2显示电路设计单片机常用七段LED构成字型“8,另外,还有一个小数点发光二极管以显示小数位!这种显示器有共阴和共阳两种!发光二极管的阳极连在一起的公共端称为共阳极显示器,阴极连在一起的称为共阴极显示器。一位显示器由8个发光二极管组成,其中,7个发光二极管构成字型“8的各个笔划段,a_g,另一个小数点为dp发光二极管。当在*段发光二极管上施加一定的正向电压时,该段笔画即亮;不加电压则暗。为了保护各段LED不被损坏,需外加限流电阻。由于共阴极连接需加驱动,故在这里我采用的是共阳阳极连接。以8位共
8、阴极LED为例,各LED公共阴极接低电平,假设向各控制端a,b,,g,dp顺次送入高平信号,便可进展显示。共阴极7段LED显示数字0 F、文字、符号及小数点的编码a段为最地位,dp点为最高位。 图 3 2.3电源电路设计在各种电子设备中,直流稳压电源是必不可少的组成局部,它是电子设备唯一能量来源,它的设计思路是根据我们以前学过的模电电子技术,要想得到我们所要的+6V输出电压,就需将交流220V的电压经过变压器、整流电路、滤波电路和稳压电路四个局部。3控制系统的软件设计3.1主程序流程图本设计中主程序主要实现显示的初始化和调用各子程序工作的功能,读取时间的子程序主要实现初始化,时间信息的采集和显
9、示段码的码的存取。分别对各个器件的功能进展编程设计,根据主程序流程图如下进展全面的分析。设计中计时主要以定时器T0中断完成,定点闹铃使用峰鸣器来完成。当端口有开关按下时,转入相应的功能程序。其主程序执行流程图如下列图9:图4 主程序流程图3.2闹钟时间设定功能程序在时钟状态下,触发外中断1时,进入闹钟时间设定模式,且不影响T0计时器的功能状态,在键盘上输入对应的数字进展时间设定。当分别按下调节时钟、分钟和秒钟的个位时,时间自动确定,闹钟时间只准确到分钟。闹钟时间设定流程图如图11所示:图11 闹钟时间设定流程图4系统功能调试与整体指标4.1软件调试与分析软件调时在KEIL C51编译器下进展,
10、源程序编译及仿真调试应分段或以子程序为单位逐个进展,最后生成he*文件,并且能够完美仿真。4.2性能分析按照设计程序分析,LED显示器动态扫描的频率为167HZ,实际使用观察时完全没有闪烁。由于计时中断程序中加了中断延时误差处理,所以实际计时精度非常高,可满足多种场合的应用需要。5元件及元件介绍8位数码管:8位数码管属于LED发光器件的一种。LED发光器件一般常用的有两类:数码管和点阵。8位数码管又称为8字型数码管。分为8段:a、b、c、d、e、f、g、p。其中p为小数点。数码管常用的有10根管脚,每一段有一根管脚,另外两根管脚位一个数码管的公共端,两根之间相互连通。用单片机驱动LED数码管有
11、很多方法,按显示方法分为静态显示和动态显示。前者:显示驱动电路具有输出锁存功能,单片机将所有要显示的数据送出后就不在控制LED,直到下一次显示时再传送一次新的显示数据。静态显示的数据稳定,占用的CPU时间少。静态显示中,每一个显示器都要占用单独的具有锁存功能的IO接口,该接口用于笔划段字型代码。这样单片机只要把要显示的字型代码发送到接口电路。该字段可以显示发送的字型。要显示新的数据时,单片机再发送新的字形码。后者:是用其接口电路把所有显示器的8个笔划段a-h同名端连在一起,而妹妹一个显示器的公共极COM各自独立的受控制。CPU向字段输出口送出字形码时,所有显示器承受到一样的字形码,但终究是哪个
12、显示器亮,则取决于公共端,而这一段是有IO扣控制的,由单片机决定何时显示哪一位。电容器:通常简称其容纳电荷的本领为电容,用字母C表示。电容器是电子设备量使用的电子元件之一,广泛应用于电路中的隔直通交,耦合,旁路,滤波,调谐回路,能量转换,控制等方面。极性电容:有极性电容是指电解电容一类的电容。它是由阳极的铝箔和阴极的电解液分别形成两个电极,有阳极铝箔上产生的一层氧化铝膜作为电介质的电容,由于这种构造,使其具有极性,当电容正接的时候,氧化铝膜会由于电化反响而保持稳定,当反接的时候,氧化铝层会表薄,使电容容易被击穿损坏,所以电解电容在电路中必须注意极性,普通的电容是无极性的,也可以把两个电解电容阳
13、极或者阴极相对串连形成无极性电解电容。晶振:是指一块石英晶体上按一定方位切下薄片,石英晶体振荡器,简称为石英晶体或晶体、晶振;而在封装部添加IC组成振荡电路的晶体元件成为晶体振荡器。其产品一般用金属外壳封装,也有用玻璃壳、陶瓷或塑料封装的。电阻:在物理学中表示导体对电流阻碍作用的大小。导体电阻越大,表示导体对电流的阻碍作用越大。不同的导体,电阻一般不同,电阻是导体本身的一种特性。电阻会导致电子流通量的变化,电阻越小,电子流通量越大,反之亦然。三极管:全称应为半导体三极管,也称双极型晶体管、晶体三极管,是一种电流控制电流的半导体器件,其作用是把微弱信号放大成幅值较大的电信号,也用作无触点开关晶体
14、三极管,是半导体根本元器件之一,具有电流放大的作业,是电子电路的核心元件。三极管是在一块半导体基片上制作两个相距很近的PN结,两个PN结把整块半导体分成三局部,中间局部是基区,两侧局部是发射区和集电区,排列方式有PNP和NPN两种。按键:控制作用蜂鸣器:是一种一体化构造的电子讯响器,采用电流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、机、定时器等电子厂品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。6总结与思考及致谢在教师的指导和同学的帮助之下,我完成了此次单片机课程设计。从开场接到课题要求到时钟的实现,再到论文的完成,每走一步对我来说都是新的
15、尝试与挑战。在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监视。课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程。这次时钟计时器设计的经历也会使我终身受益,我感受到做设计是要用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破。通过设计,我在教师的精心指导和严格要求下,获得了丰富的理论知识,极大地提高了实践能力。最后,再一次感谢我的教师.,教师严谨细致、一丝不
16、苟的作风一直是我学习的典范;教师循循善诱的教诲和不拘一格的思路给予我无尽的启迪;这次时钟计时器设计的每个环节,都离不开教师您的细心指导。我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的典范。参考文献1 毅刚.单片机原理及接口技术 M.北京:人民邮电出版社, 20112 毅刚.单片机原理及应用 M.北京:高等教育出版社,20043 毅刚.单片机原理及应用 M.北京:高等教育出版社,20104 毅刚.单片机原理及应用设计 M.北京:电子工业出版社,2008附录:程序#include unsigned char led12=0
17、*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f,0*40,0*00; /用一维数组定义-9、横杠、全灭unsigned char num12=2,0,1,2,1,0,1,1,4,1,2,7 ;unsigned char a8; unsigned char second=0,minute=0,hour=0,year=0,mon=1,day=1,day1,hsec,sec_m,min_m,N,temp1;unsigned char minute1=0,hour1=0;unsigned char b8=0*fe,0*fd,0*fb,0*f7,0*ef
18、,0*df,0*bf,0*7f;/扫描unsigned char k=0;unsigned int temp; / 记录毫秒为秒的变量unsigned char M,S_flag;/M是模式,更新时间的种模式加上正常模式S_flag闪烁标志sbit K0=P37; /K0是闹钟起停标志位sbit K1=P30;sbit K2=P31;sbit K3=P32;sbit BEEP=P33;void delay(unsigned n) /0.2毫秒 int *,y; for(*=0;*n;*+) for(y=0;y24;y+); void init1() S_flag=0; /闪烁标志位 TMOD=
19、0*10; /定时器以方式定时 TH1=0*fc; TL1=0*18; EA=1; /翻开总中断 ET1=1; /允许定时器中断 TR1=1; /开启定时器(开场定时计数)void init0() TMOD=0*01; /定时器以方式定时 TH0=0*ff; TL0=0*ff; EA=1; /翻开总中断 ET0=1; /允许定时器中断 TR0=0; /关闭定时器(关闭定时计数)void display_led() /流动显示*int *;char l,a,m;for(a=0;a21;a+)*=a-8;for(l=0;l6;l+)for(m=0;m=0&*12) P1=lednum*;else
20、P1=led11;delay(20);*+;*-=8;void display() /显示时钟及显示调节位 switch(M)case 0: a0=ledhour/10;a1=ledhour%10;a2=led10;a3=ledminute/10;a4=ledminute%10;a5=led10;a6=ledsecond/10;a7=ledsecond%10;break;case 1:if(S_flag=1)a0=ledhour/10;a1=ledhour%10;elsea0=led11;a1=led11;a2=led10;a3=ledminute/10;a4=ledminute%10;a5=
21、led10;a6=ledsecond/10;a7=ledsecond%10;break;case 2:a0=ledhour/10;a1=ledhour%10;a2=led10;if(S_flag=1)a3=ledminute/10;a4=ledminute%10;elsea3=led11;a4=led11;a5=led10;a6=ledsecond/10;a7=ledsecond%10;break; case 3:if(S_flag=1) a0=ledyear/10; a1=ledyear%10; else a0=led11; a1=led11; a2=led10; a3=ledmon/10;
22、 a4=ledmon%10; a5=led10; a6=ledday/10; a7=ledday%10;break; case 4:a0=ledyear/10;a1=ledyear%10;a2=led10;if(S_flag=1)a3=ledmon/10;a4=ledmon%10;elsea3=led11;a4=led11;a5=led10;a6=ledday/10;a7=ledday%10;break; case 5:a0=ledyear/10;a1=ledyear%10;a2=led10;a3=ledmon/10; a4=ledmon%10;a5=led10;if(S_flag=1) a6
23、=ledday/10; a7=ledday%10; else a6=led11; a7=led11;break;case 6:if(S_flag=1)a0=ledhour1/10;a1=ledhour1%10;elsea0=led11;a1=led11;a2=led10;a3=ledminute1/10;a4=ledminute1%10;a5=led10;a6=led11;a7=led11;break;case 7:a0=ledhour1/10;a1=ledhour1%10;a2=led10;if(S_flag=1)a3=ledminute1/10;a4=ledminute1%10;elsea
24、3=led11;a4=led11;a5=led10;a6=led11;a7=led11; void key_prc()/时钟和闹钟调节 if(K1=0) delay(10);/延时去抖 if(K1=0) /按K1进展模式切换 M+;if(M=8) M=0;while(!K1);/等待按键释放 if(M!=0) switch(M) case 1: /模式-调时 if(K2=0)delay(10);/延时去抖 if(K2=0) /加键按下 if(hour 0) hour-;else hour=23; while(!K3); break; case 2: /模式-调分 if(K2=0)delay(1
25、0);if(K2=0) if(minute0) minute-;else minute=59; while(!K3); break; case 3: /模式-调年 if(K2=0) delay(10); if(K2=0) if(year0) year-; else year=99; while(!K3); break;case 4: /模式-调月 if(K2=0) delay(10); if(K2=0) if(mon1) mon-; else mon=12; while(!K3); if(year%4=0&mon=2)day1=29;/闰年2月为29天 if(year%4!=0&mon=2)d
26、ay1=28;/非闰年2月为28天 if(mon=4|mon=6|mon=9|mon=11)day1=30; if(mon=1|mon=3|mon=5|mon=7|mon=8|mon=10|mon=12)day1=31; break; case 5: /模式-调日 if(K2=0) delay(10); if(K2=0) if(day1) day-; else day=day1; while(!K3); break;case 6: /模式-闹钟调时 if(K2=0)delay(10); if(K2=0) if(hour10) hour1-; else hour1=23; while(!K3);
27、 break; case 7: /模式-闹钟调分 if(K2=0)delay(10); if(K2=0) if(minute10) minute1-; else minute1=59; while(!K3); break; void display_rq() /年月日显示 if(K2=0) delay(10); if(K2=0) a0=ledyear/10; a1=ledyear%10; a2=led10; a3=ledmon/10; a4=ledmon%10; a5=led10; a6=ledday/10; a7=ledday%10; while(!K2); /等待按键释放void key_
28、prc2() /秒表模式转换if(M=0) if(K3=0) delay(10);/延时去抖 if(K3=0) /按K3进展模式切换 N+;if(N=2) N=0;while(!K3);/等待按键释放 void display_sec() /秒表显示 if(N=1) a0=ledmin_m/10; a1=ledmin_m%10; a2=led10; a3=ledsec_m/10; a4=ledsec_m%10; a5=led10; a6=ledhsec/10; a7=ledhsec%10; if(K2=0)delay(10);/延时去抖 if(K2=0) /加键按下 TR0=!TR0; whi
29、le(!K2); /等待按键释放 void res_sec() /秒表复位 if(K1=0) delay(10); if(K1=0) min_m=0; sec_m=0; hsec=0; M=0; while(!K1) ; void main() /主程序 display_led();init0(); init1(); while(1) key_prc(); key_prc2(); if(N=1) display_sec(); res_sec(); else display_rq();display(); void time1() interrupt 3 /定时器中断函数 if(year%4=0&mon=2)day1=29;/闰年2月为29天 if(year%4!=0&mon=2)day1=28;/非闰年2月为28天 if(mon=4|mon=6|mon=9|mon=11)day1=30; if(mon=1|mon=3|mon=5|mon=7|mon=8|mon=10|mon=12)day1=31; TH1=0*fc; /定时ms TL1=0*18; temp+; if(temp=1000) /配合定时器定时s temp=0; second+; if(second=60) second=0; if(minute59) minute+; else minute=0