数码管电子钟的设计及实现

更新时间:2024-05-15 19:18:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

编号:

本科毕业设计

数码管电子钟的设计及实现

院 系:信息工程学院 姓 名: 学 号:

专 业:通信工程 年 级: 指导教师: 职 称:副教授 完成日期:

摘 要

电子钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、可拓展性能强等特点,被广泛用于生活和工作中去。

本文主要为实现一款可正常显示时间、带有24h/12h制调整、带有AM/PM显示以及时间校准功能的一款基于单片机仿真的多功能电子钟。

本文对设计要求的功能进行了分析和比较,确定了提供电源、界面显示、输入等方案。本设计采用AT80C51芯片作为核心,以时钟电路、复位电路为辅助电路,用Proteus软件自带的电子钟组件实现高度仿真的显示结果。软件部分主要采用简单且应用广泛的C51语言编写实现。这种仿真的电子钟具有电路简单、读取方便、显示直观、功能多样、时间精度较高、操作简单、编程容易、成本低廉等很多优点。

设计主要是用Proteus电路软件实现电子管的仿真。经过改装,添加部分功能所生产出的产品即可应用于一般的生活和工作中,从而给人们的生活和生产带来便利,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

关键词:单片机;电子钟;控制器

I

Abstract

Electronic clock is the use of electronic technology to make clock electronic and digital. With a precise clock, small size and can be able to develop strong performance characteristics, so are widely used to live and work.

In this paper, to achieve a normal display time with 24h/12h system adjustments, with the AM/PM display and time calibration function of a simulation based on single chip multi-function electronic clock.

In his paper the design requirements of the function are analyzed and compared, determined to provide power, interface display, input program. This design adopts AT80C51 chip as the core, with a clock circuit, reset circuit, using Proteus Software comes with the electronic clock assembly to achieve a high degree of simulation result. Software part mainly uses a wide range of C51 language. This simulation electronic clock has the advantages of simple circuit, convenient reading, visual display, multiple functions, high precision ,simple operation, time programming is easy, low cost and many other advantages.

The design is mainly use Proteus software to realize the electronic tube simulation circuit. After modification, adding some functions to produce products that can be applied to people’s life and production,in line with the development trend of electronic instrumentation, and has broad market prospects.

Keywords:SCM;electronic clock;controller

II

目 录

1 绪论...................................................................................................................................... 1 1.1 数字电子钟的背景和意义........................................................................................... 1 1.2 本设计研究的主要内容............................................................................................... 2 2 系统总体设计及方案论证.................................................................................................. 3 2.1 提供方案....................................................................................................................... 3 2.2 显示界面方案............................................................................................................... 3 2.3 输入方案....................................................................................................................... 4 3 系统硬件设计及实现.......................................................................................................... 5 3.1 整体方案设计............................................................................................................... 5 3.2 单片机的基本结构....................................................................................................... 6 3.3 其它电路设计............................................................................................................... 8 3.3.1 时钟电路................................................................................................................ 8 3.3.2 复位电路................................................................................................................ 9 3.3.3 数码管显示电路.................................................................................................. 10 4 系统软件设计及实现........................................................................................................ 14 4.1 主程序流程图............................................................................................................. 14 4.2 时间调整程序流程图................................................................................................. 15 5 Proteus软件仿真................................................................................................................ 17 5.1 Proteus软件简介......................................................................................................... 17 5.2 仿真步骤..................................................................................................................... 17 5.3 仿真过程中出现的错误及解决措施......................................................................... 17 5.4 仿真结果..................................................................................................................... 18 总结........................................................................................................................................ 20 参考文献................................................................................................................................ 21

III

致谢........................................................................................................................................ 22 附录........................................................................................................................................ 23

IV

绪论

1 绪论

1.1 数字电子钟的背景和意义

20世纪末电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间,忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。

单片机具有集成度高、功能强、通用性好的特点,特别是它能耗低、价格便宜、可靠性高、抗干扰能力强和使用方便等独特的优点,所以单片机现在广泛的应用到家用电器、机电产品、儿童玩具、机器人、办公自动化产品等领域。

目前,单片机正朝着高性能和多品种方向发展,趋势是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。

单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。

数字钟是采用数字电路实现对时、分、秒、数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。

1

绪论

1.2 本设计研究的主要内容

本设计采用AT80C51芯片作为核心,采用延时电路和复位电路来实现其计时的功能,用Proteus软件自带的电子钟组件实现仿真结果。

此设计的主要研究内容有:

(1)研究电子钟的原理与实现方法。 (2)51单片机的原理与运用。

(3)构思基于单片机的仿真电子钟的实现方案。 (4)熟悉运用C51单片机语言编写软件系统。

(5)熟悉运用Keil软件与Proteus软件仿真和调试系统。

2

系统总体设计及方案论证

2 系统总体设计及方案论证

本系统采用单片机80C51为中心器件来设计电子钟系统,系统实用性强、操作简单、扩展性强。本设计采用单片机、键盘、LED显示、电子钟演示系统组成。系统包括状态转换、调时、调分以及基本的电子钟功能,计时牌显示当前时间。

电子钟控制的框图如下图2-1所示,主要有控制电路、按键电路、晶振电路、复位电路、显示电路、电源电路等电路组成。 时钟电路 单片机AT80C51 按键控制装置 74LS138地址分配装置 驱动装置 复位电路 时间显示装置

图2-1系统总体设计框图

2.1 提供方案

为使模块稳定工作,须有可靠电源。本次设计考虑了两种电源方案:

方案一:采用独立的稳压电源。此方案的优点是稳定可靠,且有各种成熟电路可供选用;缺点是各模块都采用独立电源,会使系统复杂,且可能影响电路电平。

方案二:采用单片机控制模块提供电源。该方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。

综上所述,选择第二种方案。 2.2 显示界面方案

该系统要求完成时间显示功能。基于上述原因,本次设计考虑了两种方案: 方案一:完全采用点阵式LED显示。这种方案功能强大,可方便的显示各种英文字符、汉字、图形等,但实现复杂,且须完成大量的软件工作。

3

系统总体设计及方案论证

方案二:完全采用数码管显示。这种方案优点是实现简单,可以完成时间显示功能。缺点是功能较少,只能显示有限的符号和数码字符。

根据本设计的要求,方案二已经满足了要求,所以本次设计采用方案二以实现系统的显示。 2.3 输入方案

这里同样讨论了两种方案:

方案一:采用74LS138扩展I/O口、键盘及显示等。该方案的优点是使用灵活可编程,并且有RAM及计数器。若用该方案,可提供较多I/O口,但操作起来稍显复杂。

方案二:直接在I/O口线上接上按键开关。因为设计时精简和优化了电路,所以剩余的端口资源还比较多。

由于该系统是对电子钟数码显示管的控制,用到的单片机端口比较多,所以要实现时间的显示就需要进行端口的扩展,故选择方案一。

4

系统硬件设计及实现

3 系统硬件设计及实现

3.1 整体方案设计

本设计以单片机为控制核心,采用模块化设计,共分以下几个功能模块:单片机控制系统、键盘及状态显示时间模块等。整体硬件设计图如3-1所示。

单片机作为整个硬件系统的核心,它既是协调整机工作的控制器,又是数据处理器。它由单片机振荡电路、复位电路等组成。

系统采用单数码管时间显示功能,最大显示数字9。

在时间走飞的情况下,可以通过K1、K2、K3和K4四个按键对时间进行调整。

图3-1 整体电路设计

5

系统硬件设计及实现

当一个选通端(E1)为高电平,另两个选通端(E2)和(E3)为低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平的方式译出。利用E1、E2和E3可级联扩展成一个24线译码器。若外接一个反相器还可以级联扩展成为32线译码器。若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。

74LS138的引脚如图3-7所示。

图3-7 74LS138译码器引脚图

74LS138的真值表见表3-2。

表3-2 74LS138译码器真值表

输 入 输 出 C B A E1 0 x 1 1 1 1 1 1 1 1 E2+E3 x 1 0 0 0 0 0 0 0 0 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 x x x x x x 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 74LS138外接一个反相器级联扩展成为32线译码器。在该设计中,由于单片机的P2口只有8个数据线显然不够32个数据使用。因此,74LS138译码器再次使用于

11

系统硬件设计及实现

扩展数据输入端的。将选通端中的一个作为数据输入端,74LS138还可作为数据分配器如图3-8所示。将数据分配给7个74100,以此来驱动点亮数码管。

图3-8 74LS04与74100连接图

74100具有数据锁存和数据缓冲的功能,做数据锁存时,当输入的数据消失时,在芯片的输出端,数据仍然保持;做数据缓冲时,可加强驱动能力,74100的引脚图如图3-9所示。同样,74LS244也具备数据缓冲的能力。

图3-9 74100引脚图

本设计中所用到的数码管的如图3-10所示,将1、2、3、4引脚与U5:A的Q0、Q1、Q2、Q3引脚依次相连接,引脚1控制AM/PM显示,引脚2控制12h/24h制的设定,引脚3控制复位显示,引脚4控制时间间隔位。

图3-10 数码管引脚图

本设计用到七个74100芯片,分别是U2:A、U2:B、U3:A、U3:B、U4:A、U4:B、U5:A。U2:A通过NOR-4与74LS244相连接,驱动数码管的A0~D0。U2:B与A1~D1相连接,连接方式如图3-11所示;依次类推,U3:A、U3:B、U4:A和U4:B依次与

12

系统硬件设计及实现

A2~D2、A3~D3、A4~D4、A5~D5相连接。

图3-11 74100与74LS244连接图

按键扫描控制部分采取独立按键控制方式,用单片机的P0.0~P0.3控制4个弹性按键,用来显示和控制时间的调整,因所用的按键较少,故采用独立按键控制方式,且所用按键均为弹性小按键,即按下时为低电平接通,松手时即弹起变为高电平,为了节省输入/输出端口和方便编程,每个按键根据其按的次数有不同的作用。按键控制图如图3-12所示。

图3-12 按键控制图

13

系统软件设计及实现

4 系统软件设计及实现

该系统软件程序主要有主程序模块,按键扫描程序,显示子程序,时钟调整与设置程序等四大模块组成。

图4-1中按键从上往下设定为K1、K2两个开关和K3、K4两个按键,K1与P0.0相连,K2与P0.1相连,K3与P0.2相连,K4与P0.3相连。当需要设定当前时间时,按一下K2键,进入时间设定状态,按一下K4,分钟加1;按一下K3,小时加1。如此反复来设定当前时间。调好时间后,断开K2,退出当前时间设定状态;当要切换时间模式时,按下K1键,进入二十四时计时模式,断开K1键,进入十二时计时模式。

图4-1 按键控制图

4.1 主程序流程图

本流程图所描述的是:程序导入单片机,开始运行。系统从12点59分40秒开始计时,本设计中用到了两个开关(K1、K2)和两个按钮(K3、K4),K1的优先级别最高,所以进行按键扫描时首先判断K1键是否闭合。K1键控制着不同的计时模式,闭合就进入二十四时计时模式,断开则进入十二时计时模式。

在相应的计时状态下,判断K2键是否闭合,如果要进行时间调整,则闭合K2键,程序将会通过K3和K4键进行时间的设定,K3对小时进行调整,K4对分钟进行调整,按下一次K3键,小时加1,按下一次K4键,分钟加1,时间调整结束后,断开K2键,程序从调整后的时间开始正常显示。具体主流程图如4-2所示。

14

系统软件设计及实现

Y 进入24时进制计时 开始 从12时59分40秒开始计时 正常的时间显示 判断K1是否按下 N Y 进入12时进制计时 N 判断K2是否按下 进行相应的时间调整 调整结束 图4-2 主程序流程图

4.2 时间调整程序流程图

时间的调整是通过K2、K3和K4来实现的。K2与K3、K4的优先级别不一样,K2的优先级高于K3和K4,K3和K4是同等优先级。要实现对时间的重置首先要从K2开始判断,K2是时间调整的开启键,只有先闭合K2才能进行时间的重置。

在K2闭合的状态下,按一下K3键,小时按照相应的计时模式(12/24时制)进

15

系统软件设计及实现

行加1,当小时加到相应的最大值时进行自动返1(12时计时下)或者返0(24时计时下),通过K3键进行小时的调整,直到所要设定的小时为止。按一下K4键进行分钟的加1,当达到60是自动返回1,通过K4键进行分钟的调整,直到所要设定的分钟为止。具体设计流程图如图4-3所示。

图4-3 时间调整程序流程图

调整结束 Y 进行相应的小时或分钟的调整 N 判断K2、K3是否按下 Y 进行时间调整 判断K2是否按下 N 开始

16

Proteus软件仿真

5 Proteus软件仿真

5.1 Proteus软件简介

Proteus软件是Labcenter Electronics公司的一款电路设计与仿真软件,它包括ISIS、ARES等软件模块,ARES模块主要用来完成PCB的设计,而ISIS模块用来完成电路原理图的布图与仿真。Proteus的软件仿真基于VSM技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如MCS-51系列、PIC系列等等,以及单片机外围电路,比如键盘、LED、LCD等等。通过Proteus软件的使用能够轻易地获得一个功能齐全、实用方便的单片机实验室。 5.2 仿真步骤

第一步:用Keil uVision4软件对程序进行编译,编译通过后,会自动生成HEX文件。

第二步:在Proteus的元件库中找到80C51以及相应的元件,按照硬件设计中的说明把各部件连接起来组成一个定时闹钟的硬件系统。

第三步:把在Keil uVision4环境调试下生成的.HEX文件装入到80C51里,点击运行符号就可以使软硬件的配套设施在Proteus的环境下仿真实现。

第四步:验证系统能否实现所要求的功能,并检验错误。 5.3 仿真过程中出现的错误及解决措施

(1)当把程序生成的.HEX文件装入到AT80C51后运行时,显示模块出现数字显示错误,但是软硬件都没有错误,经检查是它们不配套,在修改扫描显示控制字而且改变硬件布线顺序后方显示正常。

(2)在设计的初期把主程序设计成顺序结构,但是在运行的时候没有注意到这个问题,没有按照软件说明中的顺序操作,以至于时间模式转换时出现错误,在改变按下按键的顺序后工作正常。

(3)电子钟在设置时间的时候加时与加分未能正常运行,经检查硬件没有出现错误,而是在编写程序时漏过了一个&的字符导致时间调节功能不能正常进行,经过对程序的反复检查并改正使其实现该功能。所以不是程序运行不报错就一定可以在硬件上正常实现所要求的功能,只有认真编写程序,并在硬件上多次调试才能达到所要实现的功能。

17

Proteus软件仿真

5.4 仿真结果

图5-1 电子钟的起始状态

图5-1显示的是:程序倒入单片机后,点击开始,显示电子钟的起始状态,系统从12:59:40开始计时。

图5-2 K1断开十二时制计时

图5-2显示的是:系统正常运行时,断开K1,电子钟按十二时制计时,显示当前时间01:01:01。

18

Proteus软件仿真

图5-3 K1闭合二十四时制计时

图5-3显示的是:系统正常运行时,在K2闭合的状态下,电子钟按二十四时制计时,显示当前时间13:06:44。

图5-4 二十四时制K2闭合进行时间设置

图5-4显示的是:系统正常运行时,闭合K2进行时间设置,按6次K3键,把时间调整至19:06:44。

19

总结

总结

单片机是一门应用性很强的学科,毕业设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程,为自己今后从事与单片机控制系统有关的工作打下了基础。虽然在做毕业设计以前已经系统的把单片机课本认真的学习了一下,但是在刚开始时还是有点一头雾水,不知道该从哪里下手。令人欣慰的是经过几个月的学习,虽然过程很艰辛,问了很多朋友,但是总算实现了电子钟的功能,所有的努力都很值得。这几个月的大部分时间都在研究程序怎么处理,在这个过程中加深了对C语言命令的应用,而且也更加了解到软硬件配套的重要性。以下是本次单片机课程设计的几点心得与体会。

(1)在设计程序之前,务必要对所学单片机课程的内容有一个系统的了解知道单片机片内片外的内容及其功能。

(2)设计程序采用什么编程语言并不是非常重要,关键要有一个清晰的思路和一个完整的软件流程图。模块化的设计思想在程序设计中的作用是十分大的,它可以提供一个比较清晰的思路,并且很容易找到头绪,不至于在设想一个程序时感觉到无从下手。

(3)在设计程序时,不能妄想一次就将整个程序设计好,“反复修改,不断改进”是程序设计的必经之路。程序刚开始编好时,一般情况下会存在很多错误,要不断地修改,不断的改进才能达到预期的目的,编写程序的时间并不是很长,主要是修改程序会花很多时间。

(4)要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便。刚开始在编写程序时,很不习惯于写注释,感觉很麻烦,而且没用,但是在修改的过程中就遇到了较大的麻烦,以至于不得不重新的做了注释,以增加程序的易读性,从而使修改过程变得容易一些。

总之,这次毕业设计不仅巩固了所学的单片机基本知识,还有助于加强个人动手能力,这些能力在以后的工作或者是学习中一定会起到不小的作用,看到自己几个月的成果,感觉一切的辛苦和艰难都是值得的。

20

参考文献

参考文献

[1]曹天汉.单片机原理与接口技术[M].北京:电子工业出版社.2009. [2]李海滨.单片机技术课程设计与项目实例[M].北京:中国电力出版社.2009. [3]郑思铭.交通灯的一种新型智能控制系统[J].广东自动化与信息工程,2006,第2期. [4]胡汉才.单片机原理及接口技术(第三版)[M].北京:清华大学出版社.2010. [5]杨欣.51单片机实用实例详解[M].北京:清华大学出版社.2010. [6]王东锋.单片机C语言应用100例[M].北京:电子工业出版社.2009.

[7]薛小玲.单片机接口模块应用与开发实例详解[M].北京:北京航空航天大学出版社.2010. [8]王爱学.一种交通信号灯模糊控制器的模型设计[J].重庆工学院学报(自然科学版),2009,第2期.

[9]彭伟.单片机C语言设计实训100例:基于8051+Proteus仿真[M].北京:电子工业出版社.2009. [10]郑锋.51单片机典型应用开发范例大全[M].北京:中国铁路工业出版社.2011. [11]谢亮.例说51单片机(C语言)(第三版)[M].北京:人民邮电出版社.2010. [12]张亚力.基于C语言在单片机技术的应用[J].农业网络信息,2006,第5期. [13]李朝青.单片机原理及接口技术(第三版)[M].北京:北京航空航天大学出版社.2005. [14]谭浩强.C语言程序教程设计教程[M].北京:高等教育出版社.2006.

[15]何立民.单片机应用系统设计系统配置与接口技术.北京[M]:北京航空航天大学出版社.2001. [16]杨毅.基于单片机的交通灯控制系统设计[J].现代企业教育,2010,第18期. [17]彭伟.单片机C语言程序设计实训100例[M].北京:电子工业出版社.2009.

[18]郭天祥.新概念51单片机C语言教程:入门、提高、开发、拓展全攻略[M].北京:电子工业出版社.2009.

[19]杨天怡.单片机原理及应用[M].北京:清华大学出版社.2010.

[20]李广弟.单片机基础(第三版)[M].北京.北京航空航天大学出版社.2007. [21]房小翠.单片机使用系统设计技术.北京:国防工业出版社.2009. [22]王静霞.单片机应用技术[M].北京:电子工业出版社.2009.

[23]杨欣.实例解读51单片机完全学习与应用[M].北京:电子工业出版社.2011. [24]张毅刚.单片机原理及应用[M].北京:高等教育出版社.2010.

21

致谢

致谢

经过将近两个多月的准备和查找资料,在老师的指导下,我的毕业论文终于写完了。在论文的写作过程中遇到了无数的困难和障碍,都在同学和老师的帮助下度过了。在此,我要向诸位老师深深地鞠上一躬。我尤其要强烈感谢我的指导老师—老师,他给予了我无私的帮助和指导,不厌其烦的帮助我进行论文的修改和改进。在此,我再次向关心我学习,并且在我完成论文过程中给予我帮助和支持的老师和同学们表示衷心的感谢和祝愿!我在此衷心祝福老师身体健康,工作顺利,事业节节高!

另外,在校图书馆查找资料的时候,图书馆的老师也给我提供了很多方面的支持与帮助。在此向帮助和指导过我的各位老师表示最衷心的感谢!本文引用了数位学者的研究文献,感谢这篇论文所涉及到的各位学者,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作。同时感谢我的同学和朋友,在我写论文的过程中给予我了很多素材,还在论文的撰写和排版等过程中提供热情的帮助。

由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师和学友批评和指正!再次感谢关心和在我写作工程中给予我帮助和支持老师和同学们!谢谢大家啦!大家辛苦了。

22

附录

附录I 子程序设计 延时子程序

void DelayMS(uint x) { uchar i;

while(--x) for(i=0;i<120;i++); }

时间显示子程序 void Display_Time() { uchar i; for(i=0;i<7;i++) {

P2=(disp_Buffer[i]<<4)|i|0x08; DelayMS(5); P2&=0xF7; DelayMS(5); } }

时钟调整子程序

void Adjust_and_Set_Clock() {while(K2==0) {

if(K1==0) { f_24=1;

disp_Buffer[6]|=0x02;

附录

23

附录

} else

{f_24=0;disp_Buffer[6]&=0xFD;} if(K3==0) {

DelayMS(150); Add_Hour(); } if(K4==0) {

DelayMS(150);

current_Time[1]=(current_Time[1]+1)`; }

Refresh_Disp_Buffer(); Display_Time(); } }

附录II 源程序

#include #include #define uchar unsigned char #define uint unsigned int uchar tCount=0; //时钟设置开关及按键

sbit K1=P0^0; //12h/24h选择键 sbit K2=P0^1; sbit K3=P0^2; sbit K4=P0^3;

//设置键 //小时加 //分钟加

uchar current_Time[]={12,59,40}; //当前时间:时分秒

uchar disp_Buffer[]={0,0,0,0,0,0,0x00}; //时分秒显示缓冲(各占两位),最后的

24

附录

0X00控制AM,PM及发光管闪光等

uchar f_24=0,f_AM=0,f_set=0;

//12h,24h,AM,PM及SET控制标志

//------------------------------------------------------------------------------------------------------- //延时

//-------------------------------------------------------------------------------------------------------- void DelayMS(uint x) { uchar i;

while(--x) for(i=0;i<120;i++); }

//-------------------------------------------------------------------------------------------------------- //加时

//-------------------------------------------------------------------------------------------------------- void Add_Hour() {

++current_Time[0]; //小时数累加 if(f_24==1&¤t_Time[0]==24) current_Time[0]=0;

if(f_24==0&¤t_Time[0]==13) PM标志

{

current_Time[0]=1;

disp_Buffer[6]=(disp_Buffer[6]&0xFE)|(~(disp_Buffer[6]&0x01)&0x01); //将原来的AM和PM取反

} }

//------------------------------------------------------------------------------------------------------- //加分

//------------------------------------------------------------------------------------------------------- void Add_Miniute() {

//12h制时满13归1,且取反AM和//24h制时满24归零

25

附录

++current_Time[1]; //分钟累加

if(current_Time[1]==60) {

current_Time[1]=0; Add_Hour(); } }

//-------------------------------------------------------------------------------------------------------- //根据当前时间刷新时分秒显示缓冲

//------------------------------------------------------------------------------------------------------- void Refresh_Disp_Buffer() { uchar i; for(i=0;i<3;i++) {

disp_Buffer[2*i]=current_Time[i]/10; disp_Buffer[2*i+1]=current_Time[i]; } }

//---------------------------------------------------------------------------------------------- //外部中断0

//----------------------------------------------------------------------------------------------- void EX0_INT() interrupt 0 {

++tCount;

if(tCount==25)disp_Buffer[6]&=0xF7; if(tCount==50) {

tCount=0;

disp_Buffer[6]|=0x08;

//每1秒LED[:]关闭

//每0.5秒LED[:]点亮 //每秒刷新显示缓冲

//刷新显示缓冲

if(++current_Time[2]==60) //秒递增

26

附录

{

current_Time[2]=0; Add_Miniute(); }

Refresh_Disp_Buffer(); } }

//------------------------------------------------------------------------------------------------------ //显示时间

//---------------------------------------------------------------------------------------------------------

void Display_Time() { uchar i; for(i=0;i<7;i++) {

P2=(disp_Buffer[i]<<4)|i|0x08; DelayMS(5); P2&=0xF7; DelayMS(5); } }

//-------------------------------------------------------------------------------------------------------- //时钟调整与设置

//-------------------------------------------------------------------------------------------------------- void Adjust_and_Set_Clock() {while(K2==0) {

if(K1==0) { f_24=1;

//切换12h/24h制

//刷新时分秒的显示缓冲

27

附录

disp_Buffer[6]|=0x02; } else

{f_24=0;disp_Buffer[6]&=0xFD;} if(K3==0) {

DelayMS(150); Add_Hour(); 调用函数

} if(K4==0) {

DelayMS(150);

current_Time[1]=(current_Time[1]+1)`; 会向小时进位,故单独增加

}

Refresh_Disp_Buffer(); Display_Time(); } }

//-------------------------------------------------------------------------------------------------------- //主程序

//------------------------------------------------------------------------------------------------------- void main() {

IE=0x81; IT0=1; f_24=(K1==0); while(1) {Display_Time(); if(K1==0)

//切换12h/24h

//由开关K1决定f_24标志

//允许外部中断0,下降沿触发

//因为加分钟的函数

//加分钟

//小时增加时要影响AM,PM标志,这里可

//加小时

28

附录

{ f_24=1;

disp_Buffer[6]|=0x02; } else { f_24=0;

disp_Buffer[6]&=0xFD; } if(K2==0)

{ EX0=0; f_set=1;

disp_Buffer[6]|=0x04; } else { EX0=1; f_set=0;

disp_Buffer[6]&=0xFB; }

Adjust_and_Set_Clock(); 将立即返回

} }

//显示或关闭“set”

//调整与设置时钟,如果K2键未闭合,调用

29

本文来源:https://www.bwwdw.com/article/mws7.html

Top