毕业设计(论文)基于AT89C51单片机的万历的设计.doc
河南工业职业技术学院万年历的设计 题 目: 万年历的设计 系 别: 电子工程系 专 业: 电子信息工程 班 级: 电子0701 学生姓名: 指导教师: 2010年4月摘 要 电子万年历中实现公历农历互换的1种实用算法。用4个字节的数据可以准确地描述任意1年与年历有关的信息,将需要实现公历农历互换的每1年的4个字节的数据有机存放在1起形成1个基本数据表。电子万年历中的计算机通过查询预先存储在计算机存储器里的基本数据表,得到转换需要的数据信息,根据转换要求和本算法提供的互换算法,从而实现公历农历的互换。这种互换算法的优点是存储的数据量少,计算简便,实用性强。美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟芯片DS1302。它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的液晶12864数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用AT89C51单片机作为核心,功耗小,能在3V的低压工作,电压可选用35V电压供电。 关键词: 电子万年历 单片机AT89C51 公历 农历 互换 算法 研究DS1302 液晶12864 Abstract IIImplement electronic calendar Lunar calendar swap one kind of practical algorithms. With 4 bytes of data can accurately describe any one year and calendar-related information, will be required to achieve lunar calendar every 1-year swap 4 bytes of data stored in an organic form a basic data from the table. Electronic calendar in the computer by querying pre-stored in the computer memory in the basic data table, data need to be converted, under conversion requirements and the exchange of algorithms to provide the algorithm to realize the exchange of lunar calendar. This exchange method has the advantage of less data storage, calculation is simple, practical. We use the United States following DALLAS Semiconductor DS1820 improved after the introduction of a smart temperature sensor DS18B20 as the detection element, a temperature range of -55 125 o C, up to a maximum resolution of 0.0625 o C. DS18B20 can be directly read out the temperature on the north side, and three-wire system with single-chip connected to a decrease of the external hardware circuit, with low-cost and easy use. The United States launched with Juan DALLAS small current charge to low-power real time clock chip DS1302. It can beplay year, month, day, Sunday, hours, minutes, seconds, and temperature information, but also a time calibration functions. The circuit is AT89C51 microcontroller as a core, low power, low-voltage work in 3V, the voltage can choose 3 5V voltage power supply. Keywords: electronic calendar Lunar calendar swap AT89C51 MCU algorithm DS1302 LCD 12864 目 录1. 绪 论- 1 -1.1课题开发背景- 1 -1.2 目的和意义- 1 -1.2.1课题目的- 1 -1.2.2课题意义- 2 -1.3方案的选择与论证- 2 -1.3.1 单片机的选择- 2 -1.3.2 时钟模块- 3 -1.3.3 显示模块- 3 -1.3.4 温度检测模块- 3 -2. 硬件设计- 4 -2.1 硬件设计框图- 4 -2.2 系统硬件详细设计图- 4 -2.3 各芯片介绍- 6 -2.3.1 AT89C51单片机- 6 -2.3.2 AMPIRE128X64点阵液晶- 10 -2.3.3 DS1302时钟芯片- 11 -2.3.4 DS1302SN 的寄存器- 13 -2.3.5 DS18B20单总线数字温度计- 14 -3. 系统软件设计- 16 -3.1 主程序流程图- 16 -3.2 系统功能模块图及各功能介绍- 17 -3.2.1 时钟调整模块程序流程及程序- 17 -3.2.2温度模块程序流程图- 18 -3.2.3 显示模块程序流程图及程序- 20 -4.致 谢- 22 -5.总 结- 23 -参考文献- 24 -1. 绪 论1.1课题开发背景近年来数字集成电路技术的发展和采用了先进的石英技术,现代电子钟具有走时准确、性能稳定、制作维修简单等优点,弥补了传统钟表的许多不足之处。我们利用单片机技术设计制作的电子万年历, 可以很方便的由软件编程进行功能的调整和改进,使其在能够准确显示年、月、日、时间的同时,还能具有很多其他的功能。如设定闹钟、温度显示、阴阳历的查询、天干地支的显示等,有一定的新颖性和实用性,同时体积小、携带方便,使用也更为方便,具有技术更新周期短、成本低、开放灵活等优点,具备一定的市场前景。这里要介绍的就是一款可满足使用者特殊要求,输出方式灵活、计时准确、性能稳定、维护方便的实用电子万年历。1.2 目的和意义1.2.1课题目的巩固理论知识,提高理论知识的综合应用能力。现在的教学以课堂教学为主,辅以有限的实验教学,学生在实验中主要配合各个章节验证理论知识为主,综合性设计性实验偏少,特别是跨课程的实验几乎没有,综合性实验通过安排普通实验课,在时间上、内容和器材准备上都有难度。因此,通过课程设计让同学们完成一个相对完整的综合项目,使学生能够综合运用所学的知识,从而对所学知识有更深的理解。拓宽专业课程的广度和深度,提高学生软、硬件设计的能力和水平。1.2.2课题意义通过该电子万年历的设计, 我感觉从某些方面提高了我的解决实际问题的能力,同时也锻炼、培养了我的的实际动手能力。现实碰到的问题往往不是某一门课程所能解决的,需要我们的专业素质和综合运用专业知识能力,通过该项目的设计,我知道了在日常生活实践当中应该多以实用性的产品为设计对象,通过完整的设计和制作过程,我更加清楚了解电子产品设计制作的流程和特点。通过本项目的实施,可以做到以下几点:在设计期间我接触了专用时钟芯片DS1302,并会用DS1302芯片开发时钟模块,应用到其他系统中去。学习以单片机为核心,开发一个完整的小系统,包括硬件设计、制作,独立运行的软件的编程,而不是以前实验中的一个程序。学会用protel dxp软件,能熟练绘制电路图、制作PCB电路板等。1.3方案的选择与论证1.3.1 单片机的选择方案一:采用 ATMEL 公司的 51 系列单片机,ATMEL89 系列单片机是 ATMEL 公司的 8位 Flash 单片机系列。这个系列单片机的最大特点就是在片内含有 Flash 存储器,因 此,有着十分广泛的用途,特别是在便携式、省电和特殊信息保存的仪器中显得更为有用。 其中 AT89C51 的 ISP 在线编程功能的优势在于改写单片机存储器内的程序不需要把芯片 从工作环境中剥离,是一个强大易用的功能,易于调试和修改。考虑到通用性及价格,方案二:采用凌阳单片机。它具有以下特点:采用 COMS 制造工艺,功耗低。工作 电压范围大,能在低电压供电时正常工作,且能用电池供电;内置 2K SRAM,32K FLASH; 丰富的中断源,具有较强的的中断处理能力;强大语音功能,可以语音读出测得的电压 , 以及当电压超过测量范围时,可以语音提示,具有人性化。 但是,价格昂贵,不利于提高作品的性价比。我在设计选择也是方案一。1.3.2 时钟模块方案一:使用实时时钟芯片,例如 DS1302。优点:时间精确,耗电少,在无主电源 情况下有备用电池供电,确保时钟不停止。缺点:增加成本。方案二:直接利用单片机的定时器,完成时钟、日期程序。优点:不使用外围芯片 , 成本低。缺点:软件复杂,可靠性不高,通常达不到需 要的精度;断电后无法记录时间 , 时钟无法再继续行走。我在设计选择也是方案一。1.3.3 显示模块方案一:使用液晶 LCD 显示。优点:时尚、先进,显示内容丰富;电路简单,占用I/O 端口少。缺点:价格高。方案二:使用 LED 数码管。优点:价格便宜,编程简单。缺点:占用单片机 I/0 多 , 电路复杂,显示内容单一。我在设计选择也是方案一。1.3.4 温度检测模块方案一:使用数字温度传感器 DS18B20。优点:外围电路简单,精度高,能够直接读出被测温度。缺点:要求延时精确,编程复杂。方案二:使用热敏电阻器。优点:应用广泛,技术成熟。缺点:可靠性差,电路复 杂,精度底。我在设计时选择的也是方案一。2. 硬件设计2.1 硬件设计框图DS1302时钟模块 AT89C51主控模块键盘扫描电路显示电路温度检测模块详见下图 2-1 图2-1 硬件设计框图2.2 系统硬件详细设计图详见下图2-2:Vcc21X12X23GND4RST5I/O6SCLK7Vcc8U3DS1302VDD3I/O2GND1U4DS18B20123U574ls400-VOUT18RST17DB716DB615DB514DB413DB312DB211DB110DB09E8R/W7RS6VO5VCC4GND3CS22CS11U2AMPIRE12864P0P1P2P3P4P5P6P7P8P9P10P11+5P7P6P5P4P3P2P1P0P9P8P11P10+5RTIOCKRTCKIODQDQ+5+51212MHZ12Y230pF30pF27pF27pF10KC3200S5P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78RST9P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.5/T115P3.6/WR16P3.7/RD17XTAL118XTAL219P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427P2.7/A1528ALE29PSEN30EA31P0.7/AD732P0.6/AD633P0.5/AD534P0.4/AD435P0.3/AD336P0.2/AD237P0.1/AD138P0.0/AD039VCC40U1AT89C51+5220uFS1S3S2S4图2-2 系统硬件详细设计图2.3 各芯片介绍2.3.1 AT89C51单片机AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C51是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C51是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。图片见图2-3-1: 图2.3.1 AT89C51引脚图2-3-1 AT89C51单片机1)主要特性:l 与MCS-51 兼容 l 4K字节可编程闪烁存储器 l 寿命:1000写/擦循环l 数据保留时间:10年l 全静态工作:0Hz-24Hzl 三级程序存储器锁定l 128*8位内部RAMl 32可编程I/O线l 两个16位定时器/计数器l 5个中断源 l 可编程串行通道l 低功耗的闲置和掉电模式l 片内振荡器和时钟电路 2)管脚说明:Ø VCC:供电电压。Ø GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL 门 电流。当P1口的管脚第一次写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”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。Ø P3口也可作为AT89C51的一些特殊功能口,如表2.3.1所示:口管脚 备选功能P3.0 RXD (串行输入口)P3.1 TXD (串行输出口)P3.2 /INT0 (外部中断0)P3.3 /INT1 (外部中断1)P3.4 T0 (记时器0外部输入)P3.5 T1 (记时器1外部输入)P3.6 /WR (外部数据存储器写选通)P3.7 /RD (外部数据存储器读选通)P3口 同时为闪烁编程和编程校验接收一些控制信号。Ø RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器 周期的高电平时间。Ø ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。Ø /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。Ø /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。Ø XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。Ø XTAL2:来自反向振荡器的输出。3)芯片擦除:整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。4)振荡器特性:XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。2.3.2 AMPIRE128X64点阵液晶详见下图 2-3-2 图 2-3-2 液晶显示模块液晶显示器以其微功耗、小体积、使用灵活等诸多优点在袖珍式仪表和低功耗应用 系统中得到越来越广泛的应用。液晶显示器通常可分为两大类,一类是点阵型,另一类 是字符型。点阵型液晶通常面积较大,可以显示图形;而一般的字符型液晶只有两行, 面积小,只能显示字符和一些很简单的图形,简单易控制且成本低。目前市面上的字符 型液晶绝大多数是基于 HD44780 液晶芯片的,所以控制原理是完全相同的,HD44780 写的控制程序可以很方便地应用于市面上大部分的字符型液晶。 字符型液晶模块是一 种用 5x8 点阵图形来显示字符的液晶显示器,根据显示的容量可以分为 1 行 16 个字、2行 16 个字、2 行 20 个字等。本系统以常用的 2 行 16 个字的 TS-1620 液晶模块来显示字符。TS-1620 采用标准的 16 脚接口,其中:第 1 脚:VSS 为地电源第 2 脚:VDD 接 5V 正电源第 3 脚:V0 为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最 高,对比度过高时会产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比度。第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第 5 脚:RW 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 RW 共同为低电平时可以写入指令或者显示地址,当RS 为低电平 RW 为高电平时可以读忙信 号,当 RS 为高电平 RW 为低电平时可以写入数据。第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。 第 714 脚:D0D7 为 8 位双向数据线。第 1516 脚:背光灯正/负极。TS-1620 液晶模块内部的字符发生存储器(CGROM)已经存储了 160 个不同的点阵字 符图形,如表 3-4-1 所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号 、 和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址 41H 中的点阵字符图形显示出来,我们就能看到字母“A”。2.3.3 DS1302时钟芯片DS1302SN 是美国 DALLAS 公司推出的一种高性能、低功耗、带 RAM 的实时时钟电 路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为 2.5V5.5V。采用三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字 节的时钟信号或 RAM 数据。DS1302SN 内部有一个 31×8 的用于临时性存放数据的 RAM 寄存器。DS1302SN 是 DS1202 的升级产品,与 DS1202 兼容,但增加了主电源/后背电源 双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。 详见下图 2-3-3-1图2-3-3-1 DS1302SN引脚功能及结构图 2-3-3-1 示出 DS1302SN 的引脚排列,其中 Vcc1 为后备电源,VCC2 为主电源。在主 电源关闭的情况下,也能保持时钟的连续运行。DS1302 由 Vcc1 或 Vcc2 两者中的较大者 供电。当Vcc2大于Vcc10.2V 时 ,Vcc2给 DS1302SN供电。当 Vcc2 小于 Vcc1 时 ,DS1302SN由 Vcc1 供电。X1 和 X2 是振荡源,外接 32.768kHz 晶振。RST 是复位/片选线,通过把 RST 输入驱动置高电平来启动所有的数据传送。RST 输入有两种功能:首先,RST 接通控制 逻辑,允许地址/命令序列送入移位寄存器;其次,RST 提供终止单字节或多字节数据的 传送手段。当 RST 为高电平时,所有的数据传送被初始化,允许对 DS1302 进行操作。 如果在传送过程中 RST 置为低电平,则会终止此次数据传送,I/O 引脚变为高阻态。上 电运行时,在Vcc2.5V 之前,RST 必须保持低电平。只有在 SCLK 为低电平时,才能将RST 置为高电平。I/O 为串行数据输入输出端(双向)。SCLK 始终是输入端。1) DS1302SN 的控制字节详见下图图 2-3-3-2图 2-3-3-2 DS1302SN 的控制字DS1302SN 的控制字如图 2.3.4 所示。控制字节的最高有效位(位 7)必须是逻辑 1, 如果它为 0,则不能把数据写入 DS1302SN 中,位6 如果为 0,则表示存取日历时钟数据 ,为 1 表示存取 RAM 数据;位 5 至位 1 指示操作单元的地址;最低有效位(位 0)如为 0 表示 要进行写操作,为 1 表示进行读操作,控制字节总是从最低位开始输出。2) 数据输入输出(I/O)在控制指令字输入后的下一个 SCLK 时钟的上升沿时,数据被写入 DS1302SN,数据 输入从低位即位 0 开始。同样,在紧跟 8 位的控制指令字后的下一个 SCLK 脉冲的下降 沿读出 DS1302SN 的数据,读出数据时从低位 0 位到高位 7。2.3.4 DS1302SN 的寄存器DS1302SN 有 12 个寄存器,其中有 7 个寄存器与日历、时钟相关,存放的数据位为BCD 码形式,其日历、时间寄存器及其控制字见图 2-3-4。图 2-3-4 DS1302SN 的寄存器控制字此外,DS1302SN 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM 相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器 内容。DS1302SN 与 RAM 相关的寄存器分为两类:一类是单个 RAM 单元,共 31 个,每个 单元组态为一个 8 位的字节,其命令控制字为 C0HFDH,其中奇数为读操作,偶数为写 操作;另一类为突发方式下的 RAM 寄存器,此方式下可一次性读写所有的 RAM 的 31 个 字节,命令控制字为 FEH(写)、FFH(读)。DS1302SN 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令 字节最高位 MSB(D7)必须为逻辑 1,如果 D7=0,则禁止写 DS1302SN,即写保护;D6=0, 指定时钟数据,D6=1,指定 RAM 数据;D5D1 指定输入或输出的特定寄存器;最低位 LSB(D0)为逻辑 0,指定写操作(输入),D0=1,指定读操作(输出)。在 DS1302SN 的时钟 日历或 RAM 进行数据传送时,DS1302SN 必须首先发送命令字节。若进行单字节传送,8 位命令字节传送结束之后,在下 2 个 SCLK 周期的上升沿输入数据字节,或在下 8 个 SCLK 周期的下降沿输出数据字节。在硬件电路上,备用电源 B1可以用电池或者超级电容器(0.1F 以上)。虽然 DS1302SN在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电 池。可以用老式电脑主板上的 3.6V 充电电池。DS1302SN 在第一次加电后,必须进行初 始化操作。初始化后就可以按正常方法调整时间。2.3.5 DS18B20单总线数字温度计DS18B20 是美国 DALLAS 半导体公司继 DS1820 之后最新推出的一种改进型智能温度 传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简 单的编程实现 912 位的数字值读数方式。可以分别在 93.75 ms 和 750 ms 内完成 9 位和 12 位的数字量,并且从 DS18B20 读出的信息或写入 DS18B20 的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的 DS18B20 供电,而无需额外电源。因而使用 DS18B20 可使系统结构更趋简单,可靠性更高。他在 测温精度、转换时间、传输距离、分辨率等方面较 DS1820 有了很大的改进,给用户带 来了更方便的使 用和更令人满意的效果。详见下图2-3-5:图 2-3-5 DS18B20 模块原理图当 DS18B20 处于写存储器操作和温度 A/D 变换操作时,总线上必须有强的上拉,上 拉开启时间最大为 10 s。采用寄生电源供电方式是 VDD 和 GND 端均接地。由于单线制 只有一根线,因此发送接收口必须是三态的。主机控制 DS18B20 完成温度转换必须经过3 个步骤:初始化、ROM 操作指令、存储器操作指令。假设单片机系统所用的晶振频率为 11.0593 MHz,根据 DS18B20 的初始化时序、写时序和读时序,分别编写 3 个子程序: INIT 为初始化子程序,WRITE 为写(命令或数据)子程序,READ 为读数据子程序,所有 的数据读写均由最低位开始,实际在实验中不用这种方式,只要在数据线上加一个上拉 电阻 4.7 k,另外 2 个脚分别接电源和地3. 系统软件设计开始3.1 主程序流程图时钟调整模式处理功能键显示数据DS18B20 初始化AT89c51定时器初始化DS1302 初始化液晶初始化3.2 系统功能模块图及各功能介绍3.2.1 时钟调整模块程序流程及程序时钟调整模块程序流程图3-2-1:关闭时钟读取功能键值模式切换调整时间跳出调整模式显示时间启动时钟图3-2-1 时钟调整模块程序流程图时钟调整模块程序如下:#ifndef _REAL_TIMER_DS1302_#define _REAL_TIMER_DS1302_/SEL:运行环境选择#define SEL 0/仿真环境SEL=0,硬件环境SEL=1#if SEL > 0sbit DS1302_CLK = P40; /实时时钟时钟线引脚 sbit DS1302_RST = P41; /实时时钟复位线引脚sbit DS1302_IO = P42; /实时时钟数据线引脚 #elsesbit DS1302_CLK = P31; /实时时钟时钟线引脚 sbit DS1302_RST = P30; /实时时钟复位线引脚sbit DS1302_IO = P32; /实时时钟数据线引脚 #endifsbit ACC0 = ACC0;sbit ACC7 = ACC7;typedef struct _SYSTEMTIME_unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char YearH;/unsigned char DateString9;/unsigned char TimeString9;SYSTEMTIME;/定义的时间类型3.2.2 温度模块程序流程图如图 3-2-2:读取低位数初始化读取高位数跳过读序列号数据转换启动温度初始化读取温度寄存器图 3-2-2 温度模块程序流程图温度模块程序如下:#ifndef _DS18B20_H_#define _DS18B20_H_sbit DQ = P33;unsigned char TempBuffer10=0;/*ds18b20延迟子函数(晶振12MHz )*/ void delay_18B20(unsigned int i)while(i-);/*ds18b20初始化函数*/Init_DS18B20(void) unsigned char x=0;DQ = 1; /DQ复位delay_18B20(8); /稍做延时DQ = 0; /单片机将DQ拉低delay_18B20(80); /精确延时 大于 480usDQ = 1; /拉高总线delay_18B20(14); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败delay_18B20(20);return x; 3.2.3 显示模块程序流程图及程序显示模块程序流程图如图3-2-3:获取时间数据获取 温 度显示温度显示年月显示时间图3-2-3 显示模块程序流程图显示模块程序如下:#ifndef _LCD12864_H_#define _LCD12864_H_#define DISPON 0x3f /显示开#define DISPOFF 0x3e /显示关,参考指令表"显示开关设置"#define FIRSTROW 0xc0 /显示起始行设置,参考指令表,由LXBYTE5.0在0 到63 行选择#define SETX 0xb8 /X 方向,半屏64 列,参考指令表,由CXBYTE5.0在0 到63 列选择#define SETY 0x40 /Y 方向,8 页64 行,参考指令表,由PXBYTE2.0在0 到8 页选择 #define LLCD_CMD_WR XBYTE0xf4ff#define LLCD_DAT_WR XBYTE0xf5ff#define LLCD_CMD_RD XBYTE0xf6ff#define LLCD_DAT_RD XBYTE0xf7ff#define RLCD_CMD_WR XBYTE0xf8ff#define RLCD_DAT_WR XBYTE0xf9ff#define RLCD_CMD_RD XBYTE0xfaff#define RLCD_DAT_RD XBYTE0xfbffvoid delay(unsigned char timer); /*通用延时函数*/void check_busy(unsigned char); /*LCD 忙检测*/void lcd_init(void);