《基于单片机的简易电子时钟单片机的科研实践-学位论文.doc》由会员分享,可在线阅读,更多相关《基于单片机的简易电子时钟单片机的科研实践-学位论文.doc(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、CHANGZHOU INSTITUTE OF TECHNOLOGY单片机的科研实践题目: 基于单片机的简易电子时钟 二级学院(直属学部): 延陵学院 专业: 电气工程及其自动化 班级: 11电Y3 学生姓名: 学号: 指导教师姓名: 职称: 副教授 目 录基于单片机的简易电子钟设计1第一章 概述21.1 课题意义21.2 课题内容3第二章 单元电路方案论证42.1 控制器模块42.2 计时模块42.3 显示模块52.4 最终方案5第三章 系统硬件介绍63.1 STC89C51单片机简介63.2 数码管驱动模块93.3 74HC573芯片介绍103.4 按键调时模块113.5 整点提示模块12第
2、四章. 系统软件设计134.1 编程软件Keil C51134.2 仿真软件proteus134.3 程序流程图15第五章 调试与实现165.1 软件调试165.2 硬件调试175.3 实物调试17结 论19参考文献20附录1 元件清单21附录 2 实物图22附录 3 程序代码2329基于单片机的简易电子钟设计摘 要 :单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、
3、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。这次毕业设计通过对它的学习、应用,以STC89C51单片机为核心,辅以必要的电路,设计了一个简易的电子时钟,它由5V直流电源供电,通过数码管能够准确显示时间,调整时间,从而到达学习、设计、开发软、硬件的能力。数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。数字钟的精度、稳定度远远超过老式机械钟。在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,定时器计数。在此次设计中,电路具有显示时间的其本功
4、能,还可以实现对时间的调整。数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。关键词 :单片机,数码管,电子时钟第一章 概述1.1 课题意义20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术
5、实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。现今,高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时、分和秒的校对,片选的灵活性好。时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正
6、常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即用单片机内部的可编程定时/计数器来实现,但误差很大,主要用在对时间精度要求不高的场合;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种方法。本文主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机STC89C51单片机和LED数码管为核心,辅以必要的电路,构成了一个单片机电子时钟。1.2 课题内容此设计是在数码管上显示时、分和秒,电路包括:键盘、单片机、显示驱动电路及发生驱动。各部分说明
7、:(1) 键盘用于校正、调节数码管上显示的时间。(2) 单片机通过输出各种电脉冲信号开驱动控制各部分正常工作。(3) 单片机发送的信号经过显示电路通过译码最终在数码管上显示出来。(4) 整点或半点蜂鸣器响,小灯整点闪10下,半点的时候闪5下。系统工作过程:时间的主要处理过程是在CPU中完成的。CPU会随时对时间进行读取数据的操作。在读取了相应的寄存器的值后,CPU将读取的值进行处理,再通过I/O口把数据显示在数码管上。第二章 单元电路方案论证根据设计要求,本系统主要由控制器模块、显示驱动模块和输入模块构成。为较好的实现各模块的功能,我们分别设计了以下几种方案并分别进行了论证。2.1 控制器模块
8、方案1:采用51系列作为系统控制器单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制。由于其功耗低、体积较小、技术成熟和成本低等优点,在各个领域应用广泛。而且抗干扰性能好。方案2:采用凌阳系列单片机为系统的控制器凌阳系列单片机可以实现各种复杂的逻辑功能,模块大,密度高,它将所有器件集成在一块芯片上,减少了体积,提高了稳定性。凌阳系列单片机提高了系统的处理速度,适合作为大规模实时系统的控制核心。因51单片机价格比凌阳系列低得多,且本设计不需要很高的处理速度,从经济和方便使用角度考虑,本设计选择了方案1。2.2 计时模块数字时钟是本设计的最主要的部分。根据需要,可利用
9、两种方案实现。方案一:本方案采用Dallas公司的专用时钟芯片DS12C887。该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。方案二:本方案完全用软件实现数字时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现1秒定时中断,每产生
10、一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。该方案具有硬件电路简单的特点。但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。2.3 显示模块方案1:采用LED数码管显示用LED数码管。虽然显示的内容有限,但是也可以显示数字和几个英文字母,在此设计中已经足够了,并且价格比液晶字符式要低的多,为了降低设计制作的成本,在此设计中我们选用LED数码
11、管显示。方案2:采用液晶字符显示器显示用液晶,可以用软件达到很好的控制,硬件不复杂,液晶字符显示器可以显示很丰富的内容,显示清晰,但是液晶字符式价格昂贵,在本设计中不需要用到复杂的显示内容,因此我们放弃了此方案。从经济的角度考虑,我们选择了方案1。2.4 最终方案经过反复论证,最终确定了如下方案:(1)采用STC89C51单片机作为主控制器。(2)采用单片机内部定时器计时。(3)采用LED数码管作为显示器。第三章 系统硬件介绍本设计采用STC89C51单片机作为主控制器,外部加上74HC573驱动数码管。系统总体框图如下:图1 系统总体框图3.1 STC89C51单片机简介单片机是美国STC公
12、司最新推出的一种新型51内核的单片机。片内含有Flash程序存储器、SRAM、UART、SPI、PWM等模块。(一)STC89C51主要功能、性能参数如下:(1)内置标准51内核,机器周期:增强型为6时钟,普通型为12时钟;(2)工作频率范围:040MHZ,相当于普通8051的080MHZ;(3)STC89C51RC对应Flash空间:4KB;(4)内部存储器(RAM):512B;(5)定时器计数器:3个16位;(6)通用异步通信口(UART)1个;(7)中断源:8个;(8)有ISP(在系统可编程)IAP(在应用可编程),无需专用编程器仿真器;(9)通用IO口:3236个;(10)工作电压:3
13、.85.5V;(11)外形封装:40脚PDIP、44脚PLCC和PQFP等。(二)STC89C51单片机的引脚说明如图2所示:图2 STC89C51单片机引脚图VCC:供电电压;GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被
14、内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和
15、校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3.0 RXD(串行输入口);P3.1 TXD(串行输出口);P3.2 /INT0(外部中断0);P3.3 /INT1(外部中断1);P3.4 T0(记时器0外部输入);P3.5 T1(记时器1外部输入);P3.6 /WR(外部数据存储器写选通);P3.7 /RD(外部数据存储器读选通);P3口同时为闪烁编程和编程校验接收一些控制信号。
16、RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序
17、存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。(三)STC89C51单片机最小系统:最小系统包括单片机及其所需的必要的电源、时钟、复位等
18、部件,能使单片机始终处于正常的运行状态。用STC89C52单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,原理图如图3所示。时钟电路复位电路51系列单片机I/O接口图3 单片机最小系统原理图3.2 数码管驱动模块数码管是一种把多个LED显示段集成在一起的显示设备。有两种类型,一种是共阳型,一种是共阴型。共阳型就是把多个LED显示段的阳极接在一起,又称为公共端。共阴型就是把多个LED显示段的阴极接在一起,即为公共商。阳极即为二极管的正极,又称为正极,阴极即为二极管的负极,又称为负极。通常的数码管又分为8段,即8个LED显示段,这是为工程应用方便如设计的,分别为A、B、C、D、E
19、、F、G、DP,其中DP是小数点位段。而多位数码管,除某一位的公共端会连接在一起,不同位的数码管的相同端也会连接在一起。即所有的A段都会连在一起,其它的段也是如此,这是实际最常用的用法。数码管显示方法可分为静态显示和动态显示两种。静态显示就是数码管的8段输入及其公共端电平一直有效。动态显示的原理是,各个数码管的相同段连接在一起,共同占用8 位段引管线;每位数码管的阳极连在一起组成公共端。利用人眼的视觉暂留性,依次给出各个数码管公共端加有效信号,在此同时给出该数码管加有效的数据信号,当全段扫描速度大于视觉暂留速度时,显示就会清晰显示出来。图4 数码管本设计采用共阴数码管,显示方式为动态显示,利用
20、数码管的dp点将小时、分钟和秒分隔开。3.3 74HC573芯片介绍74HC573包含八路D 型透明锁存器,每个锁存器具有独立的D 型输入,以及适用于面向总线的应用的三态输出。所有锁存器共用一个锁存使能(LE)端和一个输出使能(OE)端。当LE为高时,数据从Dn输入到锁存器,在此条件下,锁存器进入透明模式,也就是说,锁存器的输出状态将会随着对应的D输入每次的变化而改变。当LE为低时,锁存器将存储D输入上的信息一段就绪时间,直到LE的下降沿来临。当OE为低时,8个锁存器的内容可被正常输出;当OE为高时,输出进入高阻态。OE端的操作不会影响锁存器的状态。本设计只用到了74HC573的驱动作用,来驱
21、动数码管的形,使得数码管更亮,单片机直接控制数码管的位,实现数码管的驱动显示,电路中的应用图5如下:图5 74HC573驱动电路3.4 按键调时模块单片机键盘有独立键盘和矩阵式键盘两种:独立键盘每一个I/O 口上只接一个按键,按键的另一端接电源或接地(一般接地),这种接法程序比较简单且系统更加稳定;而矩阵式键盘式接法程序比较复杂,但是占用的I/O少。根据本设计的需要这里选用了独立式键盘接法。在用单片机对键盘处理的时候涉及到了一个重要的过程,那就是键盘的去抖动。这里说的抖动是机械的抖动,是当键盘在未按到按下的临界区产生的电平不稳定正常现象,并不是我们在按键时通过注意可以避免的。这种抖动一般102
22、00毫秒之间,这种不稳定电平的抖动时间对于人来说太快了,而对于时钟是微秒的单片机而言则是慢长的。硬件去抖动就是用部分电路对抖动部分加之处理,软件去抖动不是去掉抖动,而是避抖动部分的时间,等键盘稳定了再对其处理。所以这里选择了软件去抖动,实现法是先查寻按键当有低电平出现时立即延时10200毫秒以避开抖动(经典值为20毫秒),延时结束后再读一次I/O 口的值,这一次的值如果为1 表示低电平的时间不到10200 毫秒,视为干扰信号。当读出的值是0时则表示有按键按下,调用相应的处理程序。硬件电路如图6所示:图6 键盘控制电路图本设计的按键功能是:当K1按键的时候是小时加一,当K2按下的时候分钟加一,当
23、K3按下的时候秒清零。就是通过这3个按键实现对时间的校正。3.5 整点提示模块整点提示模块包括LED提示和蜂鸣器提示。本设计中半点的时候LED小灯会闪烁5次,整点的时候会闪烁10次。图7 LED提示电路设计的声音提示是用三极管驱动蜂鸣器。利用三极管当做开关电路可以保护单片机,还可以起到放大电流的作用,当三极管基极为高电平时,发射极截止,为低电平时,发射极导通。报警模块如图8所示。图8 蜂鸣器驱动模块第四章. 系统软件设计4.1 编程软件Keil C51Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维
24、护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。Keil_c软件界面如图1所示:图1 Keil_c软件界面该软件是一款集编程和仿真于一体的软件,它支持汇编、C语言及二者的混合编程。4.2 仿真软件proteusProteus软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Pro
25、teus不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。它的元器件、连接线路等却和传统的单片机实验硬件高度对应。这在相当程度上替代了传统的单片机实验教学的功能,例:元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。图2 proteus仿真软件4.3 程序流程图程序流程图如图3所示:图3 程序流程图第五章 调试与实现5.1 软件调试利用Keil C编写程序,根据4.1讲诉的方法对编写的程序进行调试,调试结果如图5-1所示。图5-1 程序调试最终结果此次程序,先调试数码管显示程序,再调
26、试控制按键程序:小时加、分钟加和秒清零,最后进行整点半点提示调试。程序调试是本次设计较为困难的一部分,需要反复的调试,才能达到理想的效果。其中时间的准确度是本设计的重点调试对象,要反复调整定时器中断的初值,来达到设计的准确性。5.2 硬件调试利用Proteus软件进行模拟仿真,这是实物制作很重要的一步。主要是结合编译产生的hex文件对程序进一步调试,51单片机通过加载hex文件进行仿真,通过仿真的结果检验本次设计最终的效果。Proteus最终调试结果如图5-2所示。图5-2 Proteus最终调试结果5.3 实物调试经过仿真软件的成功,接下来就是实物的制作,再是程序的烧写,最后进行实物的调试。
27、最终调试结果如图5-3、5-4所示。图5-3 半点调试图5-4 整点调试本次调试中应注意的事项或情况有:线路焊接好后,不要忙于通电,首先要检测有没有短路,万一有短路又通电后,将会很麻烦,容易烧毁电路板或元器件,更容易引发安全隐患。初次按下按键的时候,按键会加好几个数,按键的延时去抖已经加了为什么还会这样呢,经过反复的查找和更改程序,最终知道原来按键的处理程序没有加等待按键释放程序,如果不加,就在轻轻按下按键的一瞬间程序已经走了好几遍,所以会出现这个情况。再一个遇到的问题就是整点的时候小灯会闪,但是蜂鸣器不会响。首先检测程序发现没有问题,仿真是没问题的。通过排除发现一定是硬件的原因,用万用表测量
28、单片机的引脚有电平变化,那一定就是蜂鸣器驱动那里的问题了,最终发现是三极管的引脚接错了,发射极和集电极接反了,重新焊接就正常了。结 论我在这一次数字电子钟的设计过程中,很是受益匪浅。通过对自己在大学三年时间里所学的知识的回顾,并充分发挥对所学知识的理解和对毕业设计的思考及书面表达能力,最终完成了。这为自己今后进一步深化学习,积累了一定宝贵的经验。撰写论文的过程也是专业知识的学习过程,它使我运用已有的专业基础知识,对其进行设计,分析和解决一个理论问题或实际问题,把知识转化为能力的实际训练。培养了我运用所学知识解决实际问题的能力。通过这次课程设计我发现,只有理论水平提高了;才能够将课本知识与实践相
29、整合,理论知识服务于教学实践,以增强自己的动手能力。这个实验十分有意义我获得很深刻的经验。通过这次课程设计,我们知道了理论和实际的距离,也知道了理论和实际想结合的重要性,也从中得知了很多书本上无法得知的知识。我们的学习不但要立足于书本,以解决理论和实际教学中的实际问题为目的,还要以实践相结合,理论问题即实践课题,解决问题即课程研究,学生自己就是一个专家,通过自己的手来解决问题比用脑子解决问题更加深刻。学习就应该采取理论与实践结合的方式,理论的问题,也就是实践性的课题。这种做法既有助于完成理论知识的巩固,又有助于带动实践,解决实际问题,加强我们的动手能力和解决问题的能力。.参考文献【1】 51单
30、片机C语言应用程序设计实例精讲/戴佳,戴卫恒编著.-北京:电子工业出版社,2006.4(电子工程应用精讲系列)【2】 51单片机C语言程序设计经典实例/陈忠平编著.-北京:电子工业出版社,2012.5(卓越工程师培养计划)附录1 元件清单序号名称型号、参数备注数量1CPUSTC89C52DIP40封装12数码管7SEG-MPX4-CC13数码管7SEG-MPX2-CC14驱动数码管74HC57315晶振11.0592MHz49S型16元片电容30pf27电解电容470uf/16V18按钮6*6 按钮-4P6mm6mm39电阻1K/0.25W金属膜1/4W210电阻220/0.25金属膜1/4W
31、111排阻10k112蜂鸣器113三极管80551附录 2 实物图附录 3 程序代码/*作品名字:简易声光报时时钟 功能:六位数码管显示时分秒,整点半点报时 ,夜间只有灯光提醒 二十四小时制到整点时长鸣1次,LED闪烁10次 到半点时短促鸣响1次,LED闪烁5次 制作说明:P0接数码管段选,P2低6位接数码管位 */#include /头文件#define uc unsigned char /宏定义#define ui unsigned int/宏定义sbit LED=P33;/定义LEDsbit key1=P34;/定义调小时sbit key2=P35;/定义调分钟sbit key3=P36
32、;/定义秒清零sbit beep=P14;/设蜂鸣器 uc min,hour,sec,led,num; /无符号字符型变量bit bdata hourLED,halfLED,hourbeep,halfbeep; /位变量uc code tab=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/*0,1,2,3,4,5,6,7,8,9,.*/共阴极编码void delay(ui x)/1ms延时函数ui i,j;for(i=0;ix;i+)for(j=0;j6)&(hour22)/判断大于6点并且小于22点if(sec=0)/以下判断是否整点i
33、f(min=0)/如果秒和分都等于0hourbeep=1;/那么蜂鸣器和小灯位开启hourLED=1;else if(min=30)/如果分钟等于30if(num10)/闪5下响一声halfbeep=1;halfLED=1;else /小于6点和大于22点的时候if(sec=0)/以下判断是否整点if(min=0)/如果分钟等于0hourLED=1; /led位开else if(min=30)/如果分钟=0halfLED=1;/进行半点报时void init()/初始化函数sec=0;/一通电,显示12:30:00,蜂鸣器响一下min=30;hour=12;TMOD=0x01;/设置定时器为定
34、时器0工作方式为1TH0=(65536-50000)/256;/赋初值TL0=(65536-50000)%256; /赋初值EA=1; /开总中断ET0=1; /开定时器0中断TR0=1; /启动定时器0void main()/主函数init();/初始化while(1) /主循环display(); /显示keyscan();/扫描是否有键按下strike();/报时函数void time0() interrupt 1 /定时器中断TH0=(65536-50000)/256;/重赋初值TL0=(65536-50000)%256;/重赋初值num+;if(num%10=0)&(hourLED=
35、1) /整点报时led+;LED=LED;/取反实现闪烁if(led=20)/闪10次led=0;/之后关闭闪烁LED=1;hourLED=0;else if(num%10=0)&(halfLED=1)/半点报时led+;LED=LED; /取反实现闪烁if(led=10)/闪5次led=0; /关闭闪烁LED=1;halfLED=0;if(hourbeep=1)/蜂鸣器响标志位if(num=1)beep=0;if(num=20) /长响次之后beep=1; /关闭hourbeep=0;else if(halfbeep=1) /蜂鸣器响标志位if(num10)beep=0;if(num=10) /短响之后beep=1; /关闭halfbeep=0;if(num=20)/计时20次为1s时间num=0;sec+;/秒加一if(sec=60)/如果秒等于60sec=0; /秒归零min+; /分钟加一if(min=60)/如果分钟等于60min=0; /分钟归零hour+;/小时加一if(hour=24) /如果小时等于24hour=0;/小时归零