基于单片机的多功能数字电子钟的设计分析研究 电子信息工程管理专业_第1页
基于单片机的多功能数字电子钟的设计分析研究 电子信息工程管理专业_第2页
基于单片机的多功能数字电子钟的设计分析研究 电子信息工程管理专业_第3页
基于单片机的多功能数字电子钟的设计分析研究 电子信息工程管理专业_第4页
基于单片机的多功能数字电子钟的设计分析研究 电子信息工程管理专业_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于单片机的多功能数字电子钟的设计摘要:自从很久很久以前,人们就已经对时间这一方面已经有所重视了,人们对于时钟有很大的依赖性,认为时钟可以使得自己清楚的了解到现在是几点几分,从而使得人们可以更好地利用时间,而且也可以意识到时间在一点一点的流逝,就可以意识到时间的宝贵性、珍贵性,这样的话就不会再随意的浪费时间了。随着科技的进步,时钟也在变得越来越科学化,而且现在已经渗入了每一个人的生活之中,几乎所有的地方都可以运用到时钟了。本文主要研究的就是一个基于单片机的多功能数字电子时钟的一个设计方案,并且对于一些其中的原理进行一定探究和分析,从而可以使得人们可以对其有一个更好的了解和认知。Abstract:Sincealongtimeago,peoplehaveattachedimportancetotheaspectoftime.Peoplehaveagreatdependenceonclocks.Theythinkthatclockscanmakethemselvesunderstandclearlywhattimeitisnow,sothatpeoplecanmakebetteruseoftime,andtheycanalsorealizethepreciousnessoftimeasitpassesbylittlebylittle.Sex,preciousness,sothatyouwon'twasteyourtimeatwill.Withtheprogressofscienceandtechnology,clocksarebecomingmoreandmorescientific,andnowinfiltratedintoeveryone'slife,almostallplacescanuseclocks.Thispapermainlystudiesadesignschemeofmulti-functiondigitalandelectronicclockbasedonMCU,andexploresandanalysessomeoftheprinciples,sothatpeoplecanhaveabetterunderstandingandrecognitionofit.

目录TOC\o"1-7"\h\u一、序言 3二、单片机的含义及其应用 42.1单片机的含义 42.2单片机的存储器 52.2.1程序存储空间 52.2.2数据存储空间 52.3单片机的应用 6三、总体方案及原理 8四、单片机电子时钟设计仿真分析和研究 94.1单片机的应用仿真分析 94.2电子时钟的仿真 94.3单片机调试仿真软件 104.4坚定单片机对电子时钟的研究信心 124.5注意单片机的理论与实践相结合 124.5.1实验平台 124.5.2智能电子时钟的系统构成 13五、电子时钟设计 135.1main模块 135.2DS18B20模块 225.3lcd12864模块 245.4key模块 26六、单片机实验分析 27总结 28致谢 29参考文献 30

一、序言对于现在这个社会来说,时间对于我们每个人来说都已经变得越来越重要了,只有遵守时间或者是重视时间的人才有可能取得成功,所以说我们需要珍惜时间,并且认真地看待时间和遵守时间,这已经成为了在现在社会中发展进步的一个重要的基础。因此我们就可以认识到,时间和别的东西不一样,虽然说它不是一个具体的实物,然后使得我们可以看到它,但是它确实很重要,其重要性是别的东西都比不上的。随着经济的发展,科技的进步,对于电子时钟来说也取得了一系列的发展,现在的时钟已经变得更加的高科技化,而且也渗透在我们生活的方方面面,所有的活动都离不开电子钟了,因为电子钟可以使得我们对时间有一定的概念,并且因此重视时间,珍惜时间,从而就可以大大的提高自己的办事效率或者是学习效率。随着时间的流逝,人们在生活中对于时间的概念也越来越重了,一直都保持一个清醒的时间观念去对待生活中的每一部分。因此,我们可以看到时钟给我们的生活带来多大的好处,那么对于时钟的发展来说,更加科学化,更加准确的展示已经成为了现在时钟发展的一个方向,那么怎样才可以将时钟的展示达到一个这样好的效果,这就是我们需要研究的课题了。在以前我们用来计算时间的一个东西叫做石英晶体的振荡器,是用来计算时间的一个工具,这个东西的准确率特别的高,并且还具有一定的稳定性,这样就会使得时钟在进行走表的时候不会摇摇晃晃,松松垮垮的了。有很多的那种电子钟都是利用的石英技术来达到可以准确计算时间的这个效果的,因为时钟的指针在走的时候会更加的准确一点。而且它还有一个好处,那就是使用了这个石英技术的话,我们一般不需要人为的去调整时间,它只要调整一次之后,之后就不会因为某些外界的原因而使得它的指针走快或者走慢,会一直保持一个规律的频率去进行走位。这样一来在使用这个石英今天来记录时间的话,也是非常的简便,而且相对来说比较准确了。还有一种新型的时钟,就是它是利用单片机的原理,再加上数字电子钟的原理,将二者进行了一个有机的合理的结合,使得两者可以通过集成电路在记录时间的时候就会更加的准确,并且更加的科学化。其实这种电子时钟的原理并没有什么太大的变化,只是将传统的那种时间表达的方式给替换成了采用译码表示,这样的话就会使得在时间表达方面变得更加的准确,并且精确度达到一定的高度。而且它还使用了一种显示屏来将之前传统的那种指针给代替了,这样的话就可以使得时间可以很清楚明了的显示出来,基本上不会存在什么误差了,而且这样也很方便人们去观看现在的时间是多少。它的精准度体现在它现在不仅仅可以显示时间和分钟,它现在还可以显示出来秒数,这样的话,就可以使得我们能够得到更加精准的时间,而且对时间进行调对的时候也更加方便了。电子钟现在的灵活性使得它在很多的地方都得到了一定的运用,比如说电脑里面,电脑中就用到了这样的一个小小的电子钟,不过不要看它小它,它的作用可是真的很重要的,它可以保证计算机得以正常的工作,如果没有它的话,计算机可能也就不能正常工作了。不过根据我们平常人口中所谈的那些钟表,通常情况下说的钟表都不是单片机里面使用的钟表,只是我们日常生活中需要使用的、很常见的那种钟表。在一般的应用系统中,特别是在单片机的系统里面,钟表有好多个不同的含义和作用,一般能够分成两种:第一种的时钟主要是为了使得某种程序可以得到好好的工作和运行,并且对其有一定的控制功能,使它可以随时发出一种信号,这种信号通常有两部分组成,第一部分就是一个叫做晶振的东西,另一种就是晶振的外圈电路所组成的,这两个部分进行结合从而产生一种信号。我们都知道晶振是有一个功能的,就是它可以有一定的震动功能,并且存在一个固定的频率,然后这个频率就可以对单片机运行的工作频率有一个速度上面的决定,单片机的快和慢都是由晶振的振动来进行决定的,所以说这个时候时钟就起到了一个很重要的作用。第二种时钟就是它可以在单片机系统中存在一定的定时功能,就是可以预先设定一下时间,从而使得到某个规定的时间之后,就会产生一定的变化,使得我们对其它的软件进行一个更好的运用。这一种时钟是通过一个软件来完成的,而软件是由程序组成的,所以说我们对单片机的运行进行一定程序方面的编程,然后因为程序里面是有指令计数器,这样的话就可以利用这个功能部件,使得我们可以实现单片机系统中时钟的定时功能了。定时功能的实现需要我们去买一个专门在计算机中使用的一个时钟芯片,这样的话才可以使得这个功能得以更好的实现。二、单片机的含义及其应用2.1单片机的含义单片机说的简单一点的话,它就是一个在计算机系统上面集成的一块小小的芯片,不过它虽然芯片的体积很小,但是绝大部分的功能都集成在这个小小的芯片上面,而且也可以很好的实现一些它该应有的那些功能,并不会因为体积小而使得它那些功能不够完善。单片机系统所能实现那些功能也是比较完整的一般来说一个计算机可以实现哪些功能,单片机就差不多可以完全实现,单片机也相当于一个小小的电脑了,它里面包括一些基本的部件,比如说CPU,内存,外存等等。除了这些基本的部件,它里面还有一些额外接入的一些功能器件,比如说它有一些通话方面的接口、定时时钟,还有其它方面的接口等等这些外围设备,使得单片机的功能变得越来越完善。现在对于一个比较强大的单片机系统来说,它可以将好多之前不可能完成的任务都集成在一块,比如说可以输出声响,可以输出图片等这些比较难的设计都已经成为了现实。单片机还有另外一个名字,就是叫做微控制器,它的功能非常强大,并不是单单为了解决某一个问题而进行的设计,而是为了解决某一类问题,反正总而言之,一个单片机虽然体积小,但是它可以实现很多功能,相当于一台功能完善的计算机。总结下来,单片机一共有以下这几个优点:单片机的体积小重量轻,而且在价格方面也很便宜。而且现在单片机还可以为工作和学习都提供了很大的帮助,使得我们现在的条件越来越便利。单片机的发展历程很早,它到现在已经经过了三个阶段了,而且在功能方面已经发展的越来越成熟,比如说现在的抗干扰能力比之前更强,加密性也比之前更强了,而且在功耗方面也变得低了很多,由于单片机这些的优点,就使得这个单片机已经被越来越多的人使用,它的市场也变得很广泛了。

利用单片机的功能,将这些功能运用到多功能电子钟上面就可以使得电子钟有一个更好的发展。比如说现在的多功能电子钟已经有了更加强大的功能,比如说它可以将时间00:00:00到23:59:59区域间进行任意设置这样的话就保证了它一特别高的精准度而且还可以利用控制电路再控制电路的控制下,保持将时间将时钟进行一定的维持、清零、校时等等。而且在这次的基于单片机的数字电子时钟的设计中,我们对电路还有一定的对电路的恶显示日期时间温度等都有一定的额,调整和设计主要想要达到的目的就是可以将时间进行很准确的显示,并且可以完成手动校对的功能,而且在时间的显示方面采用的是二十四小时制,这样就更加的方便和准确了,有闹钟方面的设计,还有对温度方面可以进行一定的检测。2.2单片机的存储器所有的单片机在内存的设计方面都是不同的,一般情况下,它可以分成两种类型,第一个就是可以将程序和数据存储器进行分类存储,第二种就是把程序和数据内存存在一起。这两种如果用科学一点的说法的话,就是第一种被称为哈佛结构,第二种被称为普林斯顿结构。本文中采用的单片机的结构式采用的哈佛结构的单片机。2.2.1程序存储空间程序方面的存储对于存储空间是按照一定的间隔来进行分类的,比如说它是采用十六进制进行的,所以就可以在所有的棱0000H至0FFFH之间,分成内部和外部两种,一般可以根据电瓶的高或者低来进行区分,如果电瓶高的地方就表示的是内部的存储电瓶低的地方表示的就是外部的存储。在这些的间隔中,程序存储的空间可以反映到所有程序的内存里面,如果在这个范围之外的话,那么高电平或者低电平都是外部的存储空间了,就不占用内部的了。2.2.2数据存储空间内部的数据存储空间指的就是它有256个字节,然后并且将这256个字节分成了低字节和高字节,第一节指的是低于128个字节的内容,高字节指的是高于128个字节的内容。在一般情况下都是可以输入或者是输出128个字节的数据的。虽然说内部数据存储空间是比较小的,它的容量很小,不能存储太多的东西,但是它的功能很大,因为它可以将整个的存储空间分成三个工作区域,将这三个工作区域进行一个合理的划分之后,它们就会进行有序的工作方面的处理,就不会产生混乱的结果。一般情况下内部存储空间中有好多个寄存器,但是在同一个时间内,只能工作一组寄存器,就是说不可以是两组寄存器同时工作。因为这样的话就有可能使得设备出现故障的问题,所以为了保证数据的安全性和设备的安全性,一定要控制寄存器在工作的时候只能是唯一的一组。寄存器的分类的话是从在内部存储程序中,按照字节的数量来进行区分的,高于128个字节的数据就会进行分别开来,这样的话,根据这些寄存器还有内部存储的数据,我们就可以将数据和计算机中的存储有一定的映射存在。2.3单片机的应用现在在不同的情况之下,我们知道使用单片机的时候它所表现的效果和功能都是不一样的,因为每一个所使用的设备都是有区别的。在现在由于科技发展的进步和经济发展的越来越快,人们对单片机方面的需求也就更加的广泛了。渐渐地,单片机已经进入到了人们生活中的每一个角落,每一个部分。就比如说一些环卫工人会利用单片机其对周围的一些花草树木进行管理;警察叔叔会利用单片机完成一定的报警系统的方面的设置;还有就是一些工厂会利用单片机的控制功能对一些设备的更新进行加工和完善。所以现在单片机的使用已经对人们来说已经是非常普遍的了,而且它也可以给人们的生活带来了很大的积极影响。在网络中利用单片机和一些物理方面的接口进行通信,这样的话就会使得我们所使用的那些接口的传输速率变得越来越快,然后我们就会更加方便的去将信息和计算机里面的信息进行交换,这样的一个接口为我们的计算机方面和通信设备方面搭建一个网桥,然后就会使得信息更加方便的传输,不管是像手机里面或者是电话里面还是其它方便传输都很方便。和DSP相比的话,单片机的价格是比较低的,所以它的适用范围比DSP要广一点。虽然说DSP也是一个比较特殊单片机,如果想要了解单片机的话,就得了解DSP这一个工作原理,不过因为DSP的产量是比较小的,然后它也属于一个低端市场的产品,所以说比较更加容易使我们去理解和接受,如果想要先学习单片机的话,对于DSP的了解是很重要的。单片机在现在这些设备中使用的已经非常广泛了,不管是在一些玩具里面,或者是在一些家具里面,它都有一定的运用,所以说它具有非常非常广泛的一个商用价值价值很高,所以说随着社会的发展,单片机的发展也在变得越来越快,人们的衣食住行都可能会需要单片机的功能。在很早以前我们就有一个结论,就是已经离不开计算机了,计算机的功能对我们有很大的帮助,但现在来说,单片机的功能对我们的帮助也变得越来越大。如果没有单片机这一个系统的话,那我们可能有很多的想要完成的事情都完成不了,然后在一定程度上,科技方面也不会有这么大的提高。比如说现在利用单片机,我们将我们的医疗设备还有一些经济方面的发展都变得越来越先进了,而且它使用单片机的范围有真的很广,比如说在计算机网络方面,工业制造方面,家电方面等等,都对单片机有一定的运用,而且经过实践表明单片机的功能真的是对我们的生活有很大的帮助的,所以说使用单片机可以让我们的工作效率或者学习效率得到很大的提高,并且对于我们付出的那些成本和时间进相应的都会得到减少。单片机的发展是现代社会发展的一个趋势,它将会发展的越来越好的,其发展前景和发展市场将会越来越广泛。三、总体方案及原理这个设计主要的想达到的目的和结果是:根据课本上的理论方面的知识,并且在通过自己的理解之后,利用实际存在的物体来表示,并且解决我们实际上需要完成的一系列问题。从而来达到单片机的功能,然后好好的使用它并且展示出它的最大的性能和优点。这就需要大家可以很好的理解其原理和很好的把握它其中一些重要的运用方法和存在的一些设计的观念方式。把握了这些具体方法以后,就可以为之后在电子电路设计中做一些预先的筹备工作了,这样就可以在一定状况下保证实验的准确可行性,然后会为探究实验、开发电子系列的产品打基础并且做一个很好的铺垫作用。功能方面的要求说明是:这个多功能数字电子钟通常状况下使用三个两位一体的共阳极LED数码管,用来展示这其中的时、分、秒。然后当电子钟一连上电的时候,就可以把它给展示出来了。它分别利用三个按键来调对时间或者是闹钟,这三个按键依次是K1、K2、K3,这里面K1的键是功能挑选按键,按一回它就可以调成小时,按两回的话就是调成分钟了,假如按三回的话,那就是转到闹钟里面,调整里面的小时了,还能够连续的按四下,按四下的话就是调整闹钟里面的分钟,按五回之后钟表就恢复到原界面开始正常运行了。而K2键的功能就是在数值上加一下,K3键就是在数值上减一下。总体方案及工作原理说明:这个设计使用的是STC单片机芯片和LED显示器,还有一个独立式的按键,这三者结合成的的多功能电子钟。在这个设计里面是使用的单片机的内部定时器定时,程序框图如下图所示:设计原理这个设计使用的是STC单片机其中一个型号来作这个系统的控制版块。单片机可以把其它的型号里面的数据通过各种计算机中的软件来进行运行和处理,这样就会把需要的数据传输到显示的模块,这样就完成了时钟、闹钟和温度等方面的显示。把LCD液晶的显示器来当作显示模块,这样就用它来把单片机里面传出了的那些数据清清楚楚的给展示出来,而且再把这些数据展现出来的数据给丰富化。而这些操纵钟,在显示电路的里面,基本上最重要的就是通过按钮来完成不同数据的展示要求中的不同的挑选和转换功能。四、单片机电子时钟设计仿真分析和研究4.1单片机的应用仿真分析就拿该单片机来说,本文中设计的整个电路里面,总体来说有电路的显示模块、内部的电路模块和电子时钟的按键模块。电子时钟最主要的就是用按键去调整时间的,而且利用电子管来显示时间。通过单片机的实际程序的运行,去调整每个数据的展示的数量和内容。按键的功能是通过使用不同的键来调整时间。时间要在12分钟以内,不能超过60秒。比如说较长时间的按住某个按键就能去调整各种的功能方面的设置,按键的时间长短,则对时间方面的调整也不同等等。当然还有开关设计的按键。这些设计原理是通过单片机的模拟电路、C语言方面的知识和数字电路这三者的结合,功能的实现都是利用单片机的这三大知识理论。这三个基础的理论中电路设计有很重要的意义。大家应该都了解这三大理论知识,给单片机的发展做一个良好的基垫。对于单片机的学习更加不能不掌握C语言和VB编程的知识。这些对于单片机的发展必须掌握这几种技术,单片机才可以更好地适用于电子钟的仿真方面的设计。4.2电子时钟的仿真首先要先去选择仿真的组合部件,这是很重要的一个步骤,否则倘若设备不太好的话,仿真就不能够真正的完成所需的结果了,而且挑选的组件必须是完善的、不用破坏性的,因为如果不适合的话,结果将不会达到想要的效果了。选择正确的组件后,我们得在Keil里面测试一下这个程序。假如说程序优良的话,我们可以对其进行模拟。之后在执行编程的时候,能通过对仿真软件的仿真调试的功能去让程序实现一定的调整,使得程序的构造越来越合理化。仿真和调试的过程中,必须考虑这几个问题部分:(1)应依据时间的基准维持程序和振荡电路中的晶体频率。(2)保证仿真的精度就得在做中间处理切断问题的时候,一定要减去定时器里面的的中断程序的时间。(3)应很多次的去调试数码管的发光时间,保证其显示的成果,防止它出现闪烁的状况。然后我们要根据Proteus软件来描述电子时钟的电路的示意图,并且在很多次的去找出存在的问题然后加以改善。原理图中最核心的一部分便是驱动器芯片。数码管的显示屏里面有这四个按钮、蜂鸣器、时钟芯片等。另外,还在电路图中详尽的阐释了晶振电路和单片机的复位电路。器件方面的说明:DS1302是由美国达拉斯开发的。它的性能很高,以至于使同行的人都非常惊奇,它的功耗也很低,也使得它本人提高了名誉和声誉。它还有RAM的实时时钟的功能,它还有最佳的定时能力,能够从直接跳到年分方面的计时功能里看到。还有就是它还有非常特殊的通信方法,那便是三线接口和核心微控制器芯片这两个结合在一起,然后再通信,时钟信号的传送特别的高效,同时它能够去传送很多个字节和应对突发的状况。相同的RAM数据也是这样。该软件已经升级了很多次。应用:89C51单片机是电子时钟的中央处理器。源程序在加载的时候电路会控制数据的输入和输出。MAX7219会接通MCU和数码管。尽管在时间展示器件里面唯有一个单独的数码管,但我们挑选的是高端数码管。并且是用键盘来调节或者是输入时间和日期。DS1302是系统里面的定时器芯片,具有定时的功能。它录用的是年、月、日、小时、秒等的时间。而蜂鸣器起的是闹钟的作用。单片机晶振电路及复位电路都是属于电路部分的,可对信号数据进行传送。4.3单片机调试仿真软件第一步我们必须去清楚调试仿真软件过程中源文件的输入:在Keil软件中,有一个文本编辑器源程序将用于编辑。处理起来很简便,但是因为是专业的软件。编辑器在File-New中被打开。然后去开创一个新项目,在Project-NewuVision项目中打开它-Atmel-AT89C51-OK。我们一开始会不太熟悉。我们仍旧需要有一个扎实的英语底子,但最好的做法是,我们得连续在不停的学习。在这个过程中我们一定要重视一个问题,那便是建设项目很容易被消失掉,必须要把它放在一个异常突出的地方才可以,不然工作就不能够顺顺利利的运行了。之后再所开创的项目后面需要输入源代码。怎样输入呢?挑选位于左侧窗口子目录里面的SourceGroup1,再通过按击右键去单击快捷菜单,挑选AddFileGroup(SourceGroup1)。再接着在AddFileDialog中,我们寻找文件,就是被我们存在汇编程序里面的文件。添加步骤中我们应该把文件类型去做一个修改,不然源文件将不会再出现了。在认定选择源文件的时候,按Add或者是双击.在模拟的时候还需要使用一个软件Proteus。它能够用于Windows的操作系统,可以完成对所有集成电路探析模拟器的分析和物理仿真。其最厉害的一个功能是把单片机与SPICB分析结合在一起.完成了最佳的电子钟设计,有要求的情况下还有利用世界上最先进、最高级的嵌入式系统设计和仿真平台里面最好的仿真软件。不管是对数字电路还是模拟电路等进行仿真,并且还有对PCB设计的调试,这样都能完成眼下最完善、最严格的要求。还有就是它的仿真和调试都是利用实时系统来管制的,这样差不多是所有的仿真工具里面是最厉害的了。还有就是为了保证完成仿真,还必须有另一个软件,即KeilC5Lu-Vision2。它的编译和仿真环境是排在第一个的。它不仅仅能够使用C语言的编入,还能支持其余的不同语言,就像汇编语言等等其它的语言。最后在编程的过程里面,由于其界面容易、操作也很简易,不需要去学习如何使用它,所以减少了仿真时间,提高仿真的效率。最重要的是,它的微处理器和仿真电路能同一时间在虚拟原理模型图上去做其它的编程和调试,而且可以利用电机、LED等突出的方法去实时展现效果。4.4坚定单片机对电子时钟的研究信心单片机的发展越来越快,不过实际的单片机学习过程却很艰难。开发人员在硬件上面必须有一套先进的学习和开发工具,再把理论和实践结合在一起,这个也应该成为软件中重点。软件应先去了解理论与实践的结合。不管是电子钟的还是其它实体的应用,单片机都必须有很强的通用性能,因此必须学会去进行实践并且一直探究下去。4.5注意单片机的理论与实践相结合单片机里面一定要重视编程。书籍中的编程看起来好像特别简单,不过在电子时钟的设计中使用单片机并不是一件特别简单的事情。我们必须要去一直测试才能得到正确的结果,目的是本人亲自实现一个可操作的程序。计划的变成不单单要相关知识,还要自己的思想。它一定要把个人创新点和看法写入方案。创造力和创意一般情况下是单片机发明成功最重要的部分。不管是HT68F40单片机或者AVR单片机都给电子钟的生产施加压力,单片机是不是能给无线互联网技术带来很大的改变。现在的科学技术一直再持续进步,单片机的优点太多了,比如体积比较小,重量比较轻,抗干扰能力比较强,和其它的部件去做对比的话,它的环境要求也不高,还拥有这样多的好处,因此一定会受到人们的广泛热爱,在现代技术发展的许多方面似乎有着很大的发展前景,不单单是那些简单的电子器件4.5.1实验平台图1的实验平台能实现了智能电子钟的各个功能,不仅仅方便了学生对单片机实验的研发。也减小学生实验成本,减少了实验完成的时间,使学生在很少的时间里了解超级多的单片机方面的知识。4.5.2智能电子时钟的系统构成该系统以AT89C51当做核心的控制芯片,这个系统实现了日历的定时、定时和闹钟功能。该系统还使用的是矩阵键盘和红外遥控器两者结合共同完成控制的,还可以对数字时钟去做调整,修改数据,修改闹钟,整点提醒,使用蜂鸣器来敲响闹钟。五、电子时钟设计5.1main模块30/54#include<at89x52.h>#include<intrins.h>#include<Delayh>#include<Key_Scanh>#include<LCD1602h>#include<DS18B20h>sbitBuzz=P2^3,//定义蜂鸣器的接口unsignedcharK1_cnt=0,//记录K1连续按下的次数unsignedcharHint.cnt=-0,unsignedcharcodeHint1[]-"PressSETtoch-//PressK1toset,unsignedcharcodeHint2]-"angeTime&Alarml',unsignedcharcodeHint3]="AlarmsettingunsignedcharcodeHint4]=",十个空格unsignedintYear2010,Year_tmp,unsignedcharMonth=4,Day=30,WeekHour=9,Min=59,Sec=50,/复位的时间初值unsignedcharAHour=10,AMin=1;unsignedcharMonthtmp,Day.tmp,Hour_tmp,unsignedcharMintmp;unsignedcharSec_tmp,unsignedcharAHourtmp,AMintmp,unsignedcharkey,bitAlarmF=1;/闹钟开状态标志位unsignedcharbsstile(unsignedinty),//函数声明判断是否闰年unsignedchartemp_bisextil(unsignedinty),//图数声明,判断是否闰年unsignedchartemp_Day_Max(unsignedcharm)//函数声明,判断当月天数unsignedcharDay_Max(unsignedcharm);//函数声明,判断当月天数unsignedcharWeekCalculate(unsignedinty,unsignedcharm,unsignedchard)//函数声明,计算星期voidTimer0_InitO;//函数声明,定时器TO初始化voidNormalDisplayO,/函数声明,正常显示模式voidAarmJudgeO,//函数声明,判断闹铃状态voidSettingMenuO,/函数声明,进入设定菜单voidstting_Displayunsignedchar)/函数声明,显示设定模式voidKey_Action(unsignedchare),/函数声明,响应键盘输入voidAlarmO,/函数声明,启动闹铃mainO{<

iE0

E

XIK

Q

31/54TimerO_

InitO,

1/Æ8t88

0

1Jb61L

DS18B20_

init(,

/Ѭ.

E

It

ÆE8

DS18B20

5J$61CLCD_

InitQ;,

HTE

LCD602

IJ361C

User_

Defined_

CharO,

1/tEáÈX

FFEÀ

LCD1602

É'J

CGRAMwhile(1)

Alarm_

JudgeO;

ReadtemperatureO,

i#

DS18B20

t8Ckey=Key_

_ScanQ;

###

if(key=

=K2)

118↑##Т

К2,

JІJТF

gХЖі#ф

tbîtAlarm_

F=~Alarm_

F,

if(key=

=K3)

#3#T

K3,

J1Jt#1

LCD1602

(

¿LH#

LCDEtßã)

LCD_

InitO,

User_

Defined_

_CharO,

if(keyK1)

/1↑#K1

tX1T

K1_

_cnt++;

.

//ÆK1_

cnt

iaR

K1

39T69X5if(K1_

_cnt=

=10)K1_

_cnt=2;

if(K1_

cnt1)

1/#K1_

cnt

#F

1Setting_

MenuQ,

#AiE#$

if(K1_

cnt>1)

1/#RK1_

cnttf

1Setting_

Display(K1_

_cnt);#/

i#ÀBt+'ë]

iÆ#

t

Key_

Action(K1_

cnt);,_

//#

K1_

cnt

B)íÜ

Qj

2B

dmÀETif(K1_

cnt=0)

//#K1_

cnt#foNormal_

DisplayO;

//i#.

AiE

5

s7#t

void

Timer0_

InitQ

/EBHtE

0

3JtAYL

TMOD=0x11,

i*5dJfI

0x4C00·//幵源中断EI0-1;幵定吋器o中断nMOD-0x11;/没置定肘器oエ作在方式1(16位〉THO=0x3c,/it数初値カ655360000-15536,即3cb0HTL0-0xb0,TR0=1;后劫定肘器ovoidTimer0IntOnterrupt1using3./定吋器o中断服努程序staticunsignedcharcounto=0,TR0=0,TH0+-0x3G,1L0+-0xb0+7,/ト信肘囘俣差,此裃信値是通辻調試得知TR0=1,count0+t,ffcout=-20/満--秒courto=0;Sectt;fSeo-60/溝--分狆Sec=0,Mintt,ifQMin=-60/満一小肘Min-O,Hourt+;iRHour-24)/満一天HourD,Day+t;ifODay>Day_MexMorth》/満一个月(先判断当月最大天数)Day-1;Montht+;ifQMonth>12)/溝一年}Month-l;Yeartt;}}voidNormalDisplayO1正常且示状恣{Set_Positionco,o);/没亶湿示地址Write_Datac0x04〉,/墨示空格Write_DataCYer10000x30,/昆示年的千位数(数字+30H等于所対座ASCI碍》Write_DatCYeu910001000x30,/昼示年的百位数WriteDaCar610006100y100x30/昼示年的十位数Write_DtCar:61000910010030/昆示年的个位数Write_Data-9,/昆示-Wrte.DataQMorth1040x30;/湿示月的十位数WriteDataQMonth96100x30),昆示月的个位数WriteDataCり;/湿示.Wrte,DataDay1040x30〉昼示日的十位数WriteDataCDay9610+0x30,/品示日的个位数Write_Data(0x04〉,/昆示空格Write_Data(0x02〉I1湿示-个心形圏案Week-Week.CalculateCYearMonthDay;switchCWeek)//昆示星期数{caseo:Write.DataCM,Write_DataCoO,WriteDataCnybreak,1/昆示星期一caseIWrileDataTWriteDataCu》.WriteDataCe9.breaks/昆示星期ニcase2:Write.Data"W'yWriteDataCeWrite_DataCdyjbreak,/昆示星期三case3:Write_Data(T>,Write_Data(t)Write.Data(upbreaks,湿示星期四case4:Write.Datc'F》Write.Datacr;Write_DataGib,break,/湿示星期五cases:WriteDatacCSyWriteDataca,Write_Dtactb,break,/昆示星期六case6:Write,Data(SWriteDatau)WriteDataChy.brek,/显示星期天default:

break,

Set

Position(1,0);

/设

置显示地址Write_

Data(0x04>.

1显示空格

Wrte_

DataHour/10+0x30),

1显

示时的十位数Wnte_

DataHour%10+0x30)

/显示时的个位数Write_

Data(");

/显示

Write,

DataQMin/10+0x30).

/显示分的十位数Wrte_

DataQMir%610+0x30),

/显示分的个位数Write

DataC'),//显示,

Write_

Data(Sec/10+0x30).

/显示秒的十位数Write

Data(Sec%610+0x30),//显示秒的个

位数if(Alarm

F

//如果闹钟开启Write

Data(0x01),

1/显示开闹钟符号else

Write_

Data(0x04)

/显示空格Write_

Data(0x04>显示空格

Write_

Data(tens+0x30),

1/显示温度的十位数Write_

Data(units+0x30),

11

显示温度的个位数Write

Data(0x2e),

/显示小数点

Wrte,

Dataldecile+0x30)

//显示温度的十分位Write_

Daita(0x00),/显示摄氏度符号》

void

Sting,

MeruO

Set_

Position(0,0),

/设置

显示地址write

StringHint1);

Set_

Position(1,0),

1设置显示地址Write

String(Hint2).

Year

tmp-Year,Month

tmp-Month,Day_

tmp=-Day,Hour_

tmp-=HourMin

tmp=

Min,Sec

tmp=Sec;

A

Hour

tmp=A

Hour,A

Min

tmp=A

Min,

1/使用过渡数据

void

stting.

Displayunsigned

chre)

1间设定模式,

被选到的数据前出现右方向三角

if(c<8)

Set.

Position(0,0,

/指向ICD

第-

-行首地址Write_

String(Hn3);

1显示提示语

"Alam

stting

,Set_

Positioc(,0),

/设置

显示地址if(c-

-8)

Write_

Data(0x03>,

/显示右三角符号if(c=

-9)

Wite_

Data(0x04);

1/显示空格

Write_

Data(A

Houwr_

tmp/10+0x30).

/显示闹钟时的十

位数Write_

Data(A

Hour.

tmp%610+0x30)显示闲钟时的个位数

if(B

Wite

DataC),

//显示.:if(==9)

Write_

Data(Ox03),

1/显示右三角符号

Write

DataCA

Min

tmp/10+0x30),显示闹钟

分的十位数Wte

DataCA

Mn

tmp%10+0x30),显示闹钟分的个位数Write_

StingHin4)/后面的位置显示空格,避免使用清屏指令}

void

Key

Acton(unsigned

char

。/执行键盘输入

ifkey-

=K3)

/如果按K3,

则被选中对象自加1,//保持数据变化范围合乎实际

switch(c)

case2

Year

_tmp++

jif(Tear_

tmp>2100)Year

tmp=

2008,Setting

Display(K1_

cn);Delay1mS(200)break,

case3;

Month

tmp++

;fQMonth

tmp>12)Month

tmp-1,Setting.

Display(K1

cn)Delay1m(200>;break,case4:{Day

tmp++,

if(Day_

tmp>temp_

Day.

MaxQMonth

tm))Day_

tnp=1,

Setting

Display(K1

cn)Delay1m(200),breax,Hourtmp+,ifHourtmp>23)Hourtmp=0,SettingDisplay(K1_cnt),Delay1mS(200),break,case6:Mintmp++;ifQMintmp>59)Mintmp=0;Setting.DisplayK1cn)Delay1mS(200)break,case7:Sectmp+,;ifSectmp>59)Sectmp=0;SettingDisplay(K1cnt),DelayImS(200),break}case8:AHourtmp++;if(AHourtmp>23)AHourtmp=0;SettingDisplay(K1.cn)Delay1mS(200)break,}case9:AMintp++,if(AMin_tmp>59)A.Mintmp=0,SettingDisplayKIcn)Delay1mS(200);break,defaultbreak,fkey-K4)//如果按K4,则被选中对象自减1,1/保持数据变化范围合乎实际switch(c)case2Yeartmp--i(Yeartmp--1900>Yeartmp-2008;Setting.Display(K1_cmD),Delay1mS(200);break,case3:Monthtnp-.fQM4onthtmp-=0)Morthtmp=12,SettingDisplay(K1cn)Delaym(200),brak,case

4:

{Day_

tmp-i.Da_

tmp-

0)

Day

tmp

temp,

Day,

Max(Month

tmp),Setting

DisplayCK1

cn),Delay1m(20)break,

case5:

Hour_

tmp++;if(Hour

tmp--

255)Hour.

tmp-23;Setting.

Display/K1_

cnt),Delay1mS(200)break;

case6:

Min

tmp++;jf0Mdin

tmp-

255)Min

tmp=59,Setting

DisplayCK1

cn),Delay1mS(200)break,

case

7:

Sec_

tm--,if(Sec.

tmp=

255)See

tmp=59,

Setting

DisplayCK1_

cnt);

Delay1mSC200),break

case8:

A

Hour,

t--.i_.

Hour

tmp-

255)A

Hou,

tmp=23,Setting

DisplayKI

cnt),Delay1mS(200),break

case9:

A

Min

tmp--if(.

Min

tmp-

255)

Min

tmp=23,Setting

Display(Ki

cn),Delay1m(200)breakx

default

beaik

ifakey-

KS&&K1_

cnt=-0)/

如果按下K5,则退出时间设定模式,设定生效

Year-Year

tmp,Month

Month

tmp,Day=-Day_

tmp,Hour-Hour

tmp,Min=Min

tmp,Sec=Sec

tmp,A

Hour=A

Hour

tmpA

Min=A

Min

tmp,KI_

_cnt=0;

else

ifkey-K6)

/如果按下

K6,则退出时间设定模式,设定无效K1_

cnt=0,unsignedcharbssteunsignedeintg)11判断是否闰年unsignedcharFeb_day,ify%4-0&&y961001=0)Febday=29;elsef(6100-0&y94000)Feb_day-2%;eiseFeb_day=28,returnFeb_dey,unsignedchartemp.bstil(unsinedeimty)1判断是否闰年unsignedcharFeb_day,ifyY%4=-0&xy%61001=0)Feb_day=29,eiseif96100-0&&x9%400-0)Feb_day=29,eiseFeb_day=28,retumFeb_day,}unsignedchartemp.Day,Max(unsignedcharm)1判断当月天数unsignedchard,switch(m)case1:d=31;case2:d-temp_bsextile(Year),csse3:d=31;case4:d=30;caseS:d=31;case6.d=30;case7:d=31,case8.d=31,case9:

d=30;case10

d-31,case11:

d=30;case12.

d=31;default

break,}retum

d

unsigned

char

Day

Max(unsigned

char

m)

11判断当月天数

unsigned

char

d,switch(m)

case1:d=31,

case

2.

d=issetile(Yer),case3;

d=31;case4:

d=30;case5

d=31;case6:

d=30,case7:d=31,case8.d=31,case9

d=30,case10:

d=31;case

11:d=30;

Icase

12:d=31;default

break,}rebum

d,}

/*计算星期几用基姆拉尔森计算公式:

W=

(d+2*m+3*(m+

)/5+y+y/4-y/100+y400)67

在公式中d表示日期中的日数,m表示月份数,y表示年数。注意:在公式中有个与其它公式不同的地方:

把一月和二月看成是上一年的十三月和十四月,例如果是2004-1-10则换算成2003-13-10来代入公式计算。*/

,

unsigned

char

Week

Calculate(unsigned

int

y,unsigmned

char

myunsigmed

char

d

unsigned

char

w,if(m-1lm=-2)>

y-m+=12,)

w=(d+2*m+3*(m+

1)y5+y+y/4

y/100+y/400)%7.return

w,

void

Alarm,

JudgeO

1判断闹铃是否

应该响

1fAlam_F一1

&&

HourA_

Hour

&&

MinA

Min

&&

Sec<10>//用钟响十秒钟

Buzz=0,

Delay1mS(00,Buzz=1,

Delay1mS(100),Buzz=0;

ifMin-0

&&

Sec-0》

//整点发出提示音

Buz=0,

Delay1mS(100),Buzz=1;

DelayimS(00)5.2DS18B20模块finclude

<intrins

h>sbitDQ-P2^4,bit

flag.

init=0;

unsigned

int

tensuitsdecile,tmp;float

tmprt,

void

DS18B20_

initOflag_int=1;1初始化成功杯志位,oカ成功DQ-l;/DQ夏位Delay_us(8》DQ=0,/拉低DQDelay_u8C0)/52》I挺吋484us(此信号要求480us~960us)DQ=1;釋放DQDelay_us(8);,1延吋6lus(在測到IO引脚上的_上升沿之后DS18B20等待l5us-6ous并且接着岌送存在脉冲160-240u的低鬼平信号〉flag_init-DQ,Delay_usC10125X誕吋241usDS18B20友送存在脉神的/低鬼平信号60-240us)unsignedcharReadonechao/洟一-↑字芦unsignedchari=0;unsignedchardat=0,fori-8ji0ji-DQ-0;dab>=1;DQ=1;iDQdatl-0x80,Delay_usG5)砥肘6lus(所有獎肘伺片的最短持綾期限カ6us,各个遠肘恂片之向必須有最短カ1us的恢夏肘囘)retumdat;}voidWnteonecharlunsignedchardat〉/写--个宇芦{unsignedchari=0;fori-8jio0ji-DQ=0;DQ=dat&0x01;Dely_us65〉/1延吋61us(在IO銭由高鬼平交カ低鬼平之后DS1820在15us-6ous之囘対JO銭采祥》DQ=1;dat>>=1;DelayuB(5),)unsignedcharReademperatureOtens=0;units=0;decile=0,tmp=0,tnprt=0,DS18B20initO,Weteoncaroce)//跳过读序列号的操作Wrteonechar(0x44)J1启动温度转换Delay.uS(100),DS18B20_initO,weritenechac0xce://跳过读序号列号的操作Witeonecharo0xbe)//读取温度寄存器Delay_uS(100),units=ReadonecharO,读低八位tens=ReadonecharO,/读高八位DS18B20initO,Weteoncharoxe)/跳过读序号列号的操作Writeonecarx44)//读取温度寄存器tens<<=8,tensl-units;//高低位合并tmprtotens*0.0625,1/计算温度值tmp=tmprt*10+0.5,1放大10倍输出并四舍五入tens=tmp/10011+位unitstmp/10%610,1个位decile-tmp%610,小数位retumtmp,液晶显示子程序“LCD1602H"finclude<intrinsh>5.3lcd12864模块finclude<intrinsh>#defineLCD

DATA

POsbit

R8-P2r0,sbit

RW=P2^1;sbit

EN=P2^2,

bit

Check_

BusyO

//读BF标志位,检查LCD是否就绪

RS=0;RW=1;EN=1;_nop_O,

iLCD

DATA&0x80)retum

1;else

retum

0

),

woid

WaitO

11等待LCD就绪

11

while(Check

BusyO-

-1)

1如果是实际器件则必须查询忙状态位BFDelay1mS(3);

//如果是protues仿真,因为无法查询BF,所以用//

I延时代替查询忙状态

void

Wite_

Data(unsigned

char

dat)

5-一个字节数据

WaitO,RS-1;RW=0;EN=1,_nop_O,

LCD

DATA=dat,

EN=0,

1下降沿写入_nop_O,)

woid

Write_

Command(unsigned

char

dat)

11写

命令

WaitO,RS-0,

RW=0,

.

nop_0.EN=1,_nop_0,LCD_DATA=dat,EN-0,下降沿写入_nop_O,)voidWiteString(unsignedchar*p)1/写字符串charcnz=0;while(*(p+cnt)l-^0Write_Data(*(p+cnD)cntt,voidLCDInitO0/LCD1602初始化Write_Command(0x38),18位数据线,两行显示,5*7点阵Delay1mS(5),Write_Command(0x38),Delay1mS(5),Write_Command(0x38),/初始化3次Delay1mS(6),Wile_Command(0x01),/清屏Write_Command(0x06),/AC自增,画面无平移Write_Command(Ox0c),/开显示,无光标voidSetPositionunsignedcharx,unsignedchary)/设置显示的位置if(x0)Write_Command(yf0x80),if(x==1)WrileCommadyOoxc0),voidUserDefined.CharO//自定义字符Write_Command(0x40),/设置自定义字符(摄氏度符号)的CGRAM地址,放在第0个位置Write_Data(0x10);/响CGRAM写入自定义字符的第I行数据WriteData(0x06),/写入第2行数据WriteData(0x09);/写入第3行数据WriteData(Ox08),1/写入第4行数据WriteData(0x08),/写入第5行数据WriteData(0x09);1写入第6行数据WriteData(0x06>,1写入第7行数据Write_Data(0x00),/写入第8行数据Write_Command(0x4>)/设置自定义字符(闹钟符号)的CGRAM地址,放在第1个位置Wite_Data(0x00);响CGRAM写入自定义字符的第1行数据Write_Data(0x04),1/写入第2行数据Write_Data(OxDe),1/写入第3行数据Write_Data(Ox0e),写入第4行数据Write_Data(0x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论