首页 基于单片机的万年历设计_毕业设计论文

基于单片机的万年历设计_毕业设计论文

举报
开通vip

基于单片机的万年历设计_毕业设计论文王习军:基于单片机的万年历设计 安徽工程大学毕业设计(论文) 毕业设计论文 基于单片机的万年历设计 摘 要 进入二十一世纪,电子技术无处不在,电子产品给我们生活带来便利的同时也改变着我们的世界。基于单片机技术的电子产品已经遍及社会的每个角落。电子万年历以其体积小,携带方便、实用,美观等优势一直占领着广阔的市场,同时也给人们的生活带来诸多方便。 本设计由硬件设计和软件设计两大部分组成。硬件设计上,以AT89C51单片机为控制核心,通过DS1302与DS18B20通信获得实时时间和实时环境温度,并将得到的数...

基于单片机的万年历设计_毕业设计论文
王习军:基于单片机的万年历设计 安徽工程大学毕业设计(论文) 毕业设计论文 基于单片机的万年历设计 摘 要 进入二十一世纪,电子技术无处不在,电子产品给我们生活带来便利的同时也改变着我们的世界。基于单片机技术的电子产品已经遍及社会的每个角落。电子万年历以其体积小,携带方便、实用,美观等优势一直占领着广阔的市场,同时也给人们的生活带来诸多方便。 本设计由硬件设计和软件设计两大部分组成。硬件设计上,以AT89C51单片机为控制核心,通过DS1302与DS18B20通信获得实时时间和实时环境温度,并将得到的数据通过1602液晶显示出来,同时通过相应的按键调整相应的值。硬件部分详细介绍了本设计所应用的各硬件接口技术和各个接口模块的功能。软件设计上,本设计采用C语言进行软件设计,在硬件的基础上来进行各功能软件模块的编写。同时软件的设计采用模块化结构,使程序设计的逻辑关系更加简单易懂。 由于该设计用液晶为载体来显示,所以具有良好的人机交互界面与友好的操作,可以显示时间、日期、星期、温度并具有闹铃功能。 关键词:AT89C51单片机;万年历;液晶技术;DS1302;DS18B20 Design of Multifunctional digital Perpetual Calendar Based on MCU Abstract Enters for the 21st century, the electronic technology is ubiquitous, the electronic products live for us bring the convenience at the same time also to change our world.Already spread social based on the monolithic integrated circuit technology electronic products each quoin.The electronic ten thousand calendars are small by its volume, the carryhome is convenient, is practical, artistic and so on the superiority are seizing the broad market continuously, simultaneously also gives people's life to bring conveniently many. This design designs major part two by the hardware design and the software is composed.The hardware designs, take AT89C51 monolithic integrated circuit as the control core, obtains the real-time time and the real-time ambient temperature through DS1302 and the DS18B20 correspondence, and will obtain data through 1602 liquid crystal displays, simultaneously through corresponding pressed key adjustment corresponding value.The hardware part introduced in detail this design applies various hardware connection technology and each interface module function.The software designs, this design uses the C language to carry on the software design, carries on various functions software module in the hardware foundation the compilation.Simultaneously the software design uses the modular structure, makes the programming the logical relations to be simpler easy to understand. Because this design demonstrated with the liquid crystal for the carrier, therefore has the good man-machine interaction contact surface and the friendly operation, may demonstrate the time, the date, the week, the temperature and have the noisy bell function. Keywords: AT89C51 monolithic integrated circuit; Ten thousand calendars; Liquid crystal technology; DS1302; DS18B20 目录 III目录 VII插图清单 IX表格清单 1引言 2第1章 绪论 21.1 课题的背景与意义 21.2 电子万年历的现状与发展 31.3 设计的主要工作及章节安排 41.4 本章小结 5第2章 设计 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 论证 52.1 电子万年历系统概述 52.2 设计任务和主要内容 62.3 设计方案论证 62.3.1 计时方案 62.3.2 测温方案 62.3.3 显示方案 72.4 本章小结 8第3章 系统硬件设计 83.1 AT89C51单片机介绍 103.2 LCD1602液晶显示 123.3 DS1302时钟芯片介绍 133.3.1 DS1302有关日历时间的寄存器 133.3.2 DS1302控制字介绍 143.3.3 DS1302单字节读写时序介绍 143.3.4 DS1302操作指令介绍 153.3.5 DS1302与单片机接口电路 153.4 DS18B20芯片介绍 183.5 语音闹铃模块 193.6 按键接口 193.7 单片机最小系统电路设计 203.8 本章小结 21第4章 系统软件设计 214.1主程序流程图 214.2按键扫描程序流程图 224.3从1302读取日期和时间程序流程图 234.4 农历转换程序设计 234.4.1 公历转农历算法研究 244.4.2 公历转农历程序 254.5 公历与星期的换算方法 274.6 本章小结 28第5章 调试仿真 285.1 Keil μVision软件简介 295.2 Proteus软件简介 305.3电子万年历的Proteus软件仿真 315.4 系统功能测试 33结论与展望 34致谢 35参考文献 36附录 36附录A电子万年历系统整体仿真电路图 37附录B电子万年历系统PCB电路图 38附录C 参考文献摘要 40附录D 源程序清单 插图清单 5图2- 1 系统硬件结构框图 10图3- 1 AT89C51引脚图 11图3- 2 LCD1602内部结构 12图3- 3 LCD1602电路图 12图3- 4 DS1302引脚介绍 14图3- 5 DS1302单字节读写时序介绍 15图3- 6 DS1302与单片机接口电路 16图3- 7 DS18B20的引脚 18图3- 8 DS18B20与单片机的接口电路 18图3- 9 蜂鸣器与单片机的接口电路 19图3- 10 按键接口电路 19图3- 11 单片机最小系统电路图 21图4-1 主程序流程图 22图4- 2 按键设置子程序流程图 22图4- 3 1302读取时间流程图 26图4- 4 星期计算流程图 29图5- 1 Keil μVision3的程序完成界面 30图5- 2 查找 HEX文件 31图5- 3 实现仿真电路图 32图5- 4 系统功能实现图 表格清单 13表3- 1 P3口的第二功能图 15表3- 2 LCD1602管脚排列及功能说明 17表3- 3 DS1302有关日历时间的寄存器 17表3- 4 DS1302控制字介绍 21表3- 5 DS18B20的引脚功能描述 引 言 电子技术是十九世纪末、二十世纪初开始发展起来的新兴技术,二十世纪发展最迅速,应用最广泛,成为近代科学技术发展的一个重要标志。进入二十一世纪,高科技的广泛应用使社会生产力和经济获得了空前的发展。现代电子技术在国防、科学、工业、医学、通讯及文化生活等各个领域中都起着巨大的作用。现在的世界,电子技术无处不在,电子手表、手机、数码相机、电视、计算机、机器人、大规模生产的工业流水线、因特网、航天飞机、宇宙探测等等。可以说,人们现在生活在电子世界中,一天也离不开它。 随着社会、科技的发展,人类得知时间,从观太阳、摆钟到现在电子钟,不断研究创新。为了在观测时间的同时,能够了解其它与人类密切相关的信息,比如温度、星期、日期等,电子万年历诞生了,它集时间、日期、星期和温度功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势。伴随着电子技术的迅速发展,特别是大规模集成电路出现,电子技术给我们的生活带来了根本性的改变。尤其是单片机技术的应用产品已经走进了千家万户。电子万年历的出现给人们的生活带来的诸多方便,作为一种附加功能,现在越来越广泛的被应用于各种电子产品中,具有广阔的市场前景。 通过以往的相关课程学习和理解,独立的完成了电子万年历的设计。电子万年历作为电子类小产品不仅是市场上的宠儿,也是单片机设计中一个很实用的题目。因为这个课题有很好的开放性和可发挥性,对制作者的要求比较高,不仅考察了对单片机的掌握能力,而且要求设计的电子万年历在操作上简洁,功能上尽量齐全,显示界面也要出色。所以,电子万年历制作无论从实用目的,还是从培养能力的角度来看都是很有价值的毕业设计课题。本电子万年历的设计在硬件方面主要采用AT89C51单片机作为主控核心,由DS1302时钟芯片提供时钟、1602LCM点阵液晶显示屏显示。AT89C51单片机是由Atmel公司推出,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的LCD液晶显示屏来直观的数字显示,可以同时显示年、月、日、星期、时、分、秒等信息。此外,该电子万年历还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点。 在软件方面,主要包括日历程序、时间调整程序,显示程序等。所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。最后在老师同学的帮助以及自己的努力下完成了此次电子万年历的设计。 第1章 绪论 1.1 课题的背景与意义 很早以前,我们的先人就用“逝者如斯夫,不舍昼夜”这样的话来感叹时光流逝,教育后人要珍惜时光,有所作为。随着人类社会的进步和科技的发展,人们计量时间的流逝,从最初的观太阳到摆钟、机械表到现在电子钟,人们不断研究,不断创造纪录。现在,电子技术日新月异,各种关系到人们生活的电子产品琳琅满目,我们已经快告别活跃很久的纯机械时代,并且逐渐由机械化仪器转型为电子仪器。从前的摆钟、机械手表已经被电子表,数字万年历所替代。近观近年来我国经济的发展局势,经济发展的支柱产业——电子产业获得快速良好的发展,各种电子产品应接不暇充次着我们的生活,大街小巷随处可见,几乎人手一部的手机,从最初的打电话发短信,到现在无所不能的智能机也更新了好几代。随着电子产品的更新速度的加快,各种功能更加强大,款式新颖的电子产品也在不断地问世。 单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。单片机是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。而51系列单片机是各单片机中最为典型和最有代表性的一种。 基于单片机的电子万年历便是这一发展潮流中最经典的缩影,电子万年历满足了人们对于获取准确时间的要求。电子万年历的出现给人们的生活带来了巨大方便。生活在步伐加快竞争压力巨大的社会里,时间就是金钱,时间就是生命,时间对人们显得特别的宝贵,其所拥有的作用更是可以不言而喻。它在学校里、车站里、港口中、剧院中、医院中、办公室里等许多公共场所的应用是非常广泛的。但传统的数字万年历除显示时间之外,功能过于简单,不能很好地满足人们的需求,逐渐失去了往日的市场。为了跟上电子技术的更新和发展,为了人们对生产、生活的需求,各种功能强大的新式万年历不断涌现出,它的功能更全面而且更加人性化。 电子万年历作为电子产品,以其体积小,携带方便、实用,美观等优势一直占领着广阔的市场,与此同时它也一直成为单片机设计培训中很常用的一个课题。基于这个课题有极好的的开发思维和发挥想象力的作用,并且它还可以通过逻辑实现许多功能,因此往往对我们设计者的要求很高,有一定的难度,电子万年历的设计不仅考察了我们对单片机知识的掌握能力,而且也更加突出了对单片机的扩展应用知识的掌握。并且还要求设计的电子万年历在使用上简单,功能上要齐全,人机交互友好美观人性化。因此基于单片机的电子万年历无论从实用的方面还是培养能力的方面来看都有巨大的价值。 1.2 电子万年历的现状与发展 二十一世纪是数字化技术高速发展的时代,而单片机在数字化高速发展的时代扮演着极为重要的角色。电子万年历的开发与研究在信息化时代的今天亦是当务之急,因为它应用在学校、机关、企业、部队等单位礼堂、训练场地、教学室、公共场地等场合,可以说遍及人们生活的每一个角落。所以说电子万年历的开发是国家之所需,社会之所需,人民之所需。 由于社会对信息交换不断提高的要求及高新技术的逐步发展,促使电子万年历发展并且投入市场得到广泛应用。这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。 目前,单片机技术已经进入了我们的产业中,家用电器、汽车电子行业,工业自动化等都有单片机的存在,单片机已经融入企业,融入人们每一天的生活。而电子万年历不过只是单片机最突出的代表,它最被人们所熟知,所接受,它优化着人们与家庭和环境的整体关系,电子万年历向着超微型、超高效的方面发展,而且他已经越来越微型化,越来越集成化,这些都为电子万年历上的集中控制提供了必不可缺的基础。目前,市场上有出售的各种各样数字万年历,它们品种很多而且实现了各种功能,其中绝大部分是基于单片机设计的电子控制系统。它们一般都是由输入脉冲电路、单片机芯片、晶振和复位电路、外部存储器和LCD显示电路组成。当今,电子万年历主要还是用于帮助人们计时、能自动报时、定时、供人们查询日期以及能自动控制等方面。因为单片机技术和数字集成电路技术的迅速发展和采用了最先进的石英技术,使得如今我们所认识和接触的电子万年历都具有体积小、省电、计时准确、性能稳定、方便维护、携带方便等诸多优点。除此之外,现在市场上已经有开发的电子万年历集成电路芯片出售,而且价格便宜,使用起来也比一般的电子万年历方便许多。 从日历的发展历程来看,已经有数千年的历史。现代日历已经很少接触到那些纸质的或者不常见的类型。因为随着我们对日历的使用范围的不断扩大,功能也会日益增加,种类更是会越来越多。从80年代开始,万年历随着单片机和超大规模集成芯片的快速发展,为电子万年历的完美诞生奠定了最根本的基础,其中有物质基础也有思想的基础。而近几年来,电子万年历的发展方向已经不是追求多样了,而是朝着精密的走时、良好的稳定性、使用很方便、耗电量很小、走时延续的时间长、体积小、功能多、制造成本较低等方向发展。我所见过最新的电子万年历,它除了具有了我们常见万年历功能外,而且还具有倒计时、多点的定时、语音报时、音乐播放、实时温度测量和显示等功能。在硬件设计方面它并没有太大的变化,主要是通过增加诸多软件部分来实现所需要的一些高级功能。 我们不难想像,在科学技术飞速发展的同时,各种各样的高新技术的出现已经被广泛应用到我们的生活中。电子万年历产品也必是将沿着体积小、耗电少、性能稳定、计时准确、维护方便、携带方便等方向发展。我想通过本次设计能实现公历显示,时间显示、实时温度显示、闹钟等功能。主要的工作量在软件调试部分,设计的程序在电子万年历设计系统中实现我需要的功能。 1.3 设计的主要工作及章节安排 本设计主要围绕对电子万年历系统的设计为主线展开,主要包括硬件部分设计,软件部分设计。其中硬件部分设计包括复位电路的设计、时钟电路的设计、按键电路的设计、单片机控制电路设计、电子万年历的显示电路设计等。软件部分要设计出各个功能模块的控制程序。 本设计所研究的电子万年历是单片机控制技术的一个具体应用,主要研究内容及工作重点包括以下几个方面: (1)选用电子万年历芯片时,应重点考虑性能稳定、使用方便、低功耗、抗断电的器件。 (2)根据选用的电子万年历芯片设计外围电路和单片机的接口电路。 (3)通过编程、编译、调试,把程序下载到单片机上运行,实现本设计的功能。 (4)在硬件设计时,结构要尽量简单实用、易于实现,系统电路尽量简单。 (5)在硬件电路和软件程序设计时,主要考虑提高人机界面的友好性,方便用户操作等因素。 1.4 本章小结 本章说明了本设计的选题来源及研究的意义,讲述了电子万年历系统在国内外的发展过程及当前的现状,其中叙述了电子万年历系统的特点和优点,根据本次设计的要求,明确了后续章节主要研究的内容。 第2章 设计方案论证 2.1 电子万年历系统概述 本设计是利用按键输入控制信号,将控制指令传送给AT89C51主控单片机,通过单片机处理数据,配合复位电路和时钟电路来驱动LCD的显示、温度采集和闹铃播放,从而实现电子万年历的各项功能。单片机是整个设计的核心部分,它既是协调整个系统工作的控制器,又是数据处理器。Atmel公司的AT89S系列能完成本次设计所需要求的所有功能,所以选用单片机AT89C51;时钟芯片采用DALLAS公司的DS1302时钟芯片,采用锂电池为DS1302供电,掉电保护,保证时间数据不会丢失;按键电路采用四个按键,分别实现调整时间和日期、设置闹钟、显示时间温度等;显示电路采用LCD1602字符液晶显示器,显示字体清晰。本设计选用简单的蜂鸣器来播放音乐。本设计的基本结构框图如下所示: 图2- 1 系统硬件结构框图 2.2 设计任务和主要内容   本设计是基于单片机的电子万年历设计,控制核心为AT89C51单片机,采用模块化的设计,设计了诸多功能模块,主要包括单片机核心控制系统、实时时钟显示模块、环境温度实时检测模块、语音输出模块、人机接口通信模块等。 1、 单片机控制模块是整个系统的核心部分,它既是协调整机工作的控制器,又是数据处理器。它由单片机、复位电路、晶振电路、时钟电路等外围电路组成。 2、 实时时钟芯片采用的是带 RAM的时钟芯片DS1302。该芯片可以进行时分秒的计数,具有10000年日历查询和显示,可以编程接口,通过加入外部电池供电可以实现掉电保存功能,并且可以加入报警功能。 3、 温度检测模块采用的是DALLAS公司所生产的单线数字温度传感器DS18B20,它具有独特的单线总线接口方式,具有接口简单、抗干扰能力强、工作稳定可靠、精度高、使用方便等优点。 4、 语音输出模块是提示用户系统的闹钟定时状态或对系统进行操作时所发出错误警告,语音输出模块可提供定点闹铃的音乐输出等功能。为了满足这些功能需求,本次设计采用的是简单的蜂鸣器作为语音输出。 5、 人机接口通信模块采用四个普通控制按键,液晶显示输出。液晶显示体积小,重量轻,辐射小,功耗低,轻便防震。由于本次设计显示的信息输出比较多也很复杂,采用液晶显示界面为了更加清晰和美观,操作更加地方便,显示信息更加丰富,本设计采用的是LCD1602能显示出所需要的各种输出信息。 2.3 设计方案论证 2.3.1 计时方案 方案(1):AT89C51单片机内部带有定时/计数功能,此定时功能是通过对外部晶振的脉冲进行计数,从而达到计时功能,只要使用11.0592M的晶振就能实现零误差的计时,因此可以利用此功能实现计时,但因为只有单一的计时功能要实现“万年历”的功能需要较复杂的程序,而且如果单片机掉电无法继续进行计时,所以使用不便。 方案(2):DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。利用单片机强大的控制功能就可实现实时计时的功能,而且消耗的系统资源少,程序简单。 综合上述两种方案,宜采用方案(2)实现实时计时功能。 2.3.2 测温方案 方案(1):热敏电阻是开发早、种类多、发展较成熟的敏感元器件.热敏电阻由半导体陶瓷 材料 关于××同志的政审材料调查表环保先进个人材料国家普通话测试材料农民专业合作社注销四查四问剖析材料 组成,利用的原理是温度引起电阻变化。通过一定的电路可以将周围环境的温度变化转化成电压的变化,通过AD转化器件将信号传输给单片机进行 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 ,从而测出当前环境温度,但误差大,不稳定,对环境要求较高。 方案(2):DS18B20是美国DALLAS公司生产的数字温度传感器,采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20 的双向通讯。 单总线具有抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。测量温度范围宽,测量精度高 ,在使用时不需要任何外围元件,支持多点组网功能多个DS18B20可以并联在惟一的单线上,实现多点测温,供电方式灵活DS18B20可以通过内部电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。因此非常适合本系统使用。 综上比较上述两种方案,宜采用方案(2)构成本设计的实时温度采集模块。 2.3.3 显示方案 方案(1):数码管是利用发光二极管的特性组合而成数字显示器件,通过控制相应的二极管的状态显示相应的数字。要使数码管正常显示就得有驱动电路驱动相应的段码,数码管的显示方式可分为静态显示和动态显示,静态显示方式只适合显示单个的数字,因此本设计应采用动态显示方式。由于动态显示方式利用的是人眼视觉暂留的特性,扫描的时间应不大于20毫秒,占用系统资源大,而且显示的个数和字型有限,在本设计中不宜采用。 方案(2):1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。1602的驱动电路带有11条指令,可以方便的控制液晶的显示效果如:清屏、左移右移、光标显示。而且1602显示的字符在下一条指令到来之前不会改变,也就是能够维持显示的字符,1602液晶占用的系统资源也少。 综合比较上述两种方案,应采用1602液晶组成本设计的显示模块。 报警模块采用无源蜂鸣器实现,只要编写相应的程序即可实现发出声音。因设置模块只需编写相应的程序外加相应的按键即可实现,实现方法较简单,在此不再论述。 2.4 本章小结 本章主要围绕电子万年历这一整套系统为主线展开,首先讲述了电子万年历系统的组成,然后讲述了几种主要电路方案的设计与论证,比较了两种方案的不同以及优缺点,然后确定所设计的电子万年历采用的方案。 第3章 系统硬件设计 本系统以AT89C51单片机为控制核心,通过与DS1302和DS18B20通信获取实时时间和实时环境温度,并将得到的数据通过1602液晶显示出来,同时通过相应的按键调整相应的值。因此本设计可分为显示模块、实时时间计算模块、实时环境温度采集模块、报警模块、设置模块(时间设置模块、最高温度设置模块、闹钟设置模块)。 下面从系统硬件的各个组成部分一一做介绍。 3.1 AT89C51单片机介绍 本系统采用的是美国ATMEL公司生产的AT89C51单片机,首先我们来熟悉一下AT89C51单片机的外部引脚和内部结构。 1.单片机的引脚功能 AT89C51单片机有40个引脚。 · Vcc:电源电压+5V · GND:接地 · P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。 在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线服用,在访问期间激活内部上拉电阻。 在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时要求外接上拉电阻。 · P1口:P1口是一个带内部上拉电阻的8位双向I/O,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。 Flash 编程和程序校验期间,P1接收低8位地址。 · P2口:P2口是一个带内部上拉电阻的8位双向I/O,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。 在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(MOVX @Ri指令)时,P2口线上的内容(也即特殊功能寄存器(SFR)区中P2寄存器的内容),在整个访问期间不改变。 Flash 编程和程序校验期间,P2亦接收低高位地址和其他控制信号。 · P3口:P3口是一组带内部上拉电阻的8位双向I/O,P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部的上拉电阻拉高并可作为输入端口。作输入端时,被外部拉低的P3口将用上拉电阻输出电流。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,见表3-1所示: P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。 表3- 1 P3口的第二功能图 端口引脚 第二功能 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(外部数据存储器读选通) · RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上的高电平将使单片机复位。WDT溢出将使引脚输出高电平,设置SFR、AUXR的DISRTO可打开或关闭该功能。DISRT0位缺省为RESET输出高电平打开状态。 · ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存器允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。 对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。 如有必要,可通过多特殊功能寄存器(SFR)区中的8EH单元的D0位置,可禁止ALE操作。该位置后,只有一条MOVX和MOVC指令ALE才会被激活。另外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。 · PSEN:程序存储允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。当访问外部数据存储器,没有两次有效的PSEN信号。 · EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。需要注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。 如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。 Flash存储器编程时,该引脚加上+12V的变成电压Vpp. · XTAL1:振荡器反相放大器及内部时钟发生器的输入端。 · XTAL2:振荡器反相放大器的输出端。 2.AT89C51单片机内部结构 AT89C51是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案,AT89C51引脚图如图3.1所示。 图3- 1 AT89C51引脚图 3.2 LCD1602液晶显示 点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。下面详细介绍LCD1602字符型液晶内部构造和引脚功能。忙碌标志:本标志(BF)用以表示当时LCD的状态,若BF=1,则表示处于忙碌状态,无法接受外部指令或数据;若BF=0,则可接受外部指令或数据。显示数据存储器:本存储器(DDRAM)存储所要显示的数据。实际上本存储器里存放的是要显示数据的ASCII码,再以ASCII码为地址,到CGRAM里找到该字型的显示编码。此外还包括字型产生器,光标闪烁控制电路,偏压电路,时序电路等等。 DB7-DB0 E R/W RS Vss Vcc Vee A K 图3- 2 LCD1602内部结构 寄存器选择控制,1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符。 LCD1602管脚排列及功能说明如表3-2所示: 表3- 2 LCD1602管脚排列及功能说明 编号 符号 引脚说明 编号 符号 引脚说明 1 VSS 电源地 9 D2 Data I/O 2 VDD 电源正极 10 D3 Data I/O 3 VL 液晶显示偏压信号 11 D4 Data I/O 4 RS 数据/命令选择端 12 D5 Data I/O 5 R/W 读/写选择端 13 D6 Data I/O 6 E 使能信号 14 D7 Data I/O 7 D0 Data I/O 15 BLA 背光源正极 8 D1 Data I/O 16 BLK 背光源负极 指令集 1602通过D0~D7的8位数据端传输数据和指令。显示模式设置(初始化)00111000[0x38]设置16×2显示,5×7点阵,8位数据接口;显示开关及光标设置:(初始化) 00001DCBD显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)。000001NS N=1(读或写一个字符后地址指针加1并且光标加1),N=0(读或写一个字符后地址指针减1并且光标减1),S=1且N=1(当写一个字符后,整屏显示左移),S=0当写一个字符后,整屏显示不移动。数据指针设置:数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)。其他设置:01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0) 。 LCD1602电路图如图3-3所示,其中D0-D7接RP1(图中未标出),RP1为8*10k欧姆的排阻作为P0口的上拉电阻,LCD1为1602液晶显示器件,左边的SIP16封装接口与液晶对应,液晶的4、5、6脚与单片机相连作为控制信号,7-14脚与单片机P0口相连作为数据信号传送。 图3- 3 LCD1602电路图 3.3 DS1302时钟芯片介绍 DS1302通过三根口线实现与单片机的通信,因DS1302功耗很小,即使电源掉电后通过3V的纽扣电池仍能维持DS1302精确走时。 DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。 图3- 4 DS1302引脚介绍 各引脚的功能为: 1、 Vcc2:5V电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1 时,由Vcc1向DS1302供电。 2、3 X1、X2 是外接晶振脚 (32.768KHZ的晶振) 4、地(GND) 5、CE/RST:复位脚 6、I/O:数据输入输出口; 7、SCLK:串行时钟,输入; 8、Vcc1:备用电池端; 3.3.1 DS1302有关日历时间的寄存器 表3- 3 DS1302有关日历时间的寄存器 读寄存器 写寄存器 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 范围 81h 80h CH 10秒 10秒 10秒 秒 秒 秒 秒 00-59 83h 82h 10分 10分 10分 分 分 分 分 00-59 85h 84h 12/24 0 10 时 时 时 时 时 1-12 0-23 AM/PM 87h 86h 0 0 10日 10日 日 日 日 日 1-31 89h 88h 0 0 0 10月 月 月 月 月 1-12 8Bh 8Ah 0 0 0 0 0 周日 周日 周日 1-7 8Dh 8Ch 10年 10年 10年 10年 年 年 年 年 00-99 8Fh 8Eh WP 0 0 0 0 0 0 0 —— 寄存器的说明如下: 1、秒寄存器(81h、80h)的位7定义为时钟暂停标志CH。当初始上电时该位置为1,时钟振荡器停止,DS1302处于低功耗状态;只有将秒寄存器的该位置改写为0时,时钟才能开始运行。 2、小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是 ,当为1时,表示PM。在24小时模式时,位5是第二个10小时位。 3、控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在对任何的时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。也就是说在电路上电的初始态WP是1,这时是不能改写上面任何一个时间寄存器的,只有首先将WP改写为0,才能进行其它寄存器的写操作。 3.3.2 DS1302控制字介绍 表3- 4 DS1302控制字介绍 7 6 5 4 3 2 1 0 1 RAM A4 A3 A2 A1 A0 RD /CK /WR 控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。 位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据; 位5至位1(A4~A0):指示操作单元的地址; 位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。 读数据: 读数据时在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据是从最低位到最高位。 写数据: 控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入也是从最低位(0位)开始。 3.3.3 DS1302单字节读写时序介绍 图3- 5 DS1302单字节读写时序介绍 DS1302的数据读写是通过I/O串行进行的。当进行一次读写操作时最少得读写两个字节,第一个字节是控制字节,就是一个命令,告诉DS1302是读还是写操作,是对RAM还是对CLOK寄存器操作,以及操作的址。第二个字节就是要读或写的数据了。 单字节写:在进行操作之前先得将CE(也可说是RST)置高电平,然后单片机将控制字的位0放到I/O上,当I/O的数据稳定后,将SCLK置高电平,DS1302检测到SCLK的上升沿后就将I/O上的数据读取,然后单片机将SCLK置为低电平,再将控制字的位1放到I/O上,如此反复,将一个字节控制字的8个位传给DS1302。接下来就是传一个字节的数据给DS1302,当传完数据后,单片机将CE置为低电平,操作结束。 单字节读操作的一开始写控制字的过程和上面的单字节写操作是一样,但是单字节读操作在写控制字的最后一个位,SCLK还在高电平时,DS1302就将数据放到I/O上,单片机将SCLK置为低电平后数据锁存,单机机就可以读取I/O上的数据。如此反复,将一个字节的数据读入单片机。 读与写操作的不同就在于,写操作是在SCLK低电平时单片机将数据放到IO上,当SCLK上升沿时,DS1302读取。而读操作是在SCLK高电平时DS1302放数据到IO上,将SCLK置为低电平后,单片机就可从IO上读取数据。 3.3.4 DS1302操作指令介绍 操作说明: 1 首先要通过8EH将写保护去掉,将日期,时间的初值写时各个寄存器。 2 然后就可以对80H、82H、84H、86H、88H、8AH、8CH进行初值的写入。同时也通过秒寄存器将位7的CH值改成0,这样DS1302就开始走时运了。 3 将写保护寄存器再写为80H,防止误改写寄存器的值。 4 不断读取80H-8CH的值,将它们格式化后显示到1602LCD液晶上 3.3.5 DS1302与单片机接口电路 图3- 6 DS1302与单片机接口电路 3.4 DS18B20芯片介绍 DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。 DS18B20通过单总线实现与单片机的通信,每个DS18B20都有一个唯一的序列号,可以方便的实现组网检测。 (1)单总线介绍 · 单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。 · 单总线通常要求外接一个约为4.7K—10K的上拉电阻,这样,当总线闲置时其状态为高电平。 (2) DS18B20特性介绍 · DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点: · 采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。 单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。 · 测量温度范围宽,测量精度高 DS18B20 的测量范围为-55 ℃ ~+ 125 ℃ ;在 -10~+ 85°C 范围内,精度为±0.5°C 。 · 在使用中不需要任何外围元件。 图3- 7 DS18B20的引脚 · 支持多点组网功能 多个DS18B20可以并联在惟一的单线上,实现多点测温。 · 供电方式灵活DS18B20可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而 使系统结构更趋简单,可靠性更高。 · 测量参数可配置DS18B20的测量分辨率可通过程序设定9~12位。 · 负压特性 电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。 · 掉电保护功能DS18B20内部含有EEPROM,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。 · DS18B20具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。 (3) DS18B20管脚介绍 DS18B20的封装及引脚排列见图3-7,其引脚功能描述见表3-5 表3- 5 DS18B20的引脚功能描述 序号 名称 引脚功能描述 1 GND 接地 2 DQ 数据输入/输出引脚。漏极开路。当被用着在寄生电源下,也可以向器件提供电源。 3 VDD 可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。 (4)DS18B20内部结构 DS18B20内部结构主要由四部分组成:64 位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(地址:28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,并且每个DS18B20的序列号都不相同,因此它可以看作是该DS18B20的地址序列码;最后8位则是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。由于每一个DS18B20的ROM数据都各不相同,因此微控制器就可以通过单总线对多个DS18B20进行寻址,从而实现一根总线上挂接多个DS18B20 的目的。 (5)DS18B20操作步骤 DS18B20 ROM 操作指令 一旦总线主机检测到从器件的存在,它便可以发出器件ROM操作命令之一。所有ROM操作命令均为8位长。 读ROM [33h ]:此命令允许总线主机读DS18B20的8位产品系列编码,唯一的48信序列号,以及8位的CRC。此命令只能在总线上仅有一个DS18B20的情况下使用。 符合ROM [55h]:此命令后继以64位的ROM数据序列,允许总线主机对多点总线上特定的DS18B20寻址。只有与64位ROM序列严格相符的DS18B20才能对后继的存储器操作命令作出响应。 跳过ROM [CCh]:在单点总线系统中,此命令通过允许总线主机不提供64位ROM编码而直接进行存储器操作以节省时间。 搜索ROM[F0h]:当系统开始工作时,总线主机可能不知道单总线上的器件个数或不知道其64位ROM编码。搜索ROM命令允许总线控制器用排除法识别总线上的所有从器件的64位编码。 警告搜索[ECh]:此命令的流程与搜索ROM命令相同。但是仅在最近一次温度测量出现警告的情况下,DS18B20才对此命令作出响应。 DS18B20 RAM操作指令 写暂存存储器[4Eh]:这个命令向DS18B20的暂存器TH和TL中写入数据。可以在任何时刻发出复信命令来中止写入。 读暂存存储器 [BEh]:这个命令读取暂相隔器的内容。读取将从第1个字节开始,一直进行下去,直到第9(CRC)字节读完。如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。 复制暂存存储器 [48h]:这个命令把暂存器的内容拷贝到DS18B20的E2ROM存储器里,即把温度报警触发字节存入非易失性存储器里。 温度变换 [44h]:这条命令启动一次温度转换而无需其它数据。温度转换命令被执行,而后DS18B20保持等待状态。如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又忙于做温度转换的话,DS18B20将在总线上输出0,若温度转换完成,则输出1。如果使用寄生电顺势,总线控制器必须在发出这条命令后立即启动强上拉,并保持500ms以上时间。 读忙[B8h]:在这条命令发出之后发出读数据隙,器件会输出温度转换忙的标识:0为忙,1为准备就绪。 读电源 [B4h]:若把这条命令发给DS18B20后,发出读时间隙,器件会返回它的电源模式:0为寄生电源,1为外部电源。 (6)DS18B20与单片机的接口电路 图3- 8 DS18B20与单片机的接口电路 3.5 语音闹铃模块 报警模块采用单片机输出一定频率的方波从而使蜂鸣器发出声音。音乐报时是本数字万年历设计系统的一个重要功能,报时器可用蜂鸣器或者扬声器来实现,本次设计采用蜂鸣器实现闹铃报时,蜂鸣器俗称喇叭,是一种结构一体化的电子讯响器。 由于单片机I/O引脚输出的电流较小,所以单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。本次设计采用了一个很简单的电路来实现蜂鸣器的连接,利用一个三极管来放大驱动蜂鸣器,电路连接如图3-9所示。 在本设计电路中,设计者采用PNP管9012来做为控制蜂鸣器的开关,可以看出当P3.4引脚为高电平时,PNP管截止,蜂鸣器不工作;当P3.4引脚为低电平时,PNP管导通,蜂鸣器工作。我们也可以在电路中加入一个限流电阻。采用PNP管9012的作用是为了防止系统上电时峰鸣器发出声音,因为系统复位以后,I/O口输出的是高电平。 用户可以通过程序控制P3.4管脚的置低和置高来使蜂鸣器发出声音和关闭,同时,蜂鸣器的声音大小及音调可以通过调整P3.4管脚的置高时间及输出的波形进行控制,这一点可以在程序调试的时候来实现。 图3- 9 蜂鸣器与单片机的接口电路 3.6 按键接口 按键输入部分主要用于时间调整、温度设置、闹钟设置,最终确定由四个按键来实现上述功能,由于按键比较少,所以用普通按钮接在 I/O 口,启用 I/O 口的内部上拉电阻,用查询法完成读键功能。 采用6mm*6mm*6mm轻触按键,四个按键分别连接在单片机的P1.4、P1.5、P1.6、P1.7口,Key1按键是调整模式键,按下Key1键分别是对时间的时、分、秒、日期等的设置,当完成设置后显示时钟界面;Key2是“减”功能键;Key3是“加”功能键;其连接图如图3.10所示。 图3- 10 按键接口电路 3.7 单片机最小系统电路设计 单片机最小系统电路实现对采集数据的处理和输出显示的控制,主控电路由AT89C51单片机、晶振电路、复位电路三部分组成。 图3- 11 单片机最小系统电路图 由其三部分构成的单片机最小系统电路如图3-11所示。CPU的时钟振荡信号有两个来源:一是采用内部振荡器,此时需要在XTAL1和XTAL2脚连接一只频率范围为0—33MHZ的晶体振荡或陶瓷振荡器及两只30pf电容。二是采用外部振荡,此时应将外部振荡器的输出信号接至XTAL1脚,将XTAL2脚浮空。 利用单片机内部的定时功能来实现时钟的走时,通过编程实现每50毫秒产生一次中断,中断20次后,秒单元加1,秒单元加到60时,跳回到零再继续加,同时分单元加1。以次类推,从而实现秒、分、小时、年的走时。本次设计中采用的是内部振荡器,频率为12MHZ的晶体振荡器及30pf的瓷片电容。 复位是指在 规定 关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定 的条件下,单片机自动将CPU以及与程序运行相关的主要功能部件、I/O口等设置为确定初始状态的过程。如果电路参数不符合规定的条件或干扰导致单片机不能正确的复位,系统将无法进行正常的工作,因此,复位电路要滤除可能的干扰。 3.8 本章小结 本章主要介绍的是本设计的硬件结构设计,通过单片机相关的I/O口输入、输出来实现相应的控制功能。还具体介绍了时钟电路、温度电路、按键电路、显示电路以及语音电路等的设计。 第4章 系统软件设计 本系统的软件部分主要进行日历计算程序设计,温度测量程序设计,按键的扫描输入等。程序开始运行后首先要进行初始化,把单片机的各引脚的状态按程序里面的初始化命令进行初始化,初始化完成后运行温度测量程序,读取出温度传感器测量出来的温度,然后运行公历计算程序,得到公历的时间、日期信息,再运行按键扫描程序,检测有无按键按下,计算完成后运行显示程序,显示程序将得到的温度数据、公历信息送给液晶屏让其显示。C语言具有编写灵活、移植方便、便于模块化设计的特点,所以本系统的软件采用C51编写。 4.1 主程序流程图 主程序的组成是通过分别调用各子程序组成总体系统功能,能很直观的看出主程序所要完成的功能,首先是初始化各模块,之后调用日历子程序完成日历时钟的初始化和时间数据的读写,调用键盘完成时间的调整,调用温度子程序完成温度芯片的初始化和读写,调用闹钟子程序当时间达到定时时间时闹铃打开,调用显示子程序显示数据,最后又转到键盘程序来回循环。 程序框图如下: 图4-1 主程序流程图 4.2 按键扫描程序流程图 系统通过按键来对时间进行调整及对闹钟的设定,由于按键会有机械性的抖动,因此需要在程序中加入防抖动程序。具体程序流程图如图4-2所示。 否 是 图4- 2 按键设置子程序流程图 4.3 从1302读取日期和时间程序流程图 本设计的时间读取主要来源于单片机对DS1302的操作,在硬件上时钟芯片DS1302与单片机的连接需要三条线,即SCLK(7)、I/O(6)、RST(5),具体连接图见系统硬件设计原理图。 N Y 图4- 3 1302读取时间流程图 4.4 农历转换程序设计 农历转换程序主要是通过对当前公历日期的计算,得到当前的农历日期。农历是同 时考虑太阳和月亮运动的历法,它起源于夏朝,又名夏历、中历、旧历,民间也有称阴 历的。它用严格的朔望周期来定月,又用设置闰月的办法使年的平均长度与回归年相近 , 兼有阴历月和阳历年的性质,因此在实质上是一种阴阳合历,它采用的是干支纪年法。 4.4.1 公历转农历算法研究 农历以月为基本单位,一个月以新月出现的那一天为始直至下一个新月出现的前一 天。由于月亮公转的周期介于29到30天之间,农历的一个月也就由新月出现时刻的早晚或是29天或是30天。大月为30天,小月为29天。与公历不同的是,大小月在不同的年中不固定。如春节的前一天常称为大年三十,但有不少年如2000年的农历十二月只有29天。由于十二个月的时间较阳历年即地球绕太阳公转一周的时间短11天左右,为了使农历年与公历年保持相对稳定,每隔两三年就需要加入一个闰月。大约每十九年要加入七个闰月。而二十四节气则是由地球在绕太阳公转的轨道上的位置确定的。以每年的冬至为始,每15度为一个节气。是故二十四节气在阳历的每月中有大概固定的日期。其中阳历下半月的十二个节气又称为中气。中气出现的时刻和闰月的确定有直接的关系。 我国农历的计算有下列四条规则: (1)所有新月和节气出现的时刻的计算以东经120度即东八区 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 时为准。但计算1929 年以前的阴历时应以北京即东经116度25分的当地时为准。此条规则用以区分中国阴历和其他类似阴历如日本阴历。 (2)新月出现的一天为一个月的第一天。如某个节气的出现时刻也在这一天,则不论该节气的出现时刻是否比新月晚,一律算落入新的一个月中。 (3)每年的冬至总是出现在这年的农历十一月中。 (4)从一年的冬至后一天起到下一年冬至这一天止的这段时间中,下称其间,如有十三个新月出现,则其间要加入一个闰月。需要加入闰月时,其间第一个没有中气的月为闰月。因为其间只有十二个中气,所以其间至少有一个月没有中气,也存在有两个月没有中气的可能性。但这种情况下只有第一个没有中气的月为闰月。闰月的前一个月为几月则该闰月称为闰几月。 以上规则的一个重要特点就是理论上完全以天文观测为依据,其中没有任何数学关系。这和公历,即格里历,完全是由数学关系确定的形成了鲜明的对比。当然,具体到未来农历的计算,仍然需要月亮与地球运动的数学模型,而且精度高的这种数学模型相当复杂,在没有电 脑的情况下,一般人根本不可能推算出精确的农历来。而公历的数学关系则非常简单,这又形成了另外一种鲜明的对比。公历,也就是太阳历,其本质就是对太阳在黄道上的视位置进行划分。农历,也就是月亮历,其本质就是对月球在白道上的视位置进行划分。 因此公历到农历的转换就是:已知太阳黄经刻度求月亮白经刻度的计算,说的通俗一点的解释就是已知地球轨道位置,求此时月球的视位置。粗略的计算方法需要的参数就是地球、月球的基本轨道参数(半长径、半短径、向径、偏心率、周期等)、质量,另外还包括轨道焦点的进动和地球的章动这两个偏移量。具体的计算公式就比较复杂了,其中包含大量的三角函数方程和迭代计算法。这种计算方法用于公历到农历的转换足够了,当然精确一点的方法则要考虑到大行星的摄动,也就是他们的引力对地球和月球的轨道的影响,最主要的是离我们最近的火星和金星,以及质量最大的木星。最好的方法是把以上传统力学计算公式换成相对论公式,这样算出来的是最精确的。 很显然,用单片机来直接计算农历这是不可能的。本系统采用的方案是用查表法来 实现的。把农历的每年的月大月小和闰月情况编成一个用 32 位二进制数据,低 12/13 位表示每个月的大小,高16 位表示闰哪个月,最后把每个 32 位的二进制数据转换成 16进制数据放在数组里,在查表的时候调用它。 比如2006年农历的16进制数据为0x7155b,转换成二进制数如下: 0000 0000 0000 0111 0001 0101 0101 1 0 1 1 |--------闰7月--------------|------- 1 2345 6778 9 10 11 12---| 又如2007年农历的16进制数据为0x25d,转换成二进制数如下: 0000 0000 0000 0000 0000 0010 0101 1 0 1 1 |--------无闰月------------|------------ 1234 5678 9 10 11 12 ---| 4.4.2 公历转农历程序 本系统设计的公历转农历程序的日期为1921年2月8日到2100年2月8日,将公历1921年2月8日作为起点,对应的农历为1921(辛酉)年正月初一。具体的转换程序如下: switch() { static int nIsEnd,m,k,n,I,nBit; static long nTheDate; int y; wCurYear= nian; wCurMonth = yue; wCurDay = ri; y=wCurYear - 1921; nTheDate=(y<<8)+(y<<6)+(y<<5)+(y<<3)+(y<<2)+y+(y>>2)+wCurDay+ wMonthAdd[wCurMonth-1]-38; if((!(wCurYear & 0x0003)) && (wCurMonth > 2)) nTheDate++; nIsEnd = 0; m= 0; while(nIsEnd != 1){ if(wNongliData[m] < 4095) k = 11; else k = 12; n = k; while(n>=0){nBit = wNongliData[m]; for(i=1;i>1); nBit = (nBit & 0x0001); if (nTheDate <= (29 + nBit)) { nIsEnd = 1;break; } nTheDate = nTheDate-29- nBit; n--;} if(nIsEnd) break; m++;} wCurYear= 1921 + m; led1=(wCurYear+6)%10; led2=(wCurYear+8)%12; wCurMonth = k - n + 1; wCurDay = nTheDate; y=wNongliData[m] / 65536 + 1; if (k == 12){ if (wCurMonth == y) wCurMonth = 1 - wCurMonth; else if (wCurMonth > y) wCurMonth = wCurMonth - 1;} if(wCurMonth<0) {wCurMonth=-wCurMonth;yun=1;} else yun=0; } 该函数是将读取到的公历的年份先赋值给wCurYear,先计算出当前公历年份距1921 年的年数,y=wCurYear-1921;然后根据y计算出今天距离公历1921年2月8日的具体天数,nTheDate=(y<<8)+(y<<6)+(y<<5)+(y<<3)+(y<<2)+y+(y>>2)+wCurDay+wMonthAdd[wCurMonth-1]-38;该公式中不包括公历 1921 年距今的闰年天数,所有的 2 月份全部都是按 28 天计算的,接下来就需要对 nTheDate 进行修正,if((!(wCurYear & 0x0003)) && (wCurMonth > 2)) nTheDate++; 如果碰到闰年,总天数 nTheDate 就加 1 天。通过得到的 nTheDate 进行查表计算出 当前距农历 1921 年的年数 m,然后就得到了当前农历的年份, wCurYear = 1921 + m。 4.5 公历与星期的换算方法 在现行公历中,历年的长度365天(平年)或者366天(闰年)都不是七的整数倍,所以日期与星期之间没有明显的对应关系。一般情况下,不看日历牌就无法知道某月某日是星期几。不过,它们之间还是有一定规律可循的,只要经过简单计算,或者查找表格,就可以知道与任何日期相对应的星期数。这里列出两种方法供读者选用。 1公式法:设y麦示公元年数,d表示从1月1日起算的日数。 首先求出1月0日(即上一年12月31日)的星期序数,然后与日数d相加,其和用7除,余数就是答案。为了推导公式,我们想一想,第一年1月0日的星期序数与第二年1月0日的星期序数有什么关系?平年365天,等于52个星期零1天,所以第二年1月0日的星期序数比第一年的多l,但这个l已包含在y中了,因为第二年的年数y比第一年大1;闰年366天,等于52个星期零二天,所以第二年1月0日的星期序数等于第一年(闰年)的星期序数加2,除了y中包含的1外,还需加修正值1。根据这些道理我们可以推得三个公式,将式中S用7除,余数就表示星期几。 从公元1900年1月1日到公元210I年1月1日之间这201年,可用公式: S = y-1900 + [(y-1901)/4] + d 方括号表示取商的整数部分,对于1900年~1904年这五年方括号值为0。这个公式是这样来的:1900年1月0日(即1899年12月31日)是星期天。这年是平年,以后直到2100年前都是每隔4年一闰,闰年多出的那一天,影响到下一年1月0日的星期序数,并不影响闰年本身,闰年产生的修正值应加到下一年上去,所以〔(y-1901)/4〕中,计算时用190l而不是1900。 例:求2000年12月31日是星期几? 2000年是闰年,从1月1日算起,12月31日是第366天,所以d=366。根据公式有:  S=2000-1900 +〔(2000-1901)/4〕+ 366   =100 +〔99/4〕+ 366   =490 490为7的整数倍,即余数为0,所以2000年12月31日为星期日。 2更普遍的公式为: s=v-1 +〔(y-1/4)〕-〔(y-1/100)〕+〔(y-1/400)〕+ d 对于这个公式,我们不妨这样考虑:公历400年中有97个闰年,共365x 400 + 97 =146.097天,146,097=20,871× 7,即正好是7的整数倍。这表明某年某月某日所对应的星期序数与四百年前同月同日所对应的星期序数完全相同。前边例中我们已算出公元2001年1月0日(即2000年12月31日)是星期日,那么,公元1601年、1201年……以及公元1年的1月0日都是星期日。假如每个历年都是365天的话,那么,由于公元1年1月0日是星期日,只要公式S=y-1 + d就可以了,但实际上闰年是366天,所以我们必须根据闰年的有关规定进行修正。〔(y-1)/4〕是四年一闺产生的修正值。如果只取这一个修正项,就会多修正以至造成错误,这是因为,根据公历的规定,逢百之年虽然能被4整除,却不一定是闰年,所以必须减去多修正的值,它等于〔(y-1/100)〕。如果逢百之年都是平年,只要这两个修正项也就可以了。可是,公元年数能被400整除的年(当然也一定能被100整除)仍是闰年,所以还必须加上〔(y-1/400)〕。这个修正项才行。方括号中之所以用y-1而不用y,是由于修正值是加到闰年的下一年上去,而不是加到闰年本身上。 否 是 是 否 否 是 是 否 是 否 是 否 是 否 图4- 4 星期计算流程图 4.6 本章小结 本章主要介绍的是本设计的软件结构设计,首先通过介绍本电子万年历系统的主流程图,然后逐渐引出各功能子程序模块流程图,具体有时间读取子程序、温度测量子程序等。 第5章 调试仿真 本设计系统在整体硬件电路的设计过程中,原理图和PCB的绘制采用Keil与Proteus软件,Keil μVision软件是Keil公司开发的一款用于MCS-51单片机开发的应用十分广泛的编译和调试软件。Proteus软件是Labcenter Electronics公司的一款电路设计与仿真软件,该软件类似我们常用的protel99SE软件,让人感到舒适,现在已成为企业工程师最喜爱的画图软件之一。 5.1 Keil μVision软件简介 Keil μVision软件是Keil公司(ARM子公司)开发的一款用于MCS-51单片机开发的应用十分广泛的编译和调试软件。该软件可以编辑、编译汇编语言、C51语言,连接定位目标文件和库文件,创建HEX文件,调试目标程序等。Keil软件功能强大,包含很多部分,本文我们主要使用Keil μVision来开发C51项目、调试程序并生成HEX文件来用于单片机开发。Keil μVision是一款在Windows下使用的集成开发环境,目前最新版本为V3,本论文中我选用了V3.0,图为程序调试完成界面。 图5- 1 Keil μVision3的程序完成界面 5.2 Proteus软件简介 Proteus软件是Labcenter Electronics公司的一款电路设计与仿真软件,它包括ISIS\ARES等软件模块,ARES模块主要用来完成PCB的设计,而ISIS模块用来完成电路原理图的布图与仿真。Proteus 的软件仿真基于VSM技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如MCS-51系列、PIC系列等等,以及单片机外围电路,比如键盘、LED、LCD等等。通过Proteus软件的使用,我便能够轻易地获得一个功能齐全、实用方便的单片机实验室。 Proteus软件有十多年的历史,在全球广泛使用,除了其具有和其它EDA工具一样的原理布图、PCB自动或人工布线及电路仿真的功能外,其革命性的功能是,它的电路仿真是互动的,针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现软件源码级别的实时调试,如果显示及输出,还能看到运行后输入输出的效果,配合系统配置的虚拟仪器如示波器、逻辑分析仪等。 5.3 电子万年历的Proteus软件仿真 (1)双击AT89C51单片机,调出Edit Component方框图,如图5-2,进行Program File的设置,查找已经利用Keil生成hex文件。然后,单击OK按钮。我在上节中用Keil软件生成并保存的文件是王绪君的毕业设计.hex文件。 图5- 2 查找 HEX文件 (2)此时,我已经将电子万年历的程序烧进了单片机。然后,就将开始我们的仿真了。可以看到,在底部的工具条从左到右依次是“Play”、“Step”、“Pause”、“Stop”按钮,即运行、步进、暂停、停止。下面我们点击“Play”按钮来仿真运行,效果如下图5-4所示,可以看到系统按照我们的程序在运行着,时间与日期也有了显示。 图5- 3 实现仿真电路图 5.4 系统功能测试 整个过程已经有了最终的结果。理论上,单击运行按钮,将会显示相应的年、月、日与时、分、秒。这些数据是在DS1302内部的寄存器中读出的。首先数据传送给AT89C51单片机的P1口。P2口控制液晶显示,驱动LCD显示日历与时间。通过按键设置闹钟时间,当闹钟时间到闹铃开始播放音乐,音乐播放器件按下第一个按键,闹铃停止播放音乐。经过对仿真的实际测试验证该数字闹钟的各项功能均达到了设计要求。 图5- 5a 显示日期时间 图5- 5b 显示温度 图5- 5c 显示星期 图5- 5d 设置时间 图5- 5e 设置闹钟 图5-5f 设置最高温度 图5- 4 系统功能实现图 结论与展望 在此毕业设计过程中,巩固了我在大学四年内学过的知识,尤其是单片机和C语言编程方面的知识,同时通过这次毕业设计提高了我的单片机编程的能力,获得的软件调试经验,同时了解到了其它相关领域的知识,对今后的工作学习有着极大的帮助。 由于时间太仓促,经验不足,理论方面也相应的存在不足,加上条件有限,仍存在着一些设计方面的问题,个人技能也有待提高。理论知识还要巩固加强。但是宝贵的实践经验还是对自己的提高有着极大的帮助。 开始进行这个设计,首先针对电子万年历的硬件系统,进行了详细介绍。由电路图可知该设计硬件主要采用AT89C51主控芯片、DS1302时钟芯片、DS18B20温度传感器、1602液晶显示器,还有一些三极管,电阻,电容等,然后,是对系统的软件进行阐述,第四章介绍了万年历的流程图,可以大致了解万年历的运行流程,该电子万年历可显示公历年、月、日和星期、时、分、秒,而且走时准确,可调整年、月、日和星期、时、分、秒。我觉得本系统设计,关键就要取决于程序的编程正确与否。最后,就要对系统进行程序调试与软件仿真。我采用的是Keil和Proteus强大的仿真软件,经过自己一步一步的学习与练习,这也是我本次设计中,收获最大的知识地方,软件的功能很强大也很完善,对我今后的学习帮助和影响都很大,受益匪浅! 美中不足的是虽然给出了与阳历同步的阴历算法,却因程序问题久经思索却终究未能实现。综上所述,本设计虽然实现了电子万年历的功能,但在硬件的选择上应该更优化,使成本更低;在软件方面也需要完善,一个真正实用的万年历应该具有显示阴历历法的功能。 致 谢 大学四年的学习生活即将结束,这篇论文作为我在校期间学习的最后一份答卷,敬献给各位老师。在大学这四年的学习和生活,我不仅学到了丰富的专业知识,更学到了各位老师认真工作、爱岗敬业、为人师表的优良品质。在此,谨向各位老师表示深深的敬意和谢意! 紧张的毕业设计就要结束了,大学四年的生活也到了尾声。在设计的过程中我要特别感谢我的导师金老师,本次设计及论文的撰写是在我的导师金老师的精心指导和悉心关怀下完成的,从论文的选题、研究、撰写到定稿,都得到了金老师细心指导。金老师对我整个毕业设计由始至终地悉心督促指导,使我从困惑迷茫的初期走向论文的顺利完成,在完成论文的同时也深受启发和教育,使我受益终生。她宽厚待人,对学生关怀备至,在工作上精益求精,对学生严格要求,鼓励学生学以致用,敢于实践,勇于创新,在实践中发现问题、解决问题。金老师具有丰富的科研经验与理论水平,其开明的学术思想、求实的科研作风和对科学研究及发展趋势的深刻认识给我以极大的影响、启迪和熏陶,令我受益匪浅。该设计及论文的圆满完成是和金老师的细心关怀分不开的。使得能顺利完成这次毕业设计。在此,再次向金老师表示由衷的感谢! 在论文修改过程中,衷心的感谢指导老师尽心尽力的对论文进行了仔细的修改,无论是在论文格式还是论文内容上,都要求的较为严格,使我在设计过程中学到了很多东西。在系统的设计和论文的研究工作中无不倾注着各位老师的心血和辛勤的汗水,各位老师严谨的治学态度、渊博的知识、生动而满富激情的授课方式,让我四年里学到了扎实的理论知识。从各位尊敬的老师身上,我不仅学到了扎实的专业知识和丰富的实践技能,也学到了很多做人的道理。在此,向给予我各位老师致以最衷心的感谢和深深的敬意!在这四年的学习和研究工作中,也得到了学院的师兄弟们的关心和热心帮助,在此向他们表示由衷的感谢!最后,衷心感谢在百忙中评阅论文和参加答辩的各位专家、教授和同学! 作者: 年 月 日 参考文献 [1]8-bit Microcontroller With 8K Bytes Flash AT89C52.ATMEL,1999 [2]8-bit Microcontroller With 4K Bytes Flash AT89C51.ATMEL,2000. [3]8-bit Microcontroller With 8K Bytes Flash AT89LV51.ATMEL,2000. [4]8-bit Microcontroller With 4K Bytes in-system programble Flash AT89S52.ATMEL,2001. [5]8-bit Microcontroller With 4K Bytes in-system programble Flash AT89S 51.ATMEL,2001. [6]8-bit Microcontroller With 4K Bytes in-system programble Flash AT89L S51.ATMEL,2001 [7]张毅刚,彭喜元,彭宇.单片机原理及应用(第二版)[M].高等教育出 版社,2011.12 [8]张毅刚.单片机原理与应用设计[M].北京:电子工业出版社,2008 [9]张毅刚.MCS-51单片机应用设计[M].哈尔滨:哈尔滨工业大学出版社,1997 [10]杨振江.智能仪器与数据采集系统中的新器件及应用[M].西安:西安电子科技大学出版社,2001 [11]童诗白.模拟电子技术基础(第四版)[M].高等教育出版社,2009.12 [12]阎石.数字电子技术基础(第五版)[M].高等教育出版社,2009 [13]胡烨.《Protel99SE原理图与PCB设计教程》[M]机械工业出版社,2004. [14]戴佳.《51单片机C语言设计实例精讲》[M] 电子工业出版社, 2006 [15]郭永贞.《数字电子技术》[M] 西安电子科技大学出版社 ,2000 [16]杨金岩等.《8051单片机数据传输接口扩展技术与应用实例》[M]人民邮电出版社,2005. 附 录 附录A:电子万年历系统整体仿真电路图 附录B:电子万年历系统PCB电路图 附录C:参考文献摘要 [1]. 单片机原理及应用 [M] 张毅刚,彭喜元,董继成 (北京:高等教育出版社,2003) 【摘要】:本书详细介绍了MCS-51单片机的硬件结构、指令系统,从应用的角度介绍了汇编语言程序设计与各种硬件接口设计、各种常用的数据运算和处理程序、接口驱动程序以及MCS-51单片机应用系统的设计,并对MCS-51单片机应用系统设计中的抗干扰技术以及各种新器件的介绍。本书突出了选取内容的实用性、典型性。 关键词:MCS-51;指令系统;数据运算;接口 [2].单片机原理与实践[M] 彭传正,林春景,凌阳 (北京:北京航空航天大学出版社, 2006) 【摘要】:本书从SPCE061A板焊接调试入手,讲述SPCE061A板的硬件系统;再结合IDE编程开发工具和语言功能讲述软件系统,整个过程中注重对软硬件结合的讲解;同时列举大量的实例供学习和参考。 关键词:SPCE061A板;IDE编程;语言功能;软硬件 [3]. C语言程序设计教程 [M] 周鸣争 (成都:电子科技大学出版社,2005) 【摘要】:本书全面地介绍了C语言的基本概念,C语言的数据类型和运算规则, C语言语句及结构特点;系统阐述了C语言程序设计的基本方法和技巧;对面向对象程序设计及C++的编程技术也作了初步介绍。 关键词:C语言;数据类型;设计方法;面向对象 [4]. PROTEUS入门实用教程 [M] 周润景,张丽娜,刘映群 (北京:机械工业出版社,2007) 【摘要】:本书基于PROTEUS7.1版本软件,通过实例讲解PROTEUS软件最基本的操作,以及如何实现数字电路、模拟电路、单片机电路的设计与仿真。本书包括原理图输入、电路仿真、软件调试及系统协同仿真,以实际的操作过程为写作的次序,以实例贯穿全书进行讲解与分析。 关键词:PROTEUS、数字电路、模拟电路、仿真、软件调试 [5].单片机外围器件实用手册[M] 窦中实 (北京:北京航天航空大学出版社,2003,251-254) 【摘要】:本书分三章介绍与单片机有关的三类主要器件。第一章介绍了各种典型的D/A转换器件。第二章介绍LED和LCD器件及其控制集成电路:包括静态LED显示器件、并行数据输入和串行数据输入动态显示器件,笔段型、点阵字符型和点阵图形型LCD显示模块及其驱动器件。第三章介绍各种主流的计算机语言输出器件。 关键词:D/A转换器、LED、LCD、驱动器件 [6].Protel 99SE原理图与PCB设计教程[M] 胡烨,陈明 (北京:机械工业出版社, 2005:44-130) 【摘要】:本书共11章,内容包括:Protel 99 SE基础、电路管理图设计基础、Protel 99 SE原理图设计基础、电路原理图设计、印刷电路板设计基础、制作元件封装等。每章均结合了典型实例进行讲解,使读者可以轻松掌握Protel 99 SE各功能模块的使用。 关键词:Protel 99 SE;原理图;印刷电路板;元件封装 [7].模拟电子技术基础[M] 童诗白,华成英 (高等教育出版社,2006(5):44-45) 【摘要】:文章介绍了常用半导体器件、基本放大电路、多级放大电路、集成运算放大电路、放大电路的频率响应、放大电路中的反馈、信号的运算和处理、波形的发生和信号的转换、功率放大电路。 关键词:半导体;放大电路;信号处理;功率放大 [8].数字电子技术基础[M] 阎石 (高等教育出版社,2006(5):103-105) 【摘要】:全书主要内容有:数制和码制、逻辑代数基础、门电路、组合逻辑电路、触发器、时序逻辑电路、半导体存储器、可编程逻辑器件、硬件描述语言、脉冲波形的产生和整形。 关键词:逻辑电路;可编程逻辑器件;硬件描述语言 [9] .Proteus在单片机仿真中的应用[J] 李娜,刘雅举 (现代电子技术,2007,30(4):181-182) 【摘要】:为了解决学生在实践性非常强的单片机课程中入门难的问题,在教学过程中引入Proteus仿真软件,通过简易实例说明该软件的使用,以及使用该软件的优缺点。 关键词:Proteus;仿真软件;单片机;应用 [10].单片机学习机及编程器的设计与制作[J] 唐德礼,王襄 (现代电子技术,28(12):117-120) 【摘要】:详细论述了51系列单片机学习机及编程器的设计思路和实现方法,该学习机既是仿真器又是编程器。他可以编程EPROM和EEPROM及AT89C51,在该机上可以进行机器语言程序的输入、调试、修改和运行;同时软件编程可以在PC机上完成,通过串行通信下载到该机的仿真RAM中运行。该装置是一款物美价廉的单片机软、硬件的学习工具和开发工具,有着重要的使用价值和推广价值 关键词:仿真器;编程器;串行通信;AT89C51 附录D:源程序清单 #include #include unsigned char code displaywelcome[]={" My Calendar"};//欢迎界面 unsigned char code displaywish[]={" Wang Xu jun ^_^"}; //欢迎界面 unsigned char code overtemperature[]={"OVERTEMPERATURE!"}; unsigned char code digit[]={"0123456789"}; //数字代码 unsigned char mode ;TH,TL,TN,TD,length,tempswitch,Maxtemp=40,amode,alarmmode,minutes,hours, minutea,seconds,houra=12; sbit SCLK=P1^0; //DS1302时钟输入 sbit DATE=P1^1; //DS1302数据输入 sbit REST=P1^2; //DS1302复位端口 sbit SET=P1^4; //DS1302设置模式选择位 sbit ADD=P1^5; //增加 sbit RED=P1^6; //减小 sbit CANL=P1^7; void delay1ms(int i)//1毫秒延时 { int j,k; while(i--) for(j=76;j>1;j--); for(k=29;k>1;k--); } void delaynus(unsigned char n) //延时若干微秒 { unsigned char i; for(i=0;i0;i--) { _nop_(); } } void baojing(unsigned char n) { unsigned char x,i; while(n--) { for(i=0;i<5;i++) { for(x=0;x<200;x++) { beep=~beep; dely500(); } } for(i=0;i<3;i++) { for(x=0;x<200;x++) { beep=~beep; dely500(); dely500(); } } } } /*******DS1302模块*************/ void Write1302(unsigned char date)//向1302写数据 { unsigned char i; SCLK=0; delaynus(2); for(i=0;i<8;i++) { DATE=date&0x01; SCLK=1; delaynus(2); SCLK=0; delaynus(2); date>>=1; } } void WriteSet1302(unsigned char cmd,unsigned char date) //根据相应的命令输入相应的数据 { REST=0; SCLK=0; REST=1; Write1302(cmd); delaynus(5); Write1302(date); SCLK=1; REST=0; } unsigned char Read1302(void) //读取1302数据 { unsigned char i,date; delaynus(2); for(i=0;i<8;i++) { date>>=1; if(DATE==1) date|=0x80; SCLK=1; delaynus(2); SCLK=0; delaynus(2); } return date; } unsigned char ReadSet1302(unsigned char cmd)//根据命令读取1302相应的值 { unsigned char date; REST=0; SCLK=0; REST=1; Write1302(cmd); delaynus(2); date=Read1302(); SCLK=1; REST=0; return date; } void IntDS1302(void) //DS1302初始化 { unsigned char flag; flag= ReadSet1302(0x81); if(flag&0x80) { //判断时钟芯片是否关闭 WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值 WriteSet1302(0x82,((0/10)<<4|(0%10))); //根据写分寄存器命令字,写入分的初始值 WriteSet1302(0x84,((0/10)<<4|(0%10))); //根据写小时寄存器命令字,写入小时的初始值 WriteSet1302(0x86,((0/10)<<4|(0%10))); //根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,((0/10)<<4|(0%10))); //根据写月寄存器命令字,写入月的初始值 WriteSet1302(0x8c,((10/10)<<4|(10%10))); //根据写年寄存器命令字,写入年的初始值 WriteSet1302(0x90,0xa5); //打开充电功能 选择2K电阻充电方式 WriteSet1302(0x8E,0x80); //根据写状态寄存器命令字,写入保护指令 } } /***************液晶显示模块*****************/ sbit RS=P2^5; sbit RW=P2^6; sbit E=P2^7; sbit BF=P0^7; /*液晶忙检测*/ bit BusyTest(void) { bit result; RS=0; RW=1; E=1; _nop_(); _nop_(); _nop_(); result=BF; _nop_(); _nop_(); _nop_(); E=0; return result; } /*写指令*/ void Write_com(unsigned char command) { while(BusyTest()!=0); RS=0; RW=0; E=0; _nop_(); _nop_(); _nop_(); P0=command; _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); E=0; } /*写地址*/ void Write_Address(unsigned char address) { Write_com(address|0x80); delay1ms(1); } /*写数据*/ void Write_Date(unsigned char date) { RS=1; RW=0; E=0; _nop_(); _nop_(); _nop_(); P0=date; _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); E=0; delay1ms(1); } /*初始化*/ void Lcd_Int(void) { Write_com(0x38); delay1ms(1); Write_com(0x38); delay1ms(1); Write_com(0x06); delay1ms(1); Write_com(0x0c); delay1ms(1); Write_com(0x01); } void displaymainpart(void)//显示液晶主要部分(不变化部分) { Write_Address(0x01); delay1ms(1); Write_Date('D'); Write_Date('A'); Write_Date('T'); Write_Date('E'); Write_Date(':'); delay1ms(1); Write_Address(0x0A); delay1ms(1); Write_Date('-'); Write_Address(0x0D); Write_Date('-'); Write_Address(0x42); Write_Date('T'); Write_Date('I'); Write_Date('M'); Write_Date('E'); Write_Date(':'); Write_Address(0x4A); Write_Date('-'); Write_Address(0x4D); Write_Date('-'); Write_Address(0x06); Write_Date('2'); Write_Date('0'); } void display_Second(unsigned char second) //在液晶上显示秒 { unsigned char i,j; i=second/10; j=second%10; Write_Address(0x4E); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); } void display_Minute(unsigned char minute) //在液晶上显示分 { unsigned char i,j; i=minute/10; j=minute%10; Write_Address(0x4B); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); } void display_Hour(unsigned char hour) //在液晶上显示时 { unsigned char i,j; i=hour/10; j=hour%10; Write_Address(0x48); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); } void display_Day(unsigned char day) //在液晶上显示日 { unsigned char i,j; i=day/10; j=day%10; Write_Address(0x0E); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); } void display_Month(unsigned char month) //在液晶上显示月 { unsigned char i,j; i=month/10; j=month%10; Write_Address(0x0B); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); } void display_Year(unsigned char year) //在液晶上显示年 { unsigned char i,j; i=year/10; j=year%10; Write_Address(0x08); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); } void display_houra(unsigned char x) //闹钟小时部分显示 { unsigned char i,j; i=x/10; j=x%10; Write_Address(0x44); Write_Date(digit[i]); Write_Date(digit[j]); } void display_minutea(unsigned char x)//闹钟分钟部分显示 { unsigned char i,j; i=x/10; j=x%10; Write_Address(0x47); Write_Date(digit[i]); Write_Date(digit[j]); } void display_Time(void) //显示实时时间 { unsigned char value,day,month,year; Write_com(0x0c); value=ReadSet1302(0x81); seconds=(((value&0x70)>>4)*10+(value&0x0f)); display_Second(seconds); value=ReadSet1302(0x83); minutes=(((value&0x70)>>4)*10+(value&0x0f)); display_Minute(minutes); value=ReadSet1302(0x85); hours=(((value&0x70)>>4)*10+(value&0x0f)); display_Hour(hours); value=ReadSet1302(0x87); day=(((value&0x70)>>4)*10+(value&0x0f)); display_Day(day); value=ReadSet1302(0x89); month=(((value&0x70)>>4)*10+(value&0x0f)); display_Month(month); value=ReadSet1302(0x8D); year=(((value&0xf0)>>4)*10+(value&0x0f)); display_Year(year); } void displaystar(void) //显示欢迎界面 { unsigned char i,j; Write_Address(0x0f); while(displaywelcome[i]!='\0') { Write_Date(displaywelcome[i]); i++; delay1ms(1); } i=0; Write_Address(0x4f); while(displaywish[i]!='\0') { Write_Date(displaywish[i]); i++; delay1ms(1); } j=40; while(j--) { Write_com(0x18);//循环左移 delay1ms(700); } Write_com(0x01); delay1ms(10); } void gbdisplay(unsigned char address) //时间调整时光标闪烁 { Write_Address(address); delay1ms(5); Write_com(0x0f); delay1ms(5); } void displaymaxt(unsigned char x) //显示最大温度 { unsigned char i,j,k; Write_com(0x0c); delay1ms(2); Write_Address(0x44); i=x/100; j=x/10; k=x%10; Write_Date(digit[i]); Write_Date(digit[j]); Write_Date(digit[k]); } /*****************时间调整部分*********************/ void hourset(void) //调时 { unsigned char timevalue,hour; delay1ms(500); //防止多次触发 WriteSet1302(0x8e,0x00);//将写保护去掉,确保能正常将调整后的数值写入DS1302 timevalue=ReadSet1302(0x85); //读取此时的数值 hour=(((timevalue&0x70)>>4)*10+(timevalue&0x0f)); while(1) { if(ADD==0) { delay1ms(50); if(ADD==0) { hour++; delay1ms(300); while(ADD==0); } } if(RED==0) { delay1ms(50); if(RED==0) { hour--; delay1ms(300); if(hour==0) hour=23; while(RED==0); } } timevalue=(((hour)/10)<<4|(hour%10)); WriteSet1302(0x84,timevalue); delay1ms(1); display_Hour(hour); Write_Address(0x49); delay1ms(5); if(hour>=24) hour=0; delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0) break; } WriteSet1302(0x8e,0x80); } void minuteset(void) //调分 { unsigned char timevalue,minute; delay1ms(500); WriteSet1302(0x8e,0x00); timevalue=ReadSet1302(0x83); minute=(((timevalue&0x70)>>4)*10+(timevalue&0x0f)); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { minute++; if(minute>=60) timevalue=0; while(ADD==0); } } if(RED==0) { delay1ms(10); if(RED==0) { minute--; delay1ms(300); if(minute==0) minute=59; while(RED==0); } } timevalue=((minute/10)<<4|(minute%10)); WriteSet1302(0x82,timevalue); delay1ms(1); display_Minute(minute); Write_Address(0x4c); delay1ms(5); if(minute>=60) minute=0; delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0) break; } WriteSet1302(0x8e,0x80); } void secondset(void) //秒归零 { unsigned char second; delay1ms(500); WriteSet1302(0x8e,0x00); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { second=0; WriteSet1302(0x80,0x00); while(ADD==0); } } delay1ms(1); display_Second(second); Write_Address(0x4f); delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0) break; } WriteSet1302(0x8e,0x80); } void yearset(void) //调年 { unsigned char datevalue,year; delay1ms(500); WriteSet1302(0x8e,0x00); datevalue=ReadSet1302(0x8d); year=(((datevalue&0x70)>>4)*10+(datevalue&0x0f)); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { year++; while(ADD==0); } } if(RED==0) { delay1ms(10); if(RED==0) { year--; delay1ms(300); while(RED==0); } } datevalue=((year/10)<<4|(year%10)); WriteSet1302(0x8c,datevalue); delay1ms(5); display_Year(year); delay1ms(5); Write_Address(0x09); delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0) break; } WriteSet1302(0x8e,0x80); } void monthset(void) //调月 { unsigned char datevalue,month; delay1ms(500); WriteSet1302(0x8e,0x00); datevalue=ReadSet1302(0x89); month=(((datevalue&0x70)>>4)*10+(datevalue&0x0f)); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { month++; if(month>12) month=1; while(ADD==0); } } if(RED==0) { delay1ms(10); if(RED==0) { month--; delay1ms(300); if(month==0) month=12; while(RED==0); } } datevalue=((month/10)<<4|(month%10)); WriteSet1302(0x88,datevalue); delay1ms(1); display_Month(month); Write_Address(0x0c); delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0) break; } WriteSet1302(0x8e,0x80); } void dayset(void) //调日 { unsigned char datevalue,day; delay1ms(500); WriteSet1302(0x8e,0x00); datevalue=ReadSet1302(0x87); day=(((datevalue&0x70)>>4)*10+(datevalue&0x0f)); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { day++; if(day>31) day=1; while(ADD==0); } } if(RED==0) { delay1ms(10); if(RED==0) { day--; delay1ms(300); if(day==0) day=31; while(RED==0); } } datevalue=((day/10)<<4|(day%10)); WriteSet1302(0x86,datevalue); delay1ms(1); display_Day(day); Write_Address(0x0f); delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0) break; } WriteSet1302(0x8e,0x80); } void alarmhourset(void) //闹钟小时调整 { unsigned char value; value=houra; while(1) { if(ADD==0) { delay1ms(20); if(ADD==0) { Write_com(0x0c); delay1ms(5); value++; if(value>23) value=0; while(ADD==0); } } if(RED==0) { delay1ms(20); if(RED==0) { value--; if(value==0) value=23; while(RED==0); } } houra=value; display_houra(houra); gbdisplay(0x45); if(CANL==0) { delay1ms(500); break; } } } void alarmminuteset(void) //闹钟分钟调整 { while(1) { if(ADD==0) { delay1ms(20); if(ADD==0) { minutea++; if(minutea>59) minutea=0; while(ADD==0) ; } } if(RED==0) { delay1ms(20); if(RED==0) { minutea--; if(minutea==0) minutea=59; while(RED==0) ; } } display_minutea(minutea); gbdisplay(0x48); if(CANL==0) { delay1ms(500); break; } } } void TimeSet(void) //时间调整函数 { display_Time(); if(SET==0) { delay1ms(10); if(SET==0) { mode++; delay1ms(20); switch(mode) { case(1):{gbdisplay(0x48);hourset(); delay1ms(500);} break; case(2):{gbdisplay(0x4c);minuteset();delay1ms(500);} break; case(3):{gbdisplay(0x4f);secondset();delay1ms(500);} break; case(4):{gbdisplay(0x09);yearset();delay1ms(500);} break; case(5):{gbdisplay(0x0c);monthset();delay1ms(500);} break; case(6):{gbdisplay(0x0f);dayset();delay1ms(500);} break; } if(mode==7) mode=0; } } } /***************显示温度模块********************/ unsigned char code displayexplain[]={"Digit thermometer"}; unsigned char code displayerror[]={"DS18B20 ERROR"}; unsigned char code displayerror1[]={"PLEASE CHECK "}; unsigned char code displaypart1[]={"WenDu:"}; unsigned char code displaypart2[]={"Cent"}; unsigned char flag; /**********************操作DS18B20模块***************************/ sbit DQ=P3^3; unsigned char time; /**********************DS18B20初始化****************************/ bit IntDS18B20(void) { bit temp; DQ=1; for(time=0;time<2;time++); DQ=0; for(time=0;time<200;time++); DQ=1; for(time=0;time<10;time++); temp=DQ; for(time=0;time<200;time++); return temp; } /**************************读DS18B20**********************/ unsigned char ReadDS18B20(void) { unsigned char i; unsigned char dat; for(i=0;i<8;i++) { DQ=1; _nop_(); DQ=0; _nop_(); DQ=1; for(time=0;time<2;time++); dat>>=1; if(DQ==1) dat=dat|0x80; else dat=dat|0x00; for(time=0;time<10;time++); } return dat; } /*********************向DS18B20写数据**************************/ void WriteDS18B20(unsigned char date) { unsigned char i; for(i=0;i<8;i++) { DQ=1; _nop_(); DQ=0; DQ=date&0x01; for(time=0;time<10;time++); DQ=1; for(time=0;time<1;time++); date>>=1; } for(time=0;time<4;time++); } /*******************为读取温度做好准备************************/ void ReadyreadDS18B20(void) { IntDS18B20(); WriteDS18B20(0XCC); WriteDS18B20(0X44); delay1ms(200); IntDS18B20(); WriteDS18B20(0XCC); WriteDS18B20(0XBE); } /*************在1602液晶上显示相关信息模块**********************/ /****************当未检测到DS18B20时显示信息模块****************/ void Display_Error(void) { unsigned char i=0; Write_Address(0x00); while(displayerror[i]!='\0') { Write_Date(displayerror[i]); i++; delay1ms(100); } delay1ms(5); i=0; Write_Address(0x40); while(displayerror1[i]!='\0') { Write_Date(displayerror1[i]); i++; delay1ms(100); } delay1ms(3000) ; } /*************温度显示模块****************/ void Display_Explain(void) { unsigned char i=0; Write_Address(0x00); delay1ms(5); while(displayexplain[i]!='\0') { Write_Date(displayexplain[i]); i++; delay1ms(5); } i=0; Write_Address(0x40); while(displaypart1[i]!='\0') { Write_Date(displaypart1[i]); i++; delay1ms(5); } i=0; Write_Address(0x4C); while(displaypart2[i]!='\0') { Write_Date(displaypart2[i]); i++; delay1ms(5); } Write_Address(0x49); Write_Date('.'); delay1ms(5); } /*********************显示温度整数部分*************************/ void Display_Integer(unsigned char x) { unsigned char i,j,k; i=x/100; j=x%100/10; k=x%10; Write_Address(0x46); if(flag==1) Write_Date('-'); Write_Date(digit[i]); Write_Date(digit[j]); Write_Date(digit[k]); delay1ms(50) ; } /************显示温度小数部分*********************/ void Display_Decimal(unsigned char x) { Write_Address(0x4A); delay1ms(5); Write_Date(digit[x]); delay1ms(50); } void displayovert(void) { unsigned char i; Write_com(0x01); delay1ms(10); Write_Address(0x03); delay1ms(10); Write_Date('W'); Write_Date('A'); Write_Date('R'); Write_Date('N'); Write_Date('I'); Write_Date('N'); Write_Date('G'); Write_Date('!'); Write_Address(0x40); while(overtemperature[i]!='\0') { Write_Date(overtemperature[i]); i++; delay1ms(10); } } /*******************温度主函数********************/ void Temperature(void) { unsigned char i; delay1ms(5); if(IntDS18B20()!=0) Display_Error(); else { delay1ms(1); Write_com(0x01); delay1ms(5); Display_Explain(); for(length=50;length>0;length--) { for(i=0;i<6;i++) { flag=0; ReadyreadDS18B20(); TL=ReadDS18B20(); TH=ReadDS18B20(); if((TH&0XF8)!=0X00) { flag=1; TL=~TL; TH=~TH; TL+=1; if(TL>255) TH+=1; TN=TH*16+TL/16; TD=(TL%16)*10/16; } TN=TH*16+TL/16; TD=(TL%16)*10/16; Display_Integer(TN); Display_Decimal(TD); delay1ms(10); } if(tempswitch==1) { if(TN>=Maxtemp) { Write_Address(0x03); delay1ms(5); displayovert(); while(1) { baojing(1); if(CANL==0) { Write_com(0x01); delay1ms(5); break; } } } } if(CANL==0) break; } } } void tempset(void) { if(ADD==0) { delay1ms(10); if(ADD==0) { Maxtemp++; while(ADD==0); } } if(RED==0) { delay1ms(10); if(RED==0) { Maxtemp--; while(RED==0); } } } void Maxtempset(void) //高温报警设置 { Write_com(0x01); delay1ms(10); Write_Address(0x03); delay1ms(10); Write_Date('T'); Write_Date('E'); Write_Date('M'); Write_Date('P'); Write_Address(0x09); Write_Date('S'); Write_Date('E'); Write_Date('T'); Write_Address(0x40); Write_Date('M'); Write_Date('A'); Write_Date('X'); Write_Date(':'); while(1) { if(SET==0) { delay1ms(20); if(SET==0) { Write_Address(0x4e); Write_com(0x0f); while(1) { if(ADD==0) { delay1ms(20); if(ADD==0) { Write_Address(0x4b); delay1ms(5); Write_Date('O'); Write_Date('N'); Write_Date(' '); tempswitch=1; } } if(RED==0) { delay1ms(20); if(RED==0) { Write_Address(0x4b); Write_Date('O'); Write_Date('F'); Write_Date('F'); tempswitch=0; } } if(CANL==0) { delay1ms(500); break; } } } } if(tempswitch==1) { Write_Address(0x4b); Write_Date('O'); Write_Date('N'); Write_Date(' '); tempset(); displaymaxt(Maxtemp); if(CANL==0) { Write_com(0x01); displaymainpart(); break; } } if(tempswitch==0) { Write_com(0x0c); Write_Address(0x4b); Write_Date('O'); Write_Date('F'); Write_Date('F'); } if(CANL==0) { Write_com(0x01); displaymainpart(); break; } } } void alarmswitchset(void) { while(1) { if(ADD==0) { delay1ms(100); if(ADD==0) { alarmmode=1; Write_Address(0x4c); Write_Date('O'); Write_Date('N'); Write_Date(' '); } } if(RED==0) { alarmmode=0; Write_Address(0x4c); Write_Date('O'); Write_Date('F'); Write_Date('F'); } if(CANL==0) { delay1ms(500); break; } } } /**************** 设置模块 ******************/ void Set(void) { if(SET==0) { delay1ms(10); if(SET==0) { Write_Address(0x40); Write_Date('T'); Write_com(0x0f); delay1ms(1000); Write_com(0x0c); while(1) { TimeSet(); if(ADD==0) { delay1ms(20); if(ADD==0) { Write_com(0x01); Write_Address(0x00); delay1ms(5); Write_Date('S'); delay1ms(10); Maxtempset(); } } if(RED==0) { delay1ms(20); if(RED==0) { Write_com(0x01); delay1ms(5); Write_Address(0x02); Write_Date('A'); Write_Date('L'); Write_Date('A'); Write_Date('R'); Write_Date('M'); Write_Address(0x09); Write_Date('S'); Write_Date('E'); Write_Date('T'); Write_Address(0x46); Write_Date('-'); display_houra(houra); display_minutea(minutea); if(alarmmode==1) { Write_Address(0x4c); Write_Date('O'); Write_Date('N'); Write_Date(' '); } if(alarmmode==0) { Write_Address(0x4c); Write_Date('O'); Write_Date('F'); Write_Date('F'); } while(1) { if(SET==0) { delay1ms(100); if(SET==0) { amode++; switch(amode) { case(1):{gbdisplay(0x45);alarmhourset();Write_com(0x0c);delay1ms(500);} break; case(2):{gbdisplay(0x48);alarmminuteset();Write_com(0x0c);delay1ms(500);} break; case(3):{gbdisplay(0x4c);alarmswitchset();Write_com(0x0c);delay1ms(500);} break; } if(amode==4) amode=0; } } if(CANL==0) { Write_com(0x01); delay1ms(5); displaymainpart(); break; } } } } if(CANL==0) { Write_Address(0x40); Write_Date(' '); Write_com(0x0c); break; } } } } } /***************主函数**********************/ void main() { IE=0X82; //打开定时中断 TMOD=0X01; //选择定时器0工作在方式1 TR0=0; //启动定时器0 IntDS1302(); //初始化DS1302 delay1ms(1); Lcd_Int(); //1602液晶初始化 delay1ms(2); displaystar(); //显示欢迎界面 displaymainpart(); //显示主要部分(不变化) while(1) { display_Time( ); Set( ); if(ADD==0) { Write_com(0x01); delay1ms(5); Temperature(); Write_com(0x01); displaymainpart(); } if((hours==houra)&&(minutes==minutea)&&(seconds==0)) { if(alarmmode==1) { Write_com(0x01); delay1ms(5); Write_Address(0x03); Write_Date('T'); Write_Date('I'); Write_Date('M'); Write_Date('E'); Write_Address(0x08); Write_Date('U'); Write_Date('P'); Write_Date('!'); delay1ms(5); while(1) { baojing(1); if(CANL==0) { Write_com(0x01); delay1ms(5); displaymainpart(); break; } } } } } } 毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。 作 者 签 名:       日  期:        ​​​​​​​​​​​​ 指导教师签名:        日  期:        使用授权说明 本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名:        日  期:        ​​​​​​​​​​​​ 学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。 作者签名: 日期: 年 月 日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权      大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 涉密论文按学校规定处理。 作者签名: 日期: 年 月 日 导师签名: 日期: 年 月 日 指导教师评阅书 指导教师评价: 一、撰写(设计)过程 1、学生在论文(设计)过程中的治学态度、工作精神 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、学生掌握专业知识、技能的扎实程度 □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、学生综合运用所学知识和专业技能分析和解决问题的能力 □ 优 □ 良 □ 中 □ 及格 □ 不及格 4、研究方法的科学性;技术线路的可行性;设计方案的合理性 □ 优 □ 良 □ 中 □ 及格 □ 不及格 5、完成毕业论文(设计)期间的出勤情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 三、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 建议成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 指导教师: (签名) 单位: (盖章) 年 月 日 评阅教师评阅书 评阅教师评价: 一、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 建议成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 评阅教师: (签名) 单位: (盖章) 年 月 日 教研室(或答辩小组)及教学系意见 教研室(或答辩小组)评价: 一、答辩过程 1、毕业论文(设计)的基本要点和见解的叙述情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、对答辩问题的反应、理解、表达情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、学生答辩过程中的精神状态 □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 三、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 评定成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 教研室主任(或答辩小组组长): (签名) 年 月 日 教学系意见: 系主任: (签名) 年 月 日 学位论文原创性声明 本人郑重声明:所呈交的学位论文,是本人在导师的指导下进行的研究工作所取得的成果。尽我所知,除文中已经特别注明引用的内容和致谢的地方外,本论文不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式注明并表示感谢。本人完全意识到本声明的法律结果由本人承担。 学位论文作者(本人签名): 年 月 日 学位论文出版授权书 本人及导师完全同意《中国博士学位论文全文数据库出版章程》、《中国优秀硕士学位论文全文数据库出版章程》(以下简称“章程”),愿意将本人的学位论文提交“中国学术期刊(光盘版)电子杂志社”在《中国博士学位论文全文数据库》、《中国优秀硕士学位论文全文数据库》中全文发表和以电子、网络形式公开出版,并同意编入CNKI《中国知识资源总库》,在《中国博硕士学位论文评价数据库》中使用和在互联网上传播,同意按“章程”规定享受相关权益。 论文密级: □公开 □保密(___年__月至__年__月)(保密的学位论文在解密后应遵守此协议) 作者签名:_______ 导师签名:_______ _______年_____月_____日 _______年_____月_____日 独 创 声 明 本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议。尽我所知,除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。 本声明的法律后果由本人承担。   作者签名: 二〇一〇年九月二十日   毕业设计(论文)使用授权声明 本人完全了解滨州学院关于收集、保存、使用毕业设计(论文)的规定。 本人愿意按照学校要求提交学位论文的印刷本和电子版,同意学校保存学位论文的印刷本和电子版,或采用影印、数字化或其它复制手段保存设计(论文);同意学校在不以营利为目的的前提下,建立目录检索与阅览服务系统,公布设计(论文)的部分或全部内容,允许他人依法合理使用。 (保密论文在解密后遵守此规定)   作者签名: 二〇一〇年九月二十日 致 谢 时间飞逝,大学的学习生活很快就要过去,在这四年的学习生活中,收获了很多,而这些成绩的取得是和一直关心帮助我的人分不开的。 首先非常感谢学校开设这个课题,为本人日后从事计算机方面的工作提供了经验,奠定了基础。本次毕业设计大概持续了半年,现在终于到结尾了。本次毕业设计是对我大学四年学习下来最好的检验。经过这次毕业设计,我的能力有了很大的提高,比如操作能力、分析问题的能力、合作精神、严谨的工作作风等方方面面都有很大的进步。这期间凝聚了很多人的心血,在此我表示由衷的感谢。没有他们的帮助,我将无法顺利完成这次设计。 首先,我要特别感谢我的知道郭谦功老师对我的悉心指导,在我的论文书写及设计过程中给了我大量的帮助和指导,为我理清了设计思路和操作方法,并对我所做的课题提出了有效的改进方案。郭谦功老师渊博的知识、严谨的作风和诲人不倦的态度给我留下了深刻的印象。从他身上,我学到了许多能受益终生的东西。再次对周巍老师表示衷心的感谢。 其次,我要感谢大学四年中所有的任课老师和辅导员在学习期间对我的严格要求,感谢他们对我学习上和生活上的帮助,使我了解了许多专业知识和为人的道理,能够在今后的生活道路上有继续奋斗的力量。 另外,我还要感谢大学四年和我一起走过的同学朋友对我的关心与支持,与他们一起学习、生活,让我在大学期间生活的很充实,给我留下了很多难忘的回忆。 最后,我要感谢我的父母对我的关系和理解,如果没有他们在我的学习生涯中的无私奉献和默默支持,我将无法顺利完成今天的学业。 四年的大学生活就快走入尾声,我们的校园生活就要划上句号,心中是无尽的难舍与眷恋。从这里走出,对我的人生来说,将是踏上一个新的征程,要把所学的知识应用到实际工作中去。 回首四年,取得了些许成绩,生活中有快乐也有艰辛。感谢老师四年来对我孜孜不倦的教诲,对我成长的关心和爱护。 学友情深,情同兄妹。四年的风风雨雨,我们一同走过,充满着关爱,给我留下了值得珍藏的最美好的记忆。 在我的十几年求学历程里,离不开父母的鼓励和支持,是他们辛勤的劳作,无私的付出,为我创造良好的学习条件,我才能顺利完成完成学业,感激他们一直以来对我的抚养与培育。 最后,我要特别感谢我的导师赵达睿老师、和研究生助教熊伟丽老师。是他们在我毕业的最后关头给了我们巨大的帮助与鼓励,给了我很多解决问题的思路,在此表示衷心的感激。老师们认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感谢他耐心的辅导。在论文的撰写过程中老师们给予我很大的帮助,帮助解决了不少的难点,使得论文能够及时完成,这里一并表示真诚的感谢。 毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。 作 者 签 名:       日  期:        ​​​​​​​​​​​​ 指导教师签名:        日  期:        使用授权说明 本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名:        日  期:        ​​​​​​​​​​​​ 学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。 作者签名: 日期: 年 月 日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权      大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 涉密论文按学校规定处理。 作者签名: 日期: 年 月 日 导师签名: 日期: 年 月 日 独 创 声 明 本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议。尽我所知,除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。 本声明的法律后果由本人承担。   作者签名: 年 月 日   毕业设计(论文)使用授权声明 本人完全了解**学院关于收集、保存、使用毕业设计(论文)的规定。 本人愿意按照学校要求提交学位论文的印刷本和电子版,同意学校保存学位论文的印刷本和电子版,或采用影印、数字化或其它复制手段保存设计(论文);同意学校在不以营利为目的的前提下,建立目录检索与阅览服务系统,公布设计(论文)的部分或全部内容,允许他人依法合理使用。 (保密论文在解密后遵守此规定)   作者签名: 年 月 日 基本要求:写毕业论文主要目的是培养学生综合运用所学知识和技能,理论联系实际,独立分析,解决实际问题的能力,使学生得到从事本专业工作和进行相关的基本训练。毕业论文应反映出作者能够准确地掌握所学的专业基础知识,基本学会综合运用所学知识进行科学研究的方法,对所研究的题目有一定的心得体会,论文题目的范围不宜过宽,一般选择本学科某一重要问题的一个侧面。 毕业论文的基本教学要求是: 1、培养学生综合运用、巩固与扩展所学的基础理论和专业知识,培养学生独立分析、解决实际问题能力、培养学生处理数据和信息的能力。2、培养学生正确的理论联系实际的工作作风,严肃认真的科学态度。3、培养学生进行社会调查研究;文献资料收集、阅读和整理、使用;提出论点、综合论证、总结写作等基本技能。 毕业论文是毕业生总结性的独立作业,是学生运用在校学习的基本知识和基础理论,去分析、解决一两个实际问题的实践锻炼过程,也是学生在校学习期间学习成果的综合性总结,是整个教学活动中不可缺少的重要环节。撰写毕业论文对于培养学生初步的科学研究能力,提高其综合运用所学知识分析问题、解决问题能力有着重要意义。 毕业论文在进行编写的过程中,需要经过开题报告、论文编写、论文上交评定、论文答辩以及论文评分五个过程,其中开题报告是论文进行的最重要的一个过程,也是论文能否进行的一个重要指标。 撰写意义:1.撰写毕业论文是检验学生在校学习成果的重要措施,也是提高教学质量的重要环节。大学生在毕业前都必须完成毕业论文的撰写任务。申请学位必须提交相应的学位论文,经答辩通过后,方可取得学位。可以这么说,毕业论文是结束大学学习生活走向社会的一个中介和桥梁。毕业论文是大学生才华的第一次显露,是向祖国和人民所交的一份有份量的答卷,是投身社会主义现代化建设事业的报到书。一篇毕业论文虽然不能全面地反映出一个人的才华,也不一定能对社会直接带来巨大的效益,对专业产生开拓性的影响。但是,实践证明,撰写毕业论文是提高教学质量的重要环节,是保证出好人才的重要措施。 2.通过撰写毕业论文,提高写作水平是干部队伍“四化”建设的需要。党中央要求,为了适应现代化建设的需要,领导班子成员应当逐步实现“革命化、年轻化、知识化、专业化”。这个“四化”的要求,也包含了对干部写作能力和写作水平的要求。 3.提高大学生的写作水平是社会主义物质文明和精神文明建设的需要。在新的历史时期,无论是提高全族的科学文化水平,掌握现代科技知识和科学管理方法,还是培养社会主义新人,都要求我们的干部具有较高的写作能力。在经济建设中,作为领导人员和机关的办事人员,要写指示、通知、总结、调查报告等应用文;要写说明书、广告、解说词等说明文;还要写科学论文、经济评论等议论文。在当今信息社会中,信息对于加快经济发展速度,取得良好的经济效益发挥着愈来愈大的作用。写作是以语言文字为信号,是传达信息的方式。信息的来源、信息的收集、信息的储存、整理、传播等等都离不开写作。 论文种类:毕业论文是学术论文的一种形式,为了进一步探讨和掌握毕业论文的写作规律和特点,需要对毕业论文进行分类。由于毕业论文本身的内容和性质不同,研究领域、对象、方法、表现方式不同,因此,毕业论文就有不同的分类方法。 按内容性质和研究方法的不同可以把毕业论文分为理论性论文、实验性论文、描述性论文和设计性论文。后三种论文主要是理工科大学生可以选择的论文形式,这里不作介绍。文科大学生一般写的是理论性论文。理论性论文具体又可分成两种:一种是以纯粹的抽象理论为研究对象,研究方法是严密的理论推导和数学运算,有的也涉及实验与观测,用以验证论点的正确性。另一种是以对客观事物和现象的调查、考察所得观测资料以及有关文献资料数据为研究对象,研究方法是对有关资料进行分析、综合、概括、抽象,通过归纳、演绎、类比,提出某种新的理论和新的见解。 按议论的性质不同可以把毕业论文分为立论文和驳论文。立论性的毕业论文是指从正面阐述论证自己的观点和主张。一篇论文侧重于以立论为主,就属于立论性论文。立论文要求论点鲜明,论据充分,论证严密,以理和事实服人。驳论性毕业论文是指通过反驳别人的论点来树立自己的论点和主张。如果毕业论文侧重于以驳论为主,批驳某些错误的观点、见解、理论,就属于驳论性毕业论文。驳论文除按立论文对论点、论据、论证的要求以外,还要求针锋相对,据理力争。 按研究问题的大小不同可以把毕业论文分为宏观论文和微观论文。凡届国家全局性、带有普遍性并对局部工作有一定指导意义的论文,称为宏观论文。它研究的面比较宽广,具有较大范围的影响。反之,研究局部性、具体问题的论文,是微观论文。它对具体工作有指导意义,影响的面窄一些。 另外还有一种综合型的分类方法,即把毕业论文分为专题型、论辩型、综述型和综合型四大类: 1.专题型论文。这是分析前人研究成果的基础上,以直接论述的形式发表见解,从正面提出某学科中某一学术问题的一种论文。如本书第十二章例文中的《浅析领导者突出工作重点的方法与艺术》一文,从正面论述了突出重点的工作方法的意义、方法和原则,它表明了作者对突出工作重点方法的肯定和理解。2.论辩型论文。这是针对他人在某学科中某一学术问题的见解,凭借充分的论据,着重揭露其不足或错误之处,通过论辩形式来发表见解的一种论文。3.综述型论文。这是在归纳、总结前人或今人对某学科中某一学术问题已有研究成果的基础上,加以介绍或评论,从而发表自己见解的一种论文。4.综合型论文。这是一种将综述型和论辩型两种形式有机结合起来写成的一种论文。如《关于中国民族关系史上的几个问题》一文既介绍了研究民族关系史的现状,又提出了几个值得研究的问题。因此,它是一篇综合型的论文。 写作步骤:毕业论文是高等教育自学考试本科专业应考者完成本科阶段学业的最后一个环节,它是应考者的 总结 性独立作业,目的在于总结学习专业的成果,培养综合运用所学知识解决实际 问题 的能力。从文体而言,它也是对某一专业领域的现实问题或 理论 问题进行 科学 研究 探索的具有一定意义的论说文。完成毕业论文的撰写可以分两个步骤,即选择课题和研究课题。 首先是选择课题。选题是论文撰写成败的关键。因为,选题是毕业论文撰写的第一步,它实际上就是确定“写什么”的问题,亦即确定科学研究的方向。如果“写什么”不明确,“怎么写”就无从谈起。 教育部自学考试办公室有关对毕业论文选题的途径和要求是“为鼓励理论与工作实践结合,应考者可结合本单位或本人从事的工作提出论文题目,报主考学校审查同意后确立。也可由主考学校公布论文题目,由应考者选择。毕业论文的总体要求应与普通全日制高等学校相一致,做到通过论文写作和答辩考核,检验应考者综合运用专业知识的能力”。但不管考生是自己任意选择课题,还是在主考院校公布的指定课题中选择课题,都要坚持选择有科学价值和现实意义的、切实可行的课题。选好课题是毕业论文成功的一半。 第一、要坚持选择有科学价值和现实意义的课题。科学研究的目的是为了更好地认识世界、改造世界,以推动社会的不断进步和发展 。因此,毕业论文的选题,必须紧密结合社会主义物质文明和精神文明建设的需要,以促进科学事业发展和解决现实存在问题作为出发点和落脚点。选题要符合科学研究的正确方向,要具有新颖性,有创新、有理论价值和现实的指导意义或推动作用,一项毫无意义的研究,即使花很大的精力,表达再完善,也将没有丝毫价值。具体地说,考生可从以下三个方面来选题。首先,要从现实的弊端中选题,学习了专业知识,不能仅停留在书本上和理论上,还要下一番功夫,理论联系实际,用已掌握的专业知识,去寻找和解决工作实践中急待解决的问题。其次,要从寻找科学研究的空白处和边缘领域中选题,科学研究。还有许多没有被开垦的处女地,还有许多缺陷和空白,这些都需要填补。应考者应有独特的眼光和超前的意识去思索,去发现,去研究。最后,要从寻找前人研究的不足处和错误处选题,在前人已提出来的研究课题中,许多虽已有初步的研究成果,但随着社会的不断发展,还有待于丰富、完整和发展,这种补充性或纠正性的研究课题,也是有科学价值和现实指导意义的。 第二、要根据自己的能力选择切实可行的课题。毕业论文的写作是一种创造性劳动,不但要有考生个人的见解和主张,同时还需要具备一定的客观条件。由于考生个人的主观、客观条件都是各不相同的,因此在选题时,还应结合自己的特长、兴趣及所具备的客观条件来选题。具体地说,考生可从以下三个方面来综合考虑。首先,要有充足的资料来源。“巧妇难为无米之炊”,在缺少资料的情况下,是很难写出高质量的论文的。选择一个具有丰富资料来源的课题,对课题深入研究与开展很有帮助。其次,要有浓厚的研究兴趣,选择自己感兴趣的课题,可以激发自己研究的热情,调动自己的主动性和积极性,能够以专心、细心、恒心和耐心的积极心态去完成。最后,要能结合发挥自己的业务专长,每个考生无论能力水平高低,工作岗位如何,都有自己的业务专长,选择那些能结合自己工作、发挥自己业务专长的课题,对顺利完成课题的研究大有益处。 致 谢 这次论文的完成,不止是我自己的努力,同时也有老师的指导,同学的帮助,以及那些无私奉献的前辈,正所谓你知道的越多的时候你才发现你知道的越少,通过这次论文,我想我成长了很多,不只是磨练了我的知识厚度,也使我更加确定了我今后的目标:为今后的计算机事业奋斗。在此我要感谢我的指导老师——***老师,感谢您的指导,才让我有了今天这篇论文,您不仅是我的论文导师,也是我人生的导师,谢谢您!我还要感谢我的同学,四年的相处,虽然我未必记得住每分每秒,但是我记得每一个有你们的精彩瞬间,我相信通过大学的历练,我们都已经长大,变成一个有担当,有能力的新时代青年,感谢你们的陪伴,感谢有你们,这篇论文也有你们的功劳,我想毕业不是我们的相处的结束,它是我们更好相处的开头,祝福你们!我也要感谢父母,这是他们给我的,所有的一切;感谢母校,尽管您不以我为荣,但我一直会以我是一名农大人为荣。 通过这次毕业设计,我学习了很多新知识,也对很多以前的东西有了更深的记忆与理解。漫漫求学路,过程很快乐。我要感谢信息与管理科学学院的老师,我从他们那里学到了许多珍贵的知识和做人处事的道理,以及科学严谨的学术态度,令我受益良多。同时还要感谢学院给了我一个可以认真学习,天天向上的学习环境和机会。 即将结束*大学习生活,我感谢****大学提供了一次在**大接受教育的机会,感谢院校老师的无私教导。感谢各位老师审阅我的论文。 晶振电路 LCD1602显示器 AT89C51 单片机 DS18B20温度传感器 DS1302时钟芯片 报警模块 设置模块(按键) 年数除4 子程序 返回时间显示 设置闹钟 � � 没有按键按下 时间日期上限温度闹钟设置模块 温度检测模块 判断是否有按键按下 1602液晶显示相关信息 开机初始化 从DS1302中读取信息 LCD CONTROLLER LSI 读取DS1302时间和日期 调整时间和日期 需要调整时间吗? 系统初始化 天=31 天=29 月=2? 闰年 不是闰年 余数=0? 年数除以400 余数=0? 年数除以100 余数=0? � � � � 16*2 LCD PANEL 开始 P1.6按下 设置最高温度 P1.5按下 设置时间日期 显示温度 天=28 月=2? 天=30 月=4、6、9、11? P1.7按下 P1.5按下 P1.4按下 显示时间日期 按键扫描 开始 是否有按键按下 月=4、6、9、11? 天=30 天=31 SEGMENT DRIVER BACK LIGHT COM 16 SEG 40 SEG 40 CONTROL SIGNALS 4 - VI - - V -
本文档为【基于单片机的万年历设计_毕业设计论文】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
不系舟红枫
从教近30年,经验丰富,教学水平较高
格式:doc
大小:811KB
软件:Word
页数:0
分类:工学
上传时间:2019-01-24
浏览量:15