基于单片机的数字时钟设计与仿真
..
(吉首大学信息科学与工程学院,湖南吉首 416000)
摘 要
随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。由其是单片机技术的应用产品已经走进了千家万户。电子万年历的出现给人们的生活带来的诸多方便。
本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。本设计以数字集成电路技术为基础,单片机技术为核心。本文编写的主导思想是软硬件相结合,以硬件为基础,来进行各功能模块的编写。
本系统以单片机的C语言进行软件设计,增加了程序的可读性和可移植性,为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了。系统通过点阵式液晶为载体显示数据,所以具有人性化的操作和美观的页面效果。可以显示年月日、星期、温度等
关键词 单片机;万年历;DS1302;LCM1602;DS18B20
Based on mcu digital clock design and simulation
..
(college of Information Science and Engineering,Jishou
University,Jishou,Hunan)
-I
- 好好学习,天天向上
Abstract
Along with the rapid development of electronic technology, especially with large scale integrated circuit appear, give mankind living has brought the fundamental change. By its is the application of single-chip computer technology product has entered innumberable families. Electronic calendar appear to the life of people bring many convenient.
This paper firstly describes the system hardware working principle, each accompanied by a diagram of the system structure of the elucidation, introduces this system by the application of the hardware interface technology and the function of each interface module and the working process, and secondly, expounded the program modules and realization process. This design with digital integrated circuit technology as the foundation, microcontroller technology as the core. In this paper the compiling principle is combining software with hardware, based on the preparation of the functional modules. The system takes microcontroller C language software design, increased the readability of our programs and portability, to facilitate the expansion and change, the design of software modular structure, make the program design of logical relationship more concise. System through dot-matrix LCD display data for carrier, so has the humanized operate and beautiful page effect. Can display the time, and lunar dates, week, temperature, solar term, tian gan earthly branches and the day sunrise sunset time, and has alarm and intelligent control household appliances function.
Keywords microcontroller; calendar; DS1302;LCM1602;DS18B20
-II
- 好好学习,天天向上
目录
Abstract ......................................................................................................................... II 目录 ............................................................................................................................. III 引 言 ........................................................................................................................ V 第1章 系统电路设计 ................................................................................................. 6 系统总体设计思路 ....................................................................................................... 6 设计方案选择 ............................................................................................................... 7 功能介绍 ....................................................................................................................... 7 工作原理 ....................................................................................................................... 7 第2章 单元电路设计 ................................................................................................. 8 单片机电路设计 ........................................................................................................... 8 时钟电路设计 ............................................................................................................. 11 温度传感器电路设计: ............................................................................................. 12 实时时钟电路设计: ................................................................................................. 14
DS1302的工作原理 ........................................................................................... 15 DS1302的寄存器和控制命令: ....................................................................... 16 与单片机接口电路原理图: ................................................................................ 16 显示电路设计 ..................................................................................................... 17 1602字符型LCD简介: .................................................................................. 17 1602LCD的指令说明及时序 ............................................................................ 19 第3章 程序流程图 ................................................................................................... 22
-III
- 好好学习,天天向上
中断时钟流程图 ......................................................................................................... 22 温度子程序流程图 ..................................................................................................... 23 万年历流程图 ............................................................................................................. 24 第4章 操作与调试 ................................................................................................... 25 KEIL uVision3简介 .................................................................................................... 26
8051开发工具
KEIL C51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强,使你可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision3的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。uVision3 IDE可为它们提供单一而灵活的开发环境。
C51 V7版本是目前最高效、灵活的8051开发平台。它可以支持所有8051的衍生产品,也可以支持所有兼容的仿真器,同时支持其它第三方开发工具。因此,C51 V7版本无疑是8051开发用户的最佳选择。 ...................... 26 uVision3集成开发环境
(1)、项目管理
工程(project)是由源文件、开发工具选项以及编程说明三部分组成的。
一个单一的uVision3工程能够产生一个或多个目标程序。产生目标程序的源文件构成“组”。开发工具选项可以对应目标,组或单个文件。
uVision3包含一个器件数据库(device database),可以自动设置汇编器、编译器、连接定位器及调试器选项,来满足用户充分利用特定 微控制器的要求。此数据库包含:片上存储器和外围设备的信息,扩展数据指针(extra data pointer)或者加速器(math accelerator)的特 性。
uVision3可以为片外存储器产生必要的连接选项:确定起始地址和规模。 ..................................................................................................................... 26 Proteus简介 ................................................................................................................ 27
进入Proteus ISIS ................................................................................................ 28 工作界面 ............................................................................................................. 28 软件调试 ..................................................................................................................... 29 结 论 ......................................................................................................................... 30 致 谢 ........................................................................................................................... 0 大学阶段的学习生活即将结束,这篇论文作为我在校期间学习的最后一份答卷,
-IV
- 好好学习,天天向上
敬礼给各位老师。 ....................................................................................................... 0 在大学这几年的学习和生活,我不仅学到了丰富的专业知识,更学到了老师认真工作、爱岗敬业、为人师表的优良品质。在此,谨向老师表示深深的敬意和谢意!尤其感谢我的指导老师,他在毕业设计过程中给予我极大的关心和帮助。从硬件制作、调试以及论文的完成都投入了他大量的心血。在课余时间还给我们讲解有关硬件的重要知识,使我们在不仅掌握了自己的所设计东西的同时,还对其它的知识有了更深的了解。老师对待学生有如此的态度,令人敬佩。同时也感谢在毕业设计过程中给予我精神上的鼓励和支持的同学,在我遇到困难时尽其所能地为我排忧解难。 ................................................................................... 0 参 考 文 献 ................................................................................................................. 1 附录1 仿真电路图 .................................................................................................... 2 附录2 程序 ................................................................................................................ 3
引 言
随着电子技术的不断发展,单片机技术在设计中所体现在出来的优势越来越明显,它不仅是电子信息类专业的一个重要部分,而且在其它类专业工程中也是不可缺少的。广泛地应用于家电、工业过程控制、仪器仪表、智能武器、航空和空间飞行器等领域发展更是迅速,已成为新一代一些电子设备不可缺少的核心部件。
目前世界上单片机年产量已达十多亿片,通常是当年微处理器产量的4-5倍以上。用最少的芯片就能实现最强大的功能。可以想见,这是将来电子产品的主流方向,它将无可置疑地一步步取代其它同类产品,其数量之大和应用面之广,是其它任何类型的计算机所无法比拟的。
单片机是应工业测控需要而诞生的。它把计算机最基本的功能电路,如CPU、程序存储器、数据存储器、I/O接口、定时、计数器、中断系统等集成到一块芯片上,形成单片形态的计算机。单片机通常以最小系统运行,在家用电器中和常用的智能仪器仪表中常常可以“单片”工作,同时单片机在我们日常生活中也经常见到,如电子表、舞厅里的一些灯光的控制、一些招牌灯光的控制、工厂一些自动控制等。将来只要有自动控制方面的都会
-V
- 好好学习,天天向上
离不开单片机的开发和使用,对于现代的自动化控制起着举足轻重的作用。
为了顺应形势发展的需要,我们学习了单片机课程,此次用液晶显示万年历和时间设置以及显示测温度的数据对单片机的学习起到了很好的巩固作用,尤其是对C语言程序的设计。
在此次课程设计的编写过程中得到了向老师的大力支持和指导。以及参考了电子设计资料如《MSC-51系列单片机原理及实用技术》(第二版),《单片机原理与应用及C51程序设计》(第二版)等。在编写此次毕业设计的过程中由于时间的仓促和本人的水平有限,在设计和制作的过程中难免出现缺点和不足之处,还请各位老师批评和指正。
第1章 系统电路设计
系统总体设计思路
此设计即液晶上显示年、月、日、时、分、秒及星期原理框图如图(),电路以下几个部分组成:键盘、单片机、温度传感器及显示电路。
图 单片机实现液晶显示万年历以及温度总框图
对于各部分:
(1) 为使时钟走时与标准时间一致,校时电路是必不可少的,键盘用来校
-VI
- 好好学习,天天向上
正液晶上显示的时间。
(2) 单片机通过输出各种电脉冲信号来驱动控制各部分正常工作。 (3) 温度传感器用来显示当天的确定温度值。
(4) 单片机发送的信号经过显示电路通过译码最终在液晶上显示出来。
设计方案选择
方案一 可以利用单片机内部的定时器作为时间的计算,再用不同的地址单元记录。这种设计误差较大,因为单片机的读取程序的时候会产生误差,其二程序编写起来也比较复杂。所以不采用此方案。
方案二 用C语言编程来控制单片机让它在液晶上显示数据及文字。由于单片机结构简单、控制功能强、可靠性高、体积小、价格低等优点,以及液晶屏幕可以完整的同时显示数据及文字等内容,综合上述方案的选择与比较,选择方案二。主要是由于电器元件的熟悉程度以及市场的供求关系。在方案二中,大部分的电器元件我们较熟悉并且更容易获得。
功能介绍
本次设计主要用单片机控制程序让它在液晶上显示年、月、日、时、分、秒及星期,同时用18B20温度传感器来接受外面的信号,让单片机来接受它,且也让它在液晶上显示测的温度。
时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以用校时电路进行校正。时计数器计满24小时后自动向日计数器进一,日计数器由平年、闰年的28/30/31对大、小月和二月的判断应与当月相应的日期相一致,当日计数器计满时,向月计数器进位,月计数器计满12月向年计数器进位,当年计数器计满100时所以计数器清零。设计采用的是年、月、日和时、分、秒、星期以及温度同时显示。
工作原理
设计的电路主要由四大模块构成:温度传感器电路,单片机控制电路,显示电路以及校正电路。
当温度传感器接受到外面的信号,送入单片机,单片机将接受到的信号
-7
- 好好学习,天天向上
输出,让它在液晶上显示。
同时由单片机控制的万年历以及时间显示,当时间及秒计数计满60时就向分进位,分计数器计满60分后向时计数器进位,小时计数器按“24翻1”规律计数。时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以用校时电路进行校正。时计数器计满24小时后自动向日计数器进一,日计数器由平年、闰年的28/30/31对大、小月和二月的判断应与当月相应的日期相一致,当日计数器计满时,向月计数器进位,月计数器计满12月向年计数器进位,当年计数器计满100时所以计数器清零。设计采用的是年、月、日和时、分、秒、星期显示,所以在单片机通过对数据处理进行同时在液晶上显示。
第2章 单元电路设计
单片机电路设计
①AT89C51的简介
AT89C51是一种带4K字节FLASH(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称。AT89C2051是一种带2K字节闪存可编程可擦除的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多提供了一种灵活性高且价廉的方案。主要特性如下:
·与MCS-51 兼容
·4K字节可编程FLASH存储器 ·寿命:1000写/擦循环 ·数据保留时间:10年 ·全静态工作:0Hz-24MHz
-8
- 好好学习,天天向上
·三级程序存储器锁定 ·128×8位内部RAM ·32可编程I/O线 ·两个16位/计数器 ·5个中断源 ·可编程串行通道 ·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路
AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。② AT89C51芯片的管脚、引线与功能 AT89C51芯片图如图所示。
VCC:供电电压。 GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻
-9
- 好好学习,天天向上
拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示: 口管脚 备选功能 RXD(串行输入口) TXD(串行输出口) /INT0(外部中断0) /INT1(外部中断1) T0(记时器0外部输入) T1(记时器1外部输入) /WR(外部数据存储器写选通) /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。
-10
- 好好学习,天天向上
23另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 图 AT89C51芯片图 时钟电路设计 时钟电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地作。 (1)时钟信号的产生 单片机内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1-11 C230pFXTAL2C130pFY16MHzXTAL1图 时钟振荡电路 - 好好学习,天天向上
和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。
电容器C1和C2的作用是稳定频率和快速起振,电容值的范围在5pF∽30pF,典型值为30pF。晶振的频率通常选择两种6MHz和12MHz。只要在单片机的XTAL1和XTAL2引脚外接晶体振荡器就构成了自激振荡器并在单片机内部产生时钟脉冲信号。
(2)时钟振荡电路如图所示:
温度传感器电路设计:
温度传感器的种类众多,在应用与高精度、高可靠性的场合时DALLAS(达拉斯)公司生产的DS18B20温度传感器当仁不让。超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得DS18B20更受欢迎。对于我们普通的电子爱好者来说,DS18B20的优势更是我们学习单片机技术和开发温度相关的小产品的不二选择。了解其工作原理和应用可以拓宽您对单片机开发的思路。 DS18B20的主要特征:
全数字温度转换及输出。 先进的单总线数据通信。
最高12位分辨率,精度可达土摄氏度。 12位分辨率时的最大工作周期为750毫秒。 可选择寄生工作方式。
检测温度范围为–55°C ~+125°C (–67°F ~+257°F) 内置EEPROM,限温报警功能。
64位光刻ROM,内置产品序列号,方便多机挂接。 多样封装形式,适应不同硬件系统。
DS18B20芯片封装结构:
-12
- 好好学习,天天向上
DS18B20引脚功能:
·GND 电压地 ·DQ 单数据总线 ·VDD 电源电压 ·NC 空引脚
DS18B20工作原理及应用:
DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。其一个工作周期可分为两个部分,即温度检测和数据处理。在讲解其工作流程之前我们有必要了解18B20的内部存储器资源。18B20共有三种形态的存储器资源,它们分别是:
ROM 只读存储器:用于存放DS18B20ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校验)。数据在出产时设置不由用户更改。DS18B20共64位ROM。
RAM 数据暂存器:用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第5个字节则是用户第3个EEPROM的镜像。第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。
-13
- 好好学习,天天向上
DS18B20芯片与单片机的接口: 如图所示,DS18B20只需要接到单片机的一个I/O口上,由于单总线为开漏所以需要外接一个的上拉电阻。如要采用寄生工作方式,只要将VDD电源引脚与单总线并联即可。但在程序设计中,寄生工作方式将会对总线的状态有一些特殊的要求。
实时时钟电路设计:
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达~。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如图1所示及内部结构如图2所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。
-14
- 好好学习,天天向上
图1 DS1302的外部引脚分配
图2 DS1302的内部结构
各引脚的功能为:
Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。 SCLK:串行时钟,输入,控制数据的输入与输出; I/O:三线接口时的双向数据线;
CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。 DS1302的工作原理
DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。时钟脉冲的个数在单字节方式下为8+8(8位地
-15
- 好好学习,天天向上
址+8位数据),在多字节方式下为8加最多可达248的数据。 DS1302的寄存器和控制命令:
DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch),存放的数据格式为BCD码形式,如图3所示。
图 3 DS1302有关日历、时间的寄存器
DS1302内部的RAM分为两类,一类是单个RAM单元,共31个,每个单元为一个8位的字节,其命令控制字为COH~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
与单片机接口电路原理图:
电路原理图如图,DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟引脚、I/O串行数据引脚,Vcc2为备用电源,外接晶振,为芯片提供计时脉冲。
-16
- 好好学习,天天向上
显示电路设计
①
液晶显示原理
液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩。阵驱动(Active Matrix)三种1 1602字符型LCD简介:
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。下面以长沙太阳人电子有
限公司的1602字符型液晶显示器为例,介绍其用法。一般1602字符型液晶显示器实物如图10-53:
-17
- 好好学习,天天向上
1602LCD主要技术参数: 显示容量:16×2个字符 芯片工作电压:— 工作电流: 模块最佳工作电压: 字符尺寸:×(W×H)mm 引脚功能说明: 1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示: 编符引脚说明 编符引脚说明 号 号 号 号 1 2 3 4 VSS VDD VL RS 电源地 电源正极 液晶显示偏压 数据/命令选择 读/写选择 使能信号 数据 数据 9 10 11 12 D2 D3 D4 D5 数据 数据 数据 数据 5 6 7 8 R/W E D0 D1 13 14 15 16 D6 D7 BLA BLK 数据 数据 背光源正极 背光源负极 第1脚:VSS为地电源。 第2脚:VDD接5V正电源。 第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 -18
- 好好学习,天天向上
第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。
1602LCD的指令说明及时序
1602液晶模块内部的控制器共有11条控制指令,如表所示: 序指令 RR/DDDDDD号 S W 7 6 5 4 3 2 1 清显示 光标返回 置输入模式 显示开/关控制 光标或字符移位 置功能 置字符发生存贮器地址 置数据存贮器地址 0 0 0 0 0 0 0 0 D1 0 D0 1 2 0 0 0 0 0 0 0 0 1 I/D * 3 0 0 0 0 0 0 0 1 S 4 0 0 0 0 0 0 1 D C B 5 0 0 0 0 0 1 S/C R/L * * 6 0 0 0 0 1 DL N F * * 字符发生存贮器地址 0 0 0 1 7 显示数据存贮器地址 0 0 1 8 -19
- 好好学习,天天向上
9 读忙标志或地址 写数到CGRAM或DDRAM) 从CGRAM或DDRAM读数 计数器地址 0 1 BF 要写的数据内容 1 0 10 读出的数据内容 1 1 11 1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平) 指令1:清显示,指令码01H,光标复位到地址00H位置。 指令2:光标复位,光标返回到地址00H。 指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。 指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。 指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。 指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。 指令7:字符发生器RAM地址设置。 指令8:DDRAM地址设置。 指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。 -20
- 好好学习,天天向上
指令10:写数据。 指令11:读数据。 与HD44780相兼容的芯片时序表如下: 读状输RS=L,R/W=H,E=H 态 入 写指令 输入 RS=L,R/W=L,D0—D7=指令码,E=高脉冲 输出 输出 D0—D7=状态字 无 读数据 写数据 输入 输入 RS=H,R/W=H,E=H 输出 输出 D0—D7=数据 无 RS=H,R/W=L,D0—D7=数据,E=高脉冲 单片机与LCD的接口电路如图所示。
图 接口电路
-21
- 好好学习,天天向上
第3章 程序流程图
中断时钟流程图
中断服务程序流程图如图所示。
流程图分析:由中断查询当有中断请求时,及进行现场保护,保护断点,将定时器赋初值,且开定时器便于计数,且赋值50000,当中断进行20次刚好一秒,当秒计数60时便向分进位,当分计数60时,向时进位,当时到24时,清零,及恢复现场。
-22
- 好好学习,天天向上
开 始分存放单元加1现场保护(入栈)是否=60分?重装定时器计数初值(开定时器)Y分缓冲单元清0中断次数减1时存放单元加1N是否= 20次?NY秒值加1是否=24时?Y时存放单元清0N是否=60秒?现场恢复Y秒存放单元清0结 束N
图中断流程图
温度子程序流程图
温度显示流程图如图所示。
流程图分析:开始进入初始化DS18B20,就是通过主机拉低单线产生复位脉冲然后释放该线,如果有应答脉冲,及发起ROM命令当成功的执行操作命令后,就使用内存操作命令,即温度转换等,当转换完后,又初始化DS18B20是否有应答脉冲,若有,就发起读时隙命令,既同时读出第1,2个字节,既为温度的数据。
-23
开始 - 好好学习,天天向上 初始化DS18B20 No应答脉冲Yes发起SkipRom命令读取第1,2字节即为温度数据发起Convert T命令延时1s等待温度转换完成发起Read Scratchpad命令 初始化DS18B20No应答脉冲? 图Yes 温度显示流程图
万年历流程图
万年历流程如图所示。
流程图分析:开始既当日加一天,同时星期也就相应的加1,看星期是否加到7,若加到了7,就返回到1,若没有就返回到时钟状态,当日加到相应的最大数时,月分就相应的加1,看月份是否加到了13, 若没有到13,就一直等待,若到了13就返回1,且年份就加1,当年份到2099时就清到2005年,若没有,就一直等待,直到2099为止。
-24
- 好好学习,天天向上
开始Day+1Week+1Week=7Day=dmax Yes week清1day清1NOMonth清1Year+1Year=2099Month+1YesYear清2005NOMonth=13NO开始
图 万年历流程图
第4章 操作与调试
-25
- 好好学习,天天向上
KEIL uVision3简介
8051开发工具
KEIL C51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强,使你可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision3的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。uVision3 IDE可为它们提供单一而灵活的开发环境。
C51 V7版本是目前最高效、灵活的8051开发平台。它可以支持所有8051的衍生产品,也可以支持所有兼容的仿真器,同时支持其它第三方开发工具。因此,C51 V7版本无疑是8051开发用户的最佳选择。 uVision3集成开发环境 (1)、项目管理
工程(project)是由源文件、开发工具选项以及编程说明三部分组成的。 一个单一的uVision3工程能够产生一个或多个目标程序。产生目标程序的源文件构成“组”。开发工具选项可以对应目标,组或单个文件。
uVision3包含一个器件数据库(device database),可以自动设置汇编器、编译器、连接定位器及调试器选项,来满足用户充分利用特定 微控制器的要求。此数据库包含:片上存储器和外围设备的信息,扩展数据指针(extra data pointer)或者加速器(math accelerator)的特 性。
uVision3可以为片外存储器产生必要的连接选项:确定起始地址和规模。
-26
- 好好学习,天天向上
(2)、集成功能:
uVision3的强大功能有助于用户按期完工。
1.集成源极浏览器利用符号数据库使用户可以快速浏览源文件。用详细的符号信息来优化用户变数存储器。
2.文件寻找功能:在特定文件中执行全局文件搜索。 3.工具菜单:允许在V3集成开发环境下启动用户功能。 4.可配置SVCS接口:提供对版本控制系统的入口。 -LINT接口:对应用程序代码进行深层语法分析。 的EasyCase接口:集成块集代码产生。
的DAVE功能:协助用户的CPU和外部程序。DAVE工程可被直接输入uVision3。
Proteus简介
Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:①实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。②支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision3等软件。④具有强大的原理图绘制功能。总之,该软
-27
- 好好学习,天天向上
件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。本章介绍Proteus ISIS软件的工作环境和一些基本操作。 进入Proteus ISIS
双击桌面上的ISIS 6 Professional图标或者单击屏幕左下方的“开始”→“程序”→“Proteus 6 Professional” →“ISIS 6 Professional”,出现如图所示屏幕,表明进入Proteus ISIS集成环境。
Proteus ISIS集成环境
工作界面
Proteus ISIS的工作界面是一种标准的Windows界面,如图所示。包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。
-28
- 好好学习,天天向上
图 Proteus ISIS的工作界面
软件调试
软件调试的任务是利用ISIS开发工具进行仿真调试,发现和纠正程序错误,同时也能发现仿真结果故障。
试运行后,检查是否能开始正确显示时间、温度。比如说,时钟显示不稳定,易乱跳,显示乱码,是由于单片机的运行与程序的执行不能同步进行造成的,应该尽量减少跳转指令的使用。修改万年历显示缓冲区内容为2012年5月18日,运行进位键,检验能否正确进位,以及试调时间看能否正确的进位,以及调温度是否能显示。
-29
- 好好学习,天天向上
结 论
从这次的论文设计中,让我们更加了解和掌握单片机结构以及液晶内部的结构,提高我们编程的能力,理解软件对硬件的控制以及硬件对软件的制约。本次设计的重点在于定时中断的合理使用,各相互独立的程序通过有机的组合,来完成所需功能则是本次设计的精妙之所在,也正是因为此,深刻领悟到“实践出真知”这句俗语。其实有好多的知识需要在一步一步的实际动手当中慢慢地体会,慢慢地学习。不能只是想当然怎样就会怎样,还要靠自己亲手去验证它才行在设计的过程中还是会学到不少东西,但是经过这次实验使我对它们有了一定的了解。经过这一次论文设计我们认识到实际动手才是一门能够提高个人能力的课程,同时也帮助了我们,怎么样把书本上理论的知识应用到实践中去。
通过这次的锻炼,我们不仅动手能力得到了加强,更重要的是学到了很多新的专业技能知识,经验也更加丰富了。我觉得我还有很多不足的地方,如:基本知识掌握不牢固、动手能力不强、知识面不够宽。我争取在以后的学习当中弥补它,不断的完善自己。虽然期间我们遇到了不少的难题,但是经过努力,再大的困难也被我们给一一的解决了。
本设计还有很多做的不够好的地方,还望老师批评指正。
-30
- 好好学习,天天向上
致 谢
大学阶段的学习生活即将结束,这篇论文作为我在校期间学习的最后一份答卷,敬礼给各位老师。
在大学这几年的学习和生活,我不仅学到了丰富的专业知识,更学到了老师认真工作、爱岗敬业、为人师表的优良品质。在此,谨向老师表示深深的敬意和谢意!尤其感谢我的指导老师,他在毕业设计过程中给予我极大的关心和帮助。从硬件制作、调试以及论文的完成都投入了他大量的心血。在课余时间还给我们讲解有关硬件的重要知识,使我们在不仅掌握了自己的所设计东西的同时,还对其它的知识有了更深的了解。老师对待学生有如此的态度,令人敬佩。同时也感谢在毕业设计过程中给予我精神上的鼓励和支持的同学,在我遇到困难时尽其所能地为我排忧解难。
感谢学校提供的优越实验环境,使我能全身心的投入到我的设计中。当查阅大量参考文献后设计原理图时,感谢指导老师向老师给我的仔细检查和改正。在向老师的帮助下对系统的方案进行了论证,并对本系统不足进行了修改。
在论文修改过程中,衷心的感谢指导老师尽心尽力的对论文进行了仔细的修改,无论是在论文格式还是论文内容上,都要求的较为严格,使我在设计过程中学到了很多东西。
-0
- 好好学习,天天向上
参 考 文 献
[1] 余锡存,曹国华.单片机原理及接口技术[M].西安电子科技大学出版社,2004年 [2] 张志良, 主编 :《单片机原理及控制技术》(第2版).北京:机械工业出版社,2005 [3] 余永权, MCS-51系列单片机实用接口技术[M].北京:北京航空航天大学出版,1993 [4] 余西存, 曹国华.单片机原理及接口技术[M].西安:西安电子科技大学出版,2000年 [5] 求是科技,单片机典型模块设计实例导航[M].北京:人民邮电出版社,2004年5月 [6] 张振荣, 晋明武.MSC-51系列单片机原理及实用技术. 人民邮电出版社,2000年 [7] 吉雷,主编 :《Protel99从入门到精通》.西安:西安电子科技大学出版社,2004 [8]徐爱钧,彭秀华.Keil Cx51 单片机高级语言编程与uVision2应用实践.北京:电子工业出版社.2004.6
[9] 何立民.MCS-51系列单片机应用系列设计[M].北京:航空航天大学出版社 [10] . Xu,Electronic design,2000年 [11] Microcontroller handbook. Inter
[12] MCS-51 Family of Single Chip Microcomputers User’s Manual. Inter Corp. 1981
-1
- 好好学习,天天向上
附录1 仿真电路图
1、完整电路图
2、键盘电路 3、温度传感器电路
-2
- 好好学习,天天向上
附录2 程序
#include<> #include\"\"
#define uint unsigned int #define uchar unsigned char
uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp; //flag用于读取头文件中的温度值,和显示温度值
#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(0=80) #define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)
//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口) sbit rs=P2^0; sbit en=P2^2;
sbit rw=P2^1; //如果硬件上rw接地,就不用写这句和后面的rw=0了 sbit led=P2^6; //LCD背光开关
//DS1302时钟芯片与C51之间的引脚连接定义 sbit IO=P1^1; sbit SCLK=P1^0; sbit RST=P1^2;
sbit ACC0=ACC^0; sbit ACC7=ACC^7;
/************************************************************ ACC累加器=A =E0H
-3
- 好好学习,天天向上
就是ACC的第0位。Acc可以位寻址。
累加器ACC是一个8位的存储单元,是用来放数据的。但是,这个存储单元有其特殊的地位, 是单片机中一个非常关键的单元,很多运算都要通过ACC来进行。以后在学习指令时, 常用A来表示累加器。但有一些地方例外,比如在PUSH指令中,就必须用ACC这样的名字。 一般的说法,A代表了累加器中的内容、而ACC代表的是累加器的地址。 ***************************************************************/
//校时按键与C51的引脚连接定义 sbit key1=P1^5; //设置键 sbit key2=P1^6; //加键 sbit key3=P1^7; //减键
sbit buzzer=P1^3;//蜂鸣器,通过三极管9012驱动,端口低电平响
/**************************************************************/
uchar code tab1[]={\"20 - - \年显示的固定字符 uchar code tab2[]={\" : : \时间显示的固定字符
//延时函数,后面经常调用
void delay(uint xms)//延时函数,有参函数 { }
/********液晶写入指令函数与写入数据函数,以后可调用**************/
-4
uint x,y;
for(x=xms;x>0;x--) for(y=110;y>0;y--);
- 好好学习,天天向上
/*在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面*/
write_1602com(uchar com)//****液晶写入指令函数**** { }
write_1602dat(uchar dat)//***液晶写入数据函数**** { }
lcd_init()//***液晶初始化函数**** {
-5
rs=0;//数据/指令选择置为指令 rw=0; //读写选择置为写 P0=com;//送入数据 delay(1);
en=1;//拉高使能端,为制造有效的下降沿做准备 delay(1);
en=0;//en由高变低,产生下降沿,液晶执行命令
rs=1;//数据/指令选择置为数据 rw=0; //读写选择置为写 P0=dat;//送入数据 delay(1);
en=1; //en置高电平,为制造下降沿做准备 delay(1);
en=0; //en由高变低,产生下降沿,液晶执行命令
write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
- 好好学习,天天向上
}
write_1602com(0x0c);//开显示不显示光标
write_1602com(0x06);//整屏不移动,光标自动右移 write_1602com(0x01);//清显示
write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示 for(a=0;a<14;a++) {
write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分 //delay(3); }
write_1602com(er+2);//时间显示固定符号写入位置,从第2个位置后开始显示 for(a=0;a<8;a++) {
write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号 //delay(3); }
/*********************over***********************/
/***************DS1302有关子函数********************/
void write_byte(uchar dat)//写一个字节 {
-6
ACC=dat; RST=1; for(a=8;a>0;a--) {
- 好好学习,天天向上
}
}
IO=ACC0; SCLK=0; SCLK=1; ACC=ACC>>1;
uchar read_byte()//读一个字节 { }
//----------------------------------------
void write_1302(uchar add,uchar dat)//向1302芯片写函数,指定写入地址,数据 {
-7
RST=1; for(a=8;a>0;a--) {
ACC7=IO; SCLK=1; SCLK=0; ACC=ACC>>1;
}
return (ACC);
RST=0; SCLK=0; RST=1; write_byte(add); write_byte(dat); SCLK=1; RST=0;
- 好好学习,天天向上
}
uchar read_1302(uchar add)//从1302读数据函数,指定读取数据来源地址 { }
uchar BCD_Decimal(uchar bcd)//BCD码转十进制函数,输入BCD,返回十进制 {
uchar Decimal; Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F)); }
//--------------------------------------
void ds1302_init() //1302芯片初始化子函数(2010-01-07,12:00:00,week4) { RST=0; SCLK=0;
write_1302(0x8e,0x00); //允许写,禁止写保护
//write_1302(0x80,0x00); //向DS1302内写秒寄存器80H写入初始秒数据00 //write_1302(0x82,0x00);//向DS1302内写分寄存器82H写入初始分数据00 //write_1302(0x84,0x12);//向DS1302内写小时寄存器84H写入初始小时数据12 //write_1302(0x8a,0x04);//向DS1302内写周寄存器8aH写入初始周数据4
-8
uchar temp; RST=0; SCLK=0; RST=1; write_byte(add); temp=read_byte(); SCLK=1; RST=0; return(temp);
- 好好学习,天天向上
//write_1302(0x86,0x07);//向DS1302内写日期寄存器86H写入初始日期数据07 //write_1302(0x88,0x01);//向DS1302内写月份寄存器88H写入初始月份数据01 //write_1302(0x8c,0x10);//向DS1302内写年份寄存器8cH写入初始年份数据10 write_1302(0x8e,0x80); //打开写保护 }
//------------------------------------ //温度显示子函数
void write_temp(uchar add,uchar dat)//向LCD写温度数据,并指定显示位置 {
uchar gw,sw;
gw=dat%10;//取得个位数字 sw=dat/10;//取得十位数字
write_1602com(er+add);//er是头文件规定的值0x80+0x40 write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
write_1602dat(0xdf);//显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码 }
//------------------------------------ //时分秒显示子函数
void write_sfm(uchar add,uchar dat)//向LCD写时分秒,有显示位置加、现示数据,两个参数 {
-9
write_1602dat(0x43); //显示\"C\"符号,0x43是液晶屏字符库里大写C的地址码
uchar gw,sw;
gw=dat%10;//取得个位数字 sw=dat/10;//取得十位数字
- 好好学习,天天向上
}
write_1602com(er+add);//er是头文件规定的值0x80+0x40 write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
//------------------------------------- //年月日显示子函数
void write_nyr(uchar add,uchar dat)//向LCD写年月日,有显示位置加数、显示数据,两个参数 { }
//------------------------------------------- void write_week(uchar week)//写星期函数 {
-10
uchar gw,sw;
gw=dat%10;//取得个位数字 sw=dat/10;//取得十位数字
write_1602com(yh+add);//设定显示位置为第一个位置+add write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
write_1602com(yh+0x0c);//星期字符的显示位置 switch(week) {
case 1:write_1602dat('M');//星期数为1时,显示
write_1602dat('O'); write_1602dat('N'); break;
- 好好学习,天天向上
-11
case 2:write_1602dat('T');//星期数据为2时显示 write_1602dat('U'); write_1602dat('E'); break;
case 3:write_1602dat('W');//星期数据为3时显示 write_1602dat('E'); write_1602dat('D'); break;
case 4:write_1602dat('T');//星期数据为4是显示 write_1602dat('H'); write_1602dat('U'); break;
case 5:write_1602dat('F');//星期数据为5时显示 write_1602dat('R'); write_1602dat('I'); break;
case 6:write_1602dat('S');//星期数据为6时显示 write_1602dat('T'); write_1602dat('A'); break;
case 7:write_1602dat('S');//星期数据为7时显示 write_1602dat('U'); write_1602dat('N');
break;
- 好好学习,天天向上
} }
//****************键盘扫描有关函数**********************
void keyscan() {
if(key1==0)//---------------key1为功能键(设置键)-------------------- {
delay(9);//延时,用于消抖动
if(key1==0)//延时后再次确认按键按下 {
buzzer=0;//蜂鸣器短响一次 delay(20); buzzer=1;
-12
while(!key1); key1n++; if(key1n==9)
key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环
switch(key1n) {
case 1: TR0=0;//关闭定时器
//TR1=0;
write_1602com(er+0x09);//设置按键按动一次,秒位置显示光标 write_1602com(0x0f);//设置光标为闪烁
temp=(miao)/10*16+(miao)%10;//秒数据写入DS1302
- 好好学习,天天向上
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80);
break;
case 2: write_1602com(er+6);//按2次fen位置显示光标
//write_1602com(0x0f);
break;
case 3: write_1602com(er+3);//按动3次,shi
//write_1602com(0x0f);
break;
case 4: write_1602com(yh+0x0e);//按动4次,week
//write_1602com(0x0f);
break;
case 5: write_1602com(yh+0x0a);//按动5次,ri
//write_1602com(0x0f);
break;
case 6: write_1602com(yh+0x07);//按动6次,yue
//write_1602com(0x0f);
break;
case 7: write_1602com(yh+0x04);//按动7次,nian case 8:
write_1602com(0x0c);//按动到第8次,设置光标不闪烁 TR0=1;//打开定时器
//write_1602com(0x0f);
break;
temp=(miao)/10*16+(miao)%10;
-13
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao数据写入DS1302 write_1302(0x8e,0x80);
- 好好学习,天天向上
break;
} } }
//------------------------------加键key2----------------------------
if(key2==0) //上调键 { delay(10); if(key2==0) {
if(key1n!=0)//当key1按下以下。再按以下键才有效(按键次数不等于零) {
buzzer=0;//蜂鸣器短响一次 delay(20); buzzer=1;
-14
while(!key2); switch(key1n) {
case 1:miao++;//设置键按动1次,调秒
if(miao==60)
miao=0;//秒超过59,再加1,就归零
write_sfm(0x08,miao);//令LCD在正确位置显示\"加\"设定好的秒数 temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00); //允许写,禁止写保护
- 好好学习,天天向上
write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒
数据BCD码
write_1302(0x8e,0x80); //打开写保护
write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,光标自
动右移,所以要指定返回
//write_1602com(0x0b); break;
case 2:fen++;
if(fen==60)
fen=0;
write_sfm(0x05,fen);//令LCD在正确位置显示\"加\"设定好的分数据 temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分
数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加
一,在这里是写回原来的位置
break;
case 3:shi++;
if(shi==24)
shi=0;
write_sfm(2,shi);//令LCD在正确的位置显示\"加\"设定好的小时数据 temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的
小时数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加
一,所以需要光标回位
-15
- 好好学习,天天向上
break;
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C);//指定'加'后的周数据显示位置
write_week(week);//指定周数据显示内容
temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周
数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针
自动加一,所以需要光标回位
case 5:ri++;
if(ri==32)
ri=1;
break;
write_nyr(9,ri);//令LCD在正确的位置显示\"加\"设定好的日期数据 temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的
日期数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动
加一,所以需要光标回位
-16
break;
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);//令LCD在正确的位置显示\"加\"设定好的月份数据
- 好好学习,天天向上
temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的
月份数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加
一,所以需要光标回位
break;
case 7:nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);//令LCD在正确的位置显示\"加\"设定好的年份数据
temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的
年份数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加
一,所以需要光标回位
-17
break;
}
}
}
//------------------减键key3,各句功能参照'加键'注释--------------- if(key3==0) {
- 好好学习,天天向上
delay(10);//调延时,消抖动 if(key3==0) {
buzzer=0;//蜂鸣器短响一次 delay(20); buzzer=1;
while(!key3); switch(key1n) {
case 1:miao--;
if(miao==-1)
miao=59;//秒数据减到-1时自动变成59
write_sfm(0x08,miao);//在LCD的正确位置显示改变后新的秒数
temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒
数据BCD码
write_1302(0x8e,0x80); //打开写保护
write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,指针自
动加一,在这里是写回原来的位置
//write_1602com(0x0b); break;
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(5,fen);
temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分
数据BCD码
-18
- 好好学习,天天向上
write_1302(0x8e,0x80);//打开写保护
write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加
一,在这里是写回原来的位置
case 3:shi--;
if(shi==-1)
shi=23;
break;
write_sfm(2,shi);
temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的
小时数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加
一,所以需要光标回位
break;
case 4:week--;
if(week==0)
week=7;
write_1602com(yh+0x0C);//指定'加'后的周数据显示位置 码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周
write_week(week);//指定周数据显示内容
temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB
数据BCD码
-19
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针
- 好好学习,天天向上
自动加一,所以需要光标回位
case 5:ri--;
if(ri==0)
ri=31;
break;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的
日期数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动
加一,所以需要光标回位
break;
case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的
月份数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加
一,所以需要光标回位
-20
break;
case 7:nian--; if(nian==-1)
nian=99; write_nyr(3,nian);
- 好好学习,天天向上
temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的
年份数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加
一,所以需要光标回位 }
//-------------------------------
void init() //定时器、计数器设置函数 {
-21
}
break;
}
}
}
TMOD=0x11; //指定定时/计数器的工作方式为3 TH0=0; //定时器T0的高四位=0 TL0=0; //定时器T0的低四位=0 EA=1; //系统允许有开放的中断 ET0=1; //允许T0中断
TR0=1; //开启中断,启动定时器
- 好好学习,天天向上
}
//*******************主函数************************** //*************************************************** void main() {
lcd_init(); //调用液晶屏初始化子函数 ds1302_init(); //调用DS1302时钟的初始化子函数 init(); //调用定时计数器的设置子函数 led=0; //打开LCD的背光电源
buzzer=0;//蜂鸣器长响一次 delay(80); buzzer=1;
while(1) //无限循环下面的语句: {
keyscan(); //调用键盘扫描子函数 } }
void timer0() interrupt 1 //取得并显示日历和时间 {
//Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中
flag=ReadTemperature();//将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示
-22
- 好好学习,天天向上
//读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样):
miao = BCD_Decimal(read_1302(0x81));
write_temp(12,flag);//显示温度,从第二行第12个字符后开始显示
write_sfm(8,miao);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数)
write_sfm(5,fen);//分,从第二行第5个字符后开始显示 write_sfm(2,shi);//小时,从第二行第2个字符后开始显示
//显示日、月、年数据:
write_nyr(9,ri);//日期,从第二行第9个字符后开始显示 //显示温度、秒、时、分数据: fen = BCD_Decimal(read_1302(0x83)); shi = BCD_Decimal(read_1302(0x85)); ri = BCD_Decimal(read_1302(0x87)); yue = BCD_Decimal(read_1302(0x89)); nian=BCD_Decimal(read_1302(0x8d)); week=BCD_Decimal(read_1302(0x8b));
write_nyr(6,yue);//月份,从第二行第6个字符后开始显示 }
write_nyr(3,nian);//年,从第二行第3个字符后开始显示 write_week(week);
-23
因篇幅问题不能全部显示,请点此查看更多更全内容