基于Proteus多功能电子万年历设计与实现—本科毕业论文_第1页
基于Proteus多功能电子万年历设计与实现—本科毕业论文_第2页
基于Proteus多功能电子万年历设计与实现—本科毕业论文_第3页
基于Proteus多功能电子万年历设计与实现—本科毕业论文_第4页
基于Proteus多功能电子万年历设计与实现—本科毕业论文_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、基于Proteus多功能电子万年历的设计与实现摘 要本文基于Proteus多功能电子万年历的设计并实现了其功能。主要是借助电路仿真软件Proteus,在硬件方面主要采用AT89S51单片机作为主控核心,由LCD1点阵液晶显示屏显示。可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,可以同时显示年、月、日、时、分、秒等信息。在软件方面,主要包括日历程序、时间调整程序和显示程序。关键词:Proteus ;AT89S51;单片机;电子万年历Design and Realization of multi function electronic calendar based on P

2、roteusAbstractIn this paper, the design of multi function electronic calendar based on Proteus and the realization of its function. By means of circuit simulation software Proteus, in terms of hardware using AT89S51 microcontroller as the main control center, by LCD dot matrix LCD display. For years

3、, month, day, week, hour, minutes and seconds for time, but also has a leap year compensation and other functions, can display year, month, day, time, minutes, seconds and other information. In the software aspect, mainly includes calendar program time to adjust procedures and display program.Key wo

4、rds:Proteus;AT89S51;Single chip microcomputer;Electronic calendar目录1 综 述11.1 单片机及多功能电子万年历的发展简述11.2 单片机及电子万年历国内外发展状况22 开发平台32.1 KeiluVision3介绍32.2 单片机仿真软件Proteus43 硬件设计53.1 AT89S51引脚及功能53.2 AT89S51的内部结构63.2.1 电路设计框图73.2.2 主要单元电路设计83.2.3 单片机中断93.3 LCD液晶显示器93.4 按键系统114 程序设计124.1 定时器模块124.2 外部中断响应模块134.

5、3 主函数模块144.4 判断闰年每月天数154.5 时间调整165 系统仿真与调试185.1 系统仿真185.1.1 系统原理电路图绘制185.1.2 Keil 工程的建立195.2 系统调试205.2.1 LCD液晶显示调试205.2.2 定时器调试215.2.3 中断函数调试216 测试结果与分析226.1 代码的功能226.2 测试结果分析257 实验总结28致 谢29参考文献30附 录31绪论随着科技的快速发展,自从观太阳、摆钟到现在电子钟,在人们的不断研究,不断创新之下一步步进步。本次课题主要介绍了基于Proteus的多功能电子万年历的设计与实现,多功能电子万年历是这一发展趋势中的

6、代表,它顺应了时代的进步,符合人们对时间方面的要求。它的出现给人们的日常生活带来的诸多方便,在时间极显宝贵的现代已经广泛应用于各个领域,其作用更是不言而喻。而且多功能电子万年历采用直观的数字显示,可以同时显示年、月、日、时、分、秒等信息,还具有时间校准等功能。本次课题主要研究液晶显示器LCD与单片机之间的硬件互联及通信,对数种硬件连接方案进行了详尽的比较,在软件方面对日历算法也进行了论述。其功耗小,可选用46V电压为其供电,更符合消费者的生活需求。1.1 单片机及多功能电子万年历的发展简述单片微型计算机简称单片机,是典型的嵌入式微控制器,其英文缩写为MCU,它最早是用在工业控制领域。从1972

7、年至今单片机经历了四个阶段的发展,从Inter公司推出的MCS-8为代表的单片机到第二阶段的部分功能优化,再到8位至16的转变,衍生到今天的单片机用于生活和各个工业用途。自从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录,科学技术的不断提高,计算机科学技术的日渐成熟,为人类的高品质生活提供了强有力的后盾。科学技术介入人类的生活,这是社会发展的必然趋势,而万年历是这一发展趋势中的代表,万年历顺应了人们对时间方面的要求,它的出现给人们的生活带来的诸多方便,在时间极显宝贵的现代生活中,已经广泛应用于各个领域,其作用更是不言而喻。相比起传统的时间工具,本系统有着精确显示时间计算,清晰、全面的显示

8、信息界面,没有厌余数据,且具有温度、农历显示等功能,这些是传统时间工具无法达到的。而相比市场出售的其他高科技时间工具,本系统有着制作简单,成本低廉等市场优势。1.2单片机及电子万年历国内外发展状况随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。在国内:单片机的学习呈上升趋势,但很多人学习是无头绪,不知道从何入手,行业发展迅速,国内生产技术不断提升。国内企业为了获得更大的投资收益,在生产规模和产品质量上不断提升,开发单片机呈必然趋势。我国生产的多功能电子万年历有很多,总体上来说是研究多

9、功能电子万年历为主,商家生产的电子万年历更从质量、价格、实用上考虑不断改变电子万年历的设计,使其更有市场。在科技发达的今天,智能化必将是以后的发展趋势,所以开发活和学习单片机是社会发展的必然需求。在国外:最具有代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。前两次革命是摆和摆轮游丝的发明,以及石英晶体振荡器的应用,第三次革命就是单片机数码计时技术的应用,使得从原来传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期,星期,温度以及农历等显示功能,它更符合消费者的生活需求。因此,电子万年历的出现带来了钟表计时业界跨越性的进步。当前,电子万年历

10、技术已经进入了优化人-家庭-环境的整体关系的阶段,它向着超微型、超高效以及集成电路的微型化方向发展,并为电子万年历上的集中控制提供了基础。目前,市场上出售的万年历品种很多,其中大部分是基于单片机技术设计的电子系统。当今,数字万年历主要还是用于计时、自动报时、定时、日期查询以及自动控制等方面。由于单片机技术以及数字集成电路技术的发展和采用了先进的石英技术,使得如今的数字万年历系统具有体积小、耗电省、计时准确、性能稳定、维护方便、走时准确、携带方便等优点,此外,现在市场上已有现成的数字万年历集成电路芯片出售,而且价格便宜、使用也很方便。2 开发平台本节主要介绍开发平台,兼容单片机C语言软件开发系统

11、Keil uVision3软件和单片机仿真软件Proteus。2.1 KeiluVision3介绍 图2.1Keil uVision3软件Keil uVision3是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。KeiluVision3工具包为forDos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发

12、流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及C51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。相比起其他单片机的开发软件,KeiluVision3生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。编译后能生成.hex文件,能直

13、接为ISIS7Professional仿真软件所使用。2.2单片机仿真软件Proteus 图2.2 Proteus单片机仿真软件在Proteus是英国Labcenter公司开发的电路及点偏激系统设计与仿真软件。它可以实现数字电路,模拟电路及为控制器系统与外设的混合电路系统的电路仿真、软件仿真、 系统协同仿真和PCB设计等功能。它能对各种处理器进行实时仿真、调试与测试的EDA工具,真正实现了再没有目标原型是就可以对系统进行调试测试与验证。Proteus提供了30多个元件库和7000余个元器件。元件涉及电阻、电容、二极管、三极管、变压器、放大器、各种激励源等等。SIS 7 Professional

14、能完成原理图设计的仿真平台,用于电路原理图的设计以及交互式仿真。通过Keil uVision3编译生成的.hex文件能直接用于Proteus所设计的电路图上。3 硬件设计微机处理系统中硬件的选择直接影响系统的功能及稳定性。选择功能适合,少发生偶合的硬件设备,是整个系统设计的关键部分,所以本次设计选择AT89S51进行实验。3.1 AT89S51引脚及功能AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片

15、内集成了通用8位中央处理器和ISP Flash存储单元,AT89S51在众多嵌入式控制应用系统中得到广泛应用。AT89S51采用的是40只引脚的双列直插式封装,如图3.1所示。图3.1 AT89S51引脚图(1) 电源及晶振引脚 Vcc(第40脚):+5V电源引脚;Vss(第20脚):接地引脚;XTAL1、XTAL2(第19、18脚):外接晶振的两个引脚。(2) 控制引脚RST/Vpd(第9脚):复位/备用电源引脚;ALE/PROG(第30脚):地址锁存使能输出/编程脉冲输入;PSEN(第29脚):输出访问片外程序存储器读选通信号;EA/Vpp(第31脚):外部ROM允许访问/编程电源输入。(

16、3) 并行I/O口引脚并行I/O口共有32只引脚,其中:P0.0P0.7(第3932脚)统称为P0口;P1.0P1.7(第1-8脚)统称为P1口;P2.0P2.7(第2128脚)统称为P2口;P3.0P3.7(第1017脚)统称为P3口,作为一般I/O口使用。3.2 AT89S51的内部结构其内部结构包含了作为微型计算机所必需的基本功能部件,如CPU、RAM、ROM、定时/计数器和可编程并行I/O口、可编程串行口等。这些功能部件通常都挂靠在单片机内部总线上,通过内部总线传送数据信息和控制信息。其内部基本结构如图3.2所示。图3.2 硬件系统组成结构框图1.中央处理器(CPU):整个单片机的核心

17、部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。2.数据存储器(RAM):片内有128个8位用户8个据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据、运算的中间结果或用户定义的字型表,3.程序存储器(ROM):共有4096个8位掩膜ROM,用于存放用户程序、原始数据或表格。4.中断系统:具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控

18、制要求,并与2级的优先级别选择。5.定时器/计数器:片内有2个16位的可编程定时器/计数器,以实现定时或计数产生中断,用于控制程序转向。6.串行口:内置1个全双工的串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信接发器,也可以当同步移位器使用。7.并行输入/输出(I/O)口:共有4组8位并行I/O口(P0、P1、P2、P3),每个口都由1个锁存器和1个驱动器组成。并行I/O口主要是用于实现与外部设备中数据的并行输入/输出,有些I/O口还具有其他功能。8.特殊功能寄存器:共有21个,用于对片内的各功能的部件进行管理、控制、监视。实际上是一些控制寄存器和状态寄存器,是一个具有

19、特殊功能的RAM区。3.2.1 电路设计框图本系统的电路系统框图如图2.1.3所示。AT89S51单片机对DS18B20写入控制字并读取相应的数据,继而控制LCM1602作出对应的显示。键盘控制模块AT89S51主控模块LCD1液晶显示模块 图3.3 电路设计框图3.2.2主要单元电路设计(1) AT89S51单片机主控制模块的设计AT89S51是一个低功耗,高性能CMOS 8位单片机,其具有如下特点:40个引脚,4kBytes Flash片内程序存储器,128Bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计

20、数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。AT89S51单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。(2) P0口P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出

21、原码,此时P0外部必须被拉高。(3) P1口P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 (4) P2口P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存

22、取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 (5) P3口P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。3.2.3 单片机中断典型的8051单片机有5个中断源,可分为两个优先级,实现中断服务嵌套。用户可以用关中断指令来屏蔽中断请求,也可以用开中断指令是CPU接受中断申请。每一

23、个中断源在软件中都可以独立开关,级别可由用户自行设置。下表2.1.1为中断控制标志列表。表3.1 中断控制标志列表中断源工作标志向量地址外部中断0IE00311计时器0TF00BH外部中断1IE113H计时器1TF11BH串行端口传送T123H串行端口接收R123H3.3 LCD液晶显示器本系统选择的LCD是AMPIRE12864的汉字图形型液晶显示模块,可显示汉字及图形。单片机P1口作为数据输出口,RS,RW,E分别通过10K的上拉电阻连接到单片机的P0.0,P0.1,P0.2。VDD接5V电源,VSS接地。VEE为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过

24、高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。E(或EN)端为使能(enable)端,下降沿使能。DB0-DB7为双向数据总线,同时最高位DB7也是忙信号检测位。BLA、BLK分别为显示器背光灯的正、负极。液晶显示器接口图和管脚表如下所示。图3.4 LCD液晶显示器表3.2 LCD接口说明表管脚号管教电平引脚说明1CS1H/L片选择信号,低电平时选择前64列2CS2H/L片选择信号,低电平时选择后64列3GND0V逻辑电源地4VCC5

25、.0V逻辑电源正5V0LCD驱动电压6RSH/L数据指令选择7R/WH/L读写选择:高电平:读数据;低电平:写数据8EH/L读写使能,高电平有效,下降沿锁定数据9DB0H/L数据输入输出引脚10DB1H/L数据输入输出引脚11DB2H/L数据输入输出引脚12DB3H/L数据输入输出引脚13DB4H/L数据输入输出引脚14DB5H/L数据输入输出引脚15DB6H/L数据输入输出引脚16DB7H/L数据输入输出引脚17RSTL复位信号,低电平有效18VOUT-10V背光源负极3.4 按键系统基于多功能万年历设置日历、时间、闹钟等功能,我们决定使用button元件作为控制按钮。Button元件在市场

26、上到处可见,其功能单一,少偶合,反应速度快等特点。本系统使用3个button元件分别作为设置位选、上调、下调等功能。3个按键与一个3位与门电路相连,作为整个按键控制功能系统,以触发AT89S51中断为方式使用设置功能。其电路图如图3.4.1所示: 图3.4.1 按键系统(1)Button1 :位选功能,设置位选位,可通过其对年、月、日、时、分、秒进行控制;(2)Button2 :上调功能,对当前所处状态位进行上调;(3)Button3 :下调功能,对当前所处状态位进行下调。4 程序设计单片机的微机控制系统设计,除了元件选择、系统硬件电路设计外,最主要的工作就是如何根据每个模块的实际需求设计出应

27、用程序。应用程序的可靠性、高效性、稳定性直接影响系统的实现与应用。因此,程序设计在微机控制系统设计中占据着重要地位。在单片机的系统设计的过程中,主要分为数据处理、系统过程控制两大部分。在多功能智能万年历系统中,数据获取与数据分类占较大的比例。其中时间的计算与获取是整个系统的核心所在,另外数据显示、声音处理、过程控制也是整个系统的重点。为了更好地完成各个部分的内容,更方便地进行调程序修改和调试排错,我们把系统分为定时器模块、外部中断响应模块、主函数模块这几大部分进行设计,并分别进行设计、编程和调试,最后通过主程序将各程序模块连接起来。这样有利于程序修改和调试,增强了程序的可移植性。4.1 定时器

28、模块在本多功能万年历系统中,使用定时器来精确计算每一秒的时间长。首先是对定时器的选择和初始化:选择定时器0,方式1。TMOD = 0x01;装载T0的初值,通过计算且与温度传感器公用,决定以20次溢出作为1秒的时间,故装填TH0 = 0x3c;TR0 = 0xb0;然后启动定时器,打开总中断开关EA = 1;ET0=1;初始化完成后便进入中断函数的设计。每一秒所产生的中断要完成年、月、日、时、分、秒的计算,并为其他功能设定标志位等,如声音,温度显示,流程图如图4.1。图4.1计时器中断响应程序流程图4.2外部中断响应模块本系统使用0号中断,在中断中响应设置时间、日历和闹钟的功能。首先在主函数中

29、打开0号中断开关,响应模式,总中断开关IT0 = 1;EX0 = 1;EA = 1;另外使用button1作为设置位选位,button2作为上调,button3作为下调,其功能流程图如图4.2所示。否是否是图4.2 外部中断响应流程图4.3 主函数模块主函数模块主要承担显示日历、时间、星期、农历等信息。因为我们所设的设置位选位为七次一循环,所以在平常状态下,系统显示相关信息,当进入设置状态下,主函数流程如下。图4.3 主函数流程图4.4判断闰年每月天数闰年的二月有29天,否则则为28天,下图是判断闰年的每个月的天数。图4.4 判断闰年每月天数非闰年每个月天数流程图与之类似,这里就不再作具体说明

30、。4.5时间调整1.根据当前的所处状态,来调整时间:满60秒,分加1;满60分,时加1;满24时,日加1;满30日,月加1;满12月,年加1。图4.5 时间调整图2.时间调整程序流程,先按控制键进入调整状态程序,再根据进入的状态进行调整年月日时分秒,具体流程如下图所示:图4.6 时间调整程序秒流程图 图4.7 时间调整程序分流程图5 系统仿真与调试仿真部分采用仿真软件Proteus和兼容单片机C语言软件开发系统Keil uVision3软件来进行仿真和调试。5.1系统仿真5.1.1 系统原理电路图绘制(1)新建文件:打开PROTEUS,点击FILE,在弹出的下拉菜单中选择NEW DESIGN,

31、即进入原理图绘制界面。(2)元器件选取:按设计要求,在对象选择窗口中点P,弹出PICK DEVICES对话框,在KEYWORDS中填写要选择的元器件,然后在右边对话框中选中要选的元器件,则元器件列在对象选择的窗口中。(3)放置元器件、电源和地、连线,得到系统电路图,最后进行电气检测。图5.1 总体电路硬件原理图5.1.2 Keil 工程的建立1.源文件的建立使用菜单“File-New”或者点击工具栏的新建文件按钮,即可在打开的文本编缉窗口中输入源程序,保存该文件,注意必须加上扩展名。2.建立工程文件点击“Project-New Project ”菜单,出现一个对话框,在编缉框中输入文件名,点击

32、“保存”按钮。在Project-Option for target出现第二个对话框选择目标 CPU(本次设计选择 Atmel 公司的 AT89C52 芯片)。此时,在工程窗口的文件页中出现了“Target 1”,点击“Source Group1”右键,选中其中的“Add file to GroupSource Group1”,出现一个对话框,要求寻找源文件(注意,该对话框下面的“文件类型” 默认为 C source file(*.c),也就是以 C 为扩展名 的文件),双击该文件,将文件加入项目。双击文件名,即打开该源程序。工程建立好以后,对工程进行进一步的设置,以满足要求。 首先点击左边Pr

33、oject窗口的Target 1,然后使用菜单“Project-Option for target target1” 设置对话框中的Target页面,Xtal后面的数值是晶振频率值,本次设计设置为12MHz;Memory Model用于设置RAM使用情况选择Small;Compact是可以使用一页外部扩展RAM,而Larget则是可以使用全部外部的扩展RAM。Code Model 用于设置ROM空间的使用选择none。设置对话框中的OutPut页面中Creat Hex file用于生成可执行代码文件(可以用编程器写入单片机芯片的HEX格式文件,文件的扩展名为.HEX)。3.编译、连接选择菜单

34、Project-Build target,对当前工程进行连接, 获得*.hex的文件,该文件即可被编程器读入并写到芯片中,同时还产生了一些其它相关的文件,可被用于Keil的仿真与调试。仿真部分采用Protus professional和Keil软件结合完成设计,功能强大且操作较为简单,可以很容易的实现各种系统的仿真。最后得出系统仿真结果如下。图5.2 多功能万年历系统仿真效果图5.2 系统调试系统调试主要是在电路原理图仿真过程中出现的系统功能、仿真结果的性能误差分析,下面我们从系统模块进行调试和分析。5.2.1 LCD液晶显示调试这是整个系统可观赏性的比分,LCD显示时间空隙必须控制在一定的范

35、围内,如果时间短了,LCD会出现显示不完整的情况;如果空隙时间长了,液晶显示就会闪烁的情况,所以其中对于度的把握非常重要。同时也要考虑在编译过程中,除了显示间隙还要算上系统数据处理与控制的时间间隙,否则同样会出现闪烁的情况。经过几天的测试与调试,最终LCD显示完整,没有出现显示问题。5.2.2 定时器调试定时器调试主要看“秒”这位的跳动是否精确,这个需要长时间的验证。同时,在定时器内处理的数据也要精确,因为定时器内处理数据也花费时间,而这段时间没有算到定时器内。经过长时间的运行,调试,最后把误差范围调整到1天0.001秒。5.2.3 中断函数调试中断函数是系统与用户交互的最要途径,用户可以通过

36、连接中断的按钮操作系统,设置日期、时间、闹钟等信息。因为中断响应速度与认为按键的速度有事会存在偏差,进过多次试验后,使用了一个等待响应的函数。该函数有效地降低了按键无响应的概率,但依然无法做到点触即可的效果,这还需要改进。同时,如果有人机互动,就必然会造成人为错误,例如我先将月份调至为1月,然后日期调为31日,再回头调月份为2月,这时就会出现2月31日这样的错误信息情况。所以,在主函数中增设了日期排错函数。6测试结果与分析本次实验我们利用Proteus仿真和Keil软件设计了多功能电子万年历,通过测试我们发现,想要几个模块相互配合使用,应该将其紧密联系起来,而不是一个个单独的个体。只有这样才能

37、够发挥更大的潜力,为设计万年历提供更有力的保障。6.1代码的功能1.主函数功能:获取时间,显示万年历和时间设置,代码如下。void main()SFR_Init();CAL_Init();GUI_Init();TR1=1;while(1) GetTime(&sys);/获得时间 LCD_ShowWNL();/显示万年历 Time_Set(); /时间设置 2. 万年历显示函数,设置刷新模式,代码如下。void LCD_ShowWNL()LCD_ShowTime(sys.cSec,6,111,Sec_Flag,UpLine,UnderLine); /秒,每秒钟刷新if(!sys.cSec | S

38、tate_Set) /分,普通模式每分钟刷新LCD_ShowTime(sys.cMin,6,87,Min_Flag,UpLine,UnderLine); /处于设置模式状态每次刷新if(!sys.cSec & !sys.cMin | State_Set) /时,普通模式每小时刷新LCD_ShowTime(sys.cHour,6,63,Hour_Flag,UpLine,UnderLine); /处于设置模式状态每次刷新if(!sys.cSec & !sys.cMin & !sys.cHour | State_Set )/公历农历的年、月、日、星期Show_YMD();/普通模式每天刷新if(St

39、ate_Set=7) State_Set=0; /处于设置模式状态每次刷新 3. 年、月、日、星期、农历、天干地支显示函数,代码如下。void Show_YMD()uchar uiTempDat; uiTempDat=RDS1302(0x88|0x01);sys.cMon=(uiTempDat&0x1f)4)*10+(uiTempDat&0x0f);LCD_ShowTime(sys.cMon,2,5,Mon_Flag,NoUpLine,NoUnderLine);hz_disp(4,5,1,uMod1,1,NoUpLine,NoUnderLine);/月Show16X32(2,27,ucNum3

40、216sys.cDay/10,Day_Flag);/日Show16X32(2,43,ucNum3216sys.cDay%10,Day_Flag); hz_disp(6,8,2,ucLunar13,1,UpLine,UnderLine); if(sys.cWeek=7)hz_disp(6,40,1,uMod2,1,UpLine,UnderLine);/星期 else hz_disp(6,40,1,ucLunarsys.cWeek,1,UpLine,UnderLine);/星期 LCD_ShowTime(20,0,9,1,UpLine,UnderLine); LCD_ShowTime(sys.cY

41、ear,0,25,Year_Flag,UpLine,UnderLine); hz_disp(0,41,1,uMod0,1,UpLine,UnderLine);/年SpDat=GetSpringDay(sys.cYear,sys.cMon,sys.cDay);/获得农历 if(SpDat.cMon=1)/显示农历月 hz_disp(4,64,1,ucLunar15,1,UpLine,NoUnderLine);/正else if(SpDat.cMon=11) hz_disp(4,64,1,ucLunar16,1,UpLine,NoUnderLine);/冬else if(SpDat.cMon=12

42、) hz_disp(4,64,1,ucLunar17,1,UpLine,NoUnderLine);/腊else hz_disp(4,63,1,ucLunarSpDat.cMon,1,UpLine,NoUnderLine);/二十 if(SpDat.cDay/10=1 & SpDat.cDay%100)/显示十,例如十四而不是一四 hz_disp(4,95,1,ucLunar10,1,UpLine,NoUnderLine); else if(SpDat.cDay/10=2 & SpDat.cDay%100) /显示廿,例如廿三而不是二四 hz_disp(4,95,1,ucLunar19,1,Up

43、Line,NoUnderLine); else hz_disp(4,95,1,ucLunarSpDat.cDay/10,1,UpLine,NoUnderLine); /正常数字if(!(SpDat.cDay%10) /十 hz_disp(4,111,1,ucLunar10,1,UpLine,NoUnderLine);else/正常数字 hz_disp(4,111,1,ucLunarSpDat.cDay%10,1,UpLine,NoUnderLine); hz_disp(0,104,1,SX(uint)(2000+SpDat.cYear)%12,1,UpLine,UnderLine); /生肖

44、hz_disp(2,95,1,TianGan(uint)(2000+SpDat.cYear)%10,1,NoUpLine,NoUnderLine);/天干hz_disp(2,111,1,DiZhi(uint)(2000+SpDat.cYear)%12,1,NoUpLine,NoUnderLine);/地支4.定时器1中断服务函数,读取键值和清键值,保证每次按键只执行依次按键动作,代码如下。void timer1() interrupt 3 TH1= (-10000)/256;TL1= (-10000)%256;keyinput();/读取按键if (keyvalue&0x10)State_Fl

45、ag=TRUE;keyvalue &= 0xef;/清键值,保证一按下只执行一次按键动作if (keyvalue&0x20 )/加Inc_Flag=TRUE;keyvalue &= 0xdf;/清键值,保证一按下只执行一次按键动作。if (keyvalue&0x40)/减Dec_Flag=TRUE;keyvalue &= 0xbf;/清键值,保证一直按下只执行一次按键动作。5.计算当年是否是闰年。当前年为闰年满足这两个条件:满足年份能被4整除;年份若是100的整数倍的话,需被400整除才能是闰年,否则为平年。也就是“四年一闰,百年不闰,四百年再闰”,代码如下。bit YearFlag(ucha

46、r cYear) if( (!(cYear%4) & (cYear%100) | !(cYear%400) ) return 1;else return 0;6. 计算目标日期是星期几。uchar GetWeekDay(uchar cYear,uchar cMon,uchar cDay)char i;uint Sum=0,tmpyear;cYear=(cYear4)&0x0f)*10)+(cYear&0x0f);/temp1+temp2;tmpyear=2000+cYear;cMon=(cMon4)&0x0f)*10)+(cMon&0x0f);/temp1+temp2;cDay=(cDay4)

47、&0x0f)*10)+(cDay&0x0f);/temp1+temp2;for(i=1;i=cMon-1;i+)Sum+=Mon1YearFlag(cYear)i;Sum+=cDay-1;return (tmpyear-1)+(tmpyear-1)/4-(tmpyear-1)/100+(tmpyear-1)/400+Sum)%7)+1;7. LCD图形初始化函数。描绘框架布局,并获取初始化时间,代码如下。void GUI_Init() LCD12864_init(); ClearLCD(); Rect(0,0,127,63,1); /描绘框架 Line(62,0,62,62,1); Line(

48、0,48,127,48,1); Line(0,15,127,15,1); Line(24,15,24,48,1); Line(63,32,128,32,1); SetTime(sys);/设置时间 GetTime(&sys);/获得时间 Show_YMD(); LCD_ShowTime(sys.cSec,6,111,Sec_Flag,UpLine,UnderLine); en_disp(6,103,1,Asc,:,1,UpLine,UnderLine); LCD_ShowTime(sys.cMin,6,87,Min_Flag,UpLine,UnderLine); en_disp(6,79,1,

49、Asc,:,1,UpLine,UnderLine); LCD_ShowTime(sys.cHour,6,63,Hour_Flag,UpLine,UnderLine); hz_disp(2,64,1,ucLunar11,1,NoUpLine,NoUnderLine);/农 hz_disp(2,80,1,ucLunar12,1,NoUpLine,NoUnderLine);/历 hz_disp(4,79,1,uMod1,1,UpLine,NoUnderLine);/月6.2测试结果分析在Proteus软件和Keil uVision3软件相结合调试的,完全用仿真软件在PC机上对目标电路原理图和程序进行

50、检测和调试。调试过程中单片机相应输入端由通用键盘和鼠标设定,运行状态、各寄存器状态、端口状态等都可以在指定的窗口区域显示出来,以确定程序运行有无错误。整体程序调试:即把各子程序整体连起来进入到综合电路调试,看是否能实现预计的功能显示。在这阶段若发生故障,可以考虑各子程序在运行时是否破坏现场,数据缓冲单元是否发生冲突,标志位的建立和清除在设计上是否失误,堆栈是否溢出,输入输出状态是否正常等。其中测试结果主要看“秒”这位的跳动是否精确,这个是需要长时间的验证。同时,在定时器内处理的数据要精确,因为定时器内处理数据也花费时间,而这段时间没有算到定时器内。经过长时间的调试、运行,最后把误差范围尽可能的

51、缩减。在调试过程中,出现过以下三种问题:(1)显示的数据秒并没有变化,是因为没有启动定时器,而我又不断地去读取DS1302时钟芯片寄存器中的数据导致。启动定时器后,就不会出现这种问题。(2)调整时间后应该先去掉写保护,如果存在写保护,那么在初始化写入初始时间时,是写不进去初始化的时间的。因而会看见显示的时间并不随着设置的初始化的值变化而变化,甚至我们看见的时间并不按着一秒一秒的增加。(3)液晶显示不稳定,甚至出现乱码现象。这是因为液晶显示的时候,由于采用的并行总线,显然传输速度快,但是数据端口必须接1K的排阻,以实现驱动。因此,排阻的作用很大。写程序时要严格按照时序就行,否则,也不会显示。经过多次修改程序最后调试出来理想的效果,如下图所示。(a)(b)图6.1 系统仿真结果图但是也有其的缺陷,现将日

温馨提示

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

评论

0/150

提交评论