设计一款数字电子时钟设计报告,具体要求如下:

宿州学院 本科生毕业设计说明书(毕业论文)题目:多功能电子钟的设计学生姓名:胡利芳 学 专 班 号: 业:电子信息工程 级:10 电信专升本指导教师:张翠侠 多功能电子钟的设计与实现― 多功能电子钟的设计与实现―硬件部分 电子钟的设计与实现 摘 要
电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界 面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。 本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃的多功能电子时钟。 本文对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现多 功能电子时钟。 本设计应用 AT89C51 芯片作为核心, 位 LED 数码管显示, 7 使用 DS1302 实时时钟日历芯片完成时钟/日历的基本功能,这种实现方法的优点是电路简单,性能可 靠,实时性好,时间精度高,操作简单,编程容易。 该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功 能,从而给人们的生活和工作带来更多的方便。微软用户1]: 批注 [微软用户 页眉要修改 微软用户 微软用户2]: 批注 [微软用户 ? 微软用户微软用户3]: 在对当前 批注 [微软用户 改为: 微软用户 电子钟开发手段进行比较和分析 的基础上确定采用单片机技术实 现一款可正常显示时钟/日历、带 有定时闹铃的多功能电子时钟。关键词: 关键词:电子时钟;多功能;AT89C51;时钟日历芯片I The Design with Investigation of the Multi-function Electron Clock -The Design of the Hardware AbstractThe electronic clock mainly uses the electronic technology make the clock computerization, the digitization, with the clock precision, small size, friendly interface, scalable performance and other characteristics, was widely used in life and work. The design for the main implementing a clock/calendar can be displayed normal, collecting personal ambient temperature, with the timing alarm of the multi-function electronic clock. Comparing and analysising the development technology of the electron clock, the design determines to use the MCU technology to realize the multi-functional electron clock. This design application AT89C51 as a core chips, 7 LED digital displaying, using DS1302real-time clock chip to complete the basic function of the clock/calendar. The method has the advantage of being simple circuit, reliable performance, good real-time, high precision of the time, simply operation, easy programming. The electronic clock can be applied to the general living and working ,can also be modified to improve performance, add new functions, and brings more convenient to people’s life and work.Key words: E Multi- AT89C51; DS1302II 目 录摘 要 .........................................................................................................................................IAbstract ...................................................................................................................................... II 第一章 绪论 ............................................................................................ 错误!未定义书签。 错误!未定义书签。 1.1 多功能电子时钟研究的背景和意义.......................................................................... 1 1.2 电子时钟的功能 ......................................................................................................... 2 第二章 电子时钟设计方案分析 .............................................................................................. 3 2.1 FPGA 设计方案 ........................................................................................................... 3 2.2 单片机设计方案 ........................................................................ 错误!未定义书签。 错误!未定义书签。 第三章 基于单片机的电子时钟硬件设计............................................................................... 5 3.1 主要 IC 芯片选择 ....................................................................................................... 5 3.1.1 微处理器选择 .................................................................................................. 5 3.1.2.1 常用时钟日历芯片比较......................................................................... 7 3.1.2.2 DS1302 简介 .......................................................................................... 7 3.1.2.3 DS1302 引脚说明 .................................................................................. 7 3.1.2.4 DS1302 的控制字和读写时序说明....................................................... 8 3.2.1.5 DS1302 的片内寄存器 ........................................................................ 11 3.2 电子时钟硬件电路设计 ............................................................................................ 13 3.2.1 时钟电路设计 ................................................................................................ 14 3.2.2 显示电路 ........................................................................................................ 15 3.2.3 按键电路设计 ................................................................................................ 16III 3.2.4 闹铃电路设计 ................................................................................................ 18 3.2.5 复位电路设计 ................................................................................................ 19 第四章 电子时钟软件设计 .................................................................................................... 21 4.1 主程序设计 ............................................................................................................... 21 4.2 子程序设计 ............................................................................................................... 22 4.2.1 实时时钟日历子程序设计............................................................................. 22 4.2.2 显示子程序设计 ............................................................................................ 22 4.2.3 键盘扫描子程序 ............................................................................................ 23 4.2.4 闹铃子程序设计 ............................................................................................ 23 第五章 系统调试 .................................................................................................................... 28 5.1 硬件调试 ................................................................................................................... 29 5.1.1 单片机基础电路调试 .................................................................................... 29 5.1.2 显示电路调试 ................................................................................................ 30 5.1.3 DS1302 电路调试 ........................................................................................... 33 5.1.4 按键电路调试 ................................................................................................ 33 5.2 软件调试 ................................................................................................................... 34 5.2.1 键盘子程序调试 ............................................................................................ 34 结 论 ...................................................................................................................................... 35参考文献 .................................................................................................................................. 36 附录一 程序 .......................................................................................................................... 37 附录二 多功能电子时钟元器件一览表............................................................................... 63 附录三 多功能电子时钟硬件电路图 .................................................................................... 64IV 致谢 ...................................................................................................................................... 66微软用户4]: 批注 [微软用户 3.1.2 标题是什 微软用户 么?这部分章节安排有些乱, 请调 整。最多三级标题即可。 3.2.2 改为:显示电路设计 4.2.1 改为:日历子程序设计 5.2 节其他子程序的调试呢?? 调为两页V 第一章 绪 论时间是人类生活必不可少的重要元素,如果没有时间的概念,社会将不会有所发展 和进步。从古代的水漏、十二天干地支,到后来的机械钟表以及当今的石英钟,都充分 显现出了时间的重要,同时也代表着科技的进步。致力于计时器的研究和充分发挥时钟 的作用,将有着重要的意义。1.1 多功能电子时钟研究的背景和意义 多功能电子时钟研究的背景和意义 电子时钟研究20 世纪末,电子技术获得了飞速的发展。在其推动下,现代电子产品几乎渗透到了 社会的各个领域,有力的推动和提高了社会生产力的发展与信息化程度,同时也使现代 电子产品性能进一步提升,产品更新换代的节奏也越来越快。 时间对人们来说总是那么宝贵,工作的忙碌性和繁杂容易使人忘记当前的时间。然 而遇到重大事情的时候,一旦忘记时间,就会给自己或他人造成很大麻烦。平时我们要 求上班准时,约会或召开会议必然要提及时间;火车要准点到达,航班要准点起飞;工 业生产中,很多环节都需要用时间来确定工序替换时刻。所以说能随时准确的知道时间 并利用时间,是我们生活和工作中必不可少的[1]。 想知道时间, 手表当然是一个很好的选择,但是,在忙碌当中, 我们还需要一个“助 理” 及时的给我们提醒时间。所以,计时器最好能够拥有一个定时系统,随时提醒容易 忘记时间的人。 最早能够定时、 报时的时钟属于机械式钟表, 但这种时钟受到机械结构、 动力和体积的限制,在功能、性能以及造价上都没办法与电子时钟相比。 电子钟是采用电子电路实现对时、分、秒进行数字显示的计时装置,广泛应用于个 人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品。由于数1 字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟 表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报 时功能。诸如定时自动报警、0 按时自动打铃、定时广播、自动起闭路灯、定时开关烘 箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为 基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。1.2 电子时钟的功能 电子时电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时间精确、体积小、界 面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。当今市场上的电子时钟 品类繁多,外形小巧别致。也有体型较大的,诸如公共场所的大型电子报时器等。电子 时钟首先是数字化了的时间显示或报时器, 在此基础上, 人们可以根据不同场合的要求, 在时钟上加置其他功能,比如定时闹铃,万年历,环境温度、湿度检测,环境空气质量 检测,USB 扩展口功能等。 本设计电子时钟主要功能为: 1. 具有时间显示和手动校对功能,24 小时制; 2. 具有年、月、日显示和手动校对功能; 3. 具有闹铃功能; 4. 具有贪睡功能; 5. 掉电后无需重新设置时间和日期; 6. 采用交直流供电电源。交流供电为主,直流电源为后备辅助电源,并能自动切 换。2 电子时钟设计方案分析 第二章 电子时钟设计方案分析电子闹钟既可以通过纯硬件实现,也可以通过软硬件结合实现,根据电子时钟里的 核心部件――秒信号的产生原理,通常有以下两种形式:2.1 FPGA 设计方案 设计方案现场可编程门阵列(Field Programmable Gate Array,FPGA) ,是 20 世纪 70 年代发 展起来的一种可编程逻辑器件,是目前数字系统设计的主要硬件基础。FPGA 在结构上 由逻辑功能块排列为阵列,并由可编程的内部连线连接这些功能块,来实现一定的逻辑 功能。 可编程逻辑器件的设计过程是利用 EDA 开发软件和编程工具对器件进行开发的过 程。由于 EDA 技术拥有系统的模拟和仿真功能,可读性、可重复性、可测性非常好, 所以利用 EDA 开发 FPGA 是目前比较流行的方式。当然,有时根据需要,也会应用 MAX+plus 开发集成环境进行设计。 正因为 FPGA 在设计过程中方便、快捷,而且 FPGA 技术功能强大,能够应用其制 作诸如基代码发生器、数字频率计、电子琴、电梯控制器、自动售货机控制系统、多功 能波形发生器、步进电机定位控制系统、电子时钟等。 应用 FPGA 能够将时钟设计为为四种类型:全局时钟、门控时钟、多级逻辑时钟和 波动式时钟。多时钟系统能够包括上述四种时钟类型的任意组合[2][3][4]。2.2 单片机设计方案 单片机设计方案单片机是微型机的一个主要分支,它在结构上的最大特点使把 CPU、存储器、定时3 器和多种输入/输出接口电路集成在一块超大规模集成电路芯片上。就其组成和功能而 言,一块单片机芯片就是一台计算机。 单片机具有如下特点: 有优异的性能价格比; 1 集成度高、体积小、有很高的可靠性; 2 控制功能强; 3 低功耗、低电压,便于生产便携式产品; 4 外部总线增加了 I2C、SPI 等串行总线方式,进一步缩小了体积,简化了结构; 5 单片机的系统扩展、系统配置较典型、规范,容易构成各种规模的应用系统。 所以单片机的应用非常广泛,在智能仪表、机电一体化、实时控制、分布式多机系 统以及人们的生活中均有用武之地。单片机应用的重要意义还在于,它从根本上改变了 传统的控制系统设计思路和设计方法。从前必须由模拟电路或数字电路实现的大部分功 能,现在已能用单片机通过软件方法来实现了。这种用软件代替硬件的控制技术,是对 生产控制技术的一次革命。 利用单片机的智能性,可方便地实现具有智能的电子钟设计。单片机均具有时钟振 荡系统,利用系统时钟借助微处理器的定时器/计数器可实现电子钟功能。然而系统时钟 误差较大,电子钟的积累误差也可能较大,所以可以通过误差修正软件加以修正,或者 在设计中加入高精度时钟日历芯片, 以精确时间。 另外很多功能不同的单片机是兼容的, 这就更便于实现产品的多功能性。4 基于单片机的电子时钟硬件 电子时钟硬件设计 第三章 基于单片机的电子时钟硬件设计在比较了第二章的三种实现方案之后,考虑单片机货源充足、价格低廉,可软硬件 结合使用,能够较方便的实现系统的多功能性,故采用单片机作为本设计的硬件基础。3.1 主要 IC 芯片选择3.1.1 微处理器选择 微处理器选择 目前在单片机系统中,应用比较广泛的微处理器芯片主要为 8XC5X 系列单片机。 该系列单片机均采用标准 MCS-51 内核,硬件资源相互兼容,品类齐全,功能完善,性 能稳定,体积小,价格低廉,货源充足,调试和编程方便,所以应用极为广泛。 例如比较常用的 AT89C2051 单片机,带有 2KB Flash 可编程、可擦除只读存储器 (E2PROM)的低压、高性能 8 位 CMOS 微型计算机。拥有 15 条可编程 I/O 引脚,2 个 16 位定时器/计数器,6 个中断源,可编程串行 UART 通道,并能直接驱动 LED 输出。 仅仅是为了完成时钟设计或者是环境温度采集设计, 应用 AT89C2051 单片机完全可 以实现。但是将两种功能结合在一片单片机上,就需要更多的 I/O 引脚,故本设计采用 具有 32 根 I/O 引脚的 AT89C51 单片机。 AT89C51 单片机是一款低功耗,低电压,高性能 CMOS 8 位单片机,片内含 4KB (可经受 1000 次擦写周期) FLASH 可编程可反复擦写的只读程序存储器 的 (EPROM) , 器件采用 CMOS 工艺和 ATMEI 公司的高密度、非易失性存储器(NURAM)技术制造, 其输出引脚和指令系统都与 MCS-51 兼容。片内的 FLASH 存储器允许在系统内可改编 程序或用常规的非易失性存储器编程器来编程。因此,AT89C51 是一种功能强,灵活性 高且价格合理的单片机,可方便的应用在各个控制领域。5 AT89C51 具有以下主要性能: 1. 4KB 可改编程序 Flash 存储器; 2. 全静态工作:0――24Hz; 3. 128×8 字节内部 RAM; 4. 32 个外部双向输入/输出(I/O)口; 5. 6 个中断优先级; 2 个 16 位可编程定时计数器; 6. 可编程串行通道; 7. 片内时钟振荡器。 此外,AT89C51 是用静态逻辑来设计的,其工作频率可下降到 0Hz,并提供两种可 用软件来选择的省电方式――空闲方式(Idle Mode)和掉电方式(Power Down Mode) 。 在空闲方式中,CPU 停止工作,而 RAM、定时器/计数器、串行口和中断系统都继续工 作。在掉电方式中,片内振荡器停止工作,由于时钟被“冻结” ,使一切功能都暂停,只 保存片内 RAM 中的内容,直到下一次硬件复位为止[8]。图 3.1 AT89C51 芯片 PDIP 封装引脚图AT89C51 为适应不同的产品需求,采用 PDIP、TQFP、PLCC 三种封装形式,本系6 统采用双列直插 PDIP 封装形式,如图 3.1。时钟日历芯片选择 3.1.2.1 常用时钟日历芯片比较 在电子时钟设计中,常用的实时时钟芯片有 DS12887、DS1216、DS1643、DS1302。 每种芯片的主要时钟功能基本相同,只是在引脚数量、备用电池的安装方式、计时精度 DS12887 与 DS1216 芯片都有内嵌式锂电池作为备用电池; 和扩展功能等方面略有不同。 X1203 引脚少,没有嵌入式锂电池,跟 DS1302 芯片功能相似,只是相比较之下,X1203 与 AT89S51 搭配使用时占用 I/O 口较多。DS1643 为带有全功能实时时钟的 8K×8 非易 失性 SRAM,集成了非易失性 SRAM、实时时钟、晶振、电源掉电控制电路和锂电池电 源,BCD 码表示的年、月、日、星期、时、分、秒,带闰年补偿。同样,DS1643 拥有 28 只管脚,硬件连接起来占用微处理器 I/O 口较多,不方便系统功能拓展和维护。故而 从性价比和货源上考虑,本设计采用实时时钟日历芯片 DS1302。 3.1.2.2 DS1302 简介 DS1302 是美国 DALLAS 公司推出的一种高性能、低功耗的实时时钟日历芯片,附 加 31 字节静态 RAM, 采用 SPI 三线接口与 CPU 进行同步通信, 并可采用突发方式一次 传送多个字节的时钟信号和 RAM 数据。实时时钟可提供秒、分、时、日、星期、月和 年,一个月小于 31 天时可以自动调整,且具有闰年补偿功能。工作电压宽达 2.5~5.5V。 采用双电源供电(主电源和备用电源) ,可设置备用电源充电方式,提供了对后备电源进 行涓细电流充电的能力。 有主电源和备份电源双引脚, 而且备份电源可由大容量电容 (> 1F)来替代。需要强调的是,DS1302 需要使用 32.768KHz 的晶振。 3.1.2.3 DS1302 引脚说明 DS1302 引脚图参照图 3.2。7 DS 3 4 VC C1 X1 X2 GND VC C2 SCLK I/O RST 8 7 6 5图 3.2 DS1302 芯片引脚图其的引脚功能参照表 3.1。表 3.1 DS1302 引脚功能说明 引脚号 1 2 3 4 5 6 7 8 名称 VCC1 X1 X2 GND RST I/O SCLK VCC2 功能 备份电源输入 32.768KHz 晶振输入 32.768KHz 晶振输出 地 控制移位寄存器/复位 数据输入/输出 串行时钟 主电源输入3.1.2.4 DS1302 的控制字和读写时序说明 在编程过程中要注意 DS1302 的读写时序。DS1302 是 SPI 总线驱动方式。它不仅要 向寄存器写入控制字,还需要读取相应寄存器的数据。要想与 DS1302 通信,首先要先 了解 DS1302 的控制字。DS1302 的控制字如表 3.2。表 3.2 DS1302 控制字(即地址及命令字节) BIT7 BIT6 RAM 1 A4 A3 A2 A1 A0 BIT5 BIT4 BIT 3 BIT 2 BIT 1 BIT 0 RDCKWR控制字的作用是设定 DS1302 的工作方式、传送字节数等。每次数据的传输都是由8 控制字开始。控制字各位的含义和作用如下: 1. BIT7:控制字的最高有效位,必须是逻辑 1,如果它为 0,则不能把数据写入到 DS1302 中。 2. BIT 6:如果为 0,则表示存取日历时钟数据,为 1 表示存取 RAM 数据; 3. BIT 5 至 BIT 1(A4~A0) :用 A4~A0 表示,定义片内寄存器和 RAM 的地址。 定义如下: 当 BIT 6 位=0 时,定义时钟和其他寄存器的地址。A4~A0=0~6,顺序为秒、分、 为芯片写保护寄存器地址。 A4~A0=8, 当 时、 月、 日、 星期、 年的寄存器。 A4~A0=7, 当 为慢速充电参数选择寄存器。当 A4~A0=31,为时钟多字节方式选择寄存器。 当 BIT 6=1 时,定义 RAM 的地址,A4~A0=0~30,对应各子地址的 RAM,地址 31 对应的是 RAM 多字节方式选择寄存器。 :如为 0,表示要进行写操作,为 1 表示进行读操作。 4. BIT 0(最低有效位) 控制字总是从最低位开始输出。在控制字指令输入后的下一个 SCLK 时钟的上升沿 时,数据被写入 DS1302,数据输入从最低位(0 位)开始。同样,在紧跟 8 位的控制字 指令后的下一个 SCLK 脉冲的下降沿,读出 DS1302 的数据,读出的数据也是从最低位 到最高位。9 图 3.3 DS1302 数据读写时序DS1302 的数据读写方式有两种,一种是单字节操作方式,一种是多字节操作方式。 每次仅写入或读出一个字节数据称为单字节操作,每次对时钟/日历的 8 字节或 31 字节 RAM 进行全体写入或读出的操作,称其为多字节操作方式。当以多字节方式写时钟寄 存器时,必须按数据传送的次序依次写入 8 个寄存器。但是,当以多字节方式写 RAM 时, 不必写所有 31 字节。 不管是否写了全部 31 字节, 所写的每一个字节都将传送至 RAM。 为了启动数据的传输,CE 引脚信号应由低变高,当把 CE 驱动至逻辑 1 的状态时, SCLK 必须为逻辑 0,数据在 SCLK 的上升沿串行输入。无论是读周期还是写周期,也 无论送方式是单字节传送还是多字节传送, 都要通过控制字指定 40 字节中的哪个将被访 问。在开始 8 个时钟周期把命令字(具有地址和控制信息的 8 位数据)装入移位寄存器 之后,另外的时钟在读操作时输出数据,在写操作时输入数据,所有的数据在时钟的下 降沿变化。所有写入或读出操作都是先向芯片发送一个命令字节。对于单字节操作,包 括命令字节在内,每次为 2 个字节,需要 16 个时钟;对于时钟/日历多字节模式操作, 每次为 7 个字节,需要 72 个时钟;而对于 RAM 多字节模式操作,每次则为 32 字节, 需要多达 256 个时钟。 这里仅给出单字节读写时序, 如图 3.3。 多字节操作方式与其类似,10 只是后面跟的字节数不止一个。 3.2.1.5 DS1302 的片内寄存器表 3.3 DS1302 有关日历、时间的寄存器 读寄 写寄 BIT7 存器 存器 81H 83H 80H 82H CH 10 秒 10 分 10 85H 84H 秒 分 00-59 00-59 1-12 时 AM/PM 87H 89H 8BH 8DH 8FH 86H 88H 8AH 8CH 8EH WP 0 0 0 0 0 0 0 10 年 0 0 0 0 0 10 日 10 月 0 0 年 0 0 日 月 周日 时 0-23 1-31 1-12 1-7 00-99 ― BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 范围12 / 240通过控制字对 DS1302 片内寄存器进行寻址之后,即可就所选中寄存器的各位进行 操作。片内各寄存器及各位的功能定义如表 3.3。 DS1302 有关日历、时间的寄存器共有 10 个,时钟/日历包含在其中的 7 个写/读寄 存器内,这 7 个寄存器分别是秒、分、小时、日、月、星期和年。 小时寄存器(85H、84H)的位 7 用于定义 DS1302 是运行于 12 小时模式还是 24 小 时模式。当为 12 小时制式时,位 5 为“0”表示 AM;为“1”表示 PM。在 24 小时制 式下,位 5 是第二个 10 小时位(20~23 时) 。 秒寄存器(81H、80H)的位 7 定义为时钟暂停标志(CH) 。当该位置为 1 时,时钟 振荡器停止,DS1302 处于低功耗状态;当该位置为 0 时,时钟开始运行。一般在设置 时钟时,可以停止其工作,设定完之后,再启动其工作。11 控制寄存器(8FH、8EH)的位 7 是写保护位(WP) ,其它 7 位均置为 0。在任何片 内时钟/日历寄存器和 RAM,在写操作之前,WP 位必须为 0,否则将不可写入。当 WP 位为 1 时,写保护位防止对任一寄存器的写操作。因此,通过置写保护位,可以提高数 据的安全性。另外,还有慢速充电控制寄存器和 RAM 寄存器。如表 3.4。表 3.4 充电控制寄存器和 RAM 寄存器各位定义 BIT7 充电控制寄存器 RAM 寄存器 TCS ― BIT6 TCS ― BIT5 TCS ― BIT4 TCS ― BIT3 DS ― BIT2 DS ― BIT1 RS ― BIT0 RS ―慢速充电寄存器控制着 DS1302 的慢速充电特性。寄存器的 BIT4~BIT7(TCS)决 定是否具备充电性能: 仅在编码为 1010 的条件下才具备充电性能, 其他编码组合不允许 充电。 BIT2 和 BIT3 选择在 VCC2 和 VCC1 之间是一个还是两个二极管串入其中。如果编码 DS 是 01,选择一个二极管;如果编码是 10,选择两个二极管;其他编码将不允许充电。 该寄存器的 BIT0 和 BIT1 用于选择与二极管相串联的电阻值。 其中编码 RS=01 为 2 K , RS=10 为 4 K ,RS=11 为 8 K ,而 RS=00 将不允许进行充电。因此,根据慢速充电寄 存器的不同编码可得到不同的充电电流。其具体计算如公式 3.1:I 充电=(V0-VD-VE)/R (3.1)式中: V0――所接入的 5.0V 工作电压; VD――二极管压降,一个按 0.7V 计算; R――慢速充电控制寄存器 0 和 1 位编码决定的电阻值; VE――VCC1 脚所接入的电池电压。12 RAM 寄存器寻址空间一次排列的 31 字节静态 RAM 可为用户使用,备用电源位 RAM 提供了掉电保护功能。寄存器和 RAM 的操作通过命令字节的 BIT6 加以区别。当 BIT6 为“0”时对 RAM 区进行寻址;否则将对时钟/日历寄存器寻址。其操作方法与前 述相同[9][10][11]。具体驱动程序参见附录 A。3.2 电子时钟硬件电路设计 电子时钟硬件电路设计电子闹钟至少要包括秒信号发生器、时间显示电路、按键电路、供电电源、闹铃指 示电路等几部分。另外,本设计要求该电子钟能够采集环境温度,所以还需要温度采集 芯片。硬件电路框图参照图 3.7。 该系统使用 AT89C51 单片机作为核心,通过读取时钟日历芯片 DS1302 和温度传感 器 DS18B20 的数据,完成此电子时钟的主要功能――时钟/日历和环境温度采集。使用 比较通用的 8 段共阴数码管,做 7 位显示,分别显示时/年,分/月,秒/日,以及环境温 度值。图 3.7 多功能电子时钟硬件系统框图键盘是为了完成时钟/日历的校对和日历/温度的显示功能。由于此电子时钟要求具13 有闹铃功能,所以设计有闹铃电路,进行声音响铃。 整个电路使用了两种电源, +5V 电源将为整个电路供电。 而+3V 电源仅作为 DS1302 的备用电源。 当+5V 电源被切断后, DS1302 启用+3V 电源, 可以保持 DS1302 继续工作。 当+5V 电源恢复供电,LED 依旧显示当前时间,而不会因为断电使系统复位到初始化时 间,避免了重新校时的麻烦。 具体电路图请参见附录 C。 3.2.1 时钟电路设计 时钟电路设计 系统时钟应用了实时时钟日历芯片 DS1302, 其连接如图 3.8。 该硬件电路设计简单, 抗干扰能力强。 如图,AT89C51 单片机 P1.7 直接接 DS1302 的 RST 端,上电后,AT89C51 的 P1.7 脚自动输出高电平。P1.5 作为串行时钟接口,P1.6 作为时钟数据的 I/O。DS1302 采用双 电源供电,平时由+5V 电源供电,当+5V 掉电之后,由图中 BT1(+3V 备用电池)供电。 特别需要注意 X1 和 X2 两端连接的晶振 Y1,该晶振频率为 32.768KHz。+5U1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RST P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD XTAL2 XTAL1 GND AT89S51 VC C P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 EA/VPP ALE/PR OG PSEN P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21BT1 BATTER Y 1 2 3 4U2 VC C1 X1 X2 GND DS 1302 VC C2 SCLK I/O RST 8 7 6 5Y1 32.768KHz图 3.8 系统时钟电路14 3.2.2 显示电路 就时钟而言,通常可采用 LCD 显示或 LED 显示。对于一般的段式 LCD,需要专门 的驱动电路,而且 LCD 显示的可视性较差;对于具有驱动电路和微处理器接口的液晶 显示模块 (字符或点阵) 一般采用并行接口, , 对微处理器的接口要求较高, 占用资源多。 另外,AT89C51 本身没有专门的液晶驱动接口。LED 结构简单,体积小,功耗低,响应 速度快,易于匹配,寿命长,可靠性高,而且显示亮度高,价格便宜,市场上也有专门 的时钟显示组合 LED。故本设计中应用 7 位 8 段共阴 LED 实现显示部分,显示面板分 布如图 3.6。 LED 显示分动态显示和静态显示:动态显示方式的硬件电路简单。但设计上如果处 理不当,易造成亮度低,闪烁问题。因此合理的设计既应保证驱动电路易实现,又要保 证图像稳定,无闪烁。动态显示采用多路复用技术的动态扫描显示方式,复用的程度不 是无限增加的,因为利用动态扫描显示使我们看到一幅稳定画面的实质是利用了人眼的 暂留效应和发光二极管发光时间的长短,发光的亮度等因素。 静态显示,是由微型计算机一次输出显示模型后,就能保持该显示结果,直到下次 发送新的显示模型为止。静态显示驱动程序简单,且 CPU 占用率低,但每个 LED 数码 管需要一个锁存器来锁存每一个显示位的笔段代码,硬件开销大,仅适合显示位数较少 的场合。为了在显示部分节省单片机 I/O 口,故采用静态显示方式。电路图参见图 3.10。 74LS164 是 8 位移位寄存器,应用该芯片驱动 LED 做显示部分,其优点在于连线简 单,节省单片机 I/O 口,软件编程容易。关于 74LS164 的具体编程方法,请参见第四章 4.2.5 显示子程序设计部分[14][15]。15 年/ 时LED0 1 2 3 4 5 6 7 8a b c d e f g dp a f e g d GND b c dp月 /分LED2 LED3a f e g d GND b c dp a b c d e f g dp日 /秒LED4 LED5a f e g d GND b c dpLED1 1 2 3 4 5 6 7 8a b c d e f g dp a f e g d GND b c dp1 2 3 4 5 6 7 81 2 3 4 5 6 7 8a b c d e f g dpLED6aa f e g d GND b c dp1 2 3 4 5 6 7 8a b c d e f g dp1 2 3 4 5 6 7 8a b c d e f g dpf eg d GNDb c dp1 2 3 4 5 6 7 8a b c d e f g dpa f e g d GND b c dp999999R1 300KR2 300KR3 300KR4 300KR5 300KR6 300K9 R7 300K 3 4 5 6 10 11 12 13 U10 74LS164 14 7 9 8 1 2 V CC G ND CLR CLK A B QA QB QC QD QE QF QG QH3 4 5 6 10 11 12 133 4 5 6 10 11 12 133 4 5 6 10 11 12 133 4 5 6 10 11 12 133 4 5 6 10 11 12 13U4 74LS164U5 74LS164U6 74LS164U7 74LS164U8 74LS1643 4 5 6 10 11 12 13 U9 74LS164 14 7 9 8 1 2 V CC G ND CLR CLK A B QA QB QC QD QE QF QG QHQA QB QC QD QE QF QG QHQA QB QC QD QE QF QG QHQA QB QC QD QE QF QG QHQA QB QC QD QE QF QG QHV CC G NDV CC G NDV CC G NDV CC G ND14 714 714 714 7+5P1.0 P1.1图 3.10 显示面板 LED 分布图3.2.3 按键电路设计 按键电路 电路设计 根据功能需要,本时钟需要设置以下功能键:校对选择键,加 1 操作键,减 1 操作 键,显示日期键,闹铃开关键。 按照键盘与 CPU 的连接方式可分为独立式键盘和矩阵式键盘。 独立式键盘是各个按 键相互独立, 每个按键占用一个 I/O 口线, 每根 I/O 口线上的按键不会影响其他 I/O 口上 按键工作状态。独立式键盘电路配置灵活,软件结构简单,但每个按键必须占用一根 I/O 口,在按键数量较多时,I/O 口线浪费较大,且电路结构复杂。矩阵式键盘适合按键较 多时使用。 由于本设计的电子钟最多需要 7 个按键, 若采用矩阵式键盘时会有按键浪费, 故采用的是独立式键盘。键盘电路如图 3.11。对于内置了上拉电阻的 I/O 引脚来说,外 接上拉电阻没有意义[15][16]。如图 3.11。P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 SW-PB K1 K2 K3 K4 K5 K6 K7图 3.11 键盘电路1614 79 81 29 81 29 81 29 81 29 81 2V CC G NDCLR CLKCLR CLKCLR CLKCLR CLKCLR CLKA BA BA BA BA BQA QB QC QD QE QF QG QH 其中 K1、K2、K7 为带自锁按键,每次按下后,其对应的 P2.7、P2.6、P2.1 管脚接 地,从高电平被拉至低电平。只有再次按下,按键弹出,与之连接的单片机管脚才会重 新被拉回高电平。K3、K4、K5、K6 键为自动复位按键。每次按下后,会自动弹出。单 片机管脚只有在按键按下时为低电平, 按键弹出后重新恢复高电平。 按键功能参见表 3.8。表 3.8 按键功能表 按键 K1 K3 K4 K5 K6 K7 键名 Calendar FUN UP DOWN Enter/Snooze Alarm 功能 显示日历 功能选择 数值加一操作 数值减一操作 确认键/贪睡 闹铃开关 属性 自锁 自动复位 自动复位 自动复位 自动复位 自锁按键操作说明如下: K1 键:该键为带自锁按键,在正常显示时间状态下,每次将按键按下, LED 数码 管将显示日期;再次按下,按键弹出,重新显示时间。 K3 键: 该键为自动复位键, 在正常显示时间状态下, 第一次按下后, 开始校对小时, 以后每次按下都会分别进入对分、秒、闹铃时、闹铃分、年、月、日的校对状态。 K4 键:该键为自动复位键,在校对状态下,每次按动该键,都会使相应校对位进行 加 1 操作。例如:校对小时状态,每按一下,小时位加 1,当加至小时最高值 23 时,再 按 K4 键,小时位回 0。调分、秒、年、月、日与皆之相同,只是各位最高值不同。 K5 键:该键为自动复位键,与 K4 键类似,不同之处是该键每次按下将使相应校对 位进行减 1 操作。 K6 键:该键为自动复位键,在校对状态下,按下该键,从校对状态返回时间显示状17 态;在响铃状态下,按下该键,闹铃进入贪睡状态。 K7 键:该键为带自锁按键,按下后闹铃开启,弹出后闹铃关闭。 3.2.4 闹铃电路设计 闹铃电路 电路设计 闹铃音乐可以直接采用蜂鸣器闹铃,如当前时刻与闹铃时间相同,单片机向蜂鸣器 送出高电平,蜂鸣器发声。采用蜂鸣器闹铃结构简单,控制方便,但是发出的闹铃声音 单一。也可以在编程的时候编写一段音乐程序,待闹铃时间到时,调用该音乐程序给扬 声器,便响起音乐。不过该方法只能做一些简单音乐,并且音乐程序会占用很多单片机 存储资源。 还有一种方法是采用录音放音芯片 1420 做闹铃, 先对录放音设备录入一段音乐, 当 到设定时间时,单片机控制录放音设备放音。采用录放音电路,铃声可以是预先设定的 一段自己喜欢的音乐,符合电器设备人性化的要求。且 1420 芯片可以分段录音,还具有 语音报时功能。 另外,也可以购置一块音乐集成电路,加置在单片机和蜂鸣器之间,当单片机连接 闹铃电路的管脚送出高电平时,音乐集成电路会给蜂鸣器特定脉冲,使蜂鸣器发声。此 类集成电路体积较小,使用方便,不足的是音乐简单、单一。 闹铃的音乐不是本设计中的重点,故采用最简单的方法,占用单片机一根 I/O 口 P2.0, 中间用 PNP 型三极管 S9012 连接 P2.0 和蜂鸣器。 P2.0 引脚为低电平时, 当 S9012 的发射极和集电极导通,使蜂鸣器发声。当响铃标志位为“1”时,P2.0 送一定频率脉 冲,使蜂鸣器 U11 发出声音[16]。如图 3.12。18 +5P2.0R8 10KQ1 S9012U11BUZZER图 3.12 闹铃电路3.2.5 复位电路设计 复位电路设计 复位是单片机的初始化操作, 以便使 CPU 和系统中其他部件都处于一个确定的初始 状态,并从这个状态开始工作。除了进入系统的正常初始化之外,当单片机系统在运行 出错或操作错误使系统处于死锁状态时,也可按复位键重新启动。 复位后,PC 内容初始化为 0000H,使单片机从 0000H 单元开始执行程序。单片机 复位后,除了 PC 之外,还对片内的特殊功能寄存器有影响,它们的复位状态如表 3.9 所示。 单片机复位后不影响内部 RAM 的状态 。 89C51 单片机复位信号的输入端是 RST 引脚,高电平有效。其有效时间持续 24 个时钟周期(2 个机器周期)以上。 RST 端的外部复位电路有两种操作方式:上电自动复位和按键手动复位。 上电自动复位是利用电容储电来实现的,如图 3.13(a)所示。上电瞬间,RC 电路充 电,RST 端出现正脉冲,随着充电电流的减少,RST 的电位逐渐下降。按键手动复位有 电平方式和脉冲方式两种。 按键电平复位是相当于 RST 端通过电阻接高电平, 如图 3.13(b) 所示;按键脉冲复位,利用 RC 微分电路产生正脉冲,如图 3.13(c)所示[12] [17]。出于应用方便,本设计采用按键电平复位电路。实际电路请参见附录 C,复位按键 为 K8。19 表 3.9 单片机寄存器的复位状态表 寄存器 PC ACC PSW SP DPTR P1、P3 IP IE TMOD 复位状态 H 07H 0000H FFH ××××00000B PCON 00H 0×××0000B(CHMOS) 寄存器 TCON TH0 TL0 TH1 TL1 SCON SBUF 复位状态 00H 00H 00H 00H 00H 00H 不定 0×××××××B(NMOS)+5 RESET Vcc+5 RESET Vcc+5Vcc22uF200 22uF RST RST22uF22uF 10K 1KRST1K1KGND 89C51GND 89C51GND 89C51(a)上多上上(b)按按多按上上(c)按按按按上上图 3.13 上电复位和按键复位电路20 电子时钟软件 软件设计 第四章 电子时钟软件设计C51 单片机可以应用汇编语言和 C 语言进行编程。 ,汇编语言与机器指令一一对应 所以用汇编语言编写的程序在单片机里运行起来效率较高。C 语言程序可读性高,更便 于理解。 本设计使用 C 语言编程。4.1 主程序设计第一次上电,系统先进行初始化, LED 显示初始时间“14:28:00” ,并开始走时。 初始日期为 2008 年 5 月 12 日,此刻若按 K1 键,LED 显示“080512” 。 单片机依次开始调用键盘扫描子程序、DS1302 子程序、DS18B20 子程序、闹铃子 程序,经过延时,返回程序开头循环运行。 主程序流程图如图 4.1。图 4.1 多功能电子钟主程序流程图21 4.2 子程序设计 子程序设计4.2.1 实时时钟日历子程序设计 该程序主要实现对 DS1302 写保护、充电,对年、月、日、时、分、秒等寄存器的 读写操作。在读写操作子程序中都执行了关中断指令,因为在串行通信时对时序要求比 较高,而且在此是用 I/O 口软件模拟串行时钟脉冲,所以在通信过程中最好保证传输的 连续性,不要允许中断。其流程图如图 4.2。图 4.2 实时时钟日历子程序流程图DS1302 每次上电时自动处于暂停状态,必须把秒寄存器的位 7 置位 0,时钟才开始 计时。如果 DS1302 一直没有掉电,则不存在此问题。 在进行写操作时,需要先解除写保护寄存器的“禁止”状态。当用多字节模式进行 操作时,必须写够 8 字节。 源程序见附录一。 4.2.2 显示子程序设计 用 74LS164 驱动 LED 数码管静态显示电路,编程也很容易。只要将需要显示的数 字编辑成对应的 BCD 码,逐位送入 74LS164 的 A、B 串行输入端,数码管将正常显示。 关键之处是要实现根据键值显示不同的数字。22 为了方便实现按键显示,程序中调用的都是各个标志位,通过判断标志位的“真” 、 “假”来决定显示的内容。显示子程序流程图参见图 4.4。源程序见附录一。 4.2.3 键盘扫描子程序 单片机对键盘扫描的方法有随机扫描方式、定时扫描方式和中断扫描方式。 在随机扫描方式中,CPU 完成某特定任务后,即执行键盘扫描程序,以确定键盘有 无按键输入,然后根据按键功能转去执行相应的操作。在执行键盘按键规定的功能中不 理睬键盘输入。 定时扫描方式与随机扫描方式基本相同, 只是利用 CPU 内的定时中断, 每隔一定时 间扫描有无按键被按下,键盘反应速度较快,在处理按键功能过程中,可以通过键盘命 令进行干预,如取消、暂停等操作。 前两种扫描方式均会占用 CPU 大量时间。不管有没有键入操作,CPU 总要在一定 的时间内进行扫描,这对于单片机控制系统是很不利的。 由于本设计中 AT89C51 单片机在系统中的主要任务是接受 DS1302 和 DS18B20 的 数据并送出显示, 完成时钟/日历校对和日期/温度显示控制。 89C51 单片机完全有能力完 成以上工作,所以采用随机扫描键盘方式,系统也能够正常运行。程序流程如图 4.5。 单片机扫描完键盘,得到键值,并根据键值转入执行对应任务,以实现按键功能。 如果没有按键按下,则程序扫描到 Key=FFH,将键值 Key 清零,返回主程序。 源程序见附录一。 4.2.4 闹铃子程序设计 闹铃子程序最主要的任务是不断用时钟分(min)与时(hour)同设定的闹铃分(clk_min) 与闹铃时(clk_hour)比较,只要满足 min 等于 clk_min、hour 等于 clk_hour,响铃启动 5 分钟,并根据外部按键执行相应贪睡任务。该程序流程图参见图 4.6。源程序见附录一。23 24 图 4.4 显示子程序流程图图 4.5 键盘扫描子程序25 26 图 4.6 闹铃子程序流程图批注 [微软用户 图和图标要在 微软用户5]: 微软用户 同一页!27 系统调试 第五章 系统调试调试工作分硬件调试和软件调试两部分,调试方法介绍如下: 首先,硬件调试主要是先搭建硬件平台,然后利用万用表等工具对电路检查,最后 应用程序进行功能调试。硬件调试比较费时,需要细心和耐心,也需要熟练掌握电路原 理。 然后,可以直接应用一些编辑或仿真软件进行软件调试,比如单片机 C51 编辑软件 Keil。该软件提供了一个集成开发环境 uVision,它包括 C 编辑器、宏编辑器、连接器、 库管理和一个功能强大的仿真调试器。通过编译、运行,可以检查程序错误。但应用此 方法,仍需要十分了解所使用元器件的工作方式和管脚连接方式。在软件调试过程中要 仔细耐心, 即便是多写或少些一两个字符, 都无法编译成功。 而有时往往在 Keil 中编译、 运行无错,但烧录到单片机中运行起来就会出错,很可能是编程时管脚或时序编辑得不 对。 还有一种方式,即应用仿真软件搭建电路的软件平台,再导入程序进行仿真调试。 如果电路出错,可以在计算机上方便的修改电路,程序出错可以重新编辑程序,这种方 法节时、省力,经济、方便。笔者应用的仿真软件为 Proteus。 总之,调试过程是一个软硬件相结合调试的过程,硬件电路是基础,软件是检测硬 件电路和实现其功能的关键 。 在调试过程中,首先必须明确调试顺序。例如:本设计是在单片机系统基础上建立 起来的,所以必须先确定单片机基础电路能否正常工作。为了正确显示时间,接下来还 要确定显示电路能否正常工作。硬件调试的过程,也是软件调试的过程。 然后,要准备好调试的工具。硬件调试需要万用表、示波器等,软件调试一般需要28[13] 诸如 Keil 等仿真编辑器。笔者根据自己实际制作该多功能电子时钟的经验,将调试过程 介绍如下:5.1 硬件调试5.1.1 单片机基础电路调试 单片机基础电路包括电源、单片机、外部时钟震荡电路、复位电路和外部接口电路。 调试过程需要注意以下几点: 1. 检查电源是否完好。 2. 单片机电源要连接正确,并且保证 AT89C51 的 31 号引脚接高电平。AT89C51 的 31 号引脚是外部程序存储器选择信号端,当该引脚为高电平时,单片机会一直从片内程 序存储器内取指令。 3. 如果使用 P0 口做 I/O 口,要接上拉电阻。 笔者在制作外部接口电路时 4. 使用万用表排查电路中是否存在断路或者短路情况。 使用的是排针,焊接时容易出现管脚之间短路,所以在上电以前必须先排查电路。 5. 编辑一个使一组发光二极管循环点亮的程序并烧录到单片机内,上电运行,检查 单片机是否正常工作,复位电路是否正确。 笔者编辑了使一组 P1 口点亮 8 个发光二极管循环点亮的程序,程序代码如下: #include ®51.h& void delay(void) { Unsigned char i, j,k; for(i=50;i&0;i--)29//延时子程序//延时时间根据变量 i,j,k 不同而改变 for(j=50;j&0;j--) for(k=250;k&0;i--); } void main() { unsigned char code ledp[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; while(1) { P1=0xFFH; for(n=0;n&8;n++) {P1=ledp[n]; delay(); }}} 5.1.2 显示电路调试 本设计的显示电路使用了共阴 LED 和 74LS164。 在连接显示电路之前要明确共阴型 8 段 LED 的 10 个管脚与各段发光二极管的对应关系,熟悉 74LS164 管脚位置,然后才 能开始进行连接 。在连接过程中,需要注意以下几点: 1. LED 数码管各管脚与 74LS164 各管脚的对应关系要十分清楚,所有 LED 数码管 与 74LS164 的连接方式要统一。 2. 因为是移位显示,所以需要注意前一位 74LS164 的 QH 脚要与下一位 74LS164 的 A、B 脚连接。 3. 明确单片机管脚功能。本设计定义了 P1.0 连接 74LS164 的 A、B 脚,P1.1 连接 74LS164 的 CLK 脚。30[19]//初始化 P1 口 4. 74LS164 的 CLR 脚接高电平。 5. 编写一段显示程序,烧录进单片机,检查好电源正负端和 P1.0、P1.1 连接是否正 确。检查无误后上电,检查显示电路是否正确。 以下是笔者编写的一段显示程序:上电后,7 位数码管分别显示 0~6。 #include ®51.h& #define uint unsigned int #define uchar unsigned char void dis(); void sendbyte(); sbit DAT=P1^0; sbit CLK=P1^1; uchar disp_buffer[7]; unsigned char tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f }; void delay_50ms(unsigned int t) { for(;t&0;t--) for(j=6245;j&0;j--) {;} } //显示子程序,0~6 //延时子程序void dis() { unsigned char gsb,led,led1, disp_buffer[0]=tab[0];31 disp_buffer[1]=tab[1]; disp_buffer[2]=tab[2]; disp_buffer[3]=tab[3]; disp_buffer[4]=tab[4]; disp_buffer[5]=tab[5]; disp_buffer[6]=tab[6]; for(gsb=0;gsb&7;gsb++) { led=disp_buffer[gsb]; for(jj=0;jj&8;jj++) { led1=led&0x1; if (led1==0x1) DAT=1; else DAT=0; CLK=0;CLK=1; led=led&&1; }}} void main() { while(1) { dis(); delay_50ms(10); }}32//主程序 5.1.3 DS1302 电路调试 该电路包含 DS1302 芯片、主电源、备用电源、晶振等部分。在与单片机连接的过 程中需要注意以下几点: 本设计定义为: DS1302 的 SCLK 连接 P1.5, 1. 清楚 DS1302 与单片机连接的管脚。 I/O 连接 P1.6,RST 连接 P1.7。 2. 注意电源正负极连接。 3. DS1302 接 32.768KHz 的晶振。该晶振体型比较小,在焊接时要小心,注意不要 将晶振引脚弄断。同时也要尽量使晶振离 DS1302 的 X1、X2 引脚近距离焊接。 4. 编写 DS1302 的时钟/日历程序,只要求能够正确显示时间。烧录进单片机,检 查电路电源正负极连接是否正确,检查 P1.0 和 P1.1 引脚接线是否正确。检查无 误后可以上电检查。 笔者编写了一段时钟/日历显示程序,设置初始时间为 14:28:00,初始日期为 2008 年 5 月 12 日。上电后 LED 数码管显示“142800” ,之后开始走时。观察 32 分钟之后, 数码管显示“150000” ,证明 DS1302 电路正确。源程序见附录 A 5.1.4 按键电路调试 按键电路比较简单,故调试起来也很容易。如果确保按键焊接正确,只需在 DS1302 的调试程序上加上一段日历显示子程序,并在主程序中写入: If(P_7==0) { dis_ } 日历显示子程序原理与时钟显示子程序原理相同, 源程序见附录 A 该程序的功能是:33 当按下 K7 时,第 1~6 位 LED 数码管马上由时间显示日期。当 K7 弹出后,数码管 1~ 6 位有显示日期转为显示实时时间[20]。5.2 软件调试在硬件调试完毕的基础上,需要进一步完善程序,也就是进入软件调试阶段。在本 设计中,软件调试主要分三大部分:实时时钟日历子程序调试、环境温度采集子程序调 试、按键子程序调试。将这三部分调试成功,那么整个设计的软件部分也就基本完成了。 在硬件调试部分,已经将实时时钟日历子程序调试完毕了,只需在主程序中调用按 键子程序即可,源程序见附录 A,这里不再赘述。 5.2.1 键盘子程序调试 键盘子程序调试 依据设计要求,键盘子程序需要完成对时间/日历的校对、日期/温度的显示和闹铃 的开关。为了便于显示子程序和闹铃子程序的调用,除了 K1、K2 键以外,其余按键都 定义功能标志位。例如: If(K7==0) { alarm_flag= } 在调用闹铃子程序时,闹铃标志位为“1” ,则开启闹铃,否则关闭闹铃。源程序见 附录 A。34 结 论过去人们应用时钟仅仅是为了明确当前时间。随着生产力的发展,社会的进步,生 产生活对时钟的需求越来越大,对时钟的体型、功能的要求也各有不同。所以多功能电 子时钟在今后的应用也会越来越广泛。 基于单片机实现电子时钟,仅仅是众多方法之一。并且市场上的实时时钟日历芯片 品类繁多,IC 化的传感器各种各样,显示方式也愈趋于人性化。所以多功能电子时钟有 多种实现方案,能够实现的功能也很多,笔者已经通过仿真和调试,实现了时间日历显 示和校对、闹铃等功能。本文采用 51 单片机 C 语言进行编程,当然也可以应用汇编语 言编程。由于笔者能力有限,提供的程序还可以进一步优化,并且还可以根据需求为电 子时钟增设新功能。35 参考文献1. 向继文等.基于 AT89C51 的电子钟系统设计[J],机电产片开发与创新,2007 年第 2 期 2. 黄智伟,王彦. FPGA 系统设计与实践[M],北京:电子工业出版社,. 刘皖等. FPGA 设计与应用[M],北京:清华大学出版社,. 姜煜等. 基于 FPGA 芯片设计多功能数字钟的研究[J],应用科技,2001 年 12 月第 28 卷 12 期 5. 冯育长. 单片机系统设计与实例分析[M],西安:西安电子科技大学出版社,.李及,赵利民.MCS-51 系列单片机原理与应用[M].长春:吉林科学技术社,1995. 7. 何力民. 单片机应用技术选编 5[M],北京:北京航空航天大学出版社 . 潘永雄. 新编单片机原理与应用[M],西安:西安电子科技大学出版社,. 万胜前. 基于 KeilC51 软件的电子钟设计与制作[J],鄂州大学学报,2007 年第 2 期 10. 蒋敏. 单片微机万年历设计[J],职大学报,2000 年第 2 期 11. 彭小军. 用单片机实现电子时钟[J].新余高专学报,2004 年 4 月第 9 卷第 2 期 12. 逢玉台等. 集成温度传感器 AD590 及其应用[J],国外电子元器件,2002 年第 7 期 13. 戴佳,戴卫恒. 51 单片机 C 语言应用程序设计实例精讲[M],北京:电子工业出版社,. 付家才. 单片机控制工程实践技术[M],北京:化学工业出版社,.刘军等.单片机原理与接口技术[M],上海:华东理工大学出版社,. 何书森等. 用电子线路设计速成[M],福州:福建科学技术出版社,. 李晓静等. 液晶显示控制器与单片机的接口及编程[J],电子技术,2004 年第 6 期. 张迎新. 单片微型计算机原理、 应用及接口技术 (第二版) [M], 北京: 国防工业出版社, 19. 潘新民,王艳芳. 微型计算机控制技术[M],北京:电子工业出版社, 2004. 20. 沈红卫. 基于单片机的智能系统设计与实现[M],北京:电子工业出版社,2005.1.36 附录一 附录一 程序程序 A.1 主程序 //主程序的功能是对子程序进行调用,并设定显示延时时间 #include ®51.h& #include &typedef.h& #include &lcd.h& #include &key.h& #include &alarm_clock.h& #include &ds1302.h& sbit DAT=P1^0; sbit CLK=P1^1; sbit Calendar=P2^7; sbit WDZ=P2^6; sbit FUN=P2^5; sbit UP=P2^4; sbit DOWN=P2^3; sbit Ente_Snooze=P2^2; sbit Alarm=P2^1; sbit beeper= P2^0; #define uint unsigned int #define uchar unsigned char37//头文件;//74LS164 的 A、B 脚接单片机 P1.0; //74LS164 的 CLOCK 脚接单片机 P1.1; //定义日历显示按键 K7 接单片机 P2.7; //定义温度显示按键 K6 接单片机 P2.6; //定义功能选择键 K5 接单片机 P2.5; //定义加 1 键 K4 接单片机 P2.4; //定义减 1 键 K3 接单片机 P2.3; //定义确认/贪睡键 K2 接单片机 P2.2; //定义闹铃开关键 K1 接单片机 P2.1; //定义闹铃接口 P2.0; #define true #define false1 0//定义 true=1; //定义 false=0; //定义 FUN 键值为 DFH; //定义 UP 键值为 EFH; //定义 DOWN 键值为 F7H; //定义 ALARM 键值为 FBH; //定义 E/S 键值为 BFH;#define FUNCTION 0xDF #define UP #define DOWN #define ALARM #define Ente_Snooze void key_task(void); void process(uchar current_key); extern bit flash_ extern uchar function_ extern bit alarm_ extern bit key_ void dis(); void sendbyte(); void void uchar void reset_3w(); wbyte_3w(uchar); rbyte_3w(); 0xEF 0xF7 0xFB 0xFB; //定义全局变量(标志位)write_byte(uchar Clock_Add,uchar Clock_Data);uchar read_byte(uchar); void write_clock_burst(); void ds1302_init();38 void ds1302_task(); void lcd_disp_time1();void dis_WD(); void ds18b20(); void alarm_clock(void); void delay(unsigned int time) { unsigned char a,b,c; for(a=0;a&a++) for(b=0;b&10;b++) for(c=0;c&120;c++); void main() { ds1302_init(); beeper=1; while(1) { key_task(); ds1302_task(); alarm_clock(); disp_time(); delay(55); beeper=1; }} 程序 A.2 电子时钟程序39//10ms 延时} //主程序; //初始化 DS1302; //初始化闹铃管脚; //循环; //扫描键盘子程序; //DS1302 子程序; //闹铃子程序; //时间显示子程序; //延时; //闹铃管脚置 1; //主要是对时钟芯片 DS1302 初始化; #include ®51.h& #include &typedef.h& #include &lcd.h& #include &ds1302.h& #include &key.h& void void uchar void reset_3w(); wbyte_3w(uchar); rbyte_3w(); write_byte(uchar Clock_Add,uchar Clock_Data);uchar read_byte(uchar); void write_clock_burst(); void ds1302_init();void ds1302_task(); #define uint unsigned int #define uchar unsigned char /*-------------定义初始化时间----------*/ uchar sec=00; uchar min=25; uchar hour=14; uchar date=12; uchar month=5;40 uchar year=8; uchar day_of_ uchar clk_hour=14; uchar clk_min=28; //-14:28-/*-----------------定义寄存器地址----------------------*/ #define READ_SEC_ADD #define READ_MIN_ADD #define READ_HOUR_ADD #define READ_DATE_ADD 0x81 0x83 0x85 0x87 //读秒寄存器 //读分寄存器 //读时寄存器 //读日寄存器 //读月寄存器 //读周寄存器 //年寄存器 //写秒寄存器 //写分寄存器 //写时寄存器 //写日寄存器 //写月寄存器 //写周寄存器 //写年寄存器 //时钟多字节传送模式#define READ_MONTH_ADD 0x89 #define READ_DOW_ADD #define READ_YEAR_ADD #define WRITE_SEC_ADD #define WRITE_MIN_ADD 0x8B 0x8D 0x80 0x82#define WRITE_HOUR_ADD 0x84 #define WRITE_DATE_ADD 0x86 #define WRITE_MONTH_ADD 0x88 #define WRITE_DOW_ADD 0x8A#define WRITE_YEAR_ADD 0x8C #define CLOCK_BURST_ADD 0xBE extern void write_clock_burst();extern void write_byte (uchar Clock_Add,uchar Clock_Data);41 void sendbyte(); void void uchar void reset_3w(); wbyte_3w(uchar); rbyte_3w(); write_byte(uchar Clock_Add,uchar Clock_Data);uchar read_byte(uchar); void write_clock_burst(); void ds1302_init();void ds1302_task(); sbit SCLK = P3^5; sbit IO = P3^6; //定义管脚 SCLK //定义管脚 I/O //定义管脚 RSTsbit RST = P3^7; uchar sec,min,hour,date,month, uchar code hex2bcd[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, /* 00-09 */ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, /* 10-19 */ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, /* 20-29 */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 30-39 */42 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, /* 40-49 */ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, /* 50-59 */ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, /* 60-69 */ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, /* 70-79 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, /* 80-89 */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, /* 90-99 */ }; uchar code bcd2hex[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, /* 00-09 */ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, /* 10-19 */ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, /* 20-29 */ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, /* 30-39 */43 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, /* 40-49 */ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, 0, 0, 0, 0, /* 50-59 */ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 0, 0, 0, 0, 0, 0, /* 60-69 */ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 0, 0, 0, 0, 0, 0, /* 70-79 */ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 0, 0, 0, 0, 0, 0, /* 80-89 */ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, 0, /* 90-99 */ }; void reset_3w() { SCLK = 0; RST = 0; RST = 1; } void wbyte_3w(uchar W_Byte) { for(i = 0; i & 8; ++i) { IO = 0;44/ /复位子程序//复位 DS1302,中止数据传送 //启动数据传送//写字节子程序 if(W_Byte & 0x01) { IO = 1; } SCLK = 0; SCLK = 1; W_Byte &&= 1; uchar rbyte_3w() }} //读字节子程序{ uchar R_B uchar TmpB R_Byte = 0x00; IO = 1; for(i = 0; i & 8; i++) { SCLK = 1; SCLK = 0; TmpByte = (uchar)IO; TmpByte &&= 7; R_Byte &&= 1; R_Byte |= TmpB return R_B void } }write_byte(uchar Clock_Add,uchar Clock_Data){ reset_3w(); wbyte_3w(Clock_Add);45 wbyte_3w(Clock_Data); reset_3w(); }void write_clock_burst() { reset_3w(); wbyte_3w(CLOCK_BURST_ADD); wbyte_3w(hex2bcd[sec]); wbyte_3w(hex2bcd[min]); wbyte_3w(hex2bcd[hour]); wbyte_3w(hex2bcd[date]); wbyte_3w(hex2bcd[month]); wbyte_3w(hex2bcd[day_of_week]); wbyte_3w(hex2bcd[year]); wbyte_3w(0); reset_3w(); } uchar read_byte(uchar Clock_Add) // 从 DS1302 读一个字节 /* must write control register in burst mode */ //复位 //写多字节传送模式寄存器 //写入初始化时间{ uchar Clock_D reset_3w(); wbyte_3w(Clock_Add); Clock_Data = rbyte_3w(); reset_3w(); return(Clock_Data); }46 voidds1302_init()/* --- initialize time & date for default value --- */{ reset_3w(); wbyte_3w(0x8e); wbyte_3w(0); reset_3w(); wbyte_3w(0x90); wbyte_3w(0xab); // 写涓流充电寄存器 // 写保护寄存器 //去保护//开涓流充电,在 VCC1 和 VCC2 之间串入 2 个二极管,8KΩ电阻 //写入初始化时间write_clock_burst(); } void ds1302_task() { if(!key_enable) {sec = bcd2hex[read_byte(READ_SEC_ADD)]; min = bcd2hex[read_byte(READ_MIN_ADD)]; hour = bcd2hex[read_byte(READ_HOUR_ADD)]; date = bcd2hex[read_byte(READ_DATE_ADD)];//读 DS1302 sec //读 DS1302 min //读 DS1302 hourday_of_week = bcd2hex[read_byte(READ_DOW_ADD)]; month = bcd2hex[read_byte(READ_MONTH_ADD)]; year = bcd2hex[read_byte(READ_YEAR_ADD)]; }} 程序 A.3 键盘子程序 //主要是用于对时间的设定与调整 #include ®51.h&47//读 DS1302 month //读 DS1302 year #include &typedef.h& #include &key.h& #include &ds1302.h& uint wait_ bit key_ bit flash_ bit alarm_ uchar flash_ uchar function_count=0; uchar key_ uchar key_l; void key_scan() { uchar l,a,PUSH; PUSH=P2&0xFF; if( PUSH!=0xFF) { for(l=500;l&0;l--) for(a=50;a &0;a--) ; if( PUSH!=0xFF) { key_push=P2&0xFF; key=key_ }}}48//扫描键盘;//延时;//key 等于键值; void process(uchar current_key) { switch (current_key) {case FUNCTION: { key_enable=//按键功能子程序;//功能选择键;function_count=function_count+1; if(function_count&=9) function_count=1; case UP: { { if(function_count==1) sec++; if(sec&=60) sec=0; write_byte(WRITE_SEC_ADD,hex2bcd[sec]); //写入秒寄存器; } if(function_count==2) { min++; if(min&=60) min=0; write_byte(WRITE_MIN_ADD,hex2bcd[min]); //写入分寄存器; } else if(function_count==3)49}//加 1 操作键; //function_count=1,则秒加 1 操作;//秒加到 60,则被置 0;//function_count=2,则分加 1 操作;//分加到 60,则被置 0;//function_count=3,则小时加 1 操作; {hour++; if(hour&=24) hour=0; write_byte(WRITE_HOUR_ADD,hex2bcd[hour]); //写入小时寄存器; //小时加到 24,则被置 0;} else if(function_count==4) { clk_min++; if(clk_min&=60) clk_min=0; } //function_count=5,则闹铃小时加 1 操作; //分钟加满 60 自动置 0; //function_count=4,则闹铃分钟加 1 操作;else if(function_count==5) { clk_hour++; if(clk_hour&=24) clk_hour=0; else if(function_count==6) { year++; if(year&99) year=0; }//小时加满 24 自动置 0;//function_count=6,则年加 1 操作;write_byte(WRITE_YEAR_ADD,hex2bcd[year]); } } else if(function_count==7) { month++; if(month&=13)50//function_count=7,则月加 1 操作; month=1; write_byte(WRITE_MONTH_ADD,hex2bcd[month]); else if(function_count==8) { date++; if(date&=31) date=0; write_byte(WRITE_DATE_ADD,hex2bcd[date]); case DOWN: { if(function_count==1) { if(sec==0) sec=60; -- write_byte(WRITE_SEC_ADD,hex2bcd[sec]); if(function_count==2) { if(min==0) min=60; -- write_byte(WRITE_MIN_ADD,hex2bcd[min]); else if(function_count==3) { if(hour==0) hour=24;51}//function_count=8,则日加 1 操作;}//键盘减 1 操作功能}} -- write_byte(WRITE_HOUR_ADD,hex2bcd[hour]); else if(function_count==4) { if(clk_min==0) clk_min=60; --clk_} else if(function_count==5) { if(clk_hour==0) clk_hour=24; --clk_ } else if(function_count==6) { if(year==0) year=100; -- write_byte(WRITE_YEAR_ADD,hex2bcd[year]); else if(function_count==7) { if(month==1) month=13; -- write_byte(WRITE_MONTH_ADD,hex2bcd[month]); else if(function_count==8) { if(date==0)52}}} date=31; -- write_byte(WRITE_DATE_ADD,hex2bcd[date]); case ALARM: { case Ente_Snooze { Time= //确认键; //贪睡功能; alarm_flag=(~alarm_flag); } }if((alarm_flag==true)&(clk_hour==hour)&(clk_min==min)) { default: void key_task() { key_scan(); if(key==0x29) { wait_time=wait_time+1; if(wait_time==3) { wait_time=0; key_enable= else wait_time=0;53clk_min = clk_min +5;}}}}}} if(function_count!=0) { flash_count++; if(flash_count&20) flash_flag= else if((flash_count&20)&&(flash_count&40)) flash_flag= if(flash_count&=40) flash_count=0; process(key); if(Calendar==0) {dis_Calendar ();} else if(WDZ==0) {void dis_WD();} if(Time=true) { disp_time();} key=0; } 主要是设定闹铃的条件 //如果按下确认键,直接显示时间; //如果 K6 按下,显示温度; //如果 K7 按下,显示日期; }程序 A.4 闹铃程序 #include ®51.h& #include &typedef.h& #include &lcd.h& #include &alarm_clock.h& #include &key.h&54 uchar freq_ void alarm_clock() { unsigned char a,b,c; if((alarm_flag==true)&(clk_hour==hour)&(clk_min==min)) { freq_count++; if(freq_count&30) { beeper= }for(a=0;a&2;a++) for(b=0;b&10;b++) for(c=0;c&120;c++); if(freq_count&=30) { beeper= if(freq_count==100) freq_count=0; }} 程序 A.5 显示程序 //当符合不同的条件时,该程序使数码管显示不同的数据; #include ®51.h& #include &typedef.h& #include &lcd.h& #include &key.h& uchar sec=45; uchar min=0;55} uchar hour=8; uchar date=1; uchar month=1; uchar year=6; uchar day_of_ uchar clk_hour=8; uchar clk_min=1; uchar disp_buffer2[7]; unsigned char dis[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x08,0x40, 0x01};//低中高 void disp_time(void) { unsigned char gsb,led,led1, if(function_count&=1) { if((flash_flag==true)&&(function_count==1)) { disp_buffer[0]=dis[3]; disp_buffer[2]=dis[hour%10]; disp_buffer[1]=dis[hour/10]; if(key_enable==false) { function_count=0; disp_buffer[0]=dis[11]; else56// Sun 00:00:00//08:00//时显示//正常显示}} {if(alarm_flag==true) disp_buffer[0]=dis[12];//闹钟开关显示else if(function_count==0) disp_buffer[0]=0; disp_buffer[2]=dis[hour%10]; disp_buffer[1]=dis[hour/10]; }if((flash_flag==true)&&(function_count==2)) //分显示 { disp_buffer[0]=dis[2]; disp_buffer[4]=dis[min%10]; //正常显示 disp_buffer[3]=dis[min/10]; if(key_enable==false) { function_count=0; disp_buffer[0]=dis[11]; else { disp_buffer[4]=dis[min%10]; disp_buffer[3]=dis[min/10]; } }}if((flash_flag==true)&&(function_count==3)) //秒显示 { disp_buffer[0]=dis[3]; disp_buffer[6]=dis[sec%10]; disp_buffer[5]=dis[sec/10]; if(key_enable==false)57//正常显示 {function_count=0; disp_buffer[0]=dis[11]; }}else { disp_buffer[6]=dis[sec%10]; disp_buffer[5]=dis[sec/10]; for(gsb=0;gsb&7;gsb++) { led=disp_buffer[gsb]; for(jj=0;jj&8;jj++) { led1=led&0x1; if (led1==0x1) data_led=1;//DATA=1 else data_led=0;//DATA=0 clk_led=0;clk_led=1;//clk=0~1 led=led&&1; else if(function_count&3) { if((flash_flag==true)&&(function_count==4)) { disp_buffer2[1]=dis[11]; disp_buffer2[2]=dis[11]; disp_buffer2[3]=dis[11]; disp_buffer2[4]=dis[11];58}}}}//约定时间设置 disp_buffer2[0]=dis[4]; disp_buffer2[6]=dis[clk_min%10]; disp_buffer2[5]=dis[clk_min/10]; if(key_enable==false) { function_count=0; disp_buffer[0]=dis[11]; if((flash_flag==true)&&(function_count==5)) { disp_buffer2[1]=dis[11]; disp_buffer2[2]=dis[11]; disp_buffer2[5]=dis[11]; disp_buffer2[6]=dis[11]; disp_buffer2[0]=dis[5]; disp_buffer2[4]=dis[clk_hour%10]; disp_buffer2[3]=dis[clk_hour/10]; if(key_enable==false) { function_count=0; disp_buffer[0]=dis[11]; }} //日设置 //预约时正常显示 }} //预约分正常显示if((flash_flag==true)&&(function_count==8)) { disp_buffer2[1]=dis[11]; disp_buffer2[2]=dis[11]; disp_buffer2[3]=dis[11]; disp_buffer2[4]=dis[11];59 disp_buffer[0]=dis[6]; disp_buffer2[6]=dis[date%10]; disp_buffer2[5]=dis[date/10]; if(key_enable==false) { function_count=0; disp_buffer[0]=dis[11]; }} //月设置 //日正常显示if((flash_flag==true)&&(function_count==7)) { disp_buffer2[1]=dis[11]; disp_buffer2[2]=dis[11]; disp_buffer2[5]=dis[11]; disp_buffer2[6]=dis[11]; disp_buffer2[0]=dis[7]; disp_buffer2[4]=dis[month%10]; disp_buffer2[3]=dis[month/10]; if(key_enable==false) { function_count=0; disp_buffer[0]=dis[11]; if((flash_flag==true)&&(function_count==6)) { disp_buffer2[5]=dis[11]; disp_buffer2[6]=dis[11]; disp_buffer2[3]=dis[11]; disp_buffer2[4]=dis[11];60//月正常显示}} //年设置 disp_buffer2[0]=dis[8]; disp_buffer2[2]=dis[year%10]; disp_buffer2[1]=dis[year/10]; if(key_enable==false) { function_count=0; disp_buffer[0]=dis[11]; }} for(gsb=0;gsb&7;gsb++) { led=disp_buffer2[gsb]; for(jj=0;jj&8;jj++) { led1=led&0x1; if (led1==0x1) data_led=1;//DATA=1 else data_led=0;//DATA=0 clk_led=0;clk_led=1;//clk=0~1 led=led&&1; }}} } void dis_Calendar () { unsigned char gsb,led,led1, disp_buffer[2]=tab[hour%10];61//年正常显示//显示日历子程序 disp_buffer[1]=tab[hour/10]; disp_buffer[4]=tab[min%10]; //正常显示 disp_buffer[3]=tab[min/10]; disp_buffer[6]=tab[sec%10]; disp_buffer[5]=tab[sec/10]; for(gsb=0;gsb&7;gsb++) { led=disp_buffer[gsb]; for(jj=0;jj&8;jj++) { led1=led&0x1; if (led1==0x1) DAT=1;//DATA=1 else DAT=0;//DATA=0 CLK=0;CLK=1;//clk=0~1 led=led&&1; } }}} //正常显示62 附录二 附录二 多功能电子时钟元器件一览表类别 序号 1 电源 2 3 IC 芯片 4 5 LED 按键 6 12 13 电容 14 15 晶振 16 17 电阻 18 19 三极管 蜂鸣器 面薄板 20 21 22 32.768KHz 300KΩ 100Ω 10KΩ S 焊接性 1支 7支 1支 2支 1个 1个 2块 DS1302 时钟震荡电路 限制 LED 亮度 复位电路 限压保护 闹铃电路 闹铃电路 基础电路和显示电路 1.0 元 0.05 元 0.05 元 0.05 元 0.3 元 1.0 元 3.0 元 总计:64.2 元 总计: 10μF 11.0592MHz 1个 1支 复位电路 单片机时钟震荡电路 0.2 元 0.5 元 +3V 电源(纽扣式) AT89S51 DS4 共阴 8 段数码显示 自锁/自动复位 30pF 1个 1片 1片 7片 7只 8个 2个 时钟备用电源 CPU 实时时钟日历芯片 8 位移位寄存器 时间和温度显示 功能键盘 单片机时钟震荡电路 4.0 元 15.0 元 3.0 元 1.5 元 1.0 元 0.5 元 0.1 元 型号 +5V 电池 数量(单位) 数量(单位) 1个 用途 系统电源 单价(¥) 单价 ¥ 3.0 元63 附录三 多功能电子时钟硬件原理 原理图 附录三 多功能电子时钟硬件原理图64 123456年/ 时LED0 D 1 2 3 4 5 6 7 8a b c d e f g dp a f e g d GND b c dp月 /分LED2 LED3a f e g d GN D b c dp日 /秒LE D4 LE D5a f e g d GND b c dpLE D1 1 2 3 4 5 6 7 8a b c d e f g dp a f e g d GN D b c dpLED6a1 2 3 4 5 6 7 8a b c d e f g dp1 2 3 4 5 6 7 8a b c d e f g dpa f e g d GND b c dp1 2 3 4 5 6 7 8a b c d e f g dp1 2 3 4 5 6 7 8a b c d e f g dpf eg d GN Db c dp1 2 3 4 5 6 7 8a b c d e f g dpDa f e g d GND b c dp999999240×8 240×8 240×8 240×8 240×8 240×8 240×83 4 5 6 10 11 12 133 4 5 6 10 11 12 133 4 5 6 10 11 12 133 4 5 6 10 11 12 133 4 5 6 10 11 12 133 4 5 6 10 11 12 13QA QB QC QD QE QF QG QHQA QB QC QD QE QF QG QHQA QB QC QD QE QF QG QHQA QB QC QD QE QF QG QHQA QB QC QD QE QF QG QHQA QB QC QD QE QF QG QHVCC GNDVCC GNDVCC GNDVCC GNDVCC GNDVCC GND14 714 714 714 714 714 7+5+5 U1 R9 240K B C3 10uF R11 +5 4K7 BT? BATTER Y 1 2 3 4 u3 VC C1 X1 X2 GN D DS 1302 VC C2 SCL K I/O RST 8 7 6 5 u2 VC C DQ GND DS 18B20 Y2 11.0592M HZ 32.768KHz C1 30pF C2 30pF 3 2 1 +5 K8 SW-PB +5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RST P3.0/RXD P3.1/TXD P3.2/INT 0 P3.3/INT 1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD XTAL2 XTAL1 GND AT89S51 VC C P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 EA/VPP AL E/PR OG PSEN P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 R8 10K U1114 79 81 29 81 29 81 29 81 29 81 29 81 29 81 2VCC GNDCLR CLKCLR CLKCLR CLKCLR CLKCLR CLKCLR CLKCLR CLKA BA BA BA BA BA BA BQA QB QC QD QE QF QG QHC3 4 5 6 10 11 12 139U4 74L S164U5 74LS164U6 74L S164U7 74L S164U8 74LS164U9 74LS164U10 74L S164CBR10 10KK1 K2 K3 K4 K5 K6 K7 SW -PBY1Q1 S9012BUZZER A A设设设设 图图图图 学学学图 学1 2 3 4 5多多多多多多多设设多多多―多多设设 多多多多多多多多多多图 常 亮 班 级6第1 页 共1 页 测测04-1班 李李李号指指指指65 致 谢在论文完成之际,我要特别感谢我的指导老师张翠侠的热情关怀和悉心指导。在我 撰写论文的过程中,张老师倾注了大量的心血和汗水,无论是在论文的选题、构思和资 料的收集方面,还是在论文的研究方法以及成文定稿方面,我都得到了张老师悉心细致 的教诲和无私的帮助,特别是她广博的学识、深厚的学术素养、严谨的治学精神和一丝 不苟的工作作风使我终生受益,在此表示真诚地感谢和深深的谢意。 在论文的写作过程中, 也得到了许多同学的支持和帮助, 给予了我很多宝贵的意见, 在此一并致以诚挚的谢意。 感谢所有关心、支持、帮助过我的良师益友。 最后,向在百忙中抽出时间对本文进行评审并提出宝贵意见的各位老师表示衷心地 感谢!66 多功能电子时钟设计―汇集和整理大量word文档,专业文献,应用文书,考试资料,教学教材,办公文档,教程攻略,文档搜索下载下载,拥有海量中文文档库,关注高价值的实用信息,我们一直在努力,争取提供更多下载资源。

我要回帖

更多关于 数字电子时钟走时不准 的文章

 

随机推荐