《多功能六位电子钟设计报告(共25页).doc》由会员分享,可在线阅读,更多相关《多功能六位电子钟设计报告(共25页).doc(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上 JINGCHU UNIVERSITY OF TECHNOLOGY 模拟电子线路基础课程设计报告 多动能六位电子钟 专 业 应用电子 班 级 10级电子三班 学生姓名 杨 振 指导教师 邹云峰、万行花 提交日期 2011年12月23日 目 录第一部分 设计任务1.1 设计题目及要求31.2 主体电路与各电路原理31.2.1 主体电路图31.2.2 显示电路原理41.2.3 键盘原理41.2.4 迅响电路及输入、输出电路原理51.2.5 单片机原理51.2.6 译码显示单元电路71.2.7 校时电路7第二部分 设计方案2.1 总体设计方案说明8 2.2 功能使用说明92
2、.3 模块结构与方框图9 2.4 复位电路10 2.5 时钟电路11第三部分 软件设计与调试3.1 软件任务与安装调试123.1.1 软件流程与任务123.1.2 安装与调试143.1.3 元件清单14第四部分课程设计总结 (心得体会)15第五部分 参考文献 16第一部分 设计任务1.1 设计题目及要求AT89C2051多功能六位电子钟设计制作一个多功能六位电子钟。1、准时计时,一数字形式显示时、分、秒的时间;2、小时的计时要求为“12翻1”分和秒的计时要求为60秒进位;3、校正时间。1.2 主体电路逻辑图1.2.1 主体电路图 原理方框图如图(1):图(1)六位电子钟原理方框图1.2.2 显
3、示电路原理显示部分主要器件为3只两位一体共阳极数码管,驱动采用 PNP 型三极管驱动,各端口配有限流电阻,驱动方式为动态扫描,占用 P3.0P3.5 端口,段码由P1.0P1.6输出。冒号部分采用 4 个 3.0的红色发光二极管,驱动方式为独立端口P1.7驱动。共阳极LED数码管的内部结构原理图:图4-4-2 共阳极LED数码管的内部结构原理图LED数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数位,因此根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。1.静态显示驱动 静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O埠进行
4、驱动,或者使用如BCD码二-十进位*器*进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O埠多,如驱动5个数码管静态显示则需要5840根I/O埠来驱动,要知道一个89S51单片机可用的I/O埠才32个呢。故实际应用时必须增加*驱动器进行驱动,增加了硬体电路的复杂性。2.动态显示驱动: 数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp 的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个
5、数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就显示出字形,没有选通的数码管就不会亮。透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位元数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O埠,而且功耗更低。图4-4-1 LED数码管正面个字段引脚1.2.3 键盘原理:如下图;按键 S1S3
6、 采用复用的方式与显示部分的 P3.5、P3.4、P3.2 口复用。其工作方式为,在相应端口输出高电平时读取按键的状态并由单片机消除抖动并赋予相应的键值。1.2.4 迅响电路及输入、输出电路原理如下图示;迅响电路由有源蜂鸣器和 PNP 型三极管组成。其工作原理是当 PNP 型三极管导通后有源蜂鸣器立即发出定频声响。驱动方式为独立端口驱动,占用P3.7端口。输出电路是与迅响电路复合作用的,其电路结构为有源蜂鸣器,5.1K定值电阻R6,排针J3并联。当有源蜂鸣器无迅响时J3输出低电平,当有源蜂鸣器发出声响时J3输出高电平,J3可接入数字电路等各种需要。驱动方式为迅响复合输出,不占端口。输入电路是与
7、迅响电路复合作用的,其电路结构是在迅响电路的 PNP 型三极管的基极电路中接入排针J2。引脚排针可改变单片机I/O口的电平状态,从而达到输入的目的。驱动方式为复合端口驱动,占用P3.7端口。1.2.5 单片机系统: 本产品采用了单片机AT89C2051为核心器件,并配合所有的外围电路,具有上电复位的功能,无手动复位功能。P3口引脚 功能 P3.0 RXD(串行输入端口) P3.1 TXD(串行输出端口) P3.2 INT0(外中断0) P3.3 INT1(外中断1) P3.4 TO(定时器0外部输入) P3.5 T1(定时器1外部输入) AT89C2051是一带有2K字节闪速可编程可擦除只读存
8、储体(EEPROM)的低电压,高性能8位CMOS微型计算机。如图10.2所示。它采用ATMEL的高密非易失存储技术制造并和工业标准MCS51指令集和引脚结构兼容。通过在单块芯片上组合通用的CPL1和闪速存储器,ATMEL AT89C2051是一强劲的微型计算机,它对许多嵌入式控制应用提供一高度灵活和成本低的解决办法。 1.2.6 译码显示单元电路的介绍方框图如图(2):图(2)译码显示电路译码电路的功能是将秒、分、时计数器的输出代码进行翻译,变成相应的数字。用与驱动LED七段数码管的译码器常用的有74LS48。74LS48是BCD-7段译码器/驱动器,输出高电平有效,专用于驱动LED七段共阴极
9、显示数码管。若将秒、分、时计数器的每位输出分别送到相应七段译吗管的输入端,便可以进行不同数字的显示。在译码管输出与数码管之间串联电阻R作为限流电阻。1.2.7校时电路原理校时电路是数字钟不可缺少的部分,每当数字钟与实际时间不符时,需要根据标准时间进行校时。K1、K2分别是时校正、分校正开关。不校正时,K1、K2开关是闭和的。当校正时位时,需要把K1开关打开,然后用手拨动K3开关,来回拨动一次,就能使时位增加1,根据需要去拨动开关的次数,校正完毕后把K1开关闭上。校正分位时和校正时位的方法一样。其电路图如下:第二部分 设计方案2.1 总体设计方案说明AT89C2051是美国公司生产的低电压、高性
10、能 8位,片内含2k bytes的可反复擦写的只读程序存储器(PEROM)和128bytes的随机数据存储器(),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和存储单元,AT89C2051单片机在电子类产品中有广泛的应用。数字电子钟是用数字电路实现“时”、“分”、“秒”数字显示的计时装置,主要由振荡器、分频器、计数器、译码显示器、校时电路等部分组成。而数字钟想准确的计时则是由振荡器产生的时脉冲送到分频器,分频电路将时标信号分成每秒一次的方波信号。秒脉冲发生器产生频率稳定很高的秒脉冲,秒脉冲被送到一个六十进制秒计数器计数,将计数结果
11、送至秒个位和十位译码器,译码结果分别由两只七段数码管以十进制数形式显示来。当秒六十进制计数器累计到第59秒时,若再来一个秒脉冲,秒计数器的进位输出就产生进位脉冲(分计数脉冲),同时,秒计数器的十位和个位都复位到零。分计数脉冲又被送到分六十进制计数器计数,经译码电路译码后数码管显示相应的分数。当计满59分59秒时,若再来一个秒脉冲,则分计数器便向时计数器送出时计数脉冲,同时,分、秒计数器均复位到零。时计数器是一个二十四进制计数器,当计数显示23时59分59秒时,若再来一个秒脉冲,则时、分、秒计数器都应回到零,并显示(00:00:00)表示已到达午夜零点,第二天开始继续计数。其主要的功能模块如图2
12、-1所示。2.2 功能使用说明; 1、功能按键说明: S1为功能选择按键,S2为功能扩展按键,S3为数值加一按键。 2、功能及操作说明: 操作时,连续短时间(小于1秒)按动S1,即可在以上的6个功能中连续循环。中途如果长按(大于2秒)S1,则立即回到时钟功能的状态。1)时钟功能:上电后即显示10:10:00 ,寓意十全十美。2)校时功能:短按一次 S1,即当前时间和冒号为闪烁状态,按动 S2 则小时位加 1,按动 S3则分钟位加1,秒时不可调。 3)闹钟功能:短按二次S1,显示状态为22:10:00,冒号为长亮。按动S2刚小时位加1,按动S3则分钟位加1,秒时不可调。当按动小时位超过23时则会
13、显示-:-:-,这个表示关闭闹钟功能。闹铃声为蜂鸣器长鸣3秒钟。 4)倒计时功能:短按三次S1,显示状态为 0,冒号为长灭。按动S2则从低位依此显示高位,按动S3则相应位加1,当S2按到第6次时会在所设定的时间状态下开始倒计时,再次按动S2将再次进入调整功能,并且停止倒计时。 5)秒表功能:短按四次 S1,显示状态为 00:00:00,冒号为长亮。按动 S2 则开始秒表计时,再次按动S2则停止计时,当停止计时的时候按动S3则秒表清零。 6)计数器功能:短按五次S1,显示状态为00:00:00,冒号为长灭,按动S2则计数器加1,按动S3则计数器清零。2.3 模块结构与方框图如图(5) 图(5)软
14、件系统结构方框图2.4 复位电路原理AT89C2051单片机的复位是由外部的复位电路来实现的。复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。上电复位电路是种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随着VCC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。为了保证系统安全可靠的复位,RST引脚的高
15、电平信号必须维持足够长的时间。图4-1 复位电路上电自动复位是通过外部复位电路的电容充电来实现的。只要VCC的上升时间不超过1ms,就可以实现自动上电复位。2.5 时钟电路时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有条不紊的一拍一拍地工作。因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路有两种方式:一种是内部时钟方式,另一种为外部时钟方式。本文用的是内部时钟方式。AT89C2051单片机内部有一个用于构成振荡器的高增益反相放大器,该高增益反向放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。这两个引脚跨接石英晶体振荡
16、器和微调电容,就构成一个稳定的自激振荡器。第三部分 软件设计与安装调试3.1 软件任务与安装调试3.1.1 软件流程与任务软件任务分析软件任务分析和硬件电路设计结合进行,哪些功能由硬件完成,哪些任务由软件完成,在硬件电路设计基本定型后,也就基本上决定下来了9。软件任务分析环节是为软件设计做一个总体规划。从软件的功能来看可分为两大类:一类是执行软件,它能完成各种实质性的功能,如测量,计算,显示,打印,输出控制和通信等,另一类是监控软件,它是专门用来协调各执行模块和操作者的关系,在系统软件中充当组织调度角色的软件。这两类软件的设计方法各有特色,执行软件的设计偏重算法效率,与硬件关系密切,千变万化。
17、软件任务分析时,应将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义(输入输出定义)。在各执行模块进行定义时,将要牵扯到的数据结构和数据类型问题也一并规划好。各执行模块规划好后,就可以监控程序了。首先根据系统功能和键盘设置选择一种最适合的监控程序结构。相对来讲,执行模块任务明确单纯,比较容易编程,而监控程序较易出问题。这如同当一名操作工人比较容易,而当一个厂长就比较难了。软件任务分析的另一个内容是如何安排监控软件和各执行模块。整个系统软件可分为后台程序(背景程序)和前台程序。后台程序指主程序及其调用的子程序,这类程序对实时性要求不是太高,延误几十ms甚至几百ms也没关系,故通常将监
18、控程序(键盘解释程序),显示程序和打印程序等与操作者打交道的程序放在后台程序中执行;而前台程序安排一些实时性要求较高的内容,如定时系统和外部中断(如掉电中断)。也可以将全部程序均安排在前台,后台程序为“使系统进入睡眠状态”,以利于系统节电和抗干扰。软件流程图图5-3 程序设计流程图程序里先定义两个中断定时器T0和T1,一个作为秒记数用,另一个做为调整时闪烁用。编程时先将P1和P3口数据清零,然后P1和P3口作动态扫描显示,由于人的眼睛有延迟性,当扫描频率非常高时人就感觉数码管一直亮着,而同时记数器在遵循时间的变化方式执行着秒到了60分加一,分到了60小时加一,小时到了24就归零。P3.7作为时
19、间调整按钮当长按按住2秒以上进入校准时间状态及换档和退出,快速点触用于调节时间数值,归零是复位按钮。3.1.2 安装与调试安装、焊接元件到电路板上按照先低后高,先小后大,先卧式后立式的顺序,正确插入元件,其高低、极性要符合规定。1.先从最低元件安装。应先安装、焊接跳线机及电阻,用电阻多余的脚做跳线,电阻引脚不分正负,焊接时间最好控制在2-3秒。2.安装、焊接瓷片电容。瓷片电容部分正负极。3.安装、焊接轻触开关4.安装、焊接三极管。三极管的外形基本一样,注意分青,且方向要和电路板上的方向一致。5.安装、焊接12MHZ晶振。晶振没有正负极。6.安装、焊接电解电容,装的时候要躺着安装,立着会影响发光
20、二极管的显示不整齐。7.安装、焊接20脚IC插座,从用一小缺口或小圆点标记的地方以逆时针数依次为1-20脚,安装时要注意缺口和电路上的缺口相一致。20只引脚都插到位后,先用手指按住,固定对角两只引脚,防止插入的引脚掉出来,再把板放到桌面上把剩下的引脚焊好。焊好后不要急于插入单片机芯片,因为还有其他元件焊接,防止电烙铁带静电击坏单片机芯片。8.安装、焊接蜂鸣器。9.安装、焊接LED。LED和普通二极管一样,有正负极之分,不能装错。安装、焊接数码管。认识数码管内部结构。3.1.3 元件清单序号名称规格位号数量序号名称规格位号数量1单片机AT89C2051U1113三极管9012Q1Q772三端集成
21、稳压78L05U2114电阻220R3R9732位共阳数码管红色0.4寸LED1LED33151KR2、R10R1574发光二极管红色3D1D44162KR17、R1825蜂鸣器5V有源U31175.1KR1616瓷片电容30PFC2、C321810KR1170.1uFC4、C5219按键6*6*5S1、S2、S3382位排针间距2.54J1J3320电池盒4节5号19集成电路插座20PU1121DC插座5.5*2.1110电解电容10uFC1122电源线双色2P带热缩管111100uFC6123电路板105*55112晶振12MHzY1124说明书A4双面1第五部分 课程设计总结(心得体会)
22、经过大量查找资料和老师的不断指点,我将所设计的六位数码管电子钟焊接成功,虽然不是很稳定,但在这个过程中,我了解了各个元器件的识别与测量,也了解了AT89C2051单片机及其引脚功能。同时明白了六位数码管电子钟的工作原理并实现了其功能。本程序设计时,只用了一个定时器T0,其他的中断全部关断,定时器工作在两个8位自动加载初始值状态。简短的定时中断程序只负责时间的计数和进位功能,这是保证走时精确。有三个轻触式按键:功能选择按键S1,功能扩展按键S2,数值加一按键S3。此数字钟采用了一只NPN型的三极管及蜂鸣器为闹时讯响电路。通过这次的毕业设计,我对自己的动手能力有了信心。面临着就业,我将充分发挥我的
23、主观能动性和在学校学到的一切知识。为母校添砖加瓦,为自己的前程奋斗!这次毕业设计的顺利进行,我深刻明白了理论知识与社会实践相结合的道理,从总得到了以前书本知识所不曾得到的知识。更加明白了如今信息时代电子技能知识的重要性。增强了我对实际工艺技术、电子技术和设备技术等方面的认识,掌握了分析处理方法,调试、计算等基本技能的训练,并具备了一定程度的实际工作能力。第六部分 参考文献程序主要代码:#includecode senen_seg10=0x81,0xe7,0x92,0xa2,0xe4,0xa8,0x88,0xe3,0x80,0xa0; bit key1_enter=0,key2_enter=0,
24、key3_enter=0,countdown_mark=0,stopwatch_mark=0,count_mark=0,bell_mark=0; unsigned char program=0,program_variable=0,count_bit=0,count=0;unsigned char hour=10,minute=10,second=0;unsigned char delayed_hour=22,delayed_minute=10,delayed_second=0; unsigned char count_hour=0,count_minute=0,count_second=0;
25、unsigned char count_time=0,count_count=0;void delay(unsigned int t) unsigned int i,j; for(i=0;it;i+) for(j=0;j=199) count_time=0; second+; if(second=60) second=0; minute+; if(minute=60) minute=0; hour+; if(hour=24)hour=0; if(delayed_hour=hour & delayed_minute=minute & second=199 & (count_second!=0|c
26、ount_minute!=0|count_hour!=0)count_count=0;count_second-;if(count_second=60) count_second=59; count_minute-; if(count_minute=60) count_minute=59; count_hour-; if(count_hour=100) count_hour=99; if(count_second=0&count_minute=0&count_hour=0&count_count=15000) count_count=14000; if(stopwatch_mark=1) co
27、unt_count+; if(count_count=2)count_count=0;count_second+;if(count_second=100) count_second=0; count_minute+; if(count_minute=60) count_minute=0; count_hour+; if(count_hour=60) count_hour=0; unsigned char show_key (void)unsigned char x=0,y=0;switch (program)case 0: P1&=senen_segsecond%10; break;case
28、1: if(count_time=90) P1&=senen_segsecond%10; break;case 2: if(delayed_hour=24) P1=0xfe; else P1&=senen_segdelayed_second%10; break;case 3: if(count_bit=0) P1&=senen_segcount_second%10; else P1=0xff; break;case 4: P1&=senen_segcount_second%10; break;case 5: P1&=senen_segcount_second%10; break; P3_3=0
29、; delay(10); if(P3_5=0) key1_enter=1;if(count=90) P1&=senen_segsecond/10; break;case 2: if(delayed_hour=24) P1=0xfe; else P1&=senen_segdelayed_second/10; break;case 3: if(count_bit=1) P1&=senen_segcount_second/10;else P1=0xff; break;case 4: P1&=senen_segcount_second/10; break;case 5: P1&=senen_segco
30、unt_second/10; break; P3_1=0; delay(10); P3_1=1; P1|=0xff;switch (program) case 0: P1&=senen_segminute%10; break;case 1: if(count_time=90) P1&=senen_segminute%10; break;case 2: if(delayed_hour=24) P1=0xfe; else P1&=senen_segdelayed_minute%10; break;case 3: if(count_bit=2) P1&=senen_segcount_minute%1
31、0;else P1=0xff;break;case 4: P1&=senen_segcount_minute%10; break;case 5: P1&=senen_segcount_minute%10; break; P3_2=0; delay(10); P3_2=1; P1|=0xff;switch (program)case 0: P1&=senen_segminute/10; break;case 1: if(count_time=90) P1&=senen_segminute/10; break;case 2: if(delayed_hour=24) P1=0xfe; else P1
32、&=senen_segdelayed_minute/10; break;case 3: if(count_bit=3) P1&=senen_segcount_minute/10;else P1=0xff;break; case 4: P1&=senen_segcount_minute/10; break;case 5: P1&=senen_segcount_minute/10; break; P3_5=0; delay(10); P3_5=1; P1|=0xff;switch (program)case 0: P1&=senen_seghour%10; break;case 1: if(cou
33、nt_time=90) P1&=senen_seghour%10; break;case 2: if(delayed_hour=24) P1=0xfe; else P1&=senen_segdelayed_hour%10; break;case 3: if(count_bit=4) P1&=senen_segcount_hour%10;else P1=0xff;break;case 4: P1&=senen_segcount_hour%10; break;case 5: P1&=senen_segcount_hour%10; break; P3_0=0; delay(10); if(P3_4=
34、1 & key2_enter=1) x=3; 3 key2_enter=0; P3_0=1; P1|=0xff;switch (program) case 0: P1&=senen_seghour/10; break;case 1: if(count_time=90) P1&=senen_seghour/10; break;case 2: if(delayed_hour=24) P1=0xfe; else P1&=senen_segdelayed_hour/10; break;case 3: if(count_bit=5)P1&=senen_segcount_hour/10; else P1=
35、0xff;break;case 4: P1&=senen_segcount_hour/10; break;case 5: P1&=senen_segcount_hour/10; break; P3_4=0; delay(10); if(P3_5=1 & key1_enter=1) if(count=127) x=1; else x=2; key1_enter=0;count=0; if(P3_2=1 & key3_enter=1) x=4; key3_enter=0; P3_4=1; P1|=0xff;if(program=100) P1&=0xff;if(program=1 & count_time=24)hour=0;break;case 4: minute+; if(minute=60)minute=0;break; break;case 2: while(program=2) switch(show_key() case 0: break;case 1:program=0