完整版多功能数字钟毕业课程设计Word文档格式.docx
《完整版多功能数字钟毕业课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《完整版多功能数字钟毕业课程设计Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
多功能数字钟的设计
摘要:
本文设计的是基于单片机的多功能数字钟的设计,本系统设计以AT89C51单片机为核心,分成四个模块,一是显示系统:
此系统采用8位LED显示,实现时、分、秒的精确显示;
二是时钟计算系统:
此系统主要实现对外部脉冲的计数,并用LED数码管将其结果动态显示;
三是闹钟定时系统:
该系统主要实现闹钟的定时与响铃功能;
四是12与24进制转换系统,此系统主要实现由12小时计时方式转换为24小时计时方式。
,LED数码管的动态显示可以及时准确的将精确的时间显示出来,在实际应用中很方便。
关键词:
AT89C51单片机;
按键;
脉冲计数;
动态显示
0.前言
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
数字钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
在单片机技术日趋成熟的今天,其灵活的硬件电路的设计和软件的设计,让单片机得到了广泛的应用,几乎是从小的电子产品,到大的工业控制,单片机都起到了举足轻重的作用。
单片机小的系统结构几乎是所有具有可编程硬件的一个缩影,可谓是“麻雀虽小,肝胆俱全”,单片机的学习和研究是对微机系统学习和研究的简捷途径。
1.总体方案设计
图1多功能数字钟单片机模拟系统基本组成框图
单的系统从而达到强化课本知识并灵活运用的目的。
电子数字钟是日常生活钟随处可见的简单系统。
对电子数字钟的设计比较容易联系实际并进行拓展,在设计中我将力求尽可能跳出课本的样板,从现实生活中寻找设计原型和设计思路,争取有所突破
电子时钟主要由显示模块,校时模块,时钟运算模块和12与24进制转换模块四大部分组成。
其中校时模块和时钟运算模块要对时、分、秒的数值进行操作,并且秒计算到60时,要自己清零并向分进1;
分计算到60时,要自己清零并向时进1;
时计算到24时,要清零。
这样,才能循环记时。
89C51是8位CPU,具有片内振荡器和时钟电路,2个16位的定时器计数器,5个中断源,两个中断优先级。
89C51单片机的时钟信号通常用内部振荡方式得到:
在引脚XTAL1和XTAL2外接晶体振荡器(简称晶振)或陶瓷谐振器,就构成了内部振荡方式。
由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器并产生振荡时钟脉冲.电容器Col,C02起稳定振荡频率、快速起振的作用,其电容值一般在5-30pF。
晶振频率的典型值为12MHZ校时模块主要功能是修改时、分、秒内存单元的数值。
每按一次键,对应的显示值便加1。
分、秒加到59后变为00;
小时加到23后再按键即变为00.再调校时均不向上一单位进位(例如分加到59后变为00;
但小时不发生改变)。
注意:
在主程序中对时间进行调校前应关闭中断,以防在调校过程中定时中断服务程序也对时间进行修改而造成混淆。
数字钟的设计首先要保证其走时尽可能准确,其次再根据人们日常的使用习惯来设定其附加功能。
在设计中利用单片机定时计数器来完成走时并用两组输出口控制数码管来显示;
通过编程向某一输出口输出方波实现报时及闹铃;
利用输入端口外接各种开关来完成对走时及显示的控制(如预置时间等)。
在设计中需要用到许多技巧。
以下为我在学习单片机课程中总结的一些设计思想或方法:
占空比概念在设计中的运用
图2占空比
如图所示的一串方波序列,导通时间同周期的比值即占空比。
在用单片机控制对多个数码管的扫描显示中,数码管接收到的电压可以看成是一串方波序列,占空比控制了数码管的亮度。
实际上对显示延时时间的调节就是调节数码管电压的占空比,当占空比大于一定数值的时候数码管可以显示,实验证明占空比在0.1时仍可以使数码管清晰显示。
利用这个概念可以比较直观地理解显示延时的调节。
CPU的分时复用
单片机只有一个CPU,因此在一个时间内只能执行一条语句,要使单片机同时控制多个外部元件(比如扬声器和数码管)就必须对单片机的CPU进行分时复用,让单片机在一小段时间内连续交替执行控制多个器件的语句,从表面上看,单片机便用一个CPU控制了多个元件。
本次课程设计中对整点报时和闹铃功能的实现便用到了这个概念。
单片机位寻址区的使用
单片机内部数据存储器由20H到2FH共有16个字节的位寻址区可以被作为程序执行过程中的状态参数,许多程序模块至于两个状态(比如闪烁与正常显示,报时与不报时等)用位寻址区中的某一位来记录程序执行状态,在需要对状态进行判断的时候十分方便并且节约空间,一个字节便可以判断八个状态,而非位寻址区的地址记录程序状态时可能需要先进行变换,增加了执行成本且容易出错。
检测开关时需要注意的问题
对于用各种开关控制程序执行状态的程序设计中,需要注意实时地进行开关的检测,以确保一旦有开关动作,程序状态立即随之改变。
此外,在用多个开关控制不同执行状态时,应注意设置开关检测的优先级以防止多个开关同时按下时出现错误。
系统资源分配与使用
单片机有许多资源是有限的不能滥用,比如定时计数器T,外部中断等,在设计一个多模块程序时,要注意先做一个整体规划,把稀缺资源用在最需要用的地方。
此外在有多个模块时,要注意模块间的数据传递,比如累加器A和进位标志C,在使用时要注意不能让前一个模块的数据对下一个模块产生不希望有的影响。
在模块间的数据传递比较多时最好用固定的内部数据存储器,以避免冲突发生错误。
2.硬件电路设计
由单片机硬件设计原理可知:
(1)尽可能采用功能强的芯片,以简化电路;
(2)留有余地。
在设计硬件电路时,要考虑到将来修改、扩展的方便。
因此在AT89C51芯片本身的最小系统需求外,还选择了上拉电阻进行了简单的扩展。
2.1单片机主机系统电路的设计
单片机主机系统原理图如图3所示。
图3单片机主机系统原理图
由图3可知,此系统有两部分:
时钟电路和复位电路。
时钟电路:
AT89C51内部有一个用于构成震荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。
这个放大器与作为反馈元件的片外晶体或陶瓷谐振器一起构成一个自激振荡器。
外接晶体以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。
(晶体可在1.2MHz~12MHz之间任选,电容C1和C2的典型值在20pF~100pF之间选择)
复位电路:
本系统的复位电路是采用按键复位的电路,复位输入引脚RET为AT89C51提供了初始化的手段。
当89C51的ALE及PSEN两引脚输出高电平,RET引脚高电平到时,单片机复位。
按下按钮,则直接把+5V加到了RET端从而复位称为手动复位。
复位后,P0到P3并行IO口全为高电平,其它寄存器全部清零,只有SBUF寄存器状态不确定。
2.2多功能数字钟的时、分、秒的调制电路
图4多功能数字钟的时、分、秒的调制电路
分别设置了三个按键:
set、up、down用于高低电平的输入。
LED灯组与单片机AT89C51相连接至P0口,用于输出时间的状态。
没有开关闭合时,时间处于正常显示状态,LED灯显示当时的时间。
开关set键按下时,如果按下一次,则可以对小时进行调整,若小时加1,则继续按up键,若需要小时减1,则需按down键;
如果set键按下两次,则可以对分进行调整,具体原理与小时的调整一样;
若果set键按下三次,则是对秒进行调整,具体原理时、分相同。
此系统减少了端口的使用,简化了电路,方便了电路以后的使用和修改。
2.3多功能数字钟显示系统的设置:
函数信号发生器输出脉冲作为输入接至P3.5口,由单片机内部计数器T1进行计数,选用7段6位共阳极数码管,与单片机的P0口相连,6个位选端分别与单片机的P2.0~P2.5口相连组成显示电路,实现时间的动态显示。
在多位LED显示时,为了简化电路,节省IO口,降低成本,动态显示方案具备一定的实用性,也是目前单片机数码管显示较为常用的一种显示方法。
在本设计课题中采用的是7段6位共阳极LED数码管,它的引脚图如图7所示。
图57段6位共阳极LED数码管引脚图
7段LED数码管是利用7个LED(发光二极管)外加一个小数点的LED组合而成的显示设备,7段数码管分共阴和共阳两种显示方式,本设计中采用共阳极显示器。
共阳极显示器的发光二极管的阳极连接在一起,当公共阳极接电源+5V时,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。
通常将控制发光二极管发光的8位字节数据编码称为LED显示的段选码,要构成多位LED显示时,除需要段选线外,还需要位选线,以确定段选码对应的显示位,位选线控制第几个LED显示。
段选线控制显示字形。
8个阴极分别与8个限流电阻相连,在接到相应的电路中(发光二极管的工作电流选取在10-20ma,限流电阻太大,数码管会太亮),其连接图如图6所示。
图67段共阳极LED连接图
多功能数字钟显示系统电路如图7所示,当按键按下输出脉冲时,内部定时器T1开始计数,脉冲数相当于时间,脉冲数通过单片机内部算法经数码管显示结果。
按键set为多功能数字钟的调整键,模拟多功能数字钟时,LED数码管显示当前时间,并随时根据调整的时间进行实时的显示。
图7多功能数字钟显示系统电路
3.软件编程
在单片机系统的程序的设计开发中,单片机就如同整个系统的交通中枢,而程序就是组成交通中枢的条条大道,各个部分的模块化的程序就是整个系统的组成成份。
软件编写的好坏,语句运用的是否简洁直接关系单片机的工作效率。
在各个模块化的程序中尽量用最少的语句作最多的事情,不让语句出现歧义,这样就可以使整个程序可以在系统中更好的运行,使单片机工作效率大大的提高。
本系统编程部分是利用C语言完成的,采用模块化的设计方法,各子程序作为实现各部分功能和过程的入口,完成对灯的控制,脉冲计数和LED动态显示等部分的设计。
该课题的软件设计采用了模块化设计的思想即将程序划分为若干个相对独立的功能模块,画出每一个功能模块的详细流程图,并根据流程图编写程序,最后按照软件设计的总体结构框图,将各模块连接成一个完整的主程序。
在主程序的设计中要合理地调用各模块程序。
模块化设计的优点是:
无论是硬件还是软件,每一个模块都相对独立,故能独立地进行设计、研制、调试和修改,从而使复杂的工作得以简化。
模块之间的相互独立也有助于研制任务的分解和设计人员之间的分工合作,这样可提高工作效率和仪表的研制速度。
本系统设计以AT89C51单片机为核心,分成四个模块,一是显示系统:
下面就其主要部分分别分析。
3.1主程序流程图
图6主程序流程图
3.2定时中断流程图
图7定时器中断流程图
本系统编程部分是利用C语言完成的,采用模块化的设计方法,各子程序作为实现各部分功能和过程的入口,完成对时,分,秒以及闹铃和12进制与24进制转换的控制,脉冲计数和LED动态显示等部分的设计。
4.调试分析
4.1软件调试
本次设计采用的是keil仿真器进行软件调试,此系统可以开发应用软件,以及对硬件电路进行诊断、调试等。
它的具体功能是可以进行CPU仿真,可以单步、跟踪、断点和全速运行,而且,程序的编译过程中,可以对设计软件进行自诊断,并自动给出故障原因。
同时用户调试程序时,可以通过窗口观察寄存器的工作状况,以便及时发现和排除编程中可能出现的错误。
软件的调试是利用keil软件,模块化调试,通过观察存储单元数据的变化,查找并解决程序的语法和逻辑错误,具体的调试步骤如下:
1.把系统的各个模块在仿真软件中逐个调试,如时间调整模块、显示模块等。
2.对各个需要赋值模块调试时,赋入初值,单步调试,观察数据窗口,看输出结果是否为设计时想要的结果。
3.把各个模块组合起来,全速运行,看程序是否能流畅的,是否能实现设计的系统的所有功能。
4.2软硬联调
本设计是采用Proteus软件实现电路图设计和仿真的,Proteus软件与Keil软件联合使用,实现设计要求。
在Keil软件中创建新文件,输入所编写的c语言程序并保存,在编译源程序无误后,会产出相应的”.HEX”文件;
将所生成的”.HEX”文件加载到已绘制好的Proteus原理图中,使Proteus与Keil真正连接起来,实现联合调试。
调试结
结果如图8所示:
5结论及进一步设想(需说明的问题)
该课题的主要任务是设计一个以89C51单片机为核心的多功能数字钟系统。
通过联调,实验验证了系统的可行,能满足设计要求,达到设计的指标,最后实现了对多功能数字钟的控制和时间的计算并用LED显示的目的。
这个开发过程主要包括了硬件电路仿真设计和软件编程两个部分。
从确定课设题目,到查阅质料确定总体方案设计,硬件电路仿真的设计,硬件电路的优化,软件的设计,软件的优化,检验仿真电路,调试软件程序,到最后的软硬件联调,其中的每一个过程都是精心设计、仔细完成的。
并且在这次设计中,我了解了单片机的各种问题以及单片机外围电路的设计,对外围电路所涉及的芯片也有了较深刻的理解。
同时对单片机的优点有了很好的认识。
虽然本次设计的系统具有电路简单、性能可靠、成本低,还有优化的程序等特点,但是该设计还是不够完善及人性化,比如加上AT24C02掉电存储芯片就可以在电源断开的时候,存储当前信息,再加上语音的提示功能,则可能更会有生命力。
总之,智能仪器被广泛应用于工程之中,而数字式仪表领域也被广泛用于实际的应用中,这也就是智能仪器的工程应用价值。
参考文献
1.张毅坤陈善久裘雪红.单片微型计算机原理及应用.西安电子科技大学出版社.1998年9月第1版.
2.任为民.电子技术基础课程设计.中央广播电视大学出版社.1997年5月第1版.
3.谭浩强.C程序设计(第二版).清华大学出版社.1999年12月第2版.。
4.刘复华.单片机及其应用系统.北京:
清华大学出版社,1992
5.周坚.单片机C语言轻松入门.北京:
航空航天大学出版社,2006
6.侯玉宝,陈忠平.基于Proteus51系列单片机设计与仿真.北京:
电子工业出版社,2008
7.戴佳,苗龙,陈斌.51单片机应用系统开发典型实例.北京:
中国电力出版社,2005
8.张立科.单片机典型模块设计实例导航.北京:
中国邮电出版社,2006
课设体会
在本次课程设计开始时我就希望能通过这次课程设计学习到尽可能多的知识。
因此我选择了难度比较大的数字钟。
此前在学习数字电子技术课程的时候,课程设计的题目同样也是数字钟,但是由于使用的语言和硬件不同,设计过程需要考虑的问题也大不相同。
数电课程设计的模块划分是由老师完成的,而这个工作锻炼价值很大;
同时,数电课设中不需要考虑CPU的时间复用问题,因此,因此本次课程设计的难度比较大。
在课程设计的第一次调试过程中,出现了许多我无法解释的问题,使我有些灰心,但是在认真重新读完自己的程序以后,我发现原来出现问题的原因都是自己的粗心,在修改完这些问题以后,接下来的调试就比较顺畅了归结原因主要还是我对流程图的设计下了很多功夫,为调试打下了良好的基础。
我对程序设计课程的学习的目标是在若干年以后能够独立设计一个复杂的系统,包括硬件电路和软件部分。
所以,这次课程设计我付出了比别人跟多的努力,同样也学习到了更多的知识。
在我能够独立设计更复杂的实用系统的时候,回想现在我连设计一个简单的数字钟系统都没有很好的把握时,我一定会为自己的成长感到喜悦。
通过两个月的学习和调试过程,终于完成了单片机模块数字钟的工作。
并且使数字钟够顺利运行,完成了预期的目标。
从单片机模块数字钟的设计过程中也找到了一些单片机开发的规律:
先了解所有元件的具体内容,从而画出其电路图,使数字钟从简易变成多功能的方式,虽没有做多功能数字钟,却知晓了其方法。
从而让我踏入了单片机应用领域的第一步。
然而在调试过程中有也有许多的不足之处:
例如编写调试程序有点不足。
希望能够在以后的不断深入学习中能够弥补自己的不足之处。
同时更是朝着单片机应用领域迈进。
元器件清单
元件名称
型号
数量
单片机
AT89C51
1
LED数码管
7SEG-MPX8-CA-BLUE
按键
BUTTON
3
附录I电路原理图
附录2程序清单
共有6种工作模式:
正常计时、按键调时、按键调分、按键调秒、闹钟调时、
闹钟调秒,按设置键切换工作模式。
#include<
reg52.,sec;
uintringhour,ringmin;
uintstatus,T;
sbitbeep=P1^0;
闹钟
bitringoff;
bitflag;
voidkeyprocess(unsignedchar);
**********延时函数************
voiddelayMS(uintt)晶振频率12M
{
uinti;
while(t--)
for(i=0;
i<
125;
i++);
}
voiddelay()闹铃的延时
uintm,n;
for(m=0;
m<
20;
m++)
for(n=0;
n<
n++);
************数码管显示函数****************
voiddisplay()
uchari;
if(status==4||status==5)闹钟调时、调分状态
{
buffer[0]=ringhour10;
buffer[1]=ringhour%10;
buffer[3]=ringmin10;
显示分的十位
buffer[4]=ringmin%10;
显示分的个位
for(i=0;
8;
i++)
{
P0=segcode[buffer[i]];
P2=dispbit[i];
delayMS
(1);
防止数码管显示的时候闪动
P2=0x0;
}
}
else正常计时显示
{
buffer[0]=10;
buffer[4]=min%10;
buffer[5]=10;
buffer[6]=sec10;
显示秒的十位
buffer[7]=sec%10;
显示秒的个位
for(i=0;
{
P0=segcode[buffer[i]];
P2=dispbit[i];
delayMS
(1);
P2=0x0;
}
main()主函数
{
bitkeyrelease;
ucharbuf;
ucharkeyinput;
keyrelease=1;
buf=0xff;
ringoff=1;
TMOD=0x01;
T0工作在方式1,16位计数器
TH0=()256;
定时器0设置延时1ms中断初始值
TL0=()%256;
TR0=1;
IE=0x82;
开定时器0中断
status=0;
while
(1)死巡环
****************************************************
键扫描程序,全扫描,逐行扫描。
按键弹起后才处理
*****************************************************
keyinput=P1&