单片机电子时钟的设计 单片机课程设计.docx
《单片机电子时钟的设计 单片机课程设计.docx》由会员分享,可在线阅读,更多相关《单片机电子时钟的设计 单片机课程设计.docx(25页珍藏版)》请在冰豆网上搜索。
单片机电子时钟的设计单片机课程设计
摘要
在今天,电子技术获得了飞速的发展,在其推动下,现代电子产品是渗透到了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
现代生活的人们非常的重视时间观念,对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以以数码管为显示器的时钟比指针式的时钟表现出了很大的优势。
数码管显示的时间简单明了而且读数快、时间准确显示到秒。
而机械式的依赖于晶体震荡器,可能会导致误差。
数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。
数字钟的精度、稳定度远远超过老式机械钟。
在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,定时器计数。
在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。
数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。
关键字:
数字电子钟;单片机
第1章绪论
1.1研究背景
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
数字钟已成为人们日常生活中:
必不可少的必需品,广泛用于个人家庭以及车站、码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。
1.1选题的目的和意义
单片机课程设计是单片机课程后续学习阶段的一个重要的实践学习环节,它既能增强学生对所学课程内容的理解和综合,也能培养学生的综合应用及设计能力,同时,还可以拓宽课程内容和培养创新意识。
数字钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
1.2本课程设计的主要内容
本设计电子时钟主要功能为:
自动计时功能。
能显示计时时间,显示效果良好。
有校时功能,能对时间进行校准。
扩展功能:
具有整点报时功能,在整点时使用蜂鸣器进行报时。
具有定时闹钟功能,能设定定时闹钟,在时间到时能使蜂鸣器鸣叫。
第2章单片机电子时钟设计方案设计
2.1设计方案
单片机电子时钟方案选择主要涉及两个方面:
计时方案和显示方案。
2.1.1计时方案
单片机电子时钟计时有两种方法:
第一种是通过单片机内部的定时器/计数器,采用软件编程来实现时钟计时,这种实现的时钟一般称为软时钟,这种方法的硬件线路简单,系统的功能一般与软件设计相关,通常用在对时间精度要求不高的场合;第二种是采用专用的硬件时钟芯片计时,这种实现的时钟一般称为硬时钟。
专用的时钟芯片功能比较强大,除了自动实现基本计时外,一般还具有日历和闰年补偿等功能,计时准确,软件编程简单,但硬件成本相对较高,通常用在对时钟精度要求较高的场合。
2.2.2显示方案
对于电子时钟而言,显示是另一个重要的环节。
显示通常采用两种方式:
LED数码管显示和LCD液晶显示。
其中LED数码管显示亮度高,显示内容清晢,根据具体的连接方式可分为静态显示和动态显示,在多个数码管时一般采用动态显示,动态显示时须要占用CPU的大量时间来执行动态显示程序,显示效果往往和显示程序的执行相关。
LCD液晶显示一般能显示的信息多,显示效果好,而且液晶显示器一般都带控制器,显示过程由自带的控制器控制,不须要CPU参与,但液晶显示器造价相对较高。
为了便于比较与学习,这里给出两种设计方案,一种是软件计时LED数码管显示的单片机电子时钟,另一种是硬件定时LCD液晶显示的单片机电子时钟。
软件计时LED数码管显示的单片机电子时钟总体设计框图如图2-1所示。
硬件定时LCD液晶显示的单片机电子时钟总体设计框图如图2-2所示。
图2-1软件计时LED显示时钟总体框图
图2-2硬件定时LCD显示时钟总体框图
2.2.3键盘的基本原理
键盘实际上是一组按键开关的集合,平时按键开关总是处于断开状态,当按下键时它才闭合,按下后可向计算机产生一脉冲波。
按键开关的结构和产生的波形如图2-3所示。
(a)键盘开关的结构(b)键盘产生的波形
图2-3键盘开关及波形示意图
当按键开关未按下时,开关处于断开状态,向P1.1输入高电平;当按键开关按下时,开关处于闭合状态,向P1.1输入低电平。
因此可通过读入P1.1的高低电平状态来判断按键开关是否按下。
(1)抖动的消除
在单片机应用系统中,通常按键开关为机械式开关,由于机械触点的弹性作用,一个按键开关在闭合时往往不会马上稳定地接通,断开时也不会马上断开,因而在闭合和断开的瞬间都会伴随着一串的抖动,如波形如图2-4所示。
按下键位时产生的抖动称为前沿抖动,松开键位时产生的抖动称为后沿抖动。
如果对抖动不作处理,会出现按一次键而输入多次,为确保按一次键只确认一次,必须消除按键抖动。
消除按键抖动通常有硬件消抖和软件消抖两种方法。
图2-4抖动波形示意图
硬件消抖是通过在按键输出电路上添加一定的硬件线路来消除抖动,一般采用R-S触发器或单稳态电路,图2-5是由两个与非门组成的R-S触发器消抖电路。
平时,没有按键时,开关倒向下方,上面的与非门输入高电平,下面的与非门输入低电平,输出端输出高电平。
当按下按键时,开关倒向上方,上面的与非门输入低电平,下面的与非门输入高电平,由于R-S触发器的反馈作用,使输出端迅速的变为低电平,而不会产生抖动波形,而当按键松开时,开头回到下方时也一样,输出端迅速的回到高电平而不会产生抖动波形。
经过图中的R-S触发器消抖后,输出端的信号就变为标准的矩形波。
图2-5硬件消抖电路
软件消抖是利用延时程序消除抖动。
由于抖动时间都比较短,因此可以这样处理:
当检测到有键按下时,执行一段延时程序跳过抖动,再去检测,通过两次检测来识别一次按键,这样就可以消除前沿抖动的影响。
对于后沿抖动,由于在接收一个键位后,一般都要经过一定时间再去检测有无按键,这样就自然跳过后沿抖动时间而消除后沿抖动了。
当然在第二次检测时有可能发现又没有键按下,这是怎么回事呢?
这种情况一般是线路受到外部电路干扰使输入端产生干扰脉冲,这时就认为没有键输入。
在单片机应用系统中,一般都采用软件消抖。
(2)键盘的分类
一般来说,单片机应用系统的键盘可分为两类:
独立式键盘和行列键盘。
独立式键盘就是各按键相互独立,每个按键各接一根I/O接口线,每根I/O接口线上的按键都不会影响其他的I/O接口线。
因此,通过检测各I/O接口线的电平状态就可以很容易地判断出哪个按键被按下了。
独立式键盘如图2-6所示。
独立式键盘的电路配置灵活,软件简单。
但每个按键要占用一根I/O接口线,在按键数量较多时,I/O接口线浪费很大。
故在按键数量不多时,经常采用这种形式。
图2-6独立式键盘结构图
行列键盘往往又叫矩阵键盘。
用两组I/O接口线排列成行、列结构,一组设定为输入,一组设定为输出,键位设置在行、列线的交点上,按键的一端接行线,一端接列线。
例如,图2-7是由4根行线和4根列线组成的44矩阵键盘,行线为输入,列线为输出,可管理44=16个键。
矩阵键盘占用的I/O接口线数目少,如图2-7中44矩阵键盘总共只用了8根I/O接口线,比独立式键盘少了一半的I/O接口线,而且键位越多,情况越明显。
因此,在按键数量较多时,往往采用矩阵式键盘。
矩阵键盘的处理一般注意两个方面:
键位的编码和键位的识别。
(a)二进制组合编码(b)顺序排列编码
图2-7矩阵键盘的结构图
键位的编码矩阵键盘的编码通常有两种:
二进制组合编码和顺序排列编码。
(1)二进制组合编码如图2-7(a)每一根行线有一个编码,每一根列线也有一个编码,图2-7(a)中行线的编码从下到上分别为1、2、4、8,列线的编码从右到左分别为1、2、4、8,每个键位的编码直接用该键位的行线编码和列线编码组合一起得到。
图2-7(a)中44键盘从右到左,从下到上的键位编码分别是:
11H、12H、14H、18H、21H、22H、24H、28H、41H、42H、44H、48H、81H、82H、84H、88H。
这种编码过程简单,但得到的编码复杂,不连续,处理起来不方便。
(2)顺序排列编码如图2-7(b),每一行有一个行首码,每一列有一个列号,图2-7(b)中4行的行首码从下到上分别为0、4、8、12,4列的列号从右到左分别是0、1、2、3。
每个键位的编码用行首码加列号得到,即:
编码=行首码+列号。
这种编码虽然编码过程复杂,但得到的编码简单,连续,处理起来方便,现在矩阵键盘一般都采用顺序编码的方法。
(3)键位的识别
矩阵式键盘键位的识别可分为两步:
第一步是首先检测键盘上是否有键按下;第二步是识别哪一个键按下。
检测键盘上是否有键按下的处理方法是:
将列线送入全扫描字,读入行线的状态来判别。
其具体过程如下:
P2口低四位输出都为低电平,然后读连接行线的P1口低四位,如果读入的内容都是高电平,说明没有键按下,则不用做下一步;如果读入的内容不全为1,则说明有键按下,再做第二步,识别是哪一个键按下。
识别键盘中哪一个键按下的处理方法是:
将列线逐列置成低电平,检查行输入状态,称为逐列扫描。
其具体过程如下:
从P2.0开始,依次输出“0”,置对应的列线为低电平,其它列为高电平,然后从P1低四位读入行线状态。
在扫描某列时,如果读入的行线全为“1”,则说明按下的键不在此列;如果读入的行线不全为“1”,则按下的键必在此列,而且是该列与“0”电平行线相交的交点上的那个键。
为求取编码,在逐列扫描时,可用计数器记录下当前扫描列的列号,检测到第几行有键按下,就用该行的行首码加列号得到当前按键的编码。
(4)独立式键盘与单片机的接口
独立式键盘每一个键用一根I/O接口线管理,电路简单,通常用于键位较少的情况下。
对某个键位的识别通过检测对应I/O线的高低电平来判断,根据判断结果直接进行相应的处理。
在MCS-51单片机系统中,独立式键盘可直接用P0~P3四个并口中的I/O线来连接,连接时,如果用的是P1~P3口,因为内部带上拉电阻,则外部可省力上拉电阻,如果用的是P0口,则须外部带上接电阻。
图2-8是通过P1口低4位直接接4个独立式按键的电路图。
直接判断P1口低4位是否为低电平即可判断相应键是否按下。
图2-8P1口接4个独立式按键图
2.3.4LED显示器的基本结构与原理
LED数码管显示器是由发光二极管按一定的结构组合起来的显示器件。
在单片机应用系统中通常使用的是7段或8段式LED数码管显示器,8段式比7段式多一个小数点。
这里以8段式来介绍,单个8段式LED数码管显示器的外观与引脚如图2-9(a)所示,其中a,b,c,d,e,f,g和小数点dp为8段发光二极管,位置如图中所示,组成一个“
”形状。
(a)引脚图(b)共阴极(c)共阳极
图2-98段式LED数码管引脚与结构
8段发光二极管的连接有两种结构:
共阴极和共阳极。
如图2-9所示。
其中,图(b)为共阴极结构,8段发光二极管的阴极端连接在一起,阳极端分开控制,使用时公共端接地,要使哪根发光二极管亮,则对应的阳极端接高电平;图(b)为共阳极结构,8段发光二极管的阳极端连接在一起,阴极端分开控制,使用时公共端接电源,要使哪根发光二极管亮,则对应的阴极端接地。
LED数码管显示器显示时,公共端首先要保证有效,即共阴极结构公共端接低电平,共阳极结构公共端接高电平,这个过程我们称为选通数码管。
再在另外一端送要显示数字的编码,这个编码称为字段码,8位数码管字段码为8位,从高位到低位的顺序依次为dp、g、f、e、d、c、b、a。
如:
共阴极数码管数字“0”的字段码为00111111B(3FH),共阳极数码管数字“1”的字段码为11111001B(F9H),不同数字或字符其字段码不一样,对于同一个数字或字符,共阴极结构和共阳极结构的字段码也不一样,共阴极和共阳极的字段码互为反码,常见的数字和字符的共阴极和共阳极的字段码如表5.2所示。
表5
.2常见的数字和字符的共阴极和共阳极的字段码
显示字符
共阴极字段码
共阳极字段码
显示字符
共阴极字段码
共阳极字段码
0
3FH
C0H
C
39H
C6H
1
06H
F9H
D
5EH
A1H
2
5BH
A4H
E
79H
86H
3
4FH
B0H
F
71H
8EH
4
66H
99H
P
73H
8CH
5
6DH
92H
U
3EH
C1H
6
7DH
82H
T
31H
CEH
7
07H
F8H
Y
6EH
91H
8
7FH
80H
L
38H
C7H
9
6FH
90H
8.
FFH
00H
A
77H
88H
“灭”
00
FFH
B
7CH
83H
……
……
……
第3章硬件设计
3.1硬件电路
软件计时LED数码管显示的时钟的具体硬件电路如图2-10所示,其中单片机采用应用广泛的AT89C51,系统时钟采用12MHz的晶振,8个数码管显示,小时与分钟、分钟与秒钟之间用短横线间隔,采用共阳极七段式数码管,由于并口上没有连接其它的硬件电路,所以P0口直接作段选码输出端,P2口作位选码输出端。
采用简化按键方式,只设定3个开关K0、K1和K2,通过P1口低3位相连。
其中K0键为调时模式选择键,K1为加1键,K2为减1健。
图2-10软件计时LED显示时钟硬件电路图
3.2数字钟的程序设计
系统的软件设计也是工具系统功能的设计。
单片机软件的设计主要包括执行软件(完成各种实质性功能)的设计和监控软件的设计。
单片机的软件设计通常要考虑以下几个方面的问题:
(1)根据软件功能要求,将系统软件划分为若干个相对独立的部分,设计出合理的总体结构,使软件开发清晰、简洁和流程合理;
(2)培养良好的编程风格,如考虑结构化程序设计、实行模块化、子程序化。
既便于调试、链接,又便于移植和修改;
(3)建立正确的数学模型,通过仿真提高系统的性能,并选取合适的参数;
(4)绘制程序流程图;
(5)合理分配系统资源;
(6)为程序加入注释,提高可读性,实施软件工程;
(7)注意软件的抗干扰设计,提高系统的可靠性。
3.2.1系统软件设计流程图
这次的数字电子钟设计用到很多子程序,它们的流程图如下所示。
主程序是先开始,然后启动定时器,定时器启动后在进行按键检测,检测完后,就可以显示时间。
图3-1软件流程图
3.2.2主程序
时间显示是先秒个位计算显示,然后是秒十位计算显示,再是分个位计算显示,再然后是分十位显示,再就是时个位计算显示,最后是时十位显示。
定时器中断时是先检测1秒是否到,1秒如果到,秒单元就加1;如果没到,就检测1分钟是否到,1分钟如果到,分单元就加1;如果没到,就检测1小时是否到,1小时如果到,时单元就加1,如果没到,就显示时间。
图3-2主程序流程图
3.2.3定时器中断子程序
定时器中断时是先检测1秒是否到,1秒如果到,秒单元就加1;如果没到,就检测1分钟是否到,1分钟如果到,分单元就加1;如果没到,就检测1小时是否到,1小时如果到时单元就加1,如果没到,就显示时间。
3.2.4LED显示子程序
时间显示是先秒个位计算显示,然后是秒十位计算显示,再是分个位计算显示,再然后是分十位显示,再就是时个位计算显示,最后是时十位显示。
图3-3LED显示子程序
3.2.5按键控制子程序
按键处理设置为:
如没有按键,则时钟正常走时。
当按K0键一次,时钟暂停走动进入调小时状态,再按K0键一次,进入调分状态,再按K0键一次,回到正常走时;对于K1和K2按键,如果是正常走时,按K1和K2不起作用,如果进入调时或调分状态,按K1可对时或分进行加1操作,小时加到24则回到0,分加到60则回到0;按K2可对时或分进行减1操作,小时减到负则回到23,分减到负则回到59。
按键处理模块流程如图3-4所示。
图3-4按键流程图
第4章结论
我在这一次数字电子钟的设计过程中,很是受益匪浅。
通过对自己在大学三年时间里所学的知识的回顾,并充分发挥对所学知识的理解和对毕业设计的思考及书面表达能力,最终完成了。
这为自己今后进一步深化学习,积累了一定宝贵的经验。
撰写论文的过程也是专业知识的学习过程,它使我运用已有的专业基础知识,对其进行设计,分析和解决一个理论问题或实际问题,把知识转化为能力的实际训练。
培养了我运用所学知识解决实际问题的能力。
通过这次课程设计我发现,只有理论水平提高了;才能够将课本知识与实践相整合,理论知识服务于教学实践,以增强自己的动手能力。
这个实验十分有意义我获得很深刻的经验。
通过这次课程设计,我们知道了理论和实际的距离,也知道了理论和实际想结合的重要性,也从中得知了很多书本上无法得知的知识。
我们的学习不但要立足于书本,以解决理论和实际教学中的实际问题为目的,还要以实践相结合,理论问题即实践课题,解决问题即课程研究,学生自己就是一个专家,通过自己的手来解决问题比用脑子解决问题更加深刻。
学习就应该采取理论与实践结合的方式,理论的问题,也就是实践性的课题。
这种做法既有助于完成理论知识的巩固,又有助于带动实践,解决实际问题,加强我们的动手能力和解决问题的能力。
参考文献
[1]谢维成.杨加国.单片机原理与应用及C51程序设计.北京.清华大学出版社;第二版
[2]童诗白.华成美.模拟电子技术基础.高等教育出版社.第四版
[3]沙占友,孟志永.单片机外围电路设计.北京:
电子工业出版社,2006.6
[4]顾德英,罗云林.计算机控制技术.北京:
北京邮电大学出版社,2009
附录1软件清单
#include
unsignedchartable1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsignedchartable2[]={0x3f,0x3f,0x40,0x3f,0x3f,0x40,0x3f,0x3f};
unsignedchartable3[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsignedchari,a,b;
sbitKEY=P1^7;
sbitADD=P1^6;
sbitCLK=P1^5;
sbitLLL=P3^0;
intm=0,n=0,k=0,l=0,j=0;
intmm=0,nn=0,kk=0;
voidDelayUs2x(unsignedchart);
voidDelayMs(unsignedchart);
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
voidInit_Timer0(void)
{
TMOD|=0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH0=0x00;//给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
//TL0=0x00;
EA=1;//总中断打开
ET0=1;//定时器中断打开
TR0=1;//定时器开关打开
}
voidmain()
{
Init_Timer0();
P3=0x00;
while
(1)
{
if(!
KEY)//如果检测到低电平,说明按键按下
{
DelayMs(10);//延时去抖,一般10-20ms
if(!
KEY)//再次确认按键是否按下,没有按下则退出
{
while(!
KEY);//如果确认按下按键等待按键释放,没有释放则一直等待
{
mm++;//释放则执行需要的程序
}
}
}
if(mm==4)
{mm=0;}
if(mm==1)
{
if(!
ADD)//如果检测到低电平,说明按键按下
{
DelayMs(10);//延时去抖,一般10-20ms
if(!
ADD)//再次确认按键是否按下,没有按下则退出
{
while(!
ADD);//如果确认按下按键等待按键释放,没有释放则一直等待
{n++;//释放则执行需要的程序
}
}
}
if(!
CLK)//如果检测到低电平,说明按键按下
{
DelayMs(10);//延时去抖,一般10-20ms
if(!
CLK)//再次确认按键是否按下,没有按下则退出
{
while(!
CLK);//如果确认按下按键等待按键释放,没有释放则一直等待
{
n--;//释放则执行需要的程序
}
}
}
}
if(mm==2)
{
if(!
ADD)//如果检测到低电平,说明按键按下
{
DelayMs(10);//延时去抖,一般10-20ms
if(!
ADD)//再次确认按键是否按下,没有按下则退出
{
while(!
ADD);//如果确认按下按键等待按键释放,没有释放则一直等待
{
k++;//释放则执行需要的程序
}
}
}
if(!
CLK)//如果检测到低电平,说明按键按下
{
DelayMs(10);//延时去抖,一般10-20ms
if(!
CLK)//再次确认按键是否按下,没有按下则退出
{
while(!
CLK);//如果确认按下按键等待按键释放,没有释放则一直等待