毕业设计格式 (50).doc
电子设计软件及应用期末大作业报告书 第 34 页 共 34 页1 前言1.1 研究背景及意义电子时钟则是以数字电路为基础,综合了模拟电路和电路基础知识设计出来的一种对时、分、秒进行时间数字显示的装置。它是以不同的计数器为基本单元构成的,用途十分广泛,只要有计时、计数的存在,便要用到数字钟的原理及结构,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表,在给人们生活带来了极大的方便之外,大大的扩展了钟表原先的报时功能。目前,数字钟的功能越来越强,不仅仅是一个数字电路,它在其他领域也有相当大的发展空间,诸如按时自动闹铃、定时启闭电路、定时自动报警器、定时开关烘箱、通断动力设备、时间程序自动控制、定时广播,甚至各种定时电气的自动启用等。所有这些都是以钟表数字化为基础的。因此研究数字钟及扩大其应用,有着非常现实的意义。1.2 设计目的为了实现电子时钟时间设置,时间显示,以及能够正确无误的运行,本文主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机AT89C51芯片和LED数码管为核心,辅以必要的电路,构成了一个单片机电子时钟。1.3 研究内容本文是以数字电路为设计基础,探究多功能数字钟的设计方法。数字钟由组合逻辑电路和时序电路组成,通过对数字钟的设计,可以更好的了解、学习和掌握组合逻辑电路和时序电路的原理知识和使用方法,同时,本设计是基于proteus软件实现电路设计和仿真,使用Altium Designer软件完成原理图绘制和PCB制板,在电路设计的过程中,采用由简入深、由原理框图到实际电路图的模式,明确设计步骤,理清设计的各个环节,将各个电路功能模块化,使得整体的电路更加清晰易懂。2 总体方案设计2.1 电子时钟的设计思路据设计要求,初步思路如下:(1)计时单元由单片机内部的定时器/计数器3来实现。(2)时间显示采用8段LED数码管,动态扫描方式。(3)LED数码管的段码输入,由并行端口P0八位产生。(4)LED数码管的位码输入,由并行端口P2八位产生。(5)时间调整与定时时间的输入,通过接入键盘电路实现。系统共设计4个按键,分别定义为:K1键(时间调整设置键):其功能是当该键按下时,进入时间调整输入功能;K2键(定时时间设置键):其功能是当该键按下时,进入定时(闹钟)时间输入功能;K3键:其功能是当该键按下时,被调整位加1;K4键:其功能是当该键按下时,指向下一个调整的位。(6)按键的接入方式:K1键:通过P3口P1.0引脚接入,中断工作方式;K2键:通过P3口P1.1引脚接入,中断工作方式;K3键:通过P3口P1.2引脚接入,查询工作方式;K4键:通过P3口P1.3引脚接入,查询工作方式。(7) 报警声响用蜂鸣器产生,蜂鸣器接入P2口的P3.6引脚2.2 方案设计2.2.1 总体设计框图根据设计要求与设计思路,确定该系统的设计方案,下图2-1为该系统设计方案的硬件电路设计框图。硬件电路由8部分组成,即按键输入电路、单片机、时钟电路、复位电路、LED显示器段码驱动电路、LED显示器位码驱动电路、8位显示器电路和蜂鸣器电路。图2-1 设计方案框图2.2.2 计时方案利用AT89C51单片机内部的定时/计数器进行中断定时,配合软件延时实现时、分、秒的计时。该方案节省硬件成本,且能使读者在定时/计数器的使用、中断及程序设计方面得到锻炼与提高,对单片机的指令系统能有更深入的了解,从而对学好单片机技术这门课程起到一定的作用。2.2.3 显示方案AT89C51的P0口和P2口外接由8个LED数码管(LED7LED0)构成的显示器,用P0口作LED的段码输出口,P2口作LED数码管的位控输出线,P1口外接四个按键K1、K2、K3、K4构成键盘电路。电子时钟的功能不复杂,采用其现有的I/O便可完成3 硬件电路设计3.1 单片机最小系统3.1.1 AT89C51单片机单片机的最小系统的核心是单片机,其次是其他辅助电路。AT89C51单片机作为应用较为广泛的单片机当然也适用于本系统。使得其应用更加的广泛。在本文硬件电路设计中,AT89C51作为主控芯片将承担着重要的控制功能,因此本节将重点研究该单片机的内部结构。单片机的内部构造比较复杂,但是认真的分析可以发现存在一定的规律。单片机引脚如图3-1所示:图3-1 AT89C51引脚图3.1.2 AT89C51单片机最小系统单片机最小系统是整个控制系统的基础,它主要是由供电模块、晶振模块和复位模块构成。供电模块是所有电气系统的电力来源,这是电路能正常工作最基本的条件。晶振电路是单片机自带的时钟电路,是获取时钟信号的重要电路,没有时钟电路,单片机最小系统就无从谈起。复位电路是单片机最小系统中一个人工复位电路,当系统出现内部错误,可以按下复位按键启动复位电路,手动复位的优点在于根据实际情况初始化单片机。当上述三个电路正常工作时,整个最小系统电路全部就绪完毕。其他功能性电路就可以根据需要进行设计,这就是单片机可扩充的功能。图3-2是单片机最小系统。而晶振电路有两个引脚和单片机相连,具体的连接方式见图3-2所示。图3-2 单片机最小系统3.2 LED数码管显示电路设计3.2.1 LED数码管介绍数码管是一种把多个LED显示段集成在一起的显示设备。有两种类型,一种是共阳型,一种是共阴型。数码管显示方法可分为静态显示和动态显示两种。静态显示就是数码管的8段输入及其公共端电平一直有效。动态显示的原理是,各个数码管的相同段连接在一起,共同占用8位段引管线;每位数码管的阳极连在一起组成公共端。利用人眼的视觉暂留性,依次给出各个数码管公共端加有效信号,在此同时给出该数码管加有效的数据信号,当全段扫描速度大于视觉暂留速度时,显示就会清晰显示出来。如图3-3是数码管引脚图。图3-3 LED数码管示意图3.2.2 LED数码管与单片机连接电路可以采用单片机的P2口和P0作为与LED的输出接口,即P0口8位作为LED的段码输出信号,P2口位作为LED位码的输出控制信号。硬件电路连接如图3-3所示。段码输出所接上拉电阻,作用是保证LED可靠导通与截止。如图3-4是LED数码管与单片机连接电路。图3-4 LED数码管与单片机连接电路3.3 按键电路设计3.3.1 键盘结构电子时钟应用系统工作时应具备两项基本功能,意识随时输入定时(闹钟)时间,而是随时对当前时间进行调整。要实现这两项功能,可以介入键盘输入电路。在单片机组成的测控系统及智能化仪器中,用得最多的是非编码键盘。键盘结构可以分为独立式键盘和行列式键盘(矩阵式)两类。本次设计中只需要4个按键,因此选择独立式键盘。如图3-5所示,电路有按键和4个电阻组成,按键分别名为K1、K2、K3、K4,按键可以采用轻触开关。3.3.2 键盘与单片机的接口电路设计如图3-5所示,将键盘直接与单片机的P1口连接。用P1.0、P1.1引脚通过两个按键K1、K2接入中断请求;P1.2、P1.3引脚作为I/O口使用,通过两个按键K3、K4接入两个输入信号。4个按键功能的设计思路如下:图3-5 键盘与单片机的接口电路设计K1键功能:设置当前时间,即当电子时钟的时间有误差时,需要随时对它进行调整,使用K1键与K3键、K4键配合来完成这一功能、K2键功能:设置定时(闹钟)时间,即当需要电子时钟进行定时(闹钟)服务时,可以通过该键的功能来输入定时(闹钟)时间,使用K2键与K3键、K4键配合来完成这一功能。K3调整键功能:分别对时间值的小时十位、小时个位、分十位、分个位、秒十位、秒个位进行+1调整,及该键没按下一次,对应的时间调整位+1。K4确认键功能:确认,即对K3调整位进行确认,该键按下时,说明被调整位的值已经确定,转去调整下一位。3.4 蜂鸣器电路3.4.1 蜂鸣器介绍蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。本设计使用的是电磁式蜂鸣器。此外,蜂鸣器还有有源蜂鸣器与无源蜂鸣器的区别。注意这里的“源”不是指电源,而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫;而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫,必须用2K-5K的方波去驱动它。本设计使用的是有源蜂鸣器如图3-6是其引脚尺寸图。图3-6 蜂鸣器引脚尺寸图3.4.2 蜂鸣器电路设计由于蜂鸣器工作时,需要的电流比较大,单片机的IO口输出的电流又比较小,所以这里利用三极管的开关管功能来控制蜂鸣器发音,本设计选用的三极管型号是PNP三极管S8550,而且本设计选用的蜂鸣器属于有源蜂鸣器,即在蜂鸣器内部已经内置了震荡电路,单片机无需连续发出高低电平来驱动它,而只要输出高(或低)电平即可,这大大简化了单片机程序的设计。由于选用的是PNP型而单片机上电IO口默认是高电平的,所以上电时蜂鸣器是不会发出鸣叫的。如图3-6是蜂鸣器电路。图3-7 蜂鸣器电路4 软件设计4.1 软件总设计进行应用软件设计时可采用模块化程序设计方法,其优点是:每个模块的程序结构简单,任务明确,易于编写、调试和修改。程序可读性好,对程序的修改可局部进行,其他部分可以保持不变,便于功能扩充和版本升级。对于使用频繁的子程序可以建立子程序库,便于多个模块调用。根据设计要求,首先要确定软件设计方案,即确定该软件应该完成哪些功能;其次是规划为了完成这些功能需要分成多少个功能模块,以及每一个程序模块的具体任务是什么。模块的划分有很大的灵活行,但也不能随意划分。划分模块时应遵循下述原则:每个模块应具有独立的功能,能产生一个明确的结果。模块之间的控制参数应尽量简单,数据参数应尽量少。控制参数是指模块进入和退出的条件及方式,数据参数是指模块间的信息交换(传递)方式、交换量的多少级交换的频繁程度。模块长度适中。模块语句的长度通常在20100条较合适。模块太长时,分析和调试比较困难,失去了模块化程序机构的优越性;模块太短则信息交换太频繁,也不合适。图4-1 主流程图主流程图如图4-1所示。本次的设计主程序是根据每个模块的特性来进行编写,先对各个模块进行初始化,然后再按照各自不同来分模块编写,最后得出总的流程图。进入程序后,先将单片机,数码管,按键等进行初始化,数码管显示固定数值“14-00-00”,程序开始等待按键按下,当有按键按下,单片机检测一次,确定按下,单片机调用程序,同时数码管刷新一次,显示当前操作结果。完后,程序返回按键等待,如此循环执行。核心代码如下:while(1) if(timenum2=0) if(timenum1=0) if(dec=0)/减键按下delay();delay();if(dec=0)while(!dec); /松手检测alfl=0; speaker=1; 4.2 LED数码管显示程序设计显示子程序每次显示8个连续内存单元的十进制BCD码数据。由于采用7段共阳LED数码管动态扫描实现数据显示,显示十进制BCD码数据对应段码存放在ROM中。显示时取内存地址中数据,然后查表得对应显示段码从P0口输出,P2口将为对应的数码管供电,于是数码管就会显示该地址单元的数据。流程图如图4-2所示。图4-2 LED数码管显示流程图核心代码如下:void display(void)P0=ledhour/10; /p0口送数据 拆数显示P2=0xFE; /片选delay(); /延时P2=0xff; /片选关 1P0=ledhour%10;P2=0xfd; /2delay();P2=0xFF;P0=0x40;P2=0xfb;/3delay();P2=0xFF;.4.3 按键程序设计本次设计采用独立键盘,键盘按下时,相应的I/O口电平由高变低,一次检测按键是否被按下。具体流程如图4-3所示。图4-3 按键流程图核心代码:void Keykonzhi() if(time=0) /键盘时间设定键按下 delay();delay();if(time=0)while(!time);timenum1+; /标记+TR1=0;f2=0;.5 电子时钟的调试5.1 单片机调试仿真软件单片机开发及涉及硬件和软件。本文主要分析软件调试所用的工具Keil uVision。该工具版本众多,本系统软件选择的开发版本是Keil uVision 4。,我们现在接触到的单片机主要是51/52系统的单片机,这完全适用于Keil uVision 4。通过该软件可以完成代码的编辑,编译,调试和仿真。在进行调试过程中可以断点调试,此项功能非常的强大,有助于找到代码中存在BUG。Keil有两个开发平台,本系统采用的是keil for 51平台。本系统的软件调试环境如图5-1所示。图5-1 软件调试环境Keil uVision本文电路仿真调试采用的是Proteus。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大,是目前世界上最先进、最完整的嵌入式系统设计与仿真平台,可以实现数字电路、模拟电路及微控制器系统与外设的混合电路系统的电路仿真、软件仿真、系统协同仿真和PCB设计等功能,是目前唯一能够对各种处理器进行实时仿真、调试与测试的EDA工具。该软件支持众多不同公司的芯片。图5-2是硬件调试软件。图5-2 硬件调试软件Proteus7.55.2 电子时钟的仿真及调试软件测试工具使用的是KEIL,在完成代码的编写后,可以使用KEIL进行开展编译工作。在编写代码时,需要进行模块化设计,这样有助于对单个子程序进行测试。当单个模块子程序完成测试没有问题以后,就可以开始下一个子程序的调试。当所有的子程序完成测试以后再进行主程序的程序,在确定所有程序没有问题以后,生成能用于仿真软件使用的源文件。仿真软件使用的是的ISIS软件,该软件是针对单片机仿真的得力助手。当本系统进行仿真时,点击仿真按钮,整个仿真电路开始运行,此时进行每个功能的测试即可。如果点击按钮之后仿真电路出现异常,此时再逐一检查仿真电路设计正确与否。5.2.1 单片机最小系统调试对于51系列单片机的软件开发,传统的方法是在PC机上采用Keil等开发工具进行程序设计、编译、调试,待程序调试通过之后生成目标文件下载至单片机硬件电路再进行硬件调试。这种方法只有硬件电路完成之后才能进行系统功能测试,若此时发现硬件电路存在设计问题且必须进行修改时就会显著影响系统开发的成本和周期。为此,本文采用了系统软硬件协同仿真的开发方法,使得硬件电路实现前的功能测试成为可能。同时硬件电路的软件化仿真为硬件电路的设计与实现提供了有力的保障。如图5-3所示是仿真电路中对单片机进行仿真测试。图5-3 单片机最小系统调试5.2.2 按键控制调试按键电路通过89C51单片机P1口组成的具有4个按键的独立式键盘。从设计电路中可看出,独立式键盘的各个按键之间彼此是相互独立的,每一个按键连接一根I/O口线。独立式键盘电路简单,调试也比较方便,只需要对每个按键单独测试就可以。对按键模块程序进行调试,首先采用延时程序来消除按键时产生的抖动延时,在设置延时程序后,调试如果没有问题,说明按键延时程序添加没有问题,如果出现问题,再讲延时时间修改3-5ms。本系统按键共有4个,通过程序检测每个按键的功能,按键闭合稳态时间由操作人员的按键时间决定,一般为零点几秒到几秒之间,然后判断按键功能是否能够实现,能够通过调节程序实现每个按键该有的功能。如图5-4所示,对“时”进行按键调试。图5-4 按键控制调试5.2.3 数码管显示模块调试数码管显示模块调试相对较为复杂,涉及到其驱动程序设计。可以采用控制变量的方法来解决问题,首先要确定问题出在哪里。之前是否正常工作过?还是从来没有调通?从硬件入手分析,电路板是自己焊机的万用板还是买的开发板,如果是自己焊接的,就要测试连线是否到位,开发板就不用测试了。然后测试程序,先找一个确定可以使用的程序来测试显示。这样的程序网上很多。一般要注意的问题就是引脚的物理链接和程序里面是否对应。还有就是背光部分和对比度,这个调试不好的,是不能显示的。数码管液晶显示屏数据显示通过程序来实现,查看按下的档位显示是否与实际时间相符。如图5-5所示,对数码管模块进行调试。图5-5 数码管显示模块调试5.3 整机的仿真及调试硬件调试要比软件测试费时短一些。硬件调试一目了然,当给电路版上电之后,能直观的看到电路中各硬件模块是否正常工作。如果出现异常,根据原理图分析异常可能所在的位置,然后使用万用表测量可能出现异常的部位。当没有找到问题所在,就其异常相关的电路进行排查。如图5-6所示是对按键及数码管显示的调试。图5-6 按键及数码管显示的调试硬件电路板进行检查时,首先检查电路中的正负极是否存在问题。当确定电源的正负极没有异常后,再检查各个引脚的连接线是否有松动或者断开的情况,特别是各元器件与单片机连接的引脚要重点检查。虽然在电路图或者仿真图中可以将晶振芯片随意的摆放,但是在实际的实物焊接过程中需要注意晶振电路要和单片机紧密的靠近,这样才不会产生更多的误差,降低单片机工作异常的概率。硬件调试完成实物的重要环节,因此应当重视焊接过程,才能获得满意的作品。结 论1、实现了的功能通过这次设计使自己对单片机的应用得到了更深的认识,特别是仿真软件的使用,时钟程序的开发,数码管显示系统设计,单片机接口设计,如何选型,怎么样使用单片机计时功能等都有了更好的提升。知道如何提升自己在单片机方面欠缺点,有利于日后在单片机学习中查漏补缺。数字时钟系统采用C语言编程,用单片机控制整个数字时钟电路,此次设计困难在于辅助电路的融合,比如说将LED和单片机怎么才能有效的连接在一起。本次使用时钟信息的获取主要依靠单片机内部时钟,设计的最终结果实现了年月日星期时分秒的显示,并且能设定闹钟。2、已经考虑到的问题,由于诸多原因没有实现的本系统没有实现掉电保存功能。如果突然断电,本系统没有掉电保存功能,重新启动之后,系统设定的闹钟信息就会丢失。因此在后续设计中可以增加24C02芯片,信息会存在该芯片中,即使断电,闹钟信息也不会丢失。致 谢在设计案例时,我的指导老师给我了很大鼓励,是他认真严谨的态度,让我坚持下来,完成整个毕业论文。同时,在制作毕业论文阶段,我的家人也给了我很大帮助,每当我遇到难题时,我都会和他们沟通交流我的想法,及时他们不能真正在论文上帮助到我什么,但是在心理上能给我很大的鼓舞,他们是我的坚强后盾。虽然毕业论文能完成,但是在整理调整论文格式时,遇到许多问题,比如图片的插入,页脚的设定,正是由于身边同学的帮助,我才能顺利完成论文文档的制作。参 考 文 献1 潘晓利. 基于S3C2440A的多功能电子时钟的设计与实现J. 电子技术, 2016, 45(2).2 王磊. 无线网络电子时钟软件设计与实现J. 无线互联科技,2016(4):13-14.3 潘晓利. 基于ARM9的电子时钟万年历的设计与实现J. 电子技术, 2016(7).4 庞斯棉. 嵌入式电子时钟系统的设计与实现J. 电子测试, 2015(6):31-33.5 李明娟. 基于单片机和手机WiFi的遥控电子时钟设计J. 滨州学院学报, 2016, 32(4):84-87.6 陈启武, 白天蕊. 基于Proteus仿真实现数字电子时钟的设计J. 西安职业技术学院学报, 2016(2):46-51.7 毛玮英. 多功能电子时钟设计J. 科技传播, 2016, 8(7).8 吕友懿, 许建明, 陈炯明. 基于单片机的电子时钟设计J. 电子世界, 2016(9):31-31.9 蒋清健, 李存永. 基于AT89S52单片机的日历钟的设计与实现J. 科学导报, 2016(4).10 黄志勇. 基于单片机技术的智能化电子时钟J. 通讯世界, 2015(22):223-223.11 胡彪, 田亚菲. 基于MSP430F149单片机的多功能电子时钟设计J. 数字技术与应用, 2015(5):180-180.12 谢海武, 杨菊兰, 海生元,等. 基于MSP430系列微处理器的高精度低功耗电子时钟设计J. 青海师范大学学报(自科版), 2015, 31(1):36-40.13 陈李仁, 彭森. 基于单片机的电子时钟和显示屏的设计J. 卷宗, 2016(11).14 王红. 基于51单片机的多功能电子时钟时间校对功能的设计J. 商, 2016(22):233-233.15 杨祾. 基于89C51时钟电路的设计与制作J. 电子世界, 2015(13):149-150.附录A 原理图.附录B 仿真图.附录C 源代码#include<reg51.h>#define tl 0xba;#define th 0x3c;sbit time=P10;/时间设置sbit timer=P11;/闹钟设置sbit add=P12;/加sbit dec=P13;/减sbit speaker=P36;/闹钟输出bit disp_sd;/数码管闪动显示标志位bit disp_ms;/数码管显示时间/闹钟标志位bit disp_sdt;/数码管闪动间隔反转标志位bit zhengdian=0;/整点报时标志位unsigned char code led=0xaf,0xa0,0xce,0xea,0xe1,0x6b,0x6f,0xa2,0xef,0xeb; /数字0-9的编码unsigned char time_cc,timer_cc,ml;/调时计数器unsigned char count0,com,count1,second,minit,hour;/时间时分秒unsigned int second1,minit1,hour1,yers,yers2,Months,days,ryears,daydata,Mothdata,dsfl,dsfg;/闹钟时分秒unsigned char hour_zd;/整点小时记录unsigned char timenum1,timenum2,timenum3,f1,f2,st;unsigned int dsflg,timeval,timerval,addval, adcval,dayfl,alfl;void delay(void)unsigned int i;for(i=0;i<100;i+);void delay1(unsigned int k) unsigned int x,y;for(x=0;x<k;x+) for(y=0;y<110;y+);void display(void)P0=ledhour/10; /p0口送数据 拆数显示P2=0xFE; /片选delay(); /延时P2=0xff; /片选关 1P0=ledhour%10;P2=0xfd; /2delay();P2=0xFF;P0=0x40;P2=0xfb;/3delay();P2=0xFF;P0=ledminit/10;P2=0x7f; /4delay();P2=0xFF;P0=ledminit%10;P2=0xdf;/5delay();P2=0xFF;P0=0x40;P2=0xef; /6delay();P2=0xFF;P0=ledsecond/10;P2=0xf7;/7delay();P2=0xFF;P0=ledsecond%10;P2=0xbF; /8delay();P2=0xFF;void Keykonzhi() if(time=0) /键盘时间设定键按下 delay();delay();if(time=0)while(!time);timenum1+; /标记+TR1=0;f2=0;if(timenum1=1) /如果timenum1=1 调时dsflg=0; st=0;if(add=0)/加键按下delay();delay();if(add=0)while(!add); /松手检测hour+;/小时+if(dec=0)/减键按下delay();delay();if(dec=0)while(!dec); /松手检测hour-; /小时-if(hour>23) /限位hour=0;P0=ledhour/10;/显示小时函数P2=0xfe;delay();P2=0xFF;P0=ledhour%10; /显示小时函数P2=0xfd;delay();P2=0xFF;if(timenum1=2) /如果timenum1=2 调分 /以下也是和调时一样的方法dsflg=0;st=0;if(add=0)delay();delay();if(add=0)while(!add);minit+;if(dec=0)delay();delay();if(dec=0)while(!dec);minit-;if(minit>59)minit=0;P0=ledminit/10;P2=0x7f;delay();P2=0xFF;P0=ledminit%10;P2=0xdf;delay();P2=0xFF;if(timenum1=3)/如果timenum1=3 调秒dsflg=0;st=0;if(add=0)delay();delay();if(add=0)while(!add);second+;if(dec=0)delay();delay();if(dec=0)while(!dec);second-;if(second>59)second=0;P0=ledsecond/10;P2=0xf7;delay();P2=0xFF;P0=ledsecond%10;P2=0xbf;delay();P2=0xFF;if(timenum1=4) /如果timenum1=4 退出 TR1=1;timenum1=0;dsflg=1;f2=1; st=1;void almset()timenum1=0;if(timer=0) /键盘上的闹钟键按下 delay();delay();if(timer=0)while(!timer); /松手timenum2+; /标记+f1=0;if(timenum2=1)/如果timenum2=1设定脑钟的小时dsflg=0;st=0;if(add=0) /加键按下delay();delay();if(add=0)while(!add);/松手hour1+;/小时+if(dec=0) /减键按下delay();delay();if(dec=0)while(!dec);/松手hour1-; /小时-if(hour1>23) /限位hour1=0;P0=ledhour1/10;/小时显示P2=0xFE;delay();P2=0xFF;P0=ledhour1%10;P2=0xFD;delay();P2=0xFF;P0=0xe7; /显示 AP2=0xf7;delay();P2=0xFF;P0=0x0d; /显示 LP2=0xbf; delay();P2=0xFF;if(timenum2=2) /如果timenum2=1设定脑钟的分钟 和上面小时一样dsflg=0;st=0;if(add=0)delay();delay();if(add=0)while(!add);minit1+;if(dec=0)delay();delay();if(dec=0)while(!dec);minit1-;if(minit1>59)minit1=0;P0=ledminit1/10;P2=0x7f;delay();P2=0xFF;P0=ledminit1%10;P2=0xdf;delay();P2=0xFF;P0=0xe7;P2=0xf7;delay();P2=0xFF;P0=0x0d;P2=0xbf;delay();P2=0xFF;if(timenum2=3)/如果timenum2=3退出timenum2=0;dsflg=1;f1=1;st=1;void almkozi()timer_cc=1;/second,minit,hour;/时间时分秒/second1,minit1,hour1;/闹钟时分秒if(alfl=1) if(hour1=hour)&&(minit1=minit)&&(second=0) time_cc=1; if(com=20)com=0;if(time_cc=1)speaker= speaker;if(minit1!=minit)time_cc=0;speaker=1;/*主函数*void main(void) second=0; /时间初始化为12:59:00minit=59;hour=12;second1=10;/闹钟默认为13:01:10minit1=1;hour1=13;count0=0x00;count1=0x00;timenum1=0;f1=1;f2=1;dsflg=1;st=1;P1=0xFF;TMOD=0x11;TL1=tl;TH1=th;EA=1;TR1=1;ET1=1; speaker=0; delay1(500); speaker=1; delay1(500);alfl=1;while(1) if(timenum2=0) if(timenum1=0) if(dec=0)/减键按下delay();delay();if(dec=0)while(!dec); /松手检测alfl=0; speaker=1; if(zhengdia