• 1.49 MB
  • 2022-04-22 11:32:01 发布

电子信息技术毕业设计论文.doc

  • 64页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'专科毕业设计(论文)题目基于51单片机的数码日历钟的设计与制作院(系部)电子与信息工程系专业名称电子信息技术年级班级07高职电信1学生姓名闫豫甜指导教师吴云志河南理工大学高等职业学院(郑州校区)二〇一二年四月二十日1 河南理工大学毕业设计论文摘要单片机以其体积小、编程灵活、控制功能强大、价格低廉等特点被广泛地应用在各种电子电器产品中。单片机技术的出现和发展带来了电子技术和控制领域的一场革命。单片机课程作为职业院校电子信息类专业一门重要的基础课程,它既是一门很有实用价值、实践性很强且很有趣味性的一门课程,同时它又是一门集硬件电路设计与软件编程于一体的学科,既要求我们有较好的电工电子技术基础知识,又要求有一定的逻辑思维和软件开发(编程)能力。通过近几年对单片机的学习,我已掌握单片机的基本知识,并具备了单片机应用系统的初步开发能力。即将毕业之际,我运用我所掌握的单片机知识设计和制作了一个基于51单片机的数码日历钟,这既是对我所学知识的总结与高度概括,同时也将自己所掌握的知识与实际应用结合起来,进一步提高工程实践能力。数码日历钟是实际生活中应用较多的一个电子计时装置,可供人们查询日期、星期及掌握时间。本文首先从数码日历钟的功能要求入手,对设计任务进行了分析,并将任务分解为若干个模块,提出在设计与制作过程中要用到的相关知识点,给出了本设计的硬件电路及软件流程,还给出了部分模块的源程序代码。本设计经过多次调试运行无误,最终提交出一个完整的应用系统产品。本次毕业设计的数码日历钟能在1602液晶屏上显示出年月日时分秒以及星期几,还能显示当前的环境温度,并且能通过按键调整日期和时间,在调整日期的同时通过相应算法自动实现星期几的调整,而且无论是否闰年、任何月份,当日期调整时都保证不会出现非法的日期。数码日历钟是一个非常实用的设计与制作,成本低廉,如能进一步完善,具有一定的推广使用价值。本设计任务比较复杂,要考虑的问题很多,C语言的模块化程序设计思想较好地解决了这个问题,故本设计任务采用C语言编程。关键词:51单片机,C语言,数码日历钟,毕业设计,制作III 河南理工大学毕业设计论文目录摘要Ⅰ1概述11.1毕业设计的选题背景及制作意义11.1.1毕业设计的选题背景11.1.2毕业设计的制作意义11.2数码日历钟的功能要求11.3本设计制作的主要内容22数码日历钟的设计与制作任务分析32.1数码日历钟的设计与制作任务分析与分解32.2设计方案的论证及选择33相关知识链接63.151单片机简介63.1.151单片机简介63.1.251单片机引脚功能介绍83.2由已知日期推算星期几113.2.1如何判断一个年份是否闰年113.2.2由已知日期如何推算星期几113.31602字符液晶的使用133.3.1液晶概述133.3.2LCM引脚功能介绍143.3.3LCD1602字符液晶显示模块指令集153.3.4LCD1602字符液晶显示模块与单片机的接口173.3.5LCD1602字符液晶显示模块的基础函数173.451单片机中的中断与定时193.4.151单片机中的中断193.4.251单片机中的定时/计数器223.5数字温度传感器DS18B20的使用283.5.1DS18B20概述283.5.2DS18B20的内部结构293.5.3DS18B20与单片机的接口电路323.5.4DS18B20的操作命令321 河南理工大学毕业设计论文3.5.5DS18B20的时序333.6矩阵式按键的检测364系统设计与调试444.1硬件系统设计与调试444.1.1硬件系统设计原理图444.1.2硬件系统元器件清单444.1.3硬件系统组装与调试454.2软件系统设计与调试454.2.1软件系统设计454.2.2软件系统调试与仿真475问题与展望495.1本设计制作存在的问题495.2展望49参考文献50致谢511 河南理工大学毕业设计论文1概述1、概述1.1毕业设计的选题背景及制作意义1.1.1毕业设计的选题背景单片机以其体积小、编程灵活、控制功能强大、价格低廉等特点被广泛地应用在各种电子电器产品中。单片机技术的出现和发展带来了电子技术和控制领域的一场革命。单片机课程作为职业院校电子信息类专业一门重要的基础课程,它既是一门很有实用价值、实践性很强且很有趣味性的一门课程,同时它又是一门集硬件电路设计与软件编程于一体的学科,既要求我们有较好的电工电子技术基础知识,又要求有一定的逻辑思维和软件开发(编程)能力。通过近几年对单片机的学习,我已掌握单片机的基本知识,并具备了单片机应用系统的初步开发能力。即将毕业之际,为了将自己所掌握的知识与实际应用结合起来,进一步提高工程实践能力,同时也对自己所学知识作以总结及高度概括向老师汇报,我决定将我的毕业设计课题选作基于51单片机的数码日历钟的设计与制作,并以此向老师作毕业汇报。1.1.2毕业设计的制作意义数码日历钟是实际生活中应用较多的一个电子计时产品,广泛地应用在酒店、宾馆、车站、家庭及办公室中,可供人们查询日期、星期,掌握当前时间及环境温度。在上述背景下,需要我运用近几年在学校学到的单片机知识及开发技巧设计和制作出一个功能完善的数码日历钟。通过这个设计的制作,必将进一步提高我的工程实践能力和单片机应用系统开发能力,将我所学到的理论知识与实际应用结合起来,做到理论与实践相结合,同时也能对我高职阶段所学知识作以梳理和总结。这是一个非常实用的设计与制作,成本低廉,若把此数码日历钟装在镜框或其它工艺品中,则更加实用。如能进一步完善其功能,具有一定的实际推广使用价值。1.2数码日历钟的功能要求本设计制作出来的数码日历钟要求能在1602液晶显示屏上显示出年月日及对应的星期几,当前时间及环境。而且要求日期和时间可通过按键调整,当日期调整时,1 河南理工大学毕业设计论文1概述通过相应算法自动实现星期几的调整,无论是否闰年、任何月份,当日期调整时都保证不会出现非法的日期。本设计制作出来的数码日历钟显示如图1-1所示。图1-1毕业设计作品——数码日历钟的显示效果图1.3本设计制作的主要内容本设计制作需要完成的主要内容有:(1)对设计与制作任务进行分析、分解;(2)对设计与制作方案进行可行性论证,选择一种较为现实可行的方案;(3)根据所选方案列出所需硬件元器件、制作与调试工具(软硬件)清单;(4)准备制作与调试工具(软硬件),照单购买所需元器件并进行逐一测试,保证完好;(5)根据所选方案,画出硬件电路原理图;(6)逐一完成每个软件模块的编写与调试,最终编译生成目标程序;(7)整机联调。在Proteus中进行软件仿真,直至实现所有预先设定的功能要求。(8)根据硬件电路原理图搭建电路,并进行电路焊接;(9)对硬件电路进行测试与调试,保证无虚焊、短路等故障,将目标程序写入单片机,再次整机联调(实物);(10)完成毕业设计论文的撰写,提交完整的毕业设计作品,由指导老师审阅,完成毕业设计论文答辩。1 河南理工大学毕业设计论文2数码日历钟的设计与制作任务分析2、数码日历钟的设计与制作任务分析2.1数码日历钟的设计与制作任务的分析与分解本设计任务比较复杂,要考虑的问题很多,故需对设计与制作任务进行分析和分解,使分解后的每一个子任务都在能够容易解决的范围之内。为此,通过对本设计任务的分析,将其按硬件和软件两个方面各分解为几个模块。它们分别是:(1)硬件①根据所选方案画出硬件电路原理图;②根据所选方案,列出所需硬件元器件、制作与调试工具清单(软硬件);③准备制作与调试工具(软硬件);④照单购买所需元器件并进行逐一测试,保证完好;⑤根据硬件电路原理图搭建电路,并进行电路焊接;⑥对硬件电路进行测试与调试,保证无虚焊、短路等故障;(2)软件①1602液晶的显示,编写1602液晶的基础显示函数;②根据已知日期推算出相应的星期几;③运用单片机的定时中断功能实现电子钟功能;④编写按键扫描程序,能够识别按键,并通过相应的按键调整年份、月份、日期、时、分;⑤数字温度传感器18b20的使用;⑥所测温度结果数据的处理及显示。2.2设计方案的论证及选择(1)硬件方面:l主控模块:单片机芯片的选择:考虑到本程序较为复杂,目标程序可能占用存储空间较大,故应选择程序存储器容量稍大一些的单片机芯片较好,但又要顾及尽量降低成本,程序开发、调试、载入方便。综合考虑,决定选用目前占有较大市场份额、技术成熟、资料丰富的Atmel公司生产的AT89S52单片机。-51- 河南理工大学毕业设计论文2数码日历钟的设计与制作任务分析晶振的选择:由于本设计决定采用单片机本身自带的定时/计数器通过定时中断提供秒信号,这样可以降低硬件成本,不再采用专用的时钟芯片,为了便于计算定时/计数器的初值和定时时长,故采用稳定性较高的、固有振荡频率为12MHz的石英晶体振荡器。l显示模块:显示模块既可采用数码管显示,也可采用液晶显示。数码管的优点是价格便宜,显示亮度高,但它也有不少不足之处:当显示的信息量较大时,所用数码管较多,接口电路复杂,编程麻烦;而且其体积较大,不宜用于便携式产品,显示也不够美观;当其中某一段出现劣化而不能正常显示时,需整体更换。字符液晶显示模块的优点是价格适中,与单片机的接口电路简单,便于编程控制其显示,体积小、质量轻、功耗低(功率为10mW,5V电源供电、工作电流只有2mA)、寿命长、可靠性高、显示操作简单,显示美观,且显示的信息量大,特别适合用于便携式电子产品中作显示器件。故本设计中的显示模块决定采用1602图形液晶显示器。l温度测量模块:温度测量模块当然可以采用较为简单的热敏电阻,其阻值会随着周围环境温度的变化而变化。热敏电阻的优点是电路及其工作原理都较为简单,但其测量结果为模拟量,要让单片机去处理其测量结果,需通过ADC(模数转换器)电路,这样又增加了不少成本,且需熟悉ADC与单片机的接口电路及其编程,这就增加了开发的难度和时间,比较麻烦。当然也可采用模拟温度传感器,如LM35,它测得的结果同样是模拟量,也需通过A/D转换,单片机才能处理,既提高了开发成本,又增加了开发难度,故本设计放弃采用以上这两种方案,决定采用美国DALLAS半导体公司生产的采用“一线式”接口的数字化温度传感器DS18B20。相比热敏电阻,该传感器的优点是可谓是多多:首先,它的硬件电路非常简单,与单片机的接口也很简单,和单片机之间的数据传输只用了一条线。测温范围为-55℃~+125℃,固有测温分辨率0.5℃。具有耐磨耐碰,体积小,工作电源:3~5V/DC。非常适合要求。l按键调整控制模块:由于笔者对矩阵式按矩的检测方法已十分熟悉,故本设计中的按键调整模块决定采用12只弹性小按键构成矩阵式按键检测方法采用行列反转法。硬件系统的组成框图如图2-1所示:图2-1数码日历钟硬件系统组成框图(2)软件方面:-51- 河南理工大学毕业设计论文2数码日历钟的设计与制作任务分析l编程语言选择:考虑到本设计任务较为复杂,C语言的模块化程序设计思想能够较好地解决这个问题,且用C语言编写程序,开发效率高,生成的目标代码质量也较高,执行效率高,综上所述,故本设计任务采用C语言编程。l编译环境软件选择:本设计选用目前单片机应用系统开发使用最泛的集成开发编译软件——Keil公司的KeilC,它既可用于汇编程言源程序的编辑、编译,生成目标程序,也可用于C语言源程序的编辑、编译、连接并生成目标代码。l仿真软件选择:在焊接硬件电路之前,为避免不必要的麻烦,要对本设计系统进行软件仿真,直到仿真运行无误后,再焊接元器件,搭建本设计硬件电路。本设计选用目前单片机应用系统仿真中最受欢迎的一款软件——英国LabcenterElectronics公司开发的电子电路设计与仿真软件——Proteus。它包括ISISARES等软件模块,ARES模块主要用来完成PCB的设计,而ISIS模块用来完成电路原理图的制图与仿真。Proteus的软件仿真基于VSM技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片以及单片机外围电路,例如键盘、LED、LCD等等。通过Proteus软件的使用,我们能够轻易地获得一个功能齐全、实用方便的单片机实验室。Proteus软件有十多年的历史,在全球广泛使用,除了具有和其它EDA工具一样的原理图制图、PCB自动或人工布线及电路仿真的功能外,其革命性的功能在于其电路仿真是互动的,针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现软件源码级别的实时调试,如果显示及输出,还能看到运行后输入输出的效果,此外系统还配置有丰富的虚拟仪器,如示波器、逻辑分析仪等。-51- 河南理工大学毕业设计论文3相关知识链接3、相关知识链接3.151单片机简介3.1.151单片机简介单片机就是将中央处理器(CPU)、存储器(包括程序存储器ROM和数据存储器RAM)、I/O接口电路、定时/计数器、中断系统和时钟电路等计算机基本部件集成在一块芯片上,具有独特功能的单片微型计算机(SingleChipMicrocomputer,简写为SCM)。由于其体积小,主要应用在控制领域,所以又被称为微控制器(MicroControllerUnit,简写为MCU)。单片机出现的历史并不长,其前身起源于上世纪70年代研制成功的微处理器(利用大规模集成电路制造技术将计算机的运算器和控制器集成为一体)。作为一门非常有前途的计算机技术,单片机一经出现就迅速发展起来。一路走来,单片机的性能在不断提高,存储容量也在不断增大,而体积、价格、功耗却在不断降低。由于其体积小、控制功能强大、编程灵活、价格低廉,所以在控制领域得到了广泛的应用。可以说,凡是与控制或简单计算有关的场合,都可以用单片机来实现。目前,单片机已得到了大力推广和广泛应用,从工业控制系统到日常工作和生活的方方面面,单片机的应用几乎无处不在。从形形色色的家用电器、电子玩具、数码产品,到各种医疗器械、智能仪器仪表、通信设备,大到航空航天、雷达、导弹等现代化武器装备,单片机的身影无处不在。复杂的工业控制系统中甚至有数百台单片机在同时工作。单片机的应用从根本上改变了传统的控制系统的设计思想和设计方法,可以说,单片机技术的出现和发展给现代电子技术和控制领域带来了一场新的革命。以往由硬件电路实现的大部分控制功能现在都能够使用单片机通过软件方式来实现,这种以软件取代硬件并能够提高系统性能的微控制技术,随着单片机应用的推广普及,不断发展,日益完善。因此,学习单片机,掌握其应用和开发技术,也成为当今职业院校电子信息专业的学生必须具备的一项基本技能。下面谈谈单片机的发展情况及其常用系列。虽然单片机出现的历史并不长,至今也不到四十年的时间,但其发展却十分迅猛。1976年,美国的Intel公司在8位微处理器的基础上首先研制成功了最早的单片机产品——-51- 河南理工大学毕业设计论文3相关知识链接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单片机的全部功能外,还内置了一些非常实用的功能。例如,它采用FlashROM、支持ISP(在系统可编程)功能,可以反复快速擦写,因此程序写入和调试非常方便,使得我们在写入程序时不需再依靠传统的编程器,只需使用它所支持的专用ISP软件就可轻易将程序写入,它改变了单片机应用系统的结构模式和开发运行条件,此外它还增加了一些外部接口功能,内置有看门狗。AT89S52是目前占有较大市场份额、性能卓越的典型的51系列单片机。AT89S52单片机的主要参数如下:l8KB在系统可编程FlashROM存储器。l片内256BRAM存储器。l工作电源电压:4.0V~5.5V。l可重复擦写1000次。l时钟频率0Hz~33MHz。l加密结构:三级。l可编程并行I/O口:4×8位。l定时/计数器:3个16位可编程定时/计数器。l中断源:8个可编程中断源。l全双工UART串行通道。l具有低功耗空闲工作模式和掉电保持模式。l内置看门狗定时器和复位电路。l双数据指针。-51- 河南理工大学毕业设计论文3相关知识链接3.1.251单片机引脚功能介绍单片机就是一块集成电路,在使用其之前,必须先了解其外部引脚功能。51单片机有多种封装方式,下面以DIP-40封装为例介绍其引脚功能。DIP-40封装的AT89S52单片机实物图如图3-1所示。图3-1DIP-40封装的AT89S52单片机实物图由于受到集成电路芯片引脚数目的限制,许多引脚具有双重功能。AT89S52单片机的引脚排列如图3-2所示。按其功能类别来划分,这40个引脚可分为以下四类:电源引脚、时钟引脚、I/O接口引脚、编程控制引脚。各引脚功能介绍如下。(1)电源引脚Vcc和GND集成电路都需要电源供电才能正常工作,单片机也不例外。采用DIP-40封装的AT89S52单片机的第40脚Vcc为电源正极输入端,一般接+5V,第20脚GND为电源负极输入端,接电源负极,也作为电路中的公共接地端。图3-2DIP-40封装的AT89S52单片机外部引脚图(2)时钟引脚XTAL1和XTAL2-51- 河南理工大学毕业设计论文3相关知识链接第19脚XTAL1为片内振荡电路输入端,第18脚XTAL2为片内振荡电路输出端。在使用片内时钟发生电路时,这两个引脚用于外接石英晶体和振荡电容(取值一般为10p~30p),此时晶振频率即为时钟振荡频率;在使用片外时钟电路时,这两个引脚用于外接外部时钟源。需要说明的是:本设计采用单片机内部时钟振荡电路,所以这两个引脚外接石英晶体和振荡电容。为便于计算定时器的初始值及定时时间,晶振频率为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语言写程序时则应写成Pm^n的形式。P0口(第39~30脚,其中第39脚为P0.0,即最低位,第32脚为P0.7,即最高位,其余依此递推)为8位双向三态I/O口。值得注意的是,P0口内部没有上拉电阻,不能正常输出高电平,因此P0口在作为通用I/O口作基本输入输出使用时必须外接上拉电阻,否则应输出高电平时为高阻态,无法正常输出高电平。上拉电阻阻值一般取10KW。P0口除了作为I/O口使用外,在系统扩展时还作为低8位地址总线和数据总线分时复用。本设计中的1602液晶显示器的数据总线就是与P0口连接的,已外接上拉电阻。P1口(第1~8脚,其中第1脚为P1.0,即最低位,第8脚为P1.7,即最高位,其余递推)为8位准双向并行I/O口。P1口内部已接有上拉电阻,故在使用时无需再接上拉电阻。P1口功能较为简单,仅作基本I/O口使用,没有第二功能。本设计中用P1口作为矩阵式按键接口使用。P2口(第21~28脚,其中第21脚为P2.0,即最低位,第28脚为P2.7,即最高位,其余递推)为8位准双向并行I/O口。P2口内部也已接有上拉电阻,故在使用时无需再接上拉电阻。P2口除了作为I/O口使用外,在系统扩展时还作为高8位地址总线使用。P3口(第10~17脚,其中第10脚为P3.0,即最低位,第17脚为P3.7,即最高位,其余递推)作为第一功能使用时为普通的8位并行I/O口,在使用时也无需再接上拉电阻。需要强调的是:P3口的每个引脚又各自具有非常重要的第二功能。P3口的每个引脚的第二功能如表3-1所示。注意:P3口每个引脚各自具有的第二功能都是比较重要的控制信号,在实际应用中应优先满足第二功能使用需要,然后再用剩余的口线作为数据的输入和输出使用。由于本设计中不涉及到P3口第二功能的使用,故不再对P3口的第二功能作详细介绍。-51- 河南理工大学毕业设计论文3相关知识链接以上四个I/O口既可字节操作(8位同时并行输入输出),亦可位操作(即每根口线均可独立控制)表3-1AT89S52单片机P3口的第二功能引脚名称第二功能功能描述P3.0RXD串行数据输入P3.1TXD串行数据输出P3.2外部中断0中断请求输入P3.3外部中断1中断请求输入P3.4T0定时/计数器0外部时钟输入P3.5T1定时/计数器1外部时钟输入P3.6外部RAM写选通信号P3.7外部RAM读选通信号(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写入程序时也无需编程脉冲输入,故不涉及该引脚的使用,故闲置。-51- 河南理工大学毕业设计论文3相关知识链接第31脚/Vpp具有双重功能。其第一功能为访问片内、片外ROM的控制信号,当该引脚接低电平时,CPU对ROM的访问限定在片外ROM(对于片内没有ROM的单片机,如8031,CPU只能访问片外ROM,则该引脚一直是接低电平的);当该引脚接高电平时,CPU对ROM的访问方式为,如果地址不超过片内ROM的存储单元范围,则访问片内ROM(低端地址),当地址信号所标志的存储单元超出片内ROM范围时(高端地址),则自动延伸至片外ROM(即只能访问片外ROM的高端存储单元)。该引脚的第二功能Vpp用于对片内含有EPROM的单片机(如8751),对其内部EPROM写入程序时作编程电压输入端。本设计中采用的AT89S52单片机片内含有8KBFlashROM,其存储容量已能满足需求,无需扩展片外ROM,且AT89S52单片机支持ISP(在系统可编程)功能,无需编程电压输入,故此引脚直接接高电平(与第40脚电源正极相连),仅限于对片内程序存储器的访问。3.2由已知日期推算星期几3.2.1如何判断一个年份是否是闰年数码日历钟显示的年份如果是闰年,则2月为29天,否则为28天。在本设计任务中,无论是日期的调整,还是星期几的推算,都涉及到闰年的判断。查阅相关资料可知,如果一个年份是闰年,则该年份必然满足以下两个条件其中之一:(1)年份是4的整数倍但不是100的整数倍;(2)年份是400的整数倍。只要年份能满足以上两个条件其中之一,便可判定是闰年,否则不是闰年。于是,不难写出判断一个年份是否闰年的函数如下:bitleap(intyear)//判断是否闰年函数{return(year%4==0&&year%100!=0||year%400==0);}//闰年的条件该函数的类型为C51中扩展的bit型(即位类型),这种类型的函数的返回值只能是0或1,不能为其它值。具体到本函数,若年份能满足闰年的条件则返回1,否则返回0。3.2.2由已知日期如何推算星期几我们在日常生活中经常会遇到这样的问题,忘记了某年某月某日是星期几,特别是一些重大节日或是一些值得纪念的日子,这就是星期几的推算问题。那么,如何由一个已知日期推算出是星期几呢?-51- 河南理工大学毕业设计论文3相关知识链接人们一般会采用这样的方法:从一个已知星期几的某天开始推算,先计算已知星期几的这一天距要推算的那天共相差几天,由于星期是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则是星期二,……如此等等。由已知日期推算星期几的函数的参考源代码如下:chartuisuan(inty,charm,chard)//根据已知日期推算星期几{ints;//变量s用于存放总天数switch(m){case1:s=0;break;-51- 河南理工大学毕业设计论文3相关知识链接//如果欲推算的这一天在1月份,则当月之前经历了0天case2:s=31;break;case3:s=59;break;case4:s=90;break;case5:s=120;break;case6:s=151;break;case7:s=181;break;case8:s=212;break;case9:s=243;break;case10:s=273;break;case11:s=304;break;case12:s=334;break;}if(m>2&&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星期计算问题测试数据表测试数据运行结果第一组1949年10月1日星期六第二组2008年8月8日星期五第三组2012年4月21日星期六3.31602字符液晶的使用3.3.1液晶概述液晶(LiquidCrystal)是一种高分子材料,由于它具有特殊的物理、化学、光学特性,被广泛地应用在各种轻薄型显示器上,如手机屏幕、笔记本电脑显示屏及各种便携式电子信息产品中。液晶显示器(LiquidCrystalDisplay,简写为LCD)的主要显示原理是以电流刺激液晶分子产生点、线、面并配合背部灯管构成画面。为叙述方便,通常把各种液晶显示器都直接叫做液晶。-51- 河南理工大学毕业设计论文3相关知识链接液晶显示器具有体积小、质量轻、功耗低(功率为10mW,5V电源供电、工作电流只有2mA)、可靠性高、显示操作简单等优点,被广泛地应用在各种便携式电子信息产品中作显示器件。特别是电池供电的单片机产品中,液晶显示器几乎是必选的显示器件。但是,液晶也有一个致命的弱点,那就是其使用的温度范围很窄,通用型液晶正常工作温度范围为0℃~+55℃,存储温度范围为-20℃~+60℃。即使是宽温级液晶,其正常工作温度范围也仅为-20℃~+70℃,存储温度范围为-30℃~+80℃。(高寒地区难以正常工作)。因此在设计相应产品时务必要考虑周全,选取合适的液晶。按照能够显示的字符个数和行数,液晶有多种型号(如1602、0801等,它们属于字符液晶,只能用于显示英文字母、阿拉伯数字及其他一些ASCII字符,不可用来显示汉字。字符液晶显示的是点阵字符,有5×7、5×10两种点阵字型可编程选择,每一个字符位可显示一个ASCII码字符。1602意即每行可显示16个字符,一共可以显示两行)。也有的液晶型号是按照液晶显示点阵的行、列数来命名的,如:12232、12864、320240,这些都是图形液晶,可用于显示图形与汉字。12864意即横向有128列、竖向有64行的点阵,通过编程控制让其中哪些点亮、哪些点不亮,就可以显示一个特定的画面。根据显示的色彩,液晶还可分为单(色)显液晶和彩(色)显液晶。根据操作的方式不同,液晶还可分为串行操作方式与并行操作方式。目前,市场上的1602液晶以并行操作方式居多。3.3.2LCM引脚功能介绍通常将LCD控制器、显示器及RAM(用于存储显示的数据)、ROM(用于存放指令)连接在一块印刷电路板上,称为液晶显示控制模块(LCM)。1602液晶显示模块有16个引脚,其引脚功能介绍如表3-3所示:表3-31602液晶显示模块引脚功能表引脚编号符号功能说明引脚编号符号功能说明1电源地(负极)9数据和命令通道2电源正极10数据和命令通道3液晶显示对比度调节端11数据和命令通道4数据/命令选择端12数据和命令通道5读写控制端13数据和命令通道6使能端14数据和命令通道7数据和命令通道15背光电源正极8数据和命令通道16背光电源负极-51- 河南理工大学毕业设计论文3相关知识链接引脚功能说明:第1脚、第2脚为整个LCM模块的电源端,第15脚、第16脚为背部光源的电源正、负极。引脚如此设置,第1脚和第16脚均是接地,第2脚和第15脚均是电源正极,即使插错,最多导致液晶不能正常工作显示,但不至于烧坏液晶。RS为存储器选择位,RS=1,对数据存储器进行读写,RS=0,对指令存储器进行读写。为读写控制信号,=1,对模块进行读操作;=0,对模块进行写操作。EN为LCM模块的使能控制端,正脉冲有效。~为LCM的数据/指令总线。、控制读、写存储器操作格式如表3-4所示:表3-4RS、的功能描述RS操作00对指令存储器进行写操作01从指令存储器读出“忙”标志信号和当前地址到数据总线10对数据存储器进行写操作11对数据存储器进行读操作3.3.3LCD1602字符液晶显示模块指令集LCD1602字符液晶显示模块指令集如表3-6所示。必要说明:(1)BF为LCD控制模块的“忙”标志位。BF=1,LCD控制模块忙,不能接收任何指令或数据;BF=0,LCD控制模块不忙,可以接收指令或数据。向LCD控制模块发送指令或数据前应先查询BF状态。(2)DDRAM为LCD显示控制模块的显示数据存储器,它共有80个单元,分为两行,其中每行的前16个单元可显示。每个存储单元都有一个独立的编号即地址。当前活动单元的地址存放在地址计数器AC中。CGRAM为LCD显示控制模块的字符发生存储器,共64个单元,用于存放自定义字符。S/和R/的功能如表3-5所示,LCM的常用指令汇总如表3-7所示。表3-5S/和R/的功能说明表S/R/功能说明00光标左移,地址计数器AC的值自动减1-51- 河南理工大学毕业设计论文3相关知识链接01光标右移,地址计数器AC的值自动加110光标和显示字符一起左移11光标和显示字符一起右移表3-6LCD1602字符液晶显示模块指令集-51- 河南理工大学毕业设计论文3相关知识链接读写操作数据口指令及指令关键字说明RSD7D6D5D4D3D2D1D00000000001清屏指令01H:将DDRAM内容全部清除,并把地址计数器AC置为第一行第一字符位置处。0000000010归位指令02H:将DDRAM地址计数器AC置为第一行第一字符位置处。但DDRAM内容不清除。00000001I/S输入方式设置指令04~07:=1,增量方式,地址计数器AC自加1;=0,减量方式,地址计数器AC自减1;S=1,显示内容整体移位;S=0,显示内容整体不移位。0000001DCB显示开关控制指令08~0F:D=1,开显示;D=0,关显示;C=1,开光标;C=0,关光标;B=1,光标闪烁;B=0,光标不闪烁。000001S/R/XX光标或显示移位指令10H~1FH:S/=1,显示移位;S/=0,光标移位;R/=1,右移;R/=0,左移;X-任意。S/和R/的功能见表3-3。00001DLNFXX功能设置指令20H~3FH:DL=1,采用8位数据总线;DL=0,采用8位数据总线;N=1,显示双行;N=0,显示单行;F=1,采用5×10点阵;F=0,采用5×7点阵;X-任意。0001A5A4A3A2A1A0CGRAM地址设置指令40H~7FH:CGRAM是LCD存放自定义字符的存储器,地址范围为:00H~3FH.A0~A5为CGRAM地址。001A6A5A4A3A2A1A0DDRAM地址设置指令80H~FFH:设置地址指针至AC中,随后对DDRAM进行读/写操作即从此新地址开始,第一行首地址为80H,第二行首地址为C0H01BFA6A5A4A3A2A1A0读BF及AC指令:BF为LCD控制模块的“忙”标志位,BF=1,LCD控制模块忙,不能接收任何指令或数据;BF=0,LCD控制模块不忙,可以接收指令或数据。向LCD控制模块发送指令或数据前应先查询BF状态。A0~A6为地址计数器AC的当前值。10D7D6D5D4D3D2D1D0写数据指令:将数据写入地址计数器AC当前所指向的DDRAM存储单元中。11D7D6D5D4D3D2D1D0读数据指令:将地址计数器AC当前所指向的DDRAM存储单元中的数据读出,送至数据总线。表3-7LCM的常用指令汇总表-51- 河南理工大学毕业设计论文3相关知识链接编号指令功能说明10x38工作方式设置指令,设置为8位数据总线,双行显示,采用5×7点阵。20x0e显示开关控制指令,设置为开显示开光标,光标不闪烁。30x06输入方式设置指令,设置地址计数器AC为增量计数方式,即自动加1计数,光标右移,显示画面不移动。40x01清屏指令,清除液晶屏显示内容,使光标回到第一行第一字符位置处,一般用于液晶屏的初始化。50x80DDRAM第一行的首地址60xc0DDRAM第二行的首地址3.3.4LCD1602字符液晶显示模块与单片机的接口LCD1602字符液晶显示模块与单片机的硬件连接如图3-3所示。图3-3LCD1602字符液晶显示模块与单片机的硬件连接图3.3.5LCD1602字符液晶显示模块的基础函数(1)引脚定义:sbitRS=P2^4;//*定义液晶模块的数据/指令存储器选择位*/sbitRW=P2^5;//定义液晶模块的读/写控制选择位*/sbitEN=P2^6;/定义液晶模块的使能端(2)向1602液晶显示模块写指令函数:voidwrite_cmd(unsignedcharcmd)//形式参数cmd为要写入的指令{RS=0;//对指令存储器进行写操作,初始化时已定义为写操作-51- 河南理工大学毕业设计论文3相关知识链接P0=cmd;//将要写入的指令送到指令总线上以便写入液晶模块delay(10);//稍作延时,以待指令数据稳定EN=1;//将使能端置高电平,使其有效,以便向液晶模块写入指令delay(10);//加以延时,以便将指令写入到液晶模块EN=0;//将使能端复位至低电平状态,为下次操作做准备}(3)向1602液晶显示模块写数据函数:voidwrite_dat(unsignedchardat)//形式参数dat为要写入的数据{RS=1;//对显示数据存储器(DDRAM)进行写操作P0=dat;//将要写入的数据送到数据总线上以便写入液晶模块delay(10);//稍作延时,以便使数据稳定EN=1;//将使能端置高电平使其有效,以便向液晶模块写入数据delay(10);//加以延时,以便将数据写入到DDRAMEN=0;//将使能端复位至低电平状态,为下次操作做准备}(4)1602液晶显示模块的初始化函数:voidLCD_init()//1602液晶显示模块的初始化函数{EN=0;//将使能端复位至低电平状态,为对液晶模块操作做准备RW=0;//由于现只对液晶模块进行写操作,故将LCD模块的读写控制端置低电平write_cmd(0x38);//设置为8位数据总线,双行显示,采用5×7点阵write_cmd(0x0c);//开显示关光标,光标不闪烁write_cmd(0x06);/*设置地址计数器AC为加法计数方式,即自动加1计数,光标右移,显示画面不移动*/write_cmd(0x01);//清屏,清除DDRAM中原有内容,AC复位至第一行首地址。}(5)1602液晶显示模块的显示函数定义如下:voiddisplay(){unsignedchari;write_cmd(0x80);//设定第一行的首地址for(i=0;i<16;i++)//逐个写入第一行的各个字符write_dat(first[i]);write_cmd(0xc0);//设定第二行的首地址for(i=0;i<16;i++)//逐个写入第二行的各个字符write_dat(second[i]);}-51- 河南理工大学毕业设计论文3相关知识链接说明:在源程序预包含的头文件head.h中已定义两个数组first[16]和second[16],分别用于存放液晶的两行要显示的内容。3.451单片机中的中断与定时3.4.151单片机中的中断中断功能是单片机的一个非常重要的功能,中断系统也是单片机中非常重要的组成部分,它是为了使单片机能够对外部或内部随机发生的事件实时处理而设置的。中断功能的存在,在很大程度上提高了单片机的实时处理能力,是单片机学习者必须掌握的重要内容。我们不但要了解单片机中断系统的资源配置情况,还要掌握通过相关的特殊功能寄存器打开和关闭中断源、设定中断优先级,掌握中断服务程序的编写方法。(1)中断的概念对于单片机来讲,中断是指CPU正在执行主程序的过程中,由于CPU之外的某种原因,有必要暂停主程序的执行,转而去执行相应的处理(中断服务)程序。待处理程序结束之后,再返回原程序断点处继续运行,这一过程称为中断。引起中断的事件称为中断源。51单片机中共有5种中断源:两个外部中断(、)、两个定时/计数器中断(T0、T1)和一个串行口通信中断。(2)51单片机的中断系统51单片机的中断系统的内部结构框图如图3-4所示。图3-451单片机的中断系统内部结构框图由图3-4可知,51单片机系统中用于定时/计数器中断控制的寄存器为TCON,中断允许寄存器IE来控制定时/计数器的启动与停止及中断的开关。51单片机内部有2个16位的定时/计数器,分别是T0和T1。52单片机则比51单片机扩展了一个定时/计数器T2。当计数器计满溢出时就会向CPU发出中断请求。关于51单片机的定时器中断,后面将有详细介绍。(3)中断标志-51- 河南理工大学毕业设计论文3相关知识链接TCON即定时/计数器控制寄存器,这是一个可位寻址的8位特殊功能寄存器,即可以对其每一位单独进行操作。它不仅与两个定时/计数器的中断有关,也与两个外部中断源有关。它可以用来控制定时/计数器的启动与停止,标志定时/计数器是否计满溢出和中断情况,还可以设定两个外部中断的触发方式、标志外部中断请求是否触发。因此,它又被称为中断请求标志寄存器。单片机复位时,TCON的全部位均被清0。其各位名称如表3-8所示。表3-8定时/计数器控制寄存器TCON的各位功能说明位号D7D6D5D4D3D2D1D0位名称TF1TR1TF0TR0IE1IT1IE0IT0TCON寄存器中和定时/计数器中断有关的位的功能介绍如下:TR0:定时/计数器0(T0)的启动控制位。当TR0=1时,T0启动计数;当TR0=0时,T0停止计数;TF0:定时/计数器0(T0)的溢出中断标志位。当定时/计数器0计满溢出时,由硬件自动将TF0置1,并向CPU发出中断请求,当CPU响应该中断进入中断服务程序后,由硬件自动将该位清0,不需用专门的语句将该位清0。需要说明的是:如果使用定时/计数器的中断功能,则该位完全不用人为操作,硬件电路会自动将该位置1、清0,但是如果中断被屏蔽,使用软件查询方式去处理该位时,则需用专门语句将该位清0。TR1:定时/计数器1(T1)的启动控制位。其功能及使用方法同TR0。TF1:定时/计数器1(T1)的溢出中断标志位。其功能及使用方法同TF0。其余四位与外部中断相关,是两个外部中断的中断请求标志位和触发方式控制位,本设计不涉及,故不再赘述。(4)中断允计寄存器IE在MCS-51单片机的中断系统中,中断的允许或禁止是在中断允许寄存器IE中设置的。IE也是一个可位寻址的8位特殊功能寄存器,即可以对其每一位单独进行操作,当然也可以进行整体字节操作。单片机复位时,IE全部被清0。其各位定义如表3-9所示。表3-9中断允许寄存器IE的各位功能定义位号D7D6D5D4D3D2D1D0位名称EA——ESET1EX1ET0EX0中断允许寄存器IE中和定时/计数器中断有关的位的功能定义说明如下:EA:即EnableAll的缩写,全局中断允许控制位。当EA=0时,则所有中断均被禁止;当EA=1时,全局中断允许打开,在此条件下,由各个中断源的中断控制位确定相应的中断允许或禁止。换言之,EA就是各种中断源的总开关。-51- 河南理工大学毕业设计论文3相关知识链接ET0:定时/计数器0的中断允许位。如果ET0置1,则允许定时/计数器0中断,否则禁止定时/计数器0中断。ET1:定时/计数器1的中断允许位。如果ET1置1,则允许定时/计数器1中断,否则禁止定时/计数器1中断。例如:如果我们要设置定时/计数器T0中断允许,其他中断不允许,则IE寄存器各位取值如表3-10所示。表3-10IE寄存器的各位取值位号D7D6D5D4D3D2D1D0位名称EA——ESET1EX1ET0EX0取值10000010即IE=0x82。当然,我们也可以用位操作指令来实现:EA=1,ET0=1。(5)中断初始化及中断服务程序结构中断初始化实质上就是对与中断有关的特殊功能寄存器TCON、IE进行管理和控制,具体实施如下:①CPU的开、关中断(即全局中断允许控制位的打开与关闭,EA=1或EA=0);②具体中断源中断请求的允许和禁止(屏蔽);中断的管理和控制(即中断初始化)程序一般都包含在主函数的初始化函数中,根据需要通常只需几条赋值语句即可完成。中断服务程序是一种具有特定功能的独立程序段,往往写成一个独立函数,函数内容可根据中断源的要求进行编写。C51的中断服务程序(函数)的格式如下:void中断处理程序函数名()interrupt中断序号{中断处理程序内容;}中断处理函数不会返回任何值,故其函数类型为void型,函数类型名void后紧跟中断处理程序的函数名,函数名可以任意命名,只要合乎C51中对标识符的规定即可;中断处理函数不带任何参数,所以中断函数名后面的括号内为空;interrupt即“中断”的意思,是为区别于普通自定义函数而设;中断序号是编译器识别不同中断源的唯一符号,它对应着中断服务程序入口地址,因此在写中断函数时一定要把中断序号写准确,否则中断程序将得不到运行。51单片机的5个中断源的中断序号、默认优先级别、对应的中断服务程序的入口地址如表3-11所示:表3-1151单片机的中断源的中断序号、-51- 河南理工大学毕业设计论文3相关知识链接默认优先级及对应的中断服务程序入口地址中断源名称中断序号默认优先级别中断服务程序入口地址外部中断0()0最高0003H定时/计数器0中断1第2000BH外部中断1()2第30013H定时/计数器1中断3第4001BH串行口中断4第50023H3.4.251单片机中的定时/计数器在工业控制与民用电子领域中,经常需要用到定时或延时控制或对某些外部事件进行计数。例如,全自动洗衣机中的各种定时控制;工业生产中,对流水线上的产品计数打包控制等。如果这些控制都采用软件方式,则势必影响单片机的实时控制。因此,为了适应控制领域的这一要求,单片机内部都集成了定时/计数器。51单片机内部集成了两个16位的定时/计数器,即T0和T1。52单片机则比51单片机扩展了一个定时/计数器T2。从名称上就可以看出它们既具有计数功能又具有定时功能。定时/计数器的实质就是计数器,它是由若干个触发器组成的一个计数系统,其功能是能对输入脉冲进行计数。如果输入脉冲的周期是固定的,即计数脉冲的时间间隔相等,那么计数值还代表了时间,从而计数转化为计时,可以实现定时功能。T0和T1都是16位的加法计数器,它们的容量是有限的,不可能无限制地持续计数,其计数最大值为65535(即二进制数1111111111111111B),此时,若再输入一个计数脉冲则计满溢出,将对应的计满溢出标志位置1,向CPU发出中断申请,请求CPU暂停当前程序的执行,转而来执行相应的中断处理程序。图3-551单片机的定时/计数器逻辑结构图-51- 河南理工大学毕业设计论文3相关知识链接51单片机内部的定时/计数器的逻辑结构如图3-5所示,T0和T1都是16位的可编程定时/计数器,通过设置和它们相关的特殊功能寄存器可以选择其作为定时器使用或作为计数器使用。需要注意的是:51单片机中的定时/计数器系统是单片机内部一个独立的硬件部分,它与CPU和晶振通过内部某些控制线连接并相互作用,一旦CPU启动计数器工作时,计数器便在输入脉冲的作用下开始计数,计数器的计数与CPU的工作是同时进行的,直到计数器计满溢出将相应的溢出标志位置1,向CPU发出中断请求,CPU在允许中断的情况下才暂停当前程序的执行,转去执行相应的中断服务程序。由图3-5可知:51单片机的定时器系统由定时器T0、定时器T1、定时器控制寄存器TCON和定时器工作方式寄存器TMOD组成。T0和T1都可对输入脉冲进行加法计数,即每来一个脉冲计数器的值加1,直到计满溢出。每一个计数器都是由两个8位计数器(即高8位THX(X=0,1)和低8位TLX(X=0,1))组成,TH1、TL1、TH0、TL0都可以单独访问。当定时/计数器的计数脉冲来自单片机外部(从单片机的P3.4(T0)、P3.5(T1)输入)时,由于外部输入脉冲的周期不固定性,此时定时/计数器工作于计数状态;如果定时/计数器的计数脉冲来自单片机内部(对机器周期进行加法计数,一个机器周期等于12个时钟周期,即机器周期脉冲是时钟脉冲的十二分频)时,由于晶振产生的时钟脉冲的周期是非常稳定的,所以当计数值一定时,计数的时间也随之而定,此时定时/计数器工作于定时状态。对于16位的计数器而言,其计数最大容量为65536。如果其初始值为零,当输入65535个脉冲后,其计数值为65535(即二进制数1111111111111111B),再来一个脉冲,计数器的值将计满溢出回零(进位信号将相应的计满溢出标志位TFX(X=0,1)置1,从而向CPU发出中断请求)。如果所需计数值小于65536,怎么办呢?这就好比一个空的水瓶,要滴1万滴水才会滴满溢出,我们在开始滴水之前先放入一些水,就不需要1万滴了。比如先放入2000滴,再滴8000滴就可以把瓶子滴满。在单片机中,也采用类似的方法,称为预置初始数法。我们要计50000,那就先预置计数器的初始值为15536(65536-50000),再输入50000个脉冲,不就到65536从而计满溢出了嘛!使用定时/计数器时,首先在程序中用相关赋值语句设定好定时/计数器的启动方式、功能模式、工作方式及计数初始值(这一过程我们习惯称为定时/计数器的初始化),然后启动它工作,定时/计数器将按照设定好的工作方式,从计数初始值开始,对指定的计数脉冲加1计数,此时不占用CPU时间,CPU的工作与计数器的计数是同时进行的且互不影响,直到定时/计数器计满溢出才向CPU发出中断请求信号,CPU通过中断或软件查询方式处理溢出后的服务。如果计满溢出后没有停止定时/计数器工作,则定时/计数器继续进行加1计数,每次计满溢出时都会向CPU发出中断请求。-51- 河南理工大学毕业设计论文3相关知识链接T0和T1都有定时和计数两种功能,这两种功能的主要区别在于计数脉冲来源不同。当计数脉冲从单片机的T0(P3.4)、T1(P3.5)脚输入时,为计数功能。由于计数器至少需要用两个机器周期来判断一个计数脉冲(计数脉冲的高电平和低电平的持续时间在一个机器周期以上),所以从外部输入的计数脉冲的最高频率为晶振产生的时钟脉冲频率的24分频(),否则将会产生计数误差。当计数脉冲来自于单片机内部的机器周期时,此时每过一个机器周期,定时/计数器的值就加1,直至计满溢出。由于机器周期是非常稳定的,计数值也就对应一个固定的时间,定时/计数器的功能也就转化为定时模式。定时器的定时时间的长短与系统晶振的振荡频率密切相关。例如,为便于计算,本设计中的单片机系统采用12MHz的晶振,一个机器周期由12个振荡脉冲组成,则计数脉冲的频率为振荡频率的12分频,即12MHz/12=1MHz,计数周期为1ms,如果计数器的初始值为零,则最长定时时间为65536ms,即65.536ms。如果赋予定时器一个合适的初始值,就可获取一个需要的定时时间。如果所需定时时间大于定时器所能定时的最长时间,可采用多次定时法以达到要求。下面简要介绍一下定时/计数器的方式和控制寄存器。我们可以通过设置定时器工作方式寄存器TMOD来决定定时/计数器的启动方式、计数脉冲源的选择(从而可以决定使其工作于计数功能或定时功能)、工作方式,可通过设置定时器控制寄存器TCON来控制定时/计数器的启动与停止。(1)定时器工作方式寄存器TMODTMOD是一个字节操作的特殊功能寄存器,不可对其进行位操作。单片机复位时,TMOD的各位均被清0。其各位名称如表3-12所示。表3-12定时器工作方式寄存器TMOD的各位功能说明位号D7D6D5D4D3D2D1D0位名称GATEM1M0GATEM1M0高4位控制定时/计数器T1低4位控制定时/计数器T0由表3-12可知。定时器工作方式寄存器TMOD的高4位用于控制定时/计数器T1,低4位用于控制定时/计数器T0,下面对其各位功能介绍如下:GATE:门控位。该位影响定时/计数器的启动控制方式。当GATE=0时,定时/计数器的启动与停止仅受定时器控制寄存器TCON中的TRX(X=0,1)的控制。此时,若TRX=1,接通定时/计数器的输入脉冲,启动定时/计数器工作;若TRX=0,则切断定时/计数器的输入脉冲来源,使定时/计数器停止工作。当GATE=1时,定时/计数器的启动与停止由定时器控制寄存器TCON中的TRX和外部中断引脚(或-51- 河南理工大学毕业设计论文3相关知识链接)上的电平状态共同控制。此时,若TRX和(X=0,1)均为高电平,则接通定时/计数器的输入脉冲,启动定时/计数器工作;若TRX和不全为高电平,则切断定时/计数器的输入脉冲来源,使定时/计数器停止工作。:定时/计数功能选择位。当=0时,定时/计数器的计数脉冲来源于单片机内部时钟脉冲的十二分频(即机器周期),此时,由于计数周期是固定的,计数就转化为定时,定时/计数器工作在定时功能模式。当=1时,定时/计数器的计数脉冲来源于单片机外部(从单片机的P3.4(T0)、P3.5(T1)输入),此时,由于计数脉冲的周期是不固定的,定时/计数器工作在计数功能模式。GATE与对定时/计数器的控制作用(以T0为例)如图3-6所示。图3-6定时/计数器控制逻辑图M1和M0:工作方式选择位。T0和T1,每个定时/计数器都有四种工作方式,由M1和M0来设定。定时/计数器的工作方式选择与M1M0值的对应关系如表3-13所示。表3-13定时/计数器的4种工作方式选择表M1M0工作方式功能说明00方式0仅作为13位的定时/计数器使用01方式1作为16位的定时/计数器使用10方式2作为8位定时/计数器使用,初始值可自动重载11方式3仅适用于T0,分成两个8位的计数器使用,T1停止工作定时器控制寄存器TCON是一个可位寻址的8位特殊功能寄存器。其低4位内容与外部中断有关,高4位控制定时/计数器的启动与停止、记录定时/计数器的是否溢出状态,其各位功能说明详见上一小节内容,在此不再赘述。值得注意的是,单片机复位时,TCON的各位也均被清0。定时/计数器共有4种工作方式,下面予以详细介绍。(1)工作方式0(M1M0=00)-51- 河南理工大学毕业设计论文3相关知识链接T0和T1的工作方式0是完全相同的,都是作为13位的定时/计数器来使用的,由THX(X=0,1)的8位和TLX的低5位构成,TLX的高3位未用,TLX的低5位产生进位时,直接进到THX上。THX产生进位时,即计满溢出,置计满溢出标志位TFX为1,向CPU申请中断,若CPU响应中断,由系统硬件自动将TFX复位。在工作方式0下,两个定时/计数器的最大计数值为=8192,最长定时时间也只有8192个机器周期。(2)工作方式1(M1M0=01)T0和T1的工作方式1也是完全相同的,都是作为16位的定时/计数器来使用的,定时/计数器的低8位产生进位时进到高8位上。高8位产生进位时,即计满溢出,置计满溢出标志位TFX(X=0,1)为1,向CPU申请中断,若CPU响应中断,由系统硬件自动将TFX复位。在工作方式1下,两个定时/计数器的最大计数为=65536,最长定时时间为65536个机器周期。(3)工作方式2(M1M0=10)T0和T1在工作方式2下都是作为8位的定时/计数器来使用的,定时/计数器的低8位负责计数。高8位不参与计数,只作为计数初始值寄存器,存放低8位的初始值。每当低8位计满溢出时,直接将计满溢出标志位TFX(X=0,1)为1,向CPU发出中断请求,若CPU响应中断,由系统硬件自动将TFX复位。与此同时,硬件自动将高8位中存放的计数初始值加载至低8位中。在工作方式2下,由于只有低8位参与计数,故最大计数为=256,最长定时时间为256个机器周期。虽然定时时间缩短了,但由于能够自动加载初始值,故定时时间更为精确。需要强调的是:在工作方式0和工作方式1下,定时/计数器的计数初始值是不能自动重载的,需要我们在程序中用相应的赋值语句重载;如果在程序中缺少了相应的重载计数初始值语句,则定时/计数器溢出后将从0开始计数。(4)工作方式3(M1M0=11)只有T0有方式3,T1在方式3下停止工作。此时T0被分为两个独立的8位的定时/计数器来使用。需要指出的是:在方式3下,TL0作为不能自动重载初始值的8位定时/计数器来使用,其计数初始值仍需在程序中用相应赋值语句加载;此时,TL0既可以用作定时功能,也可以用作计数功能,由原来控制T0的位来选择;TL0的启动部分仍然由原来控制T0的GATE、TR0、的逻辑组合来控制,启动与停止过程与前面三种工作方式相同;当TL0计满溢出时,直接将TF0置位从而向CPU申请中断,CPU响应中断后,由系统硬件自动将TF0复位;此时,TL0的中断服务程序入口地址即为原来T0的中断服务程序入口地址,中断序号也同样使用T0的中断序号。-51- 河南理工大学毕业设计论文3相关知识链接在方式3下,TH0也是作为不能自动重载初始值的8位定时器来使用,但它只能用于定时功能,不能用于计数功能,因此没有选择位控制;TH0的启动也仅受原来T1的启动位TR1来控制;当TH0计满溢出时,直接将TF1置位从而向CPU申请中断;此时,TH0的中断服务程序入口地址占用原来T1的中断服务程序入口地址,中断序号也同样使用T1的中断序号。当T0工作在方式3时,T1可以工作在方式0、1、2三种工作方式下,但由于TH0占用了原来T1的启动控制位TR1和溢出标志位TF1,所以T1的工作过程与前述有所变化。在这种情况下,T1仍然既可以工作在定时功能,又可以工作在计数功能,但计满溢出时不能置位溢出标志,不能申请中断,其计满溢出信号可以送给串行口,此时T1作为波特率发生器。T1的启动与停止仍由其原来的方式字控制,当写入“方式0/1/2”时,T1即启动,当写入“方式3”时,T1即停止工作。根据上面的讨论可以知道,定时器的定时时间的长短与定时器的位数、计数初始值、时钟频率密切相关。定时时间的计算公式如下:其中,t为定时时间,n为定时器位数,为系统的晶振时钟频率。例如:已知系统晶振频率为=12MHz,在方式1下,T0的最大定时时间为而在方式2下,T0的最大定时时间为如果在方式1下要定时50ms,晶振频率不变,则T0应赋的初始值的计算方法为:由于晶振频率为12MHz,则机器周期为1,若定时50ms,即50000,则计数初始值应为65536-50000=15536,将15536/256赋与定时/计数器的高8位THX,将15535%256赋与定时/计数器的低8位TLX。本设计中定时中断的初始化函数参考源代码为:voidinit_timer(void)//定时器初始化函数{TMOD=0x01;//使用模式1,16位定时器,工作在定时模式下TH0=15536/256;//设定定时器T0的初始值,定时50ms,即50000usTL0=15536%256;TR0=ET0=EA=1;}//打开中断,启动定时器T0本设计中定时中断的中断服务程序参考源代码为:voidtimer0()interrupt1//定时器T0的中断服务程序{staticucharn,num;/*定义两个静态局部变量,用来统计定时中断的次数,每够1秒秒钟加1,每够3秒测一次温度*/-51- 河南理工大学毕业设计论文3相关知识链接TH0=15536/256;TL0=15536%256;//重新给定时器T0赋初值n++;if(n==60){n=0;ReadTempFlag=1;}//每隔3秒将读温度标志位置1,即每3秒钟采集一次环境温度num++;//变量num为全局变量,用以统计定时中断的次数是否达到20次if(num==20)//若定时中断次数达到20次,则1秒时间到{num=0;//变量num归零,以便重新统计定时中断的次数sec++;//每隔1秒,秒加1if(sec==60)//如果秒达到60,则秒归零,向分钟进位{sec=0;minu++;if(minu==60)//如果分钟达到60,则分钟归零,向小时进位{minu=0;hour++;if(hour==24)//如果小时达到24,则小时归零,向日期进位{hour=0;day++;if(day>28){if((month==2&&(!leap(year)||leap(year)&&day>29))||(day>31&&(month==1||month==3||month==5||month==7||month==8||month==10||month==12))||(day>30&&(month==4||month==6||month==9||month==11))){day=1;//若日期达到最大,则日期归一,向月份进位month++;if(month==13){month=1;year++;}//若月份达到最大,则月份归一,向年份进位}}}}}}}3.5数字温度传感器DS18B20的使用3.5.1DS18B20概述DS18B20是美国DALLAS半导体公司的数字化温度传感器,它也是世界上第一片支持“一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络。DS18B20的测温范围为-55ºC~+125º-51- 河南理工大学毕业设计论文3相关知识链接C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性,适合于恶劣环境的现场温度测量,支持3V~5.5V的电压范围,使系统设计更加灵活、方便。DS18B20可通过编程设定9~12位的分辨率,精度为±0.5ºC。分辨率的设定以及用户设定的报警温度存储在其EEPROM中,掉电后依然保存。DS18B20的性能是新一代产品中最好的,性价比也非常出色。DS18B20使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。DS18B20的引脚及底视图如图3-7所示。图3-7DS18B20引脚及底视图引脚功能说明如下:GND:地信号;DQ:数据输入/输出引脚。单总线接口引脚。当工作于寄生电源时,也可以向器件提供电源;VDD:可选择的VDD引脚。当工作于寄生电源时,该引脚必须接地。DS18B20的性能特点如下:Ø只要求1根口线即可实现通信。Ø每个DS18B20器件上都有独一无二的序列号。Ø实际应用中不需要外接任何元器件即可实现测温。Ø测量温度范围在-55ºC~+125ºC之间。Ø用户可通过编程为数字温度传感器设定9~12位的分辨率。Ø内部有温度上、下限报警设置。3.5.2DS18B20的内部结构DS18B20的内部结构如图3-8所示,主要由五部分组成:64-51- 河南理工大学毕业设计论文3相关知识链接位光刻ROM,高速缓存,温度传感器,非挥发的温度报警触发器TH和TL、配置寄存器。图3-8DS18B20内部结构图下面具体介绍DS18B20每一部分的结构和作用。(1)64位光刻ROM光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的唯一序列号,最后8位是前面56位的循环冗余校验码(CRC)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。(2)高速缓存存储器高速缓存存储器包含了9个连续字节,如表3-14所示。前两个字节存放测得的温度值,第一个字节的内容是所测温度的低八位,第二个字节是所测温度的高八位。第三和第四个字节分别是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新,第六、七、八个字节用于内部计算。第九个字节是冗余检验字节,是前面所有8个字节的CRC码,可用来保证通信正确。表3-14DS18B20字节定义寄存器内容字节地址温度低字节0温度高字节1高温限制2低温限制3保留4保留5计数剩余值6每度计数值7每度计数值8-51- 河南理工大学毕业设计论文3相关知识链接配置寄存器为高速缓存存储器中的第5个字节,其内容用于确定温度值的数字转换分辨率,DS18B20工作时按此寄存器中的分辨率将温度转换为相应精度的数值。该字节各位的定义如下:TMR1R011111低5位一直都是1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去随意改动,R1和R0决定温度转换的精度位数,即设置分辨率,如表3-15所示(DS18B20出厂时分辨率被设置为12位)。从表3-15中数据可知,设定的分辨率越高,所需要的温度转换时间就越长。因此,在实际应用中要在分辨率和转换时间两者之间权衡考虑。实际上,18B20的转换精度为±0.5ºC,分辨率的位数设置得多并不具有多少实际意义,而且设定的分辨率越高,所需要的温度转换时间也越长,可以说“得不偿失”,故在本设计中,将其分辨率设置为9位即可。表3-15温度转换精度位数及转换时间表R1R0分辨率温度最大转换时间(单位:ms)009位93.750110位187.51011位275.01112位750.0(3)温度传感器DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码形式提供,以0.0625ºC/LSB形式表达,其中S为符号位。如表3-16所示。表3-1612位转化的数据位低字节bit7bit6bit5bit4bit3bit2bit1bit0高字节bit15bit14bit13bit12bit11bit10bit9bit8SSSSS这是转换后得到的12位数据,存储在高速缓存的前两个字节中,二进制中的高5位是扩展的符号位,如果测得的温度高于0ºC,这5位都为0,只要将该二进制数转换后十进制数再乘以0.0625即可得到实际温度;如果温度低于0ºC,这5位都为-51- 河南理工大学毕业设计论文3相关知识链接1,测得的二进制数值按位取反加1(对于负数,存储的是其补码,需转换为原码,负数的补码转换为原码,只需将补码按位取反后再加1即可)后再乘以0.0625即可得到实际温度。(4)CRC的产生在64位光刻ROM的最高字节中存储有循环冗余校验码(CRC)。主机根据ROM的前56位来计算CRC值,并和存入DS18B20中的CRC值做比较,以判断主机收到的ROM数据是否正确。3.5.3DS18B20与单片机的接口电路DS18B20与单片机的典型接口电路如图3-9所示,DS18B20的正电源3脚接+5V,1脚接地,2脚接单片机的I/O口,3脚和2脚之间接一个4.7KW的上拉电阻。在本设计方案中,DS18B20的数据端与单片机的P2.0相连。说明:在源程序预包含的头文件head.h中已含有数字温度传感器与单片机的接口的定义语句:sbitDQ=P2^0;图3-9DS18B20与单片机接口电路3.5.4DS18B20的操作命令根据DS18B20的通讯协议,对DS18B20进行操作必须经过三个步骤:复位、发送ROM操作命令、发送RAM操作命令。(1)复位单片机发出复位脉冲,紧跟其后接收DS18B20发出的存在脉冲,收到的存在脉冲表明DS18B20已准备好进行发送和接收数据,单片机可以发送所要求的ROM操作命令和存储器操作命令。(2)发送ROM操作命令对于只存在单个DS18B20芯片的情况,可直接执行跳过ROM操作命令,对于多个芯片则必须进行读ROM、搜索ROM、匹配ROM等命令操作。ROM操作命令如表3-17所示。-51- 河南理工大学毕业设计论文3相关知识链接表3-17DS18B20的ROM操作命令表命令命令代码功能简介读ROM00x33读DS18B20的ROM中的编码(即64位地址)ROM匹配0x55CPU通过数据总线读出DS18B20的ROM代码,以通知该器件准备工作。跳过ROM0xcc忽略64位ROM地址,直接向DS18B20发出温度转换命令,适用于单片DS8B20工作。搜索ROM0xf0当数据总线上有多个DS18B20时,可通过该命令搜索各个器件的ROM地址报警搜索命令0xec判断温度是否超界(3)发送RAM操作命令RAM操作命令主要有启动温度转换、读出存储器中的温度值、写存储器等命令操作。RAM操作命令如表3-18所示。表3-18RAM操作命令命令命令代码功能简介温度转换0x44启动DS18B20开始温度转换读存储器0xbe读出存储器中的温度值写入存储器0x4e将TH和TL值输入存储器中拷贝存储器0x48将存储器中的值拷贝进计算机中读电源状态0xb4判断电源工作方式读TH和TL0xb8读出存储器中的TH和TL值3.5.5DS18B20的时序由于DS18B20采用的是“单总线”协议方式,即在一根数据线上实现数据的双向传输,而对AT89S52单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20的访问。由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机(单片机)作为主设备,单总线器件(DS18B20)作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。(1)DS18B20的复位时序-51- 河南理工大学毕业设计论文3相关知识链接初始化时序包括单片机送出的复位脉冲和DS18B20向单片机返回的存在脉冲。主机总线最小发出480ms的低电平复位脉冲,接着释放总线并进入接收状态,器件在接收到总线的电平上升沿后,等待15~60ms后发出60~240ms的低电平存在脉冲信号,表明DS18B20存在,如图3-10所示。图3-10DS18B20复位时序图DS18B20的初始化函数参考源代码为:voidinit_DS18B20(void)//温度传感器的初始化函数{DQ=1;//DQ的初始状态为高电平DQ=0;//单片机将DQ拉低,给出复位脉冲delay(90);//精确延时大于480us、小于960usDQ=1;//单片机释放单总线delay(20);//延时15~60us后,等待接收传感器返回60-240us的存在脉冲}(2)DS18B20的读时序DS18B20的读时序分为读0时序和读1时序两种过程。对于DS18B20的读时序是从单片机把单总线拉低之后,在15ms之内就得释放单总线,以便让DS18B20把数据传输到单总线上。DS18B20完成一个读时序过程,至少需要60ms才能完成。DS18B20的读时序如图3-11所示。图3-11DS18B20的读时序图DS18B20的读数据函数的参考源代码为:ucharReadByte()//读数据函数,调用它可得到温度传感器测得的环境温度数值{uchari,dat;//变量i用于控制循环次数,变量dat用于存放读取的结果以便反馈给主调函数-51- 河南理工大学毕业设计论文3相关知识链接for(i=0;i<8;i++){DQ=1;dat>>=1;//dat右移一位,由于它是无符号数,其左边最高位自动补0DQ=0;//给出时钟,以便温度传感器回传数据delay(1);//稍作延时,以便符合操作的时序要求DQ=1;//释放总线,以便检测温度传感器回传的数据是0还是1if(DQ)dat=dat|0x80;//如果读取到的该位数据为1,则将最高位调整为1;//如果读取到的该位数据确实为0,则不做修改。delay(10);//适当延时,以便完成本次读操作}return(dat);//经过8次循环已读到一个字节数据,存放在dat中,返回主调函数}(3)DS18B20的写时序对于DS18B20的写时序,仍然分为写0时序和写1时序两个过程。对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60ms,以便保证DS18B20能够在15ms到45ms之间能够正确地采样I/O总线上的“0”电平;当要写1时序时,单总线被拉低之后,在15ms之内就得释放单总线。DS18B20的写时序如图3-12所示。图3-12DS18B20的写时序图DS18B20的写数据函数的参考源代码为:voidWriteByte(uchardat)//写字节函数,调用它可以向温度传感器发送指令和数据//形式参数dat为要写入的数据或指令{uchari;//变量i用于控制循环次数for(i=0;i<8;i++){DQ=1;//总线初始化DQ=0;//拉低总线,给出时钟,以便向温度传感器写入数据或指令-51- 河南理工大学毕业设计论文3相关知识链接DQ=dat&0x01;//先写入的是低位delay(10);//稍作延时,以便温度传感器采集单总线上主机写入的数据DQ=1;//主机释放单总线dat=dat>>1;//dat左移一位,为下次写操作做准备delay(5);//适当延时,以便完成本次写操作}}根据设计任务要求,要完成的工作是启动DS18B20进行温度转换,读取转换结果,测得的温度数据经处理后送液晶显示模块显示测温结果。DS18B20的工作主程序的参考源代码如下:voidDS18B20()//温度传感器18B20的工作主程序{init_DS18B20();//温度传感器初始化复位WriteByte(0xcc);//跳过读序号列号的操作WriteByte(0x44);//启动温度转换delay(20000);//延时,待温度传感器采集数据并完成模数转换后再读取转换结果init_DS18B20();//温度传感器复位WriteByte(0xcc);//跳过读序号列号的操作WriteByte(0xbe);//读取温度寄存器中转换的结果(共可读9个寄存器,其中前两个字节就是温度)c1=ReadByte();//低位字节c2=ReadByte();}//高位字节//全局变量c1和c2用以存放温度传感器测得的温度数据(两个字节)至于测得的温度数据如何处理,详见下一章“4.4软件系统设计”部分中主函数部分的源代码。3.6矩阵式按键的检测由于本设计中所用按键较多,为节省I/O口资源,故按键采用行列式连接,即组成矩形按键阵列,同一行上的按键相应一端连在一起,同一列上的按键相应另一端连在一起,如图3-13所示:-51- 河南理工大学毕业设计论文3相关知识链接图3-134×4矩阵按键的结构将矩阵按键的行线与列线与单片机的某个并行I/O口相连,本设计中所用的由12个按键组成3×4矩阵按键与单片机的P1口相连,连接方式如图3-14所示。图3-14本设计中按键与单片机的连接为了提高CPU的效率,对按键的检测一般分为两步:第一步是快速检查整个键盘中是否有键按下,如果没有键按下,则直接转到其他程序的执行。如果有键按下,再进行下一步;第二步则是具体判断按下的是哪一个键。第一步:快速检查整个按键中是否有键按下。其方法是先通过与键盘相连的I/O端口将所有的行线置为低电平,将所有的列线置为高电平;然后再读回相应端口的数据,检测所有与列线相连的端口信号是否还全为高电平。如果所有列线上的信号仍全为高电平,则表明无键按下,则直接转到其他程序的执行;如果所有列线上的信号不全为高电平,则表示有键按下,但此时还不能确定按下的键是哪一个键,则转入第二步判断。第二步:具体判断按下的是哪一个键。矩阵按键的识别方法有多种,在此只介绍常用的逐行扫描法和行列反转法。(1)逐行扫描法逐行扫描法是识别闭合按键的常用方法,下面以4×4矩阵键盘为例介绍其工作原理:先通过与矩阵按键相连的I/O口将第一行的行线拉低,其它行线和列线均置高,然后读回端口信息,看所有列线是否均为高电平。如果此时所有列线不全为高电平,则表明为低电平的该列第一行相应的键按下(注意:如果同一行上两个按键同时按下是判断不了的)。若所有列线全为高电平,则表示第一行无键按下(此时,其他行如果有键按下是判断不了的),则用同样的方法扫描下一行。如此逐行扫描完每一行按键。说明:扫描哪一行,就通过I/O将该行拉低,其它行线和所有列线均置高。再读回端口信息,就可以判断出该行是否有键按下,如果该行有键按下,还可通过列线上的电平判断出是该行的哪一列上的按键按下。-51- 河南理工大学毕业设计论文3相关知识链接矩阵按键的处理程序中,还需要进行按键去抖(用延时的办法软件去抖)和等待按键的释放。采用逐行扫描法识别按键的程序如下:unsignedcharkeyscan()//采用逐行扫描法检测按键的函数//该函数的返回值为闭合按键的编号,如无键按下则返回零{unsignedcharnum=0;P1=0xf0;if(P1!=0xf0){delay(500);if(P1!=0xf0){P1=0xfe;switch(P1){case0xee:num=1;break;case0xde:num=2;break;case0xbe:num=3;break;case0x7e:num=4;break;}P1=0xfd;switch(P1){case0xed:num=5;break;case0xdd:num=6;break;case0xbd:num=7;break;case0x7d:num=8;break;}P1=0xfb;switch(P1){case0xeb:num=9;break;case0xdb:num=10;break;case0xbb:num=11;break;case0x7b:num=12;break;}P1=0xf7;switch(P1)-51- 河南理工大学毕业设计论文3相关知识链接{case0xe7:num=13;break;case0xd7:num=14;break;case0xb7:num=15;break;case0x77:num=16;break;}P1=0xf0;while(P1!=0xf0);/*/在按键未释放时不做按键处理,当然此处也可继续执行与按键无关的程序,例如显示程序*/}}returnnum;}(2)行列反转法上述逐行扫描法虽然原理简单易懂,但逐行扫描速度不快,效率不高,而下面要介绍的行列反转法要比逐行扫描法扫描速度快,效率更高。下面仍以4×4矩阵键盘为例介绍其工作原理。首先通过与键盘相连的I/O端口将所有的行线置为低电平,将所有的列线置为高电平;然后再读回相应端口的数据,如果此时有一个键按下,则必然使某一列线上的电平变低。然后再通过与键盘相连的I/O端口将所有的行线置为高电平,将所有的列线置为低电平(行列线的电平与前次相反,故称行列反转法),然后再读回相应端口的数据,相应闭合键必然使某一行线上的电平变低。这样,当一个键按下时,必定读得一对唯一的行值和列值,根据这一对值即可确定闭合键所在的行和列。采用行列反转法识别按键的程序如下:unsignedcharkeyscan()//采用行列反转法检测按键的函数//该函数的返回值为闭合按键的编号,如无键按下则返回零{unsignedchartemp=0xff,num=0;P1=0xf0;if(P1!=0xf0){delay(500);if(P1!=0xf0){P1=0xf0;temp=P1;P1=0x0f;temp=temp∣P1;-51- 河南理工大学毕业设计论文3相关知识链接switch(temp){case0xee:num=1;break;case0xde:num=2;break;case0xbe:num=3;break;case0x7e:num=4;break;case0xed:num=5;break;case0xdd:num=6;break;case0xbd:num=7;break;case0x7d:num=8;break;case0xeb:num=9;break;case0xdb:num=10;break;case0xbb:num=11;break;case0x7b:num=12;break;case0xe7:num=13;break;case0xd7:num=14;break;case0xb7:num=15;break;case0x77:num=16;break;default:num=0;}P1=0xf0;while(P1!=0xf0);/*/在按键未释放时不做按键处理,当然此处也可继续执行与按键无关的程序,例如显示程序*/}returnnum;}需要说明的是,用行列反转法来判断闭合键时,如果遇到多个按键同时按下的情况,则得到的行值和列值中必定有1个以上的低“0”(低电平)。由于上面的程序中没有这样的值,因而可以判断为重键而丢弃。由此可见,行列反转法可以很方便地解决重键问题。确定是哪个键按下后,应进行相应处理。按键的处理函数设计如下:voidkeyprocess()//按键的处理函数{unsignedcharkeynum;keynum=keyscan();if(keynum!=0)-51- 河南理工大学毕业设计论文3相关知识链接{if(keynum==1)第1行第1个按键的功能代码;if(keynum==2)第1行第2个按键的功能代码;if(keynum==3)第1行第3个按键的功能代码;if(keynum==4)第1行第4个按键的功能代码;if(keynum==5)第2行第1个按键的功能代码;if(keynum==6)第2行第2个按键的功能代码;if(keynum==7)第2行第3个按键的功能代码;if(keynum==8)第2行第4个按键的功能代码;if(keynum==9)第3行第1个按键的功能代码;if(keynum==10)第3行第2个按键的功能代码;if(keynum==11)第3行第3个按键的功能代码;if(keynum==12)第3行第4个按键的功能代码;if(keynum==13)第4行第1个按键的功能代码;if(keynum==14)第4行第2个按键的功能代码;if(keynum==15)第4行第3个按键的功能代码;if(keynum==16)第4行第4个按键的功能代码;}}具体到本设计中,只用到12个按键,故只需写出前三行的按键处理程序即可。在编写每个按键的功能代码时,应考虑调整日期时不要出现非法日期。本设计中每个按键的功能代码如下。第1行第1个按键的功能是使年份加1,其功能代码为:if(keynum==1){year++;//年份加1if(year>9999)year=1;//本设计只能显示四位年份,超过四位数后归一if(month==2&&day>28)day=28;}特别说明:如果调整年份之前,2月份的天数大于28,则调整之前的年份必然为闰年,调整后必然不是闰年,则需调整2月份的天数为平年2月份的天数,即28天。除2月份之外的其他月份的天数与是否闰年无关,因此调整年份时其他月份的天数无需调整。第1行第2个按键的功能是使年份减1,其功能代码为:if(keynum==2){year--;//年份减1if(year<1)year=2012;//年份小于1时,调整为2012-51- 河南理工大学毕业设计论文3相关知识链接if(month==2&&day>28)day=28;}//解释同上第1行第3个按键的功能是使月份加1,其功能代码为:if(keynum==3){month++;//月份加1if(month>12)month=1;//月份超过12,则调整为1if(month==2&&day>28){if(leap(year))day=29;elseday=28;}//当调整后的月份为2月且天数超过28时要作特殊处理if(day>30&&(month==4||month==6||month==9||month==11))day=30;}第1行第4个按键的功能是使月份减1,其功能代码为:if(keynum==4){month--;//月份减1if(month<1)month=12;//月份小于1时,则调整为12if(month==2&&day>28)//当调整后的月份为2月时解释同前{if(leap(year))day=29;elseday=28;}if(day>30&&(month==4||month==6||month==9||month==11))day=30;}第2行第1个按键的功能是使天数加1,其功能代码为:if(val==5){day++;if(day>28){if(month==2){if(!leap(year))day=1;elseif(day>29)day=1;}if(day>31&&(month==1||month==3||month==5||month==7||month==8||month==10||month==12))day=1;if(day>30&&(month==4||month==6||month==9||month==11))day=1;}}第2行第2个按键的功能是使天数减1,其功能代码为:if(val==6){day--;if(day<1){day=31;if(month==2)if(leap(year))day=29;elseday=28;if((month==4||month==6||month==9||month==11))day=30;}}-51- 河南理工大学毕业设计论文3相关知识链接第2行第3个按键的功能是使小时加1,其功能代码为:if(val==7){hour++;//小时加1,调整时间时无需向日期进位if(hour>23)hour=0;}//当小时大于23时归零第2行第4个按键的功能是使小时减1,其功能代码为:if(val==8){hour--;//小时减1if(hour==255)hour=23;}//hour定义为无符号char型变量,当其由0再减1时会变为255第3行第1个按键的功能是使分钟加1,其功能代码为:if(val==9){minu++;//分钟加1,调整分钟时无需向小时进位if(minu>59)minu=0;}//当分钟大于59时归零第3行第2个按键的功能是使分钟减1,其功能代码为:if(val==10){minu--;//分钟减1if(minu==255)hour=59;}//minu同样定义为无符号char型变量,当其由0再减1时会变为255第3行第3个按键的功能是使秒钟归零,其功能代码为:if(keynum==11)sec=0;第3行第4个按键的功能是控制时钟的走停,其功能代码为:if(keynum==11)TR0=~TR0;要准确调整时钟时,可先使时钟停下来,将秒钟归零,待整分钟时使时钟恢复运行。由于秒钟变化较快,按照生活常识,本设计中不再设置秒钟的加1、减1功能,只设置将秒钟归零、控制时钟走停的功能。-51- 河南理工大学毕业设计论文4系统设计与调试4、系统设计与调试4.1硬件系统设计与调试4.1.1硬件系统设计原理图本设计的硬件系统设计如下:为了节约制作成本,本设计最后完成的作品用干电池供电,故不再设计电源电路部分;按键输入模块由12个按键组成4×3行列式矩阵按键,其行、列线均与单片机的P1口相连;液晶显示模块的数据口与单片机的P0口相连,其他控制线与P2口的某些位相连;数字温度传感器的数据通信端与单片机的P2.0相连,具体硬件系统电路原理图如图4-1所示。图4-1数码日历钟硬件系统电路原理图4.1.2硬件系统元器件清单数码日历钟硬件系统元器件清单如表4-1所示。-51- 河南理工大学毕业设计论文4系统设计与调试表4-1数码日历钟硬件系统元器件清单代号名称规格U1单片机AT89S52X1石英晶体振荡器12MHzC1、C2瓷介质电容30pFC3电解电容10μFR1电阻10KΩLCM字符液晶显示模块RTC1602RP1排阻Respack-8(10k)RV1电位器20KU2数字温度传感器DS18B20R2电阻4.7KΩS1~S17轻触按键BUTTONIC插座双列直插式40引脚IC插座直流电源极片及引线正负极各一4.1.3硬件系统组装与调试按图4-1所示数码日历钟硬件系统电路原理图所示,先在电路板上规划好元器件布局,按照规划好的布局依次进行元器件的排列与插装,再按照规范的焊接工艺要求依次对元器件进行焊接,直到所有的元器件连接并焊完为止。值得说明的是:单片机属于本系统中的“贵重品”,不直接将单片机焊在电路板上,而是在电路板上焊接一个40引脚的通用IC插座,调试时再直接把单片机插在该插座上即可。通电调试之前先用万用表检查各种电源线与地线之间是否有短路现象。经检查没有短路现象时,再给硬件系统加电,检查所有插座或元器件的电源源是否有符合要求的电压值、接地端电位是否为0。插上单片机芯片,接通电源,用万用表测量单片机各脚电压是否正常,用示波器测试单片机的第18脚(XTAL2)、第19脚(XTAL1)、第30脚(ALE)是否有正常波形,如果有则表明时钟电路已经起振。4.2软件系统设计与调试4.2.1软件系统设计软件设计流程图如图4-2所示,各模块程序参考源代码见上一章,此处不再重复。-51- 河南理工大学毕业设计论文4系统设计与调试图4-2数码日历钟软件系统设计流程图以下给出主函数部分的源代码:main(){unsignedintt;//无符号整型变量t用于存放读取到的温度转换结果的全部数据,共两个字节unsignedcharTempZh,TempXs;//无符号字符型变量TempZh、TempXs分别用于存放温度转换结果的整数部分和小数部分init();//主程序初始化,主要是初始化固定显示的字符(此后不需再做变化)及温度初始值init_lcd();//液晶初始化,设定工作模式,8位数据总线,5*7点阵,开显示,关光标,DDRAM地址指针递加计数,光标右移,init_timer();//初始化定时器,设定工作模式及定时器初始值,开中断,启动定时器T0计数-51- 河南理工大学毕业设计论文4系统设计与调试while(1)//主循环{keyscan();//扫描键盘有无按键按下chaifen();//拆分年月日时分秒的各位,以便送液晶显示。display();//调用液晶显示函数if(ReadTempFlag==1)//如果到读温度时间,则读取温度转换结果并加以处理,送液晶显示{ReadTempFlag=0;//将读温度标志位归零DS18B20();//调用温度传感器的工作主程序,以便完成温度转换t=t|c2;t=t<<8;t=t|c1;if(t&0x8000)//如果获取到的温度值为负值{temp1[9]="-";//在此处显示负号t=~t;//取反t=t+1;//加1}elsetemp1[9]="";//如果读取到的温度值为正值,则正号不显示TempXs=c1&0x0f;//获取温度转换结果的小数部分TempXs=TempXs*625/1000;//处理温度转换结果的小数部分TempZh=c2<<4|c1>>4;//获取温度转换结果的整数部分if(TempZh/10==0)temp1[10]="";//若温度的绝对值不到十度,则十位上不显示elsetemp1[10]="0"+TempZh/10;//十位温度temp1[11]="0"+TempZh%10;//个位温度temp1[13]="0"+TempXs;//温度的小数部分(由于温度伟感器测温有较大误差,无需保留多位小数,故本程序中只保留一位小数)}}}4.2.2软件系统调试与仿真在KeilC软件中建立工程,将源程序添加到工程中,经编译无误后生成扩展名为“*.hex”-51- 河南理工大学毕业设计论文4系统设计与调试的目标程序;在Proteus软件中画好电路原理图,将目标程序加载到目标单片机中,仿真调试运行,检查各个按键的功能是否正常(重点检查各个特殊日期调整时会不会出现非法日期),电子钟运行是否正常,温度传感器能否正常工作、所测温度是否正常。调试仿真运行无误后将目标程序下载到实物单片机中,观察运行结果与仿真运行结果是否一致,如有问题再修改程序源代码。将日期分别调整为“1949年10月1日”、“2008年8月8日”、“2012年4月21日”,显示结果分别如图4-3、4-4、4-5所示。图4-3“1949年10月1日”显示效果图图4-4“1949年10月1日”显示效果图图4-5“1949年10月1日”显示效果图-51- 河南理工大学毕业设计论文5、问题与展望由于本人才疏学浅,加之时间和精力有限,再加上受论文篇幅的限制,本设计中的很多功能还不够完善,本文的理论研究和实际制作都有待今后进一步深化和拓展,需大力加强,还需要笔者在今后的工作、学习中进行更深入的研究。通过设计与调试数码日历钟,进一步提高了我的工程实践能力,并对以前所学的单片机知识加以梳理、总结,并应用到实际开发中,使自己所掌握的知识得到了巩固和加强,这就是我这次毕业设计的最大收获。5.1本设计制作存在的问题本设计制作存在的主要问题和需要进一步开展的工作有:(1)没有数据存储能力,每次掉电后时间和日期自动初始化。解决办法:采用后备电源供电的专用时钟芯片,如DS1302。(2)按键太多,不利于记忆各按键的功能,可进一步减少按键,以便用户使用,但必将使按键处理程序更加复杂。(3)系统时间有误差,可采用补偿方式修正或采用专用的时钟芯片,如Dallas公司的DS1302。(4)功能尚不够完善,如可再增加定点报时、定时闹铃等功能。(5)如将本作品嵌入在镜框或其他工艺品中,将使其更加美观,又可作为实用的室内装饰品。5.2展望可以预料,随着单片机技术的不断发展,新产品、新思路将会不断出现,基于51单片机的数码日历钟系统的开发将更趋实用,功能也将不断完善。-51- 河南理工大学毕业设计论文参考文献[1]梁洁婷.单片机原理及应用[M].北京:高等教育出版社.2006.[2]金杰.新编单片机技术应用项目教程[M].北京:电子工业出版社.2009.[3]舒伟红.单片机原理与实训教程[M].北京:科学出版社,2008.[4]谭浩强.C程序设计[M].北京:清华大学出版社,2006.5.[5]郭天祥.新概念51单片机C语言教程(入门、提高、开发、拓展全攻略)[M].北京:电子工业出版社,2009,12.[6]金杰.MCS-51单片机C语言程序设计与实践[M].北京:电子工业出版社,2011.[7]雷林均.单片机控制装置安装与调试(上册)[M].北京:电子工业出版社,2011.[8]雷林均.单片机控制装置安装与调试(下册)[M].北京:电子工业出版社,2011.[9]周永东.单片机技术及应用(C语言版)[M].北京:电子工业出版社,2012.[10]谢龙汉.Proteus电子电路设计与仿真[M].北京:电子工业出版社,2012.[11]白炽贵.单片机C语言案例教程[M].北京:电子工业出版社,2010.[12]周兴华.手把手教你学单片机(第2版)[M].北京:北京航空航天大学出版社,2007.[13]AtmelMicrocontrollerHandbook,2001.[14]张毅刚.新编MCS-51单片机应用设计[M].哈尔滨:哈尔滨工业大学出版社,2003.[15]林立等.单片机原理及应用——基于Proteus和KeilC[M].北京:电子工业出版社,2011.[16]杨暾等.单片机技术及应用——基于Proteus仿真的C语言程序设计[M].北京:电子工业出版社,2012.-51- 河南理工大学毕业设计论文致谢基于51单片机的数码日历钟的设计与制作及毕业设计论文的撰写是在我的指导老师吴云志老师的精心指导下完成的,在我的学业和毕业设计与制作、毕业设计论文中无不倾注着吴老师辛勤的汗水和心血。本文从设计选题到最后论文定稿成文,吴老师一直给予了悉心指导,吴老师严谨的治学态度、渊博的知识、无私的奉献精神、严谨求实的作风,使我深受启迪和教益。从尊敬的老师身上,我不仅学到了扎实、宽广的专业知识,也学到了很多做人的道理。在此,我要向吴云志老师致以最衷心的感谢和深深的敬意。另外,我还要感谢在高职阶段学习期间,辛勤教导我的各位师长,是你们的传道、授业、解惑使我增长了知识,让我受益匪浅。学友们的无私帮助也让我感激不尽,你们在我撰写论文期间提供了很多无私的帮助,使我开拓了思路,增加了一些新的知识,你们的鼓励和帮助永远是我前进的动力。在此,我谨向所有关心和帮助过我的各位老师、同学和朋友们表示由衷的感谢!今后,我将更加努力地学习和工作,以更加出色的成绩回报你们!最后,我衷心地感谢在百忙之中评阅论文和参加答辩的各位老师!闫豫甜2012年4月18日本科毕业设计(论文)开题报告学生姓名学号专业班级指导教师职称单位课题性质设计□论文□课题来源科研□教学□生产□其它□毕业设计(论文)题目59 河南理工大学毕业设计论文开题报告(阐述课题的目的、意义、研究现状、研究内容、研究方案、进度安排、预期结果、参考文献等)一、论文研究的目的、意义1、现实意义:指出现实当中存在这个问题,需要去研究,去解决,本课题的研究有什么实际作用。2、理论意义:论文的理论和学术价值。二、研究现状1、国内研究现状:(国内对此课题研究到了什么程度)2、国外研究现状:(国外对此课题研究到了什么程度)三、研究内容此部分即为论文大纲(大纲格式如下:)绪论(论文研究的目的、意义论文研究的内容论文的研究方法)1.。。。。。(只写该标题的名称即可)1.1.。。。1.1.1.。。。。1.2.。。。。1.2.1.。。。。2.1.。。。2.1.1.。。四、研究方案此部分内容为研究方法,即通过何种途径完成本篇论文。如观察法、调查法、实验法、59 河南理工大学毕业设计论文经验总结法、个案法、比较研究法、文献资料法等。在介绍方法时简单写一下通过此方法研究出了什么内容。五、进度安排在毕业任务书中有,粘贴过即可。六、预期结果本部分为你的论文预期达到什么程度。(即达到本科毕业论文答辩水平)七、参考文献参考文献的格式一定要写对。1、期刊格式:[序号]主要责任者.文献题名[J].刊名,年,卷(期):起止页码.如:[1]周颖,王姣.谈邮政储蓄银行对银行业竞争格局的影响[J].商业时代,2006[2]景玉琴.构建中小企业政策性金融支持体系[J].上海金融学院学报,20042、著作格式:[序号]主要责任者.文献题名[文献类型标识].出版地:出版者,出版年.起止页码.如:[1]陈晓红.中小企业融资[M]北京.中国金融出版社,20013、报纸文章:[序号]主要责任者.文献题名[N].报纸名,出版日期(版次).4、电子文献:[序号]主要责任者.电子文献题名[电子文献及载体类型标识].电子文献的出处或可获得地址,发表或更新日期/引用日期(任选).59 河南理工大学毕业设计论文指导教师意见:指导教师签名:年月日教研室意见:审查结果:同意□不同意□教研室主任签名:年月日59 河南理工大学毕业设计论文电子科技大学毕业设计(论文)成绩考核表题目:教学中心:学生姓名:学号:专业:指导教师:职称:所在单位:59 河南理工大学毕业设计论文指导教师意见:签字:年月日评审意见:评阅人:年月日59 河南理工大学毕业设计论文答辩意见:答辩小组组长签名:年月日毕业设计(论文)成绩1.设计说明书(论文报告)分总分:(等级:)2.答辩分3.平时成绩分学校意见:年月日1.学生毕业设计(论文)正本存教学中心。2.本表一式两份,一份存入学生档案,一份学校存档。3.此表须用钢笔填写。59 河南理工大学毕业设计论文附件2:2008级统招本科生毕业论文(设计)中期检查表(学生用表)学院检查时间年月日论文题目指导教师学生姓名专业班级学号目前已完成的任务是否符合任务书要求的进度是否尚需完成的任务能否按期完成任务能不能存在的问题及拟采取的办法存在的问题拟采取的办法对指导教师的建议学生(签名):年月日59 河南理工大学毕业设计论文本科生毕业论文(设计)中期检查表(教师用表)学院检查时间年月日论文题目指导教师学生姓名专业班级学号指导情况指导方式工作进度完成情况提前完成按计划完成延期完成没有完成质量评价(学生前期已完成的工作的质量情况)优良中差工作态度情况(学生对毕业论文的认真程度、纪律及出勤情况)认真较认真一般不认真选题是否有变化有无选题变化原因目前存在的问题,拟采取解决问题的方案及措施对该同学阶段性工作的评价指导教师(签名):年月日(此表一式两份,一份学院存档,一份交教务处实践科存档。)59'