多功能电子时钟设计 - 图文

更新时间:2024-06-27 02:06:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

JIANGSU TEACHERS UNIVERSITY OF TECHNOLOGY

电子系统设计综合训练

多功能定时控制系统设计

学院名称: 电气信息工程学院 专 业: 电子信息工程 班 级: 09电2Z 姓 名: 施璐霞 学 号: 09311219 指导教师姓名: 刘晓杰、戴霞娟

2012年11月

第 1 页 共 50 页

电子系统设计报告

多功能定时控制系统设计

摘要:

电子钟主要是利用现代电子技术将时钟电子化、数字化。与传统的机械钟相比,具有时钟精确、显示直观、无机械传动装置等优点。

本设计是以单片机为核心,附加必要的外围电路,还用到时钟芯片DS1302和LCD1602的液晶显示器。在这些硬件基础上,通过编写配套的C语言程序,实现对年、月、日、时、分、秒在液晶屏上的显示,此外还实现整点报时和秒表计时功能。日期和时间通过相应的时钟芯片DS1302与单片机的配合工作将数据传送到液晶显示器上来实现的。整点报时和秒表计时的功能主要是通过软件和单片机的控制来实现的。因此我们要加上一些必要的按键,对相关数据进行设置于操作,如工作模式的选择,对年、月、日、时、分、秒的上、下调节,以及在秒表计时模式下有启动、清零、记录。

通过此次实物制作,增强了我们的动手能力,把理论与实践融合在一起。同时,也进一步加深了对单片机的硬件结构的理解和巩固,编程能力也得到了提高。在此将电子钟制作过程中用到的知识进行了一些总结,并记录了遇到的问题,希望自己今后能注意。同时也希望能成为读者的参考资料,能帮助读者避免出现相同的问题,并能从中得到一些启发。

关键词:电子钟 单片机 时钟芯片

Multi function timing control system design

第 2 页 共 50 页

电子系统设计报告

Abstract: Electronic clock is the use of modern electronic technology, digital

electronic clock. Compared with the traditional mechanical clock, with precision clock, visual display, no mechanical transmission device etc.

The design is based on the single-chip microcomputer as the core, the additional

necessary peripheral circuits, in addition to the single chip, also uses the clock chip DS1302 and LCD1602 liquid crystal display. On the basis of hardware, through the preparation of supporting C language program, realizes to the year, month, day, time, second in the LCD screen to display, in addition to realize the whole point timekeeping and stopwatch function of time. Date and time through the clock chip DS1302 and MCU work together to transmit data to the LCD display to achieve. The whole point timekeeping and stopwatch function mainly by software and single chip computer control to achieve. So we are going to add some necessary key, the relevant data for setting in operation, such as the selection of working mode, for the year, month, day, time, seconds, regulation, as well as in the stopwatch mode start, reset, recording.

Through the physical production, enhance our ability, put theory and practice together. At the same time, also further deepened to single-chip hardware structures to understand and consolidate, programming ability has been improved. The electronic clock making the knowledge used in the course of a number of summary, and recorded the encountered problems, hope that their future will pay attention. Also hope to become readers reference, can help readers to avoid the same problem, and can get some inspiration.

Keywords: Electronic clock Single-chip microcomputer the Clock Chip

第 3 页 共 50 页

电子系统设计报告

目 录

前言 ................................................................ 5

第1章绪论 ........................................ 错误!未定义书签。

1.1研究目的与意义 ............................. 错误!未定义书签。 1.2课题研究内容及技术指标 ..................... 错误!未定义书签。 第2章、系统的方案设计 ............................ 错误!未定义书签。

2.1系统方案设定与确定 ......................... 错误!未定义书签。 2.2系统实现总框图 ............................. 错误!未定义书签。 第3章、硬件电路设计 .............................. 错误!未定义书签。

3.1电源部分模块 ............................... 错误!未定义书签。 3.2主控模块 ................................... 错误!未定义书签。

3.2.1单片机的发展阶段 ..................................... 10 3.2.2 STC89C52单片机 ...................................... 11 3.2.3 主控模块的实现 ....................................... 13 3.3时钟产生电路 ............................................... 14

3.3.1 DS1302的简介 ........................................ 14 3.3.2 DS1302的结构及工作原理 .............. 错误!未定义书签。 3.3.3 DS1302实时显示时间软硬件 ............................ 15 3.3.4 DS1302的调试与电路实现 ............................. 16 3.4显示模块 ................................................... 16

3.4.1 LCD1602的简介 ....................................... 16 3.4.2 LCD1602引脚图及功能 ................................. 16 3.5按键控制模块 ............................................. -17

3.5.1键盘电路原理 ........................................ 17 3.5.2键盘电路与89C52的连接如图 ......................... 17 第 4 页 共 50 页

电子系统设计报告

第4章、软件设计 .................................. 错误!未定义书签。

4.1系统软件设计 ............................................... 18 4.2 模块软件设计 .............................................. 22

4.2.1 LCD1602的驱动程序 ................................... 22 4.2.2 DS1302的驱动程序 .................................... 25 4.2.3 整点报时的闹铃驱动程序 ............... 错误!未定义书签。 4.2.4 延时程序 ............................................. 30 第5章、测试结果 .................................. 错误!未定义书签。 第6章 总结与展望 ............................. -错误!未定义书签。1- 第7章、参考文献 .................................................. 31

第8章 附录 .................................................... 32

附录一:元器件清单 ............................................ 32 附录二:电路原理图 ........................................... 32 附录三:程序清单 .............................................. 33 附录四 实物图 .............................................. -50-

多功能定时控制系统设计

前言

随着时代的进步,科技日新月异的进步,现在的电子产品在社会上的各个领域发挥着不可替代的作用,单片机是电子元件中重要的一员,从1976年Intel公司推出的第一款8位单片机MCS-48开始,已经走过了30多年的历史。30多年中单片机迅速的更新换代,从最初的低性能迅速的过渡到如今的高性能阶段,并以其优异的性能和低廉的

第 5 页 共 50 页

电子系统设计报告

价格迅速占领电子市场,渗透到社会的各个领域。随着芯片制造工艺和技术水平的不断提高,单片机的性价比越来越高,单片机技术的开放性和市场的管饭需求无疑给了单片机飞速发展的巨大动力。因此,单片机技术的开发和应用成为了如今电子行业技术工程人员必备的技术。

本课题将通过对目前市场上的数字电子钟的研究,制作一个基于AT89C52单片

机的多功能数字电子时钟,该表具有显示年、月、日、时、分、秒,正点报时,智能闹钟等功能。使得户外活动的人们可以在得到精确时间显示的同时得到提醒接下来的时间安排,方便人们的生活。并且扩展了温度的测量和显示。

通过此次课题的程序编写与实物制作调试,增强了我的编程能力和动手能力,把理论与实践融合在一起。同时,也进一步加深了对单片机的硬件结构和内部结构的理解和巩固。在此将电子时钟制作过程中用到的知识进行了一些总结,并记录了遇到的问题,希望自己今后做相似的课题或工程时能注意。同时也希望能成为一些读者的参考资料,能帮助读者避免出现相同的问题,并能从中得到一些启发。

第 6 页 共 50 页

电子系统设计报告

第1章 绪论

1.1 课题的意义和目的

时钟,自从它发明的那天起,就成为人类的朋友,但随着时间的推移,科学技术的不断发展,人们对时间计量的精度要求越来越高,应用越来越广。目前市场上出售的很多电子时钟中,功能五花八门,种类齐全,外表也非常精美,但对时钟的功能要求因人而异。针对此种情况,我们设计的此款新型多功能电子时钟应运而生,它既能够显示时间,又能整点报时,而准确的显示年、月、日、时、分、秒且可以进行秒表计时。满足了很多人愿望数字钟是一种多用电子时钟,与机械式时钟相比具有更高的准确性和直观性,且无机械装置而与一般的电子时钟相比,由于其多功能性,而不同于市场上其它同类产品,会多人的青睐。

1.2 课题的研究内容

1、设计任务

设计制作一台以控制器为核心的多功能计时系统 2、设计内容

①.系统具有3种工作模式状态(正常时钟显示模式、系统校准模式、秒表计时模式);系统所有功能,均能够通过上位PC机对其操作修改与实时动态显示。(PC主机端可利用高级语言进行人机界面设计)

②.在正常时钟显示模式时,时钟具有显示年、月、日、时、分、秒的功能。 ③.在正常时钟显示模式时,系统具有整点报时的功能,在离整点前10秒时,自动发出鸣叫声,步长1秒,每间隔1秒鸣叫一次,前4响是低音,后1响为高音,共鸣

第 7 页 共 50 页

电子系统设计报告

叫5次,最后1响结束时为整点。高音频率为1KHz;

④.在系统校准模式时,系统具有快速校准时间的功能。

⑤.在秒表计时模式时,可兼做比赛时间记录表。秒表记时的精度为0.1秒,由3个键分别控制秒表的启动、清零、记录功能,可连续记录3组时间,并能够显示记录时间。

⑥.系统显示器采用LCD液晶显示器1602或其它显示器件,并采用键盘对相关数据进行设置与操作。

⑦.在正常时钟模式下,具有定时报警功能,可任意设置定时时间进行报警。即当前时间与设定定时时间相一致时,输出报警信号。

第2章 系统方案设计

2.1系统方案设计 设计(研究)方案

方案1:采用单片机数码管或者液晶,通过定时器中断写时钟程序。再通过按键进行校时和闹铃,完成简单的数字时钟设计

整体框图:

晶振电路显示电路复位电路单片机按键电路

第 8 页 共 50 页

串行通信接口电路 电子系统设计报告

方案2:采用高精度的时钟芯片DS1302,可以通过矩阵键盘修改时间,可以对时间进行校时和闹铃,时钟芯片DS1302有一个备用电源,即使系统关闭,也可以计时,实用性强。

整体框图:

晶振电路显示电路复位电路单片机时钟芯片按键电路

串行通信接口电路 综合以上的方案,我决定用第二种方案设计设计电路 1.设计与运行环境

数字钟的程序设计在Keil4环境完成的,设计并完成的程序下载到单片机后,可以初始化DS1302的芯片进行计时,系统开始正常的运行

2.硬件的功能

数字钟能够正确显示年,月,日,时,分,秒。用户可以通过矩阵键盘任意修改时间以及闹铃时钟设置。

3.上位机的功能

能够获取系统当前的时间,也可以完成硬件的所满足的功能,远程控制硬件功能。

第3章 系统各模块的硬件设计

第 9 页 共 50 页

电子系统设计报告

确定了多点温湿度的监测系统方案设计,根据系统实现方案中各模块的功能设计要求,对多点粮仓温湿度的无线监测系统各模块硬件电路进行设计。该模块分为上位机和下位机,其主要包括以下七个模块:电源模块、温湿度测量模块、单片机控制模块、无线传输模块、按键选择模块、显示模块和报警电路模块。

3.1 电源模块设计

由于本系统功耗并不很大,而且不需要功率输出部分,因此只需用简单的输出5V

的电源供电。

3.2 主控模块设计

3.2.1单片机的发展阶段

单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。

(1)SCM即单片微型计算机(Single Chip Microcomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。在开创嵌入式系统独立发展道路上,Intel公司功不可没。 (2)MCU即微控制器(Micro Controller Unit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关,因此,发展MCU的重任不可避免地落在电气、电子技术厂家。从这一角度来看,Intel逐渐淡出MCU的发展也有其客观因素。在发展MCU方面,最著名的厂家当数Philips公司。 Philips公司以其在嵌入式应用方面的巨大优势,将MCS-51从单片微型计算机迅速发展到微控制器。因此,当我们回顾嵌入式系统发展道路时,不要忘记Intel和Philips的历史功绩。

(3)单片机是嵌入式系统的独立发展之路,向MCU阶段发展的重要因素,就是寻求应用系统在芯片上的最大化解决;因此,专用单片机的发展自然形成了SoC化趋势。随着微电子技术、IC设计、EDA工具的发展,基于SoC的单片机应用系统设计会有较大的发展。因此,对单片机的理解可以从单片微型计算机、单片微控制器延伸到单片应用系统。单片机作为微型计算机的一个重要分支,应用面很广,发展很快。自单片机诞生至

第 10 页 共 50 页

电子系统设计报告

今,已发展为上百种系列的近千个机种。

3.2.2 STC89C52单片机 (一)主要功能特性

标准MCS-51内核和指令系统 32个双向I/O口 3个16位可编程定时/计数器 向上或向下定时计数器 6个中断源 全双工串行通信口 —帧错误侦测 —自动地址识别 空闲和掉电节省模式 (二)STC89C52功能引脚图如图:

片内8kROM(可扩充64kB外部存储器) 256x8bit内部RAM(可扩充64kB外部存储器) 时钟频率3.5-12/24/33MHz 改进型快速编程脉冲算法 5.0V工作电压 布尔处理器 4层优先级中断结构 兼容TTL和CMOS逻辑电平 PDIP(40)和PLCC(44)封装形式

(三)引脚功能说明:

第 11 页 共 50 页

电子系统设计报告

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的一些特殊功能口,管脚 备选功能:

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(外部数据存储器读选通)

RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电

第 12 页 共 50 页

电子系统设计报告

平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA / VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 (四)振荡器特性

外接石英晶体或者陶瓷谐振器以及电容C1、C2接在放大器的反馈回路(AT89C52内部有一个用于构成内部振荡器的高增益反相放大电路,XTAL1、XTAL2分别是该放大器的输入和输出端)中构成并联振荡电路。

为了使装置能够被外部时钟信号激活,XATL1应该有效,而XTAL2应该被悬空。由于输入到内部的时钟信号电路通过了一个二分频的信号,外部信号的工作周期比没有别的要求,但是最大值和最小值的大小可以在数据表上观察出来。

当正常工作时,外部振荡器可以计算出XTAL1上的电容,最大可达到100pF。这是由于振荡器电容和反馈电容之间的相互作用。当外部信号是标准高电平或者低电平时,电容不会超过20pF。

3.2.3 主控模块的实现

本设计的系统以 STC89C52为主控芯片,主要进行基于STC89C52低功耗MCU的字符型电子时钟及其系统的研究。整个系统利用52系列单片机AT89C52为控制核心,结合高精度计时的时钟日历芯片DS1302用四*四矩阵按键使用来对其进行时钟校时、周数设置显示部分LCD1602液晶显示,用片选扫描的方式对其进行扫描,从而使数码管得以高亮度显示。单片机的连接如图3-1所示:

第 13 页 共 50 页

电子系统设计报告

如图3-1为第三章第一图

3.3时钟产生电路

3.3.1 DS1302的简介

DS1302是由美国DALLAS公司推出的一种低功耗、高性能的实时时钟芯片,实时时钟可提供年、月、日、时、分和秒的调整,一个月的30天与31天可以自动调整,且具有闰年的自动补偿功能。此款时钟芯片附加31字节的静态RAM,用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。工作电压2.5~5.5V。采用主电源和备用电源的双电源供电,并且可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。DS1302的外部引脚分配如图3-2所示

第 14 页 共 50 页

电子系统设计报告

图3-2第三章第二图

控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

为了实现系统报警计时等功能,此设计采用了DS302实时时钟芯片。DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。 3.3.3 DS1302实时显示时间的软硬件

DS1302与CPU的连接需要三条线,即SCLK(7)、I/O(6)、RST(5)。图中显示出DS1302

第 15 页 共 50 页

电子系统设计报告

与89C52的连接图,其中,时钟的显示用LCD。

在DS1302的时钟日历或RAM进行数据传送时,DS1302必须首先发送命令字节。若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输出数据字节。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,在此方式下可一次性读、写所有的RAM的31个字节。 3.3.4 DS1302的调试与电路实现

要特别说明的是备用电源3V,可以用电池或者超级电容器(0.1F以上)。虽然DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。DS1302在第一次加电后,必须进行初始化操作。初始化后就可以按正常方法调整时间。 实际上,在调试程序时可以不加电容器,只加一个32.768kHz 的晶振即可。电路原理图如3-3下:

图3-3第三章第三图

3.4显示模块

3.4.1 LCD1602的简介

工业字符型液晶,能够同时显示16x02即32个字符。(16列2行) 3.4.2 LCD1602引脚图及功能

第 16 页 共 50 页

电子系统设计报告

3.5按键控制模块

3.5.1键盘电路原理

键盘是由8个按键组成的开关,是最简单的也是最常用的单片机输入设备,操作员可以通过键盘输入数据或命令,实现简单的人机通信。

3.5.2键盘电路与89C52的连接如图

第 17 页 共 50 页

电子系统设计报告

第4章 系统软件设计

整个软件系统采用模块化思想,把1602,DS1302的驱动程序做成头文件,在功能程序中调用。采用这种方法不仅使程序模块化,使程序结构层次分明,便于管理和维护,同时可方便以后开发的调用,只要包含头文件,功能程序模块中再调用接口函数就可以了,而不必关心底层驱动是如何实现的,这样缩短了开发周期,开发效率大大提高。在主程序中采用事件顺序驱动机制的编程方法,按键处理中采用采用网状多级状态结构的编程方法,而秒表功能采用定时中断实现,精确到1ms。

主程序采用事件驱动机制,事件为某个按键按下,则主程序响应这个按键,并进入相应的功能程序,其编程思想如下:

第 18 页 共 50 页

电子系统设计报告

开始 主程序流程图 I/O初始化 DS1302初始化,定时中断初始化 读取DS1302的RAM中的时间 正常显示 整点到否? 报时 是否进入校准模式?K1? 闹钟模式?k 进入校准 确认?K4 进入闹钟定时模式 秒表模式?K5 确认?k4 进入秒表模式?k 确认?K4 第 19 页 共 50 页

电子系统设计报告

开始 闹钟模式 返回?K4 返回闹钟时间 确认?K4 显示是否与闹铃一致? 蜂鸣器响 显示闹铃时间 是否关闭蜂鸣?k 正常显示

第 20 页 共 50 页

电子系统设计报告

开始 返回?K4 正常显示

秒表模式 启动?K5 暂停?K1 记录? K1 显示 清零?K3 第 21 页 共 50 页

电子系统设计报告

开始 返回?K 光标确认 K4 调整时间K2、K3 确定?K4 正常显示

4.2 模块软件设计

4.2.1 LCD1602的驱动程序

#ifndef LCD_1602 #define LCD_1602

第 22 页 共 50 页

电子系统设计报告

#include

//引脚定义********************************************************** sbit LcdRs = P2^7; sbit LcdRw = P2^6; sbit LcdEn = P2^5; sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口 //内部等待函数************************************************************************** unsigned char LCD_Wait(void) { LcdRs=0; LcdRw=1; _nop_(); LcdEn=1; _nop_();

//// while(DBPort&0x80); //在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环, //可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80 //实际硬件时打开此语句 {LcdEn=0; } return DBPort; } //向LCD写入命令或数据************************************************************ #define LCD_COMMAND 0 // Command #define LCD_DATA 1 // Data

#define LCD_CLEAR_SCREEN 0x01 // 清屏 #define LCD_HOMING 0x02 // 光标返回原点 void LCD_Write(bit style, unsigned char input) { LcdEn=0; LcdRs=style; LcdRw=0; _nop_(); DBPort=input; _nop_();//注意顺序 LcdEn=1; _nop_();//注意顺序 LcdEn=0; _nop_(); LCD_Wait(); }

//设置显示模式************************************************************ #define LCD_SHOW 0x04 //显示开 #define LCD_HIDE 0x00 //显示关

第 23 页 共 50 页

#define LCD_CURSOR #define LCD_NO_CURSOR

#define LCD_FLASH 0x01 //光标闪动 #define LCD_NO_FLASH 0x00 //光标不闪动

void LCD_SetDisplay(unsigned char DisplayMode) //显示模式设定 { LCD_Write(LCD_COMMAND, 0x08|DisplayMode); }

//设置输入模式************************************************************ #define LCD_AC_UP 0x02 //读入一个字符后地址指针加一 #define LCD_AC_DOWN 0x00 //读入一个字符后地址指针减一

#define LCD_MOVE 0x01 //写一个字符后W左移 #define LCD_NO_MOVE 0x00 //写一个字符后不移动

void LCD_SetInput(unsigned char InputMode) //输入屏幕模式设定 { LCD_Write(LCD_COMMAND, 0x04|InputMode); }

//初始化LCD************************************************************ void LCD_Initial() { LcdEn=0; LCD_Write(LCD_COMMAND,0x38); //8位数据端口,一般指令 LCD_Write(LCD_COMMAND,0x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动 }

//************************************************************************ void GotoXY(unsigned char x, unsigned char y) { if(y==0) LCD_Write(LCD_COMMAND,0x80|x); if(y==1) LCD_Write(LCD_COMMAND,0x80|(x-0x40)); }

void Print(unsigned char *str)

第 24 页 共 50 页

电子系统设计报告

0x02 //显示光标 0x00 //无光标

电子系统设计报告

{ while(*str!='\\0') { LCD_Write(LCD_DATA,*str); str++; } }

#endif

4.2.2 DS1302的驱动程序 #ifndef _TIMER_DS1302 #define _TIMER_DS1302

sbit DS1302_CLK = P3^4; //实时时钟时钟线引脚 sbit DS1302_IO = P3^5; //实时时钟数据线引脚 sbit DS1302_RST = P3^6; //实时时钟复位线引脚 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7;

char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; unsigned char week_value[2];

typedef struct __SYSTEMTIME__ { unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Day; unsigned char Month; unsigned char Year; unsigned char DateString[10]; unsigned char TimeString[9];

}SYSTEMTIME; //定义的时间类型 //SYSTEMTIME CurrentTime;

#define AM(X) X

#define PM(X) (X+12) // 转成24小时制

#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,写时间 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84

#define DS1302_DAY 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C

第 25 页 共 50 页

电子系统设计报告

void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数) {

unsigned char i; ACC = d;

for(i=8; i>0; i--) {

DS1302_IO = ACC0; //相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; } }

unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数) {

unsigned char i; for(i=8; i>0; i--) {

ACC = ACC >>1; //相当于汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; }

return(ACC); }

void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据 {

DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1;

DS1302InputByte(ucAddr); // 地址,命令 DS1302InputByte(ucDa); // 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; }

unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据 {

unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0;

第 26 页 共 50 页

电子系统设计报告

DS1302_RST = 1;

DS1302InputByte(ucAddr|0x01); // 地址,命令 ucData = DS1302OutputByte(); // 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData); }

void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组 { unsigned char ReadValue; ReadValue = Read1302(DS1302_SECOND); Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //十六进制转换成十进制(x/16)*10+个位 ReadValue = Read1302(DS1302_MINUTE); Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_HOUR); Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_DAY); Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_MONTH); Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_YEAR); Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); }

void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]

{ if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2011/01/10 { Time->DateString[0] = '2'; Time->DateString[1] = '0'; Time->DateString[2] = Time->Year/10 + '0'; Time->DateString[3] = Time->Year + '0'; } else { Time->DateString[0] = ' '; Time->DateString[1] = ' ';

第 27 页 共 50 页

Time->DateString[10] = '\\0'; //字符串末尾加 '\\0' ,判断结束字符 }

void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];

{ if(hide_hour<2) { Time->TimeString[0] = Time->Hour/10 + '0'; Time->TimeString[1] = Time->Hour + '0'; } else { Time->TimeString[0] = ' '; Time->TimeString[1] = ' '; } Time->TimeString[2] = ':'; if(hide_min<2)

第 28 页 共 50 页

电子系统设计报告

Time->DateString[2] = ' '; Time->DateString[3] = ' '; }

Time->DateString[4] = '-'; if(hide_month<2) {

Time->DateString[5] = Time->Month/10 + '0'; Time->DateString[6] = Time->Month + '0'; }

else {

Time->DateString[5] = ' '; Time->DateString[6] = ' '; }

Time->DateString[7] = '-'; if(hide_day<2) {

Time->DateString[8]=Time->Day/10 + '0'; Time->DateString[9]=Time->Day + '0'; }

else {

Time->DateString[8] = ' ';

Time->DateString[9] = ' '; }

电子系统设计报告

{ Time->TimeString[3] = Time->Minute/10 + '0'; Time->TimeString[4] = Time->Minute + '0'; } else { Time->TimeString[3] = ' '; Time->TimeString[4] = ' '; } Time->TimeString[5] = ':'; if(hide_sec<2) { Time->TimeString[6] = Time->Second/10 + '0'; Time->TimeString[7] = Time->Second + '0'; }

else {

Time->TimeString[6] = ' '; Time->TimeString[7] = ' '; } Time->DateString[8] = '\\0'; }

void Initial_DS1302(void) //时钟芯片初始化 { unsigned char Second=Read1302(DS1302_SECOND); if(Second&0x80) //判断时钟芯片是否关闭 { Write1302(0x8e,0x00); //写入允许 Write1302(0x8c,0x0b); Write1302(0x88,0x0b); Write1302(0x86,0x22); Write1302(0x84,0x14); Write1302(0x82,0x57); Write1302(0x80,0x40); Write1302(0x8e,0x80); //禁止写入 } }

//*******************************ROM操作*************************************************

void WriteRAM(unsigned char address,unsigned char *dat,unsigned char n)//写RAM函数 {

第 29 页 共 50 页

电子系统设计报告

unsigned char i;

unsigned char addr=0xc0|(address<<1); for(i=0;i

Write1302(addr,*dat++); addr+=2; } }

void ReadRAM(unsigned char address,unsigned char *dat,unsigned char n)//读RAM函数 {

unsigned char i;

unsigned char addr=0xc1|(address<<1); for(i=0;i

*dat++=Read1302(addr); addr+=2; } }

#endif

4.2.4 延时程序 #ifndef _delay_H_ #define _delay_H_

void delay(uint x) //延时-us {

while(--x); }

void delayms(uint xms) //延时-ms {

uint i,j;

for(i=xms;i>0;i--)

for(j=125;j>0;j--); }

#endif

第5章 测试结果

在本次课程设计过程中,虽然非常顺利地完成了软件和硬件的设计和仿真,并最终实现了题目所要求实现的功能。但还有可深入研究和可改进之处。在调试过程中,最让人头痛的是DS1302的驱动,除了注意时序以外,引脚的连接和抗干扰很重要,特别是

第 30 页 共 50 页

电子系统设计报告

使用了备份电池,当备份电池直接接在芯片第1脚时,芯片的发热量很大,温度上升达到了很高的度数,经过查看数据手册,我的主电源与备用电源接反了,将线路正确和好后,温度还是很高,经过再仔细的看了芯片使用手册后,我认为是电池容量超过了芯片涓细充电电流所容许的容量,于是在第8脚和备用电池之间串联了30欧姆的电阻,减小充电电流,消除了DS1302的发热问题但不影响备用电池的功能。需要改进的地方是按键和时间的显示部分星期应该可以自己更新。在实际的操作中,按键的反应很慢,原因是为了防抖而在程序中加入只有按键弹起才执行的程序,虽然防抖了,但按键反应迟钝,带来了操作上的不便。但是在时间校准的设计上采用矩阵按键功能,能够快速校准时间,给设置时间带来了极大地方便。

第6章 结论

从最终的作品来看,本电子钟具有如下优点:走时准确;能快速校准时间;整点报时闹铃提示功能;秒表功能计时准确,精确到1毫秒;功耗低,操作界面友好,操作简便。

本课程设计从软件设计到仿真到硬件制作和调试,我收获不小。首先,我认真复习了C语言编程,其次我学习了使用protus和keil画电路原理图和编程。特别是在仿真编程和硬件调试方面。在编程过程中一直灌输给自己“编程是一种思想”,一定要用编程的思想去编程,如模块化思想,文件管理思想,头文件和接口函数的思想,设计程序时要考虑到程序的可扩充性,兼容性,可维护性以及重用性,并归纳和总结各种功能算法,各种调度和事件驱动机制等等。在编程方面有了一定的进步。在使用仿真软件时得到了一些启示:仿真只是提供一个实现的大概参考,真正的功能实现仍需在实际硬件调试中完善。此次的课程设计为我的毕业设计做了良好的基础。

第7章 参考文献

[1] 楼然苗,李光飞. 单片机课程设计指导[M].北京:北京航空航天大学出版社,2007 [2] 李海滨,片春媛,许瑞雪.单片机技术课程设计与项目实例[M].北京:中国电力出版社,2009

[3] 杨居义.单片机课程设计指导[M].北京:清华大学出版社,2009

[4] 张友德、赵金英、涂时亮.单片微型计算机原理、应用与实验(第四版)[M].上

海:复旦大学出版社.2003.

[5] 肖金球.单片机原理与接口技术[M].北京:清华大学出版社.2003.

[6] 张超琦.单片机原理及实例 实践篇[M].上海:上海交通大学出版社.2006.

[7] 吕胜杰. 用单片机实现DS18B20的远程无线温度检测[J]. 自动化应用, 2010, 11(09):

第 31 页 共 50 页

电子系统设计报告

31-37.

[8] 董秀洁, 赵程程. 基于AT89S52和nRF905的无线遥控系统设计与实现[J].中原工学

院学报, 2010, (04): 10-16.

[9] 郑阿奇,彭作民. Visual Basic.NET程序设计教程[M] .机械工业出版社, 2007,6

[10] Visual BASIC程序设计,谭浩强,清华大学出版社,2000

附录一:元器件清单

单片机STC89C52 电阻:4.7k 4个 10k 1个 1k 1个 电位器:10k 1个 晶振:12MHz 1个 32.7MHz 1个 时钟芯片DS1302

附录二:电路原理图

第8章 附录

蜂鸣器

三极管:8050 1个 电容:20PF 4个 电解电容:10uF 1个 按键:8个 排阻:330*8 2个 液晶显示LCD1602 第 32 页 共 50 页

电子系统设计报告

附录三:程序清单

#include #include #include \#include \#include \

#define uint unsigned int #define uchar unsigned char

sbit Set = P1^3; //模式切换键 sbit Up= P1^2; //加法按钮 sbit Down = P1^4; //减法按钮

sbit out = P1^1; //立刻跳出调整模式按钮 sbit stop_watch=P1^0;

sbit stop_watch_button1=P1^5; sbit stop_watch_button2=P1^6; sbit stop_watch_button3=P1^7;

第 33 页 共 50 页

电子系统设计报告

sbit b=P2^3;

char done,count,temp,flag,up_flag,down_flag;

char settime_flag,stopwatch_flag,stopwatch_count=0;

char idata stop_watch_temp1[]={' ','0','0',':','0','0',':','0','0',':','0','0','\\0'}; char idata stop_watch_temp2[]={' ','0','0',':','0','0',':','0','0',':','0','0','\\0'}; char idata stop_watch_temp3[]={' ','0','0',':','0','0',':','0','0',':','0','0','\\0'}; uchar week_value[2];

uchar idata stop_watch_value[]={' ','0','0',':','0','0',':','0','0',':','0','0','\\0'}; uchar idata DateStr[3]={'0','0','\\0'}; SYSTEMTIME CurrentTime; uchar idata minite=0; uchar idata second=0; uchar idata count_stop=0;

void show_time(); //液晶显示程序 void disp_alarm(void); void gettime(void); void trasfer(void)

{ stop_watch_value[4]=minite/10+0x30; stop_watch_value[5]=minite+0x30; stop_watch_value[7]=second/10+0x30; stop_watch_value[8]=second+0x30; stop_watch_value[10]=count_stop/10+0x30; stop_watch_value[11]=count_stop+0x30; }

void Delay1ms(unsigned int count) { unsigned int i,j; for(i=0;i

/*延时子程序*/

void mdelay(uint delay) { uint i;

for(;delay>0;delay--)

{for(i=0;i<62;i++) //1ms延时. {;} } }

void bz(int co,int h,int l) { int i;

第 34 页 共 50 页

电子系统设计报告

for(i=1;i<=co;i++) { b=1; mdelay(h); b=0; mdelay(l); } }

void disp_strstowatch(void) { LcdEn=0; LCD_Write(LCD_COMMAND,0x38); //8位数据端口,一般指令 LCD_Write(LCD_COMMAND,0x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 GotoXY(0, 0); Print(\ Stopwatch \ GotoXY(0,1); Print(\ GotoXY(1, 1); Print(stop_watch_value); stopwatch_flag=1; Delay1ms(200); }

void disp_strstowatch1(void) { LcdEn=0; LCD_Write(LCD_COMMAND,0x38); //8位数据端口,一般指令 LCD_Write(LCD_COMMAND,0x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 GotoXY(0,1); Print(\ GotoXY(0, 0); Print(stop_watch_temp1); GotoXY(1, 1); Print(stop_watch_value); stopwatch_flag=1; Delay1ms(200); }

void disp_strstowatch2(void) { LcdEn=0; LCD_Write(LCD_COMMAND,0x38); //8位数据端口,一般指令

第 35 页 共 50 页

}

void disp_strstowatch3(void) { LcdEn=0; LCD_Write(LCD_COMMAND,0x38); //8位数据端口,一般指令 LCD_Write(LCD_COMMAND,0x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 GotoXY(0,1); Print(\ GotoXY(0, 0); Print(stop_watch_temp3); GotoXY(1, 1); Print(stop_watch_value); stopwatch_flag=1; Delay1ms(200); }

void outkey() //跳出调整模式,返回默认显示 { uchar Second;

if(out==0) { mdelay(8); count=0; hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0; Second=Read1302(DS1302_SECOND); Write1302(0x8e,0x00); //写入允许 Write1302(0x80,Second&0x7f); Write1302(0x8E,0x80); //禁止写入 done=0; while(out==0); settime_flag=0; }

第 36 页 共 50 页

电子系统设计报告

LCD_Write(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 GotoXY(0,1); Print(\GotoXY(0, 0);

Print(stop_watch_temp2); GotoXY(1, 1);

Print(stop_watch_value); stopwatch_flag=1; Delay1ms(200);

电子系统设计报告

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////// void Upkey()//升序按键 { Up=1; if(Up==0) { mdelay(8); switch(count) {case 1:

temp=((Read1302(DS1302_SECOND)&0x70)>>4)*10 + (Read1302(DS1302_SECOND)&0x0F); //读取秒数 temp=temp+1; //秒数加1

up_flag=1; //数据调整后更新标志 if(temp>59) //超过59秒,清零 temp=0; break; case 2:

temp=((Read1302(DS1302_MINUTE)&0x70)>>4)*10 + (Read1302(DS1302_MINUTE)&0x0F); //读取分数 temp=temp+1; //分数加1 up_flag=1; if(temp>59) //超过59分,清零 temp=0; break; case 3:

temp=((Read1302(DS1302_HOUR)&0x70)>>4)*10 + (Read1302(DS1302_HOUR)&0x0F); //读取小时数 temp=temp+1; //小时数加1 up_flag=1; if(temp>23) //超过23小时,清零 temp=0; break; case 5:

temp=((Read1302(DS1302_DAY)&0x70)>>4)*10 + (Read1302(DS1302_DAY)&0x0F); //读取日数 temp=temp+1; //日数加1 up_flag=1; if(((Read1302(DS1302_MONTH)&0x70)>>4)*10 + (Read1302(DS1302_MONTH)&0x0F)==1||((Read1302(DS1302_MONTH)&0x70)>>4)*10

第 37 页 共 50 页

电子系统设计报告

+

(Read1302(DS1302_MONTH)&0x0F)==3||((Read1302(DS1302_MONTH)&0x70)>>4)*10 +

(Read1302(DS1302_MONTH)&0x0F)==5||((Read1302(DS1302_MONTH)&0x70)>>4)*10 +

(Read1302(DS1302_MONTH)&0x0F)==7||((Read1302(DS1302_MONTH)&0x70)>>4)*10 +

(Read1302(DS1302_MONTH)&0x0F)==8||((Read1302(DS1302_MONTH)&0x70)>>4)*10 +

(Read1302(DS1302_MONTH)&0x0F)==10||((Read1302(DS1302_MONTH)&0x70)>>4)*10 + (Read1302(DS1302_MONTH)&0x0F)==12) { if(temp>31) temp=1; } if(((Read1302(DS1302_MONTH)&0x70)>>4)*10 + (Read1302(DS1302_MONTH)&0x0F)==4||((Read1302(DS1302_MONTH)&0x70)>>4)*10 +

(Read1302(DS1302_MONTH)&0x0F)==6||((Read1302(DS1302_MONTH)&0x70)>>4)*10 +

(Read1302(DS1302_MONTH)&0x0F)==9||((Read1302(DS1302_MONTH)&0x70)>>4)*10 + (Read1302(DS1302_MONTH)&0x0F)==11) { if(temp>30) temp=1; } if(((Read1302(DS1302_MONTH)&0x70)>>4)*10 + (Read1302(DS1302_MONTH)&0x0F)==2) { if(temp>28) temp=1; } break; case 6:

temp=((Read1302(DS1302_MONTH)&0x70)>>4)*10 + (Read1302(DS1302_MONTH)&0x0F); //读取月数 temp=temp+1; //月数加1 up_flag=1; if(temp>12) temp=1; break; case 7:

第 38 页 共 50 页

电子系统设计报告

temp=((Read1302(DS1302_YEAR)&0x70)>>4)*10 + (Read1302(DS1302_YEAR)&0x0F); //读取年数 temp=temp+1; //年数加1 up_flag=1; if(temp>99) temp=0; break; default:break; } while(Up==0); } }

//////////////////////////////////////////////////////////////////////////////////////////////////////////// void Downkey()//降序按键 { Down=1; if(Down==0) { mdelay(8); switch(count) {case 1:

temp=((Read1302(DS1302_SECOND)&0x70)>>4)*10 + (Read1302(DS1302_SECOND)&0x0F); //读取秒数 temp=temp-1; //秒数减1 down_flag=1; //数据调整后更新标志 if(temp==0x7f) //小于0秒,返回59秒 temp=59; break; case 2:

temp=((Read1302(DS1302_MINUTE)&0x70)>>4)*10 + (Read1302(DS1302_MINUTE)&0x0F); //读取分数 temp=temp-1; //分数减1 down_flag=1; if(temp<0) temp=59; //小于0秒,返回59秒 break; case 3:

temp=((Read1302(DS1302_HOUR)&0x70)>>4)*10 + (Read1302(DS1302_HOUR)&0x0F);

第 39 页 共 50 页

电子系统设计报告

//读取小时数 temp=temp-1; //小时数减1 down_flag=1; if(temp<0) temp=23; break; case 5:

temp=((Read1302(DS1302_DAY)&0x70)>>4)*10 + (Read1302(DS1302_DAY)&0x0F); //读取日数 temp=temp-1; //日数减1 down_flag=1; if(temp<1) { if(((Read1302(DS1302_MONTH)&0x70)>>4)*10 + (Read1302(DS1302_MONTH)&0x0F)==1||((Read1302(DS1302_MONTH)&0x70)>>4)*10 +

(Read1302(DS1302_MONTH)&0x0F)==3||((Read1302(DS1302_MONTH)&0x70)>>4)*10 +

(Read1302(DS1302_MONTH)&0x0F)==5||((Read1302(DS1302_MONTH)&0x70)>>4)*10 +

(Read1302(DS1302_MONTH)&0x0F)==7||((Read1302(DS1302_MONTH)&0x70)>>4)*10 +

(Read1302(DS1302_MONTH)&0x0F)==8||((Read1302(DS1302_MONTH)&0x70)>>4)*10 +

(Read1302(DS1302_MONTH)&0x0F)==10||((Read1302(DS1302_MONTH)&0x70)>>4)*10 + (Read1302(DS1302_MONTH)&0x0F)==12) temp=31; if(((Read1302(DS1302_MONTH)&0x70)>>4)*10 + (Read1302(DS1302_MONTH)&0x0F)==4||((Read1302(DS1302_MONTH)&0x70)>>4)*10 +

(Read1302(DS1302_MONTH)&0x0F)==6||((Read1302(DS1302_MONTH)&0x70)>>4)*10 +

(Read1302(DS1302_MONTH)&0x0F)==9||((Read1302(DS1302_MONTH)&0x70)>>4)*10 + (Read1302(DS1302_MONTH)&0x0F)==11) temp=30; if(((Read1302(DS1302_MONTH)&0x70)>>4)*10 + (Read1302(DS1302_MONTH)&0x0F)==2) temp=28; } break; case 6:

temp=((Read1302(DS1302_MONTH)&0x70)>>4)*10 + (Read1302(DS1302_MONTH)&0x0F); //读取月数

第 40 页 共 50 页

本文来源:https://www.bwwdw.com/article/9oa3.html

Top