可调数码日历钟毕业论文.doc_第1页
可调数码日历钟毕业论文.doc_第2页
可调数码日历钟毕业论文.doc_第3页
可调数码日历钟毕业论文.doc_第4页
可调数码日历钟毕业论文.doc_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

可调数码日历钟毕业论文1、 概述1.1 毕业设计的选题背景及制作意义1.1.1毕业设计的选题背景单片机以其体积小、编程灵活、控制功能强大、价格低廉等特点被广泛地应用在各种电子电器产品中。单片机技术的出现和发展带来了电子技术和控制领域的一场革命。单片机课程作为职业院校电子信息类专业一门重要的基础课程,它既是一门很有实用价值、实践性很强且很有趣味性的课程,同时它又是一门集硬件电路设计与软件编程于一体的学科,既要求我们有较好的电工电子技术基础知识,又要求有一定的逻辑思维和软件开发(编程)能力。通过近几年对单片机的学习,我已掌握单片机的基本知识,并具备了单片机应用系统的初步开发能力。即将毕业之际,为了将自己所掌握的知识与实际应用结合起来,进一步提高工程实践能力,同时也对自己所学知识作以总结及高度概括向老师汇报,我决定将我的毕业设计课题选作基于51单片机的可调数码日历钟的设计与制作,并以此向老师作毕业汇报。1.1.2毕业设计的制作意义数码日历钟是实际生活中应用较多的一个电子计时产品,广泛地应用在酒店、宾馆、车站、家庭及办公室中,可供人们查询日期、星期,掌握当前时间及环境温度。在上述背景下,需要我运用近几年在学校学到的单片机知识及开发技巧设计和制作出一个功能完善的可调数码日历钟。通过这个设计的制作,必将进一步提高我的工程实践能力和单片机应用系统开发能力,将我所学到的理论知识与实际应用结合起来,做到理论与实践相结合,同时也能对我高职阶段所学知识作以梳理和总结。这是一个非常实用的设计与制作,成本低廉,若将它稍加改进安装在镜框或其它工艺品中,则更加实用。如能进一步完善其功能,具有一定的实际推广使用价值。1.2数码日历钟的功能要求 本设计制作出来的数码日历钟要求能在12864液晶显示屏上显示出年月日及对应的星期几,当前时间及环境。而且要求日期和时间可通过按键调整,当日期调整时,通过相应算法自动实现星期几的调整,无论是否闰年、任何月份,当日期调整时都保证不会出现非法的日期。本设计制作出来的数码日历钟显示如图1-1所示。图1-1 毕业设计作品数码日历钟的显示效果图1.3 本设计制作的主要内容本设计制作需要完成的主要内容有:(1)对设计与制作任务进行分析、分解;(2)对设计与制作方案进行可行性论证,选择一种较为现实可行的方案;(3)根据所选方案列出所需硬件元器件、制作与调试工具(软硬件)清单;(4)准备制作与调试工具(软硬件),照单购买所需元器件并进行逐一测试,保证完好;(5)根据所选方案,画出硬件电路原理图;(6)逐一完成每个软件模块的编写与调试,最终编译生成目标程序;(7)整机联调。在Proteus中进行软件仿真,直至实现所有预先设定的功能要求。(8)根据硬件电路原理图搭建电路,并进行电路焊接;(9)对硬件电路进行测试与调试,保证无虚焊、短路等故障,将目标程序写入单片机,再次整机联调(实物);(10)完成毕业设计论文的撰写,提交完整的毕业设计作品,由指导老师审阅,完成毕业设计论文答辩。1河南理工大学毕业设计论文 2 数码日历钟的设计与制作任务分析2、 数码日历钟的设计与制作任务分析2.1 数码日历钟的设计与制作任务的分析与分解本设计任务比较复杂,要考虑的问题很多,故需对设计与制作任务进行分析和分解,使分解后的每一个子任务都在能够容易解决的范围之内。为此,通过对本设计任务的分析,将其按硬件和软件两个方面各分解为几个模块。它们分别是:(1) 硬件根据所选方案画出硬件电路原理图;根据所选方案,列出所需硬件元器件、制作与调试工具清单(软硬件);准备制作与调试工具(软硬件);照单购买所需元器件并进行逐一测试,保证完好;根据硬件电路原理图搭建电路,并进行电路焊接;对硬件电路进行测试与调试,保证无虚焊、短路等故障;(2) 软件12864液晶的显示,编写12864液晶的基础显示函数;根据已知日期推算出相应的星期几;利用实时时钟芯片DS1302提供日期和时间,从而实现电子钟功能;编写按键扫描程序,能够识别按键,并通过相应的按键调整年份、月份、日期、时、分;数字温度传感器18B20的使用;所测温度结果数据的处理及显示。2.2设计方案的论证及选择(1) 硬件方面:l 主控模块:单片机芯片的选择:考虑到本程序较为复杂,目标程序可能占用存储空间较大,故应选择程序存储器容量稍大一些的单片机芯片较好,但又要顾及尽量降低成本,程序开发、调试、载入方便。综合考虑,决定选用目前占有较大市场份额、技术成熟、资料丰富的Atmel公司生产的AT89S52单片机。晶振的选择:由于本设计中读取时间和温度的时刻由定时/计数器控制,为便于计算定时/计数器的初值和定时时长,故采用稳定性较高的、固有振荡频率为12MHz的石英晶体振荡器。l 显示模块:显示模块既可采用数码管显示,也可采用液晶显示。数码管的优点是价格便宜,显示亮度高,但它也有不少不足之处:当显示的信息量较大时,所用数码管较多,接口电路复杂,编程麻烦;而且其体积较大,不宜用于便携式产品,显示也不够美观;当其中某一段出现劣化而不能正常显示时,需整体更换。图形液晶显示模块的优点是价格适中,与单片机的接口电路简单,便于编程控制其显示,体积小、质量轻、功耗低(功率为10mW,5V电源供电、工作电流只有2mA)、寿命长、可靠性高、显示操作简单,显示美观,且显示的信息量大,特别适合用于便携式电子产品中作显示器件。故本设计中的显示模块决定采用12864点阵图形液晶显示器。l 实时时钟模块:我们固然可以利用单片机本身自带的定时/计数器提供秒信号实现电子日历钟,但这过于消耗单片机资源,且由于中断响应影响到时钟的精度,而且一旦主机掉电后重新启动时系统的时间日期必将再次初始化,每次上电后必须重新调整日期和时间初始值。本设计决定采用美国Dallas半导体公司的DS1302实时时钟芯片实现日历钟功能。DS1302可以在主机掉电后由后备电源为其供电,从而保证日期和时间在主机掉电后依旧保持运行,不需每次上电调整。而且DS1302还提供了为后备电源涓流充电的功能。DS1302自身还有31个字节的RAM空间,可以存储其他数据,从而为系统功能进一步拓展提供了空间。l 温度测量模块:温度测量模块当然可以采用较为简单的热敏电阻,其阻值会随着周围环境温度的变化而变化。热敏电阻的优点是电路及其工作原理都较为简单,但其测量结果为模拟量,要让单片机去处理其测量结果,需通过ADC(模数转换器)电路,这样又增加了不少成本,且需熟悉ADC与单片机的接口电路及其编程,这就增加了开发的难度和时间,比较麻烦。当然也可采用模拟温度传感器,如LM35,它测得的结果同样是模拟量,也需通过A/D转换,单片机才能处理,既提高了开发成本,又增加了开发难度,故本设计放弃采用以上这两种方案,决定采用DALLAS 公司的“一线式”接口的数字化温度传感器DS18B20。相比热敏电阻,该传感器的优点是可谓多多:首先,它与单片机的接口非常简单,只需一根线即可实现和单片机之间的数据传输。测温范围为55125,固有测温分辨率0.5。具有耐磨耐碰,体积小,工作电源: 35V/DC。非常适合要求。l 按键调整控制模块:为了便于用户识记各按键的功能,本设计中只用3个按键来实现对日期和时间的调整。由于所用按键数目较少,为便于编程,按键采用独立式按键的接法,独立式按键接口电路简单,编程方便。硬件系统的组成框图如图2-1所示:图2-1 数码日历钟硬件系统组成框图(2) 软件方面:l 编程语言选择:考虑到本设计任务较为复杂,C语言的模块化程序设计思想能够较好地解决这个问题,且用C语言编写程序,开发效率高,生成的目标代码质量也较高,执行效率高,综上所述,故本设计任务采用C语言编程。l 编译环境软件选择:本设计选用目前单片机应用系统开发使用最泛的集成开发编译软件Keil公司的Keil C,它既可用于汇编程言源程序的编辑、编译,生成目标程序,也可用于C语言源程序的编辑、编译、连接并生成目标代码。l 仿真软件选择:在焊接硬件电路之前,为避免不必要的麻烦,要对本设计系统进行软件仿真,直到仿真运行无误后,再焊接元器件,搭建本设计硬件电路。本设计选用目前单片机应用系统仿真中最受欢迎的一款软件英国Labcenter Electronics公司开发的电子电路设计与仿真软件Proteus。它包括ISISARES等软件模块,ARES模块主要用来完成PCB的设计,而ISIS模块用来完成电路原理图的制图与仿真。Proteus 的软件仿真基于VSM技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片以及单片机外围电路,例如键盘、LED、LCD等等。通过Proteus软件的使用,我们能够轻易地获得一个功能齐全、实用方便的单片机实验室。Proteus软件有十多年的历史,在全球广泛使用,除了具有和其它EDA工具一样的原理图制图、PCB自动或人工布线及电路仿真的功能外,其革命性的功能在于其电路仿真是互动的,针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现软件源码级别的实时调试,如果显示及输出,还能看到运行后输入输出的效果,此外系统还配置有丰富的虚拟仪器,如示波器、逻辑分析仪等。-51-河南理工大学毕业设计论文 3 相关知识链接3、 相关知识链接3.1 51单片机简介3.1.1 51单片机简介单片机就是将中央处理器(CPU)、存储器(包括程序存储器ROM和数据存储器RAM)、I/O接口电路、定时/计数器、中断系统和时钟电路等计算机基本部件集成在一块芯片上,具有独特功能的单片微型计算机(Single Chip Microcomputer,简写为SCM)。由于其体积小,主要应用在控制领域,所以又被称为微控制器(Micro Controller Unit,简写为MCU)。单片机出现的历史并不长,其前身起源于上世纪70年代研制成功的微处理器(利用大规模集成电路制造技术将计算机的运算器和控制器集成为一体)。作为一门非常有前途的计算机技术,单片机一经出现就迅速发展起来。一路走来,单片机的性能在不断提高,存储容量也在不断增大,而体积、价格、功耗却在不断降低。由于其体积小、控制功能强大、编程灵活、价格低廉,所以在控制领域得到了广泛的应用。可以说,凡是与控制或简单计算有关的场合,都可以用单片机来实现。目前,单片机已得到了大力推广和广泛应用,从工业控制系统到日常工作和生活的方方面面,单片机的应用几乎无处不在。从形形色色的家用电器、电子玩具、数码产品,到各种医疗器械、智能仪器仪表、通信设备,大到航空航天、雷达、导弹等现代化武器装备,单片机的身影无处不在。复杂的工业控制系统中甚至有上百台单片机在同时工作。单片机的应用从根本上改变了传统的控制系统的设计思想和设计方法,可以说,单片机技术的出现和发展给现代电子技术和控制领域带来了一场新的革命。以往由硬件电路实现的大部分控制功能现在都能够使用单片机通过软件方式来实现,这种以软件取代硬件并能够提高系统性能的微控制技术,随着单片机应用的推广普及,不断发展,日益完善。因此,学习单片机,掌握其应用和开发技术,也成为当今职业院校电子信息专业的学生必须具备的一项基本技能。下面谈谈单片机的发展情况及其常用系列。虽然单片机出现的历史并不长,至今也不到四十年的时间,但其发展却十分迅猛。1976年,美国的Intel公司在8位微处理器的基础上首先研制成功了最早的单片机产品MCS-48系列单片机,这是一种低档的8位单片机,但它以其体积小、功能全、价格低、容易嵌入到其他控制产品中等特点得到了广泛的应用。现在MCS-48系列单片机已经完全退出了历史舞台。20世纪80年代,Intel公司在总结MCS-48系列单片机的基础上推出了8位单片机的第二代产品MCS-51系列单片机。虽然它仍然是8位单片机,但其功能有了很大的增强。其系列产品包括基本型8031/8051/8751/8951、80C31/80C51,增强型8032/8052,改进型8044/8344/8744等,其中80C31/80C51采用CHMOS工艺制造,功耗更低。上述单片机产品的内核均是8051内核,它们是高档的8位单片机。由于Intel公司主要致力于计算机的CPU的研究和开发,所以该公司在推出MCS-51体系结构后不久,开放了8051内核技术,授权一些厂商以MCS-51系列单片机为核心生产各自的单片机,为单片机的发展起了很大作用。随后世界各大半导体公司依靠自己的优势,争相研究和开发单片机,发展了MCS-51单片机,创造了许多各具特色的单片机产品,成为事实上的8位单片机主流和经典。这些单片机统称MCS-51系列单片机,它们与MCS-51单片机兼容,又各具特点。目前,全世界生产单片机的厂家不计其数,单片机的型号也五花八门。值得一提的是,本设计中所采用的AT89S52单片机是Atmel公司的产品,它拥有与MCS-51单片机同样的内核和引脚排列,它除了具有和MCS-51单片机的全部功能外,还内置了一些非常实用的功能。例如,它采用Flash ROM、支持ISP(在系统可编程)功能,可以反复快速擦写,因此程序写入和调试非常方便,使得我们在写入程序时不需再依靠传统的编程器,只需使用它所支持的专用ISP软件就可轻易将程序写入,它改变了单片机应用系统的结构模式和开发运行条件,此外它还增加了一些外部接口功能,内置有看门狗。AT89S52是目前占有较大市场份额、性能卓越的典型的51系列单片机。AT89S52单片机的主要参数如下:l 8KB在系统可编程Flash ROM存储器。l 片内256B RAM存储器。l 工作电源电压:4.0V5.5V。l 可重复擦写1000次。l 时钟频率0Hz33MHz。l 加密结构:三级。l 可编程并行I/O口:48位。l 定时/计数器:3个16位可编程定时/计数器。l 中断源:8个可编程中断源。l 全双工UART串行通道。l 具有低功耗空闲工作模式和掉电保持模式。l 内置看门狗定时器和复位电路。l 双数据指针。3.1.2 51单片机引脚功能介绍单片机就是一块集成电路,在使用其之前,必须先了解其外部引脚功能。51单片机有多种封装方式,下面以DIP-40封装为例介绍其引脚功能。DIP-40封装的AT89S52单片机实物图如图3-1所示。图3-1 DIP-40封装的AT89S52单片机实物图由于受到集成电路芯片引脚数目的限制,许多引脚具有双重功能。AT89S52单片机的引脚排列如图3-2所示。按其功能类别来划分,这40个引脚可分为以下四类:电源引脚、时钟引脚、I/O接口引脚、编程控制引脚。各引脚功能介绍如下。(1) 电源引脚Vcc和GND集成电路都需要电源供电才能正常工作,单片机也不例外。采用DIP-40封装的AT89S52单片机的第40脚Vcc为电源正极输入端,一般接+5V,第20脚GND为电源负极输入端,接电源负极,也作为电路中的公共接地端。图3-2 DIP-40封装的AT89S52单片机外部引脚图(2) 时钟引脚XTAL1和XTAL2第19脚XTAL1为片内振荡电路输入端,第18脚XTAL2为片内振荡电路输出端。在使用片内时钟发生电路时,这两个引脚用于外接石英晶体和振荡电容(取值一般为10p30p),此时晶振频率即为时钟振荡频率;在使用片外时钟电路时,这两个引脚用于外接外部时钟源。需要说明的是:本设计采用单片机内部时钟振荡电路,所以这两个引脚外接石英晶体和振荡电容。为便于计算定时器的初始值及定时时间,晶振频率为12MHz。(3) 并行I/O接口引脚AT89S52单片机共有4个8位并行I/O口,分别为P0、P1、P2、P3(字母P为英文单词Port(意为“端口”)的第一个字母),每个I/O口均有8位,分别表示成Pm.n的形式(m=0,1,2,3;n=0,1,2,3,4,5,6,7),在用C语言写程序时则应写成Pmn的形式。P0口(第3930脚,其中第39脚为P0.0,即最低位,第32脚为P0.7,即最高位,其余依此递推)为8位双向三态I/O口。值得注意的是,P0口内部没有上拉电阻,不能正常输出高电平,因此P0口在作为通用I/O口作基本输入输出使用时必须外接上拉电阻,否则应输出高电平时为高阻态,无法正常输出高电平。上拉电阻阻值一般取10KW。P0口除了作为I/O口使用外,在系统扩展时还作为低8位地址总线和数据总线分时复用。本设计中的12864液晶显示器的数据总线就是与P0口连接的,已外接上拉电阻。P1口(第18脚,其中第1脚为P1.0,即最低位,第8脚为P1.7,即最高位,其余递推)为8位准双向并行I/O口。P1口内部已接有上拉电阻,故在使用时无需再接上拉电阻。P1口功能较为简单,仅作基本I/O口使用,没有第二功能。本设计中用P1口作为矩阵式按键接口使用。P2口(第2128脚,其中第21脚为P2.0,即最低位,第28脚为P2.7,即最高位,其余递推)为8位准双向并行I/O口。P2口内部也已接有上拉电阻,故在使用时无需再接上拉电阻。P2口除了作为I/O口使用外,在系统扩展时还作为高8位地址总线使用。P3口(第1017脚,其中第10脚为P3.0,即最低位,第17脚为P3.7,即最高位,其余递推)作为第一功能使用时为普通的8位并行I/O口,在使用时也无需再接上拉电阻。需要强调的是:P3口的每个引脚又各自具有非常重要的第二功能。P3口的每个引脚的第二功能如表3-1所示。表3-1 AT89S52单片机P3口的第二功能引脚名称第二功能功能描述P3.0RXD串行数据输入P3.1TXD串行数据输出P3.2外部中断0中断请求输入P3.3外部中断1中断请求输入P3.4T0定时/计数器0外部时钟输入P3.5T1定时/计数器1外部时钟输入P3.6外部RAM写选通信号P3.7外部RAM读选通信号注意:P3口每个引脚各自具有的第二功能都是比较重要的控制信号,在实际应用中应优先满足第二功能使用需要,然后再用剩余的口线作为数据的输入和输出使用。由于本设计中不涉及到P3口第二功能的使用,故不再对P3口的第二功能作详细介绍。以上四个I/O口既可字节操作(8位同时并行输入输出),亦可位操作(即每根口线均可独立控制)(4) 编程控制引脚第9脚RST/Vpd为复位信号输入端。当RST端保持两个机器周期以上的高电平时即可使单片机进入复位状态,完成一系列初始化操作。单片机复位时,使片内各特殊功能寄存器的内容复位到初始状态,程序计数器PC的值归零,即指向ROM的第一个单元。复位操作还使4个并行I/O口的每根口线都置为高电平状态。除作为复位信号输入外,该引脚也具有不太常用的第二功能,即作为片内RAM的备用电源输入端。一旦电源断电或者电压降到一定值时,可通过该引脚为片内RAM供电,以保护片内RAM中的数据不丢失,且上电后能够继续工作。第29脚为外部ROM的读选通信号,当访问片外扩展ROM时,只有该引脚为低电平有效信号,才能选通片外程序存储器对其进行读操作。本设计中无外接扩展ROM,不涉及对该引脚的使用,故悬空。第30脚ALE/为地址锁存使能/片内ROM编程脉冲信号输入端。在单片机扩展外部存储器时,该引脚作第一功能使用,用于控制把P0口提供的低8位地址送锁存器锁存起来,以实现低8位地址和数据的隔离。在没有访问外部存储器时,该引脚以时钟周期频率的6分频固定频率输出,因此可作为外部时钟,或可作为外部定时脉冲使用。该引脚的第二功能为片内ROM的编程脉冲输入端。这是为兼容以往的低版本单片机而设置的。以往低版本单片机的片内ROM要靠编程脉冲才能将程序写入,而AT89S52支持ISP功能,无需编程脉冲输入。本设计中既没有扩展外部存储器,往片内ROM写入程序时也无需编程脉冲输入,故不涉及该引脚的使用,故闲置。第31脚/Vpp具有双重功能。其第一功能为访问片内、片外ROM的控制信号,当该引脚接低电平时,CPU对ROM的访问限定在片外ROM(对于片内没有ROM的单片机,如8031,CPU只能访问片外ROM,则该引脚一直是接低电平的);当该引脚接高电平时,CPU对ROM的访问方式为,如果地址不超过片内ROM的存储单元范围,则访问片内ROM(低端地址),当地址信号所标志的存储单元超出片内ROM范围时(高端地址),则自动延伸至片外ROM(即只能访问片外ROM的高端存储单元)。该引脚的第二功能Vpp用于对片内含有EPROM的单片机(如8751),对其内部EPROM写入程序时作编程电压输入端。本设计中采用的AT89S52单片机片内含有8KB Flash ROM,其存储容量已能满足需求,无需扩展片外ROM,且AT89S52单片机支持ISP(在系统可编程)功能,无需编程电压输入,故此引脚直接接高电平(与第40脚电源正极相连),仅限于对片内程序存储器的访问。3.2 由已知日期推算星期几3.2.1如何判断一个年份是否是闰年数码日历钟显示的年份如果是闰年,则2月为29天,否则为28天。在本设计任务中,无论是日期的调整,还是星期几的推算,都涉及到闰年的判断。查阅相关资料可知,如果一个年份是闰年,则该年份必然满足以下两个条件其中之一:(1) 年份是4的整数倍但不是100的整数倍;(2) 年份是400的整数倍。只要年份能满足以上两个条件其中之一,便可判定是闰年,否则不是闰年。于是,不难写出判断一个年份是否闰年的函数如下: bit leap(int year) /判断是否闰年函数 return(year%4=0&year%100!=0|year%400=0); /闰年的条件该函数的类型为C51中扩展的bit型(即位类型),这种类型的函数的返回值只能是0或1,不能为其它值。具体到本函数,若年份能满足闰年的条件则返回1,否则返回0。3.2.2由已知日期如何推算星期几我们在日常生活中经常会遇到这样的问题,忘记了某年某月某日是星期几,特别是一些重大节日或是一些值得纪念的日子,这就是星期几的推算问题。那么,如何由一个已知日期推算出是星期几呢?人们一般会采用这样的方法:从一个已知星期几的某天开始推算,先计算已知星期几的这一天距要推算的那天共相差几天,由于星期是7天一轮回的,故可以将相差的天数除以7取余数,再用已知的那天星期几加上余数,就可以推算出要计算的这天是星期几了。在此,我们也采用类似的方法进行推算。已知公元元年1月1日正好是星期一,那么,只需计算出从公元元年1月1日到要推算的这一天总共多少天(s),再用天数s除以7取余数,余0则说明正好够整数个星期,则要推算的这一天正好就是一个星期的最后一天,也就是星期日;余1则说明整数个星期还多一天,那么要推算的这一天就是星期一了;依次类推,余2就是星期二,余3就是星期三.。但是我们在计算天数时会发现由于中间会经历平年(365天)、闰年(366天),每年的不同月份天数也不相同,这样算来,计算量是很大的,计算也十分不便。有没有改进的方法呢?我们不妨这样来考虑:如果一个年份是平年,则该年有365天,也就是52个星期多一天;如果一个年份是闰年,则该年有366天,也就是52个星期多两天;于是,对于以前的年份,如果是平年,则只计为一天(扣除其中的整数个星期),同理,如果是闰年,则计为两天。这样一来,则计算量大大减少。再进一步,把要推算的这一年之前的所有年份都先按平年计算,则之前有多少年,就有多少天(一个平年只计一天,其中的整数个星期已扣除)。设要推算的年份为y,则之前有y-1个年份,就计为y-1天。其中y-1个年份中有若干个年份是闰年,由于闰年比平年多一天(平年2月28天,闰年2月29天,闰年和平年的其它相应月份的天数是一样的,只有2月份不同),则需再加上闰年的个数,于是可以算出y年之前有(y-1) +(y-1)/4-(y-1)/100+(y-1)/400天。注意:先把之前y-1年中凡是4的整数倍的年份都暂按闰年计算,然后再去掉是100的整数倍的年份,再加上是400的整数倍的年份,即可算出y年之前有之少天了(整数个星期已扣除)。然后再计算要推算的这一天是当年的第多少天,这个不难计算。如果要推算的日子在该年的前两个月,则与该年是否闰年无关;如果是2月份以后的月份,可以先按平年计算,如果是闰年,则再加上一天(因为闰年的2月份比平年的2月份多一天)。这样,就可以对要推算的日子所在的月份进行测试,并按各种情况计算出要推算的这一天所在的月份之前当年已过了多少天,再加上要推算的这一天是当月的第几天,就可以算出要推算的这一天是当年的第多少天了。用之前所算出的当年之前的总天数加上要推算的这一天是当年的多少天,如此计算出总天数,再用这个总天数除以7取余数,余0则是星期日,余1则是星期一,余2则是星期二,如此等等。由已知日期推算星期几的函数的参考源代码如下:char tuisuan(int y, char m, char d) /根据已知日期推算星期几 int s; /变量s用于存放总天数 switch (m) case 1: s=0; break; /如果欲推算的这一天在1月份,则当月之前经历了0天 case 2: s=31;break; case 3: s=59; break; case 4: s=90;break; case 5: s=120; break; case 6: s=151;break; case 7: s=181; break; case 8: s=212;break; case 9: s=243; break; case 10: s=273;break; case 11: s=304; break; case 12: s=334;break; if(m2&leap(y) s=s+1; s=s+d; s=s+(y-1)+(y-1)/4-(y-1)/100+(y-1)/400; return (s%7);程序运行期间,通过按键调整日期,运行结果测试如表3-2所示:表3-2 星期计算问题测试数据表测试数据运行结果第一组2000年1月1日星期六第二组2008年8月8日星期五第三组2014年4月19日星期六3.3 12864点阵图形液晶的使用3.3.1液晶概述液晶(Liquid Crystal)是一种高分子材料,由于它具有特殊的物理、化学、光学特性,被广泛地应用在各种轻薄型显示器上,如手机屏幕、笔记本电脑显示屏及各种便携式电子信息产品中。液晶显示器(Liquid Crystal Display,简写为LCD)的主要显示原理是以电流刺激液晶分子产生点、线、面并配合背部灯管构成画面。为叙述方便,通常把各种液晶显示器都直接叫做液晶。液晶显示器具有体积小、质量轻、功耗低(功率为10mW,5V电源供电、工作电流只有2mA)、可靠性高、显示操作简单等优点,被广泛地应用在各种便携式电子信息产品中作显示器件。特别是电池供电的单片机产品中,液晶显示器几乎是必选的显示器件。但是,液晶也有一个致命的弱点,那就是其使用的温度范围很窄,通用型液晶正常工作温度范围为0+55 ,存储温度范围为-20+60 。即使是宽温级液晶,其正常工作温度范围也仅为-20+70 ,存储温度范围为-30+80 。(高寒地区难以正常工作)。因此在设计相应产品时务必要考虑周全,选取合适的液晶。按照能够显示的字符个数和行数,液晶有多种型号(如1602、0801等,它们属于字符液晶,只能用于显示英文字母、阿拉伯数字及其他一些ASCII字符,不可用来显示汉字)。也有的液晶型号是按照液晶显示点阵的行、列数来命名的,如:12232、12864,这些都是图形液晶,可用于显示图形与汉字。12864意即横向有128列、竖向有64行的点阵,通过编程控制让其中哪些点亮、哪些点不亮,就可以显示一个特定的画面。根据显示的色彩,液晶还可分为单(色)显液晶和彩(色)显液晶。根据操作的方式不同,液晶还可分为串行操作方式与并行操作方式。目前,市场上的12864液晶以并行操作方式居多。3.3.2 LCM引脚功能介绍通常将LCD控制器、显示器及RAM(用于存储显示的数据)、ROM(用于存放指令)连接在一块印刷电路板上,称为液晶显示控制模块(LCM)。12864液晶显示模块有20个引脚,其引脚功能介绍如表3-3所示:表3-3 12864液晶显示模块引脚功能表引脚编号符号功能说明引脚编号符号功能说明1电源地(负极)11数据和命令通道2电源正极12数据和命令通道3液晶显示对比度调节端13数据和命令通道4数据/命令选择端14数据和命令通道5读/写控制端15左半屏选择信号6读写使能端16右半屏选择信号7数据和命令通道17复位信号,低电平有效8数据和命令通道18液晶驱动电压输出端9数据和命令通道19背光电源正极10数据和命令通道20背光电源负极引脚功能说明:第1脚、第2脚为整个LCM模块的电源端,第19脚、第20脚为背部光源的电源正、负极。引脚如此设置,第1脚和第20脚均是接地,第2脚和第19脚均是电源正极,即使插错,最多导致液晶不能正常工作显示,但不至于烧坏液晶。RS为存储器选择位,RS=1,对数据存储器进行读写,RS=0,对指令存储器进行读写。为读写控制信号,=1,对模块进行读操作;=0,对模块进行写操作。EN为LCM模块的使能控制端,高电平有效,下降沿锁定数据。为LCM的数据/指令总线。CS1、CS2为左右半屏选择信号,高电平有效。其中当CS1=1、CS2=0时选中左半屏;当CS1=0、CS2=1时选中右半屏。、控制读、写存储器操作格式如表3-4所示:表3-4 RS、的功能描述RS操 作00对指令存储器进行写操作01从指令存储器读出“忙”标志信号和当前地址到数据总线10对数据存储器进行写操作11对数据存储器进行读操作3.3.3 LCD12864图形液晶显示模块指令集LCD12864图形液晶显示模块指令集如表3-5所示。表3-5 LCD12864图形液晶显示模块指令集读写操作数据口指令及指令关键字说明RSD7D6D5D4D3D2D1D0000011111D显示开关控制指令:0x3f0x3eD=1,开显示(0x3f);D=0,关显示(0x3e)0011L5L4L3L2L1L0设置显示起始行指令:0xc0+addadd=L5L4L3L2L1L0,add的取值范围为063。该指令用于控制显示的起始行。0010111P2P1P0页地址设置指令:0xb8+addadd=P2P1P0,add的取值范围为07。该指令用于设置后续读写的页地址。0001C5C4C3C2C1C0列地址设置指令:0x40+addadd=C5C4C3C2C1C0,add的取值范围为063。该指令用于设置后续读写的列地址。整个屏幕分为左右两个半屏,每半屏各64列(063)01BF0on/offrst0000读状态字指令:BF为LCD控制模块的“忙”标志位。On/off=1说明显示关闭;rst=1说明LCD控制模块正在复位。10D7D6D5D4D3D2D1D0写显示数据指令:将要显示的字模数据写入LCD控制模块的数据存储器中。11D7D6D5D4D3D2D1D0读显示数据指令:从LCD控制模块的数据存储器中读出字模数据,送至数据总线,以便修改后重新写入从而实现特效显示。必要说明:(1) BF为LCD控制模块的“忙”标志位。BF=1,LCD控制模块忙,不能接收任何指令或数据;BF=0,LCD控制模块不忙,可以接收指令或数据。向LCD控制模块发送指令或数据前应先查询BF状态。(2)12864液晶显示器规定每8行点阵为1页,整个屏幕64行分为8页。(3)12864液晶显示器把整个屏幕分为左右两个半屏,每个半屏各64列。左、右半屏通过CS1、CS2来选择。在读写数据时,当页地址不变时,列地址会自动加1,在063列之间循环,不换页。LCD12864的显示缓存DDRAM页地址、列地址与显示器的点阵位置对应,单片机只需把字模数据送到DDRAM,就可以在点阵相应位置显示出字符。3.3.4 LCD12864图形液晶显示模块与单片机的接口LCD12864图形液晶显示模块与单片机的硬件连接如图3-3所示。图3-3 LCD12864图形液晶显示模块与单片机的硬件连接图3.3.5 LCD12864图形液晶显示模块的基础函数(1) 引脚定义:sbit CS1=P21; /左半屏选择位,高电平有效sbit CS2=P22; /右半屏选择位,高电平有效sbit RS=P24; /定义液晶模块的数据/指令存储器选择位sbit RW=P25; /定义液晶模块的读/写控制选择位sbit EN=P26; /定义液晶模块的使能端,高电平写入,下降沿锁存(2) 忙检测函数:void busy_12864( ) /用于检测12864是否忙,无返回值,如忙则等待 P0=0xff ; /将P0口置于准备“读”状态RS=0;RW=1; /读状态操作 EN=1; /使EN有效 while(P0&0x80); /若P0口最高位为1则表示“忙”,需等待 EN=0 ; /关闭使能信号 (3) 向12864液晶显示模块写命令函数:void writelcd_cmd(unsigned char cmd) /形式参数cmd为要写入的指令 busy_12864( ); /忙检测,若忙则等待 RS=0; RW=0; /置于写命令工作模式P0=cmd; /将要写入的命令字节数据放在数据线上EN=1;EN=0; /送出命令,并使之有效(4) 向12864液晶显示模块写数据函数:void writelcd_dat(unsigned char dat) /形式参数dat为要写入的数据 busy_12864( ); /忙检测,若忙则等待 RS=1; RW=0; /置于写数据工作模式P0=cmd; /将要写入的数据放在数据线上EN=1;EN=0; /送出数据,并使之有效 (5) 向12864液晶显示器指定位置写数据函数:/将要显示的一字节数据dat写入到12864液晶显示器的第p页、第c列void sendlcd_dat(unsigned char p, unsigned char c,unsigned char dat)if(c63) CS1=0, CS2=1,c=c-64; /如果列号超过63,则应显示在右半屏else CS1=1,CS2=0 ; /如果列号不超过63,则应显示在左半屏writelcd_cmd(0xb8+p); /定位于p页writelcd_cmd(0x40+c); /定位于c列writelcd_dat(dat); /向指定位置写入待显示的数据 (6) 12864液晶显示模块的清屏函数:由于本设计中所采用的是不带字库的12864显示屏,没有清屏指令,需要自己编写清屏函数,原理就是向DDRAM的每页每列处写0。void cls() uchar i, j; for(i=0;i8;i+) for(j=0;j128;j+) sendlcd_dat(i,j,0) ; /(7) 12864液晶显示模块的初始化函数:void lcd_init( ) /12864液晶显示模块的初始化函数writelcd_cmd(0x3f); /开显示writelcd_cmd(0xc0); /设置显示起始行cls(); /清屏(8) 在12864液晶显示器的指定位置显示某个汉字的函数定义如下:void xhz (uchar p,uchar c,uchar n) /p为页地址,c为列地址,n为该汉字在字模数组中的序号uchar i;for(i=0;i32;i+) sendlcd_dat (p+i/16,c+i%16,zmni);说明:源程序中已定义要显示的各个汉字和特殊字符的字模数据,字模数据由取字模软件获得。zm32为汉字字模,每个汉字的字模包括32个字节数据。(9) 在12864液晶显示器的指定位置显示某个数字字符的函数定义如下:void xsz (bit flag, uchar p,uchar c,uchar n) /p为页地址,c为列地址,n为该数字在字模数组中的序号uchar i;for(i=0;i16;i+) sendlcd_dat(p+i/8,c+i%8,flag?szni:szni);说明:源程序中已定义要显示的各ASCII码字符的字模数据,由取字模软件获得。sz16为ASCII码字符字模,每个ASCII码字符的字模包括16个字节数据。形式参数变量flag决定是否反显,flag=1则反显,flag=0则正常显示。当要调整日期时间时需反显要调整的数据项,以免错调,此时应使变量flag等于1。(10) 12864液晶显示模块的显示函数12864液晶显示器的显示函数只需调用以上显示汉字和ASCII码字符的函数在指定位置显示特定的汉字或数字即可。略写。3.4 51单片机中的定时器中断本设计中需要用单片机的定时器来标识读取实时时钟和环境温度的时刻。51单片机内部有2个16位的定时器,分别是T0和T1。当定时器计满溢出时就会向CPU发出中断请求,在开中断的前提下,CPU检测到中断请求后会暂停主程序的执行,转去执行中断处理程序,待中断处理程序执行完毕后再返回原程序断点处继续运行。定时器的启动与停止、是否计满溢出申请中断是由定时器控制寄存器TCON来控制和管理的。TCON是一个可位寻址的特殊功能寄存器,可对其每一位单独进行操作。单片机复位时,TCON的所有位均被清0。其各位名称如表3-6所示。表3-6 定时器控制寄存器TCON的各位功能说明位 号D7D6D5D4D3D2D1D0位名称TF1TR1TF0TR0IE1IT1IE0IT0TCON寄存器中和定时中断有关的位的功能介绍如下:TR0:定时器T0的启动控制位。当TR0=1时,T0启动计数;当TR0=0时,T0停止计数;TF0:定时器T0的溢出中断标志位。当T0计满溢出时,由硬件自动将TF0置1,并向CPU发出中断请求,当CPU响应该中断进入中断服务程序后,由硬件自动将该位清0,不需用专门的语句将该位清0。TR1:定时器T1的启动控制位。其功能及使用方法同TR0。TF1:定时器T1的溢出中断标志位。其功能及使用方法同TF0。其余四位与外部中断相关,是两个外部中断的中断请求标志位和触发方式控制位,本设计不涉及,故不再赘述。在51单片机的中断系统中,中断的允许或禁止是在中断允计寄存器IE中设置的。IE也是一个可位操作的8位特殊功能寄存器,即可以对其每一位单独进行操作,当然也可以进行整体字节操作。单片机复位时,IE全部被清0。其各位定义如表3-7所示。表3-7 中断允许寄存器IE的各位功能定义位 号D7D6D5D4D3D2D1D0位名称EAESET1EX1ET0EX0中断允许寄存器IE中和定时器中断有关的位的功能定义说明如下:EA:即Enable All的缩写,全局中断允许控制位。当EA=0时,则所有中断均被禁止;当EA=1时,全局中断允许打开,在此条件下,由各个中断源的中断控制位确定相应的中断允许或禁止。换言之,EA就是各种中断源的总开关。ET0:定时器T0的中断允许位。如果ET0置1,则允许定时器T0中断,否则禁止定时器T0中断。ET1:定时器T1的中断允许位。如果ET1置1,则允许定时器T1中断,否则禁止定时器T1中断。例如:如果我们要设置定时/计数器T0中断允许,其他中断不允许,则IE寄存器各位取值如表3-8所示。表3-8 IE寄存器的各位取值位 号D7D6D5D4D3D2D1D0位名称EAESET1EX1ET0EX0取 值10000010即IE=0x82。当然,我们也可以用位操作指令来实现:EA=1,ET0=1。(5) 中断初始化及中断服务程序结构中断初始化实质上就是对与中断有关的特殊功能寄存器TCON、IE进行管理和控制,具体实施如下: CPU的开、关中断(即全局中断允许控制位的打开与关闭,EA=1或EA=0); 具体中断

温馨提示

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

评论

0/150

提交评论