基于单片机的实时时钟系统设计毕业设计论文(C语言编程、含PCB图).doc_第1页
基于单片机的实时时钟系统设计毕业设计论文(C语言编程、含PCB图).doc_第2页
基于单片机的实时时钟系统设计毕业设计论文(C语言编程、含PCB图).doc_第3页
基于单片机的实时时钟系统设计毕业设计论文(C语言编程、含PCB图).doc_第4页
基于单片机的实时时钟系统设计毕业设计论文(C语言编程、含PCB图).doc_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

- 1 - 毕业设计毕业设计(论论文)文)任任务书务书 题目:题目: 基于基于12cr887 的实时时钟系统设计的实时时钟系统设计 任务与要求:任务与要求: 时钟功能:该时钟最少可以准确走时几十年,在掉电后时钟芯片 12cr887 由内部集成锂离子电池供电,之所以在不需要看时 钟信息时可以将主电源拔掉,当需要看时钟信息时插上主电 源即可正常显示。 日期功能:能够准确的显示当前日期,具有闰年,平年日期自动调整功 能。 闹钟功能:能够按规定的定时时间报时。 要求: 1、确定单片机的 i/o 口,选择单片机的型号,选择外围设备,所须电源 参数。 2、单片机外围 i/o 接线图 3、设计控制程序 1) 、选择 stc89c52 单片机设计 2) 、选择 ds12cr887 作为时钟源 3) 、选择 74ls273 作为地址锁存器 4) 、选择 tda2822 作为闹钟功率放大器 4、程序与说明 毕业设计毕业设计( (论文论文) )进度计划表进度计划表 日日 期期工工 作作 内内 容容 执执 行行 情情 况况 指指 导导 教教 师师 签签 字字 2 0 0 9年4月2 0日 2009 年 4 月 30 日 认识课题:围绕要求掌握的内容,查阅书籍、 资料确定设计方案。方法:书店购买书籍、 利用工作之余努力学习单片机编程、在网上 申请 ds12cr887 免费样品,在电子城买其他 外围元器件。 - 2 - 2009 年 5 月 5 日 2009 年 5 月 10 日 读图:查阅 ds12cr887 时钟芯片内部结构相 关资料、利用所学的知识重点对单片机如何 读取 ds12cr887 内部数据信息进行分析,确 定时钟显示电路、调时轻触按钮、地址锁存 器 74ls273、闹钟蜂鸣器、stc51 单片机的 选取。 2009 年 5 月 12 日 2009 年 5 月 18 日 基于 ds12cr887 实时日历时钟的硬件连接, stc51 单片机编程器的制作。并画出原理图 及其 pcb 板准备外发 pcb 公司打板! 2009 年 5 月 20 日 2009 年 5 月 25 日 编写程序,调试程序,并用软件仿真!将调 试成功的程序下载到单片机中! 2009 年 5 月 26 日时钟制作成功,并观察走时的准确性,为编 写毕业论文做准备! 2009 年 5 月 27 日 2009 年 6 月 5 日整理编写毕业设计论文,准备答辩。 指导教师对进度计划实施情况总 评 签名: 年 月 日 - 3 - 目目 录录 摘要摘要 第第 1 1 章章 绪论绪论 1 1.1 实时时钟研究的背景和意义.1 1.2 本论文研究的主要内容.1 本章小结本章小结 第第 2 2 章章 系统概述系统概述 3 2.1 实时时钟的特点.3 2.2 实时时钟芯片 ds12cr887 工作原理.3 2.3 实时时钟芯片 ds12cr887 主要性能参数.3 2.4 七段数码管构成的显示电路工作原理.3 第第 3 3 章章 硬件设计硬件设计 .5 3.1 stc89s52 单片机编程器电路5 3.2 电源和显示时间控制电路.5 3.3 按键调时控制电路 5 3.4 闹钟电路.5 第第 4 4 章章 片机软件设计 4.1 实时时钟芯片 ds12cr887 编程基础.7 4.2 时间调整,闹钟调整,年、月、日调整却换子程序设计 7 4.3 时间调整子程序设计7 4.4 闹钟定时调整子程序设计.7 4.5 年、月、日显示子程序设计.7 4.6 年、月、日调整子程序设计.7 4.7 数码管显示子程序设计.7 第第 5 5 章章 结论结论 27 谢辞谢辞 参考文献参考文献 - 4 - 附录附录 a:基于:基于 12cr887 实时时钟实时时钟 pcb 板板 - 5 - 摘要摘要 随着我国经济的飞速发展,城市人口日益增多,人们在忙碌的日常生活中 都少不了一个稳定可靠的时钟!当我们在火车站候车时总是时不时盯着电子显 示屏的时间来预知车次的到来,当我们在工厂里面工作时,一个工人工资的多 少往往都是以时间来计算的!由此看来一个稳定可靠的时钟在我们的日常生活 中具有很实际的意义。 本课题是基于 ds12cr887 时钟芯片为时钟源,单片机为主控制系统开发的 一个实时时钟。该时钟走时准确,并且在掉电的状态下最少也能准时间工作 10 年,它不但具有走时准确的功能,而且还能够准确的显示年,月,日,星期。 在本设计中充分利用了单片机内部资源,涉及到了键盘控制、数码管显示、中 断系统、定时/计数器、串口通信等,这既是对所学知识的总结也是对自己动手 能力的最好锻炼。通过本次设计,我成功的制作出了属于自己的产品,并对单 片机有了更深层次的了解。通过本次设计,要想真正的学好单片机就要找时间 去多“玩”单片机,也就是说多练习,多想,按照自己的想法去开发产品,这 样才能真正的掌握单片机。 单片机“入门既不难,深造也是办得到的”,只要有恒心、有决心,跟随 “连载”一步步走下去,将来就一定能在单片机世界里遨游。 关键词关键词:实时时钟 单片机 stc89c52 ds12cr887 - 6 - 第第 1 1 章章 绪绪 论论 1.1 实时时钟研究的背景和意义实时时钟研究的背景和意义 在我们的现实生活中可能每个人都拥有自己的时钟,因为有了时钟我们就 可以按着时间去工作,按着时间有计划的去处理某些事情。但是有没有人想过 你的时钟走时不准的时候,你是多么的烦恼呢。因为在生活中大多数时钟多是 非实时的,只要把电池取下来时钟就将停止工作,或者当你的时钟电池耗尽时 它将也停止工作。就连人们常带的电子手表也要定期更换电池,否则将停止工 作。然而又有没有人想过在更换电池上所话费金钱的多少呢?我们就以电子钟 一个月更换一次电池来计算吧,换一次电池大概需要 3 元钱,一年下来将要花 费 36 元钱,十年下来将要花费 360 元,还不算电池涨价的情况与时钟维修的钱! 而本次设计的实时时钟不但时间是连续的,而且在掉电的情况下也能工作几十 年,并且制作成本也才 20 来块钱。本时钟还具有环保、走时无噪音、低功耗等 非实时时钟不具有的功能。该实时时钟不但可以作为家用,而且更可以在公共 场合使用,如车站、码头、商场等场所。 1.2 本论文研究的主要内容本论文研究的主要内容 本文是以实时时钟芯片 ds12cr887 和 stc89c52 单片机为主要研究对象, 着重进行 51 单片机控制系统的设计研究和如何读取 ds12cr887 内部时钟信息 的研究。主要内容包括: 1、时间显示系统的设计; 2、调整时间系统的设计; 3、年、月、日显示系统的设计; 4、年、月、日调整系统的设计; 5、闹钟定时系统的设计; 6、闹钟定时响应系统的设计; 7、如何读取 ds12cr887 内部时钟信息; 本章小结本章小结 本章介绍了基于 ds12cr887 实时时钟在现实生活中的重要性,总结了本 论文研究的目的、意义及要完成主要工作的任务。 - 7 - 第第 2 2 章章 系统概述系统概述 2.1 实时时钟的特点实时时钟的特点 1、走时准确无误,配置灵活,设用于工厂,车站,家庭等领域使用。 2、价格较低,外围设备较简单易于制作。 3、低功耗,能够掉电工作几十年。 4、工作无噪音,不影响他人休息。 5、闹钟报时准确,不会误报错报。 6、外表美观,实用,实用价值高。 2.2 实时时钟工作原理实时时钟工作原理 本时钟在上电工作时首先显示当前时间时、分、秒,然后延时一段时间后 显示当前年、月、日,并在设定的闹铃时间闹钟响应。当用户需要调整年、月、 日、时、分、秒闹铃时可以按轻触按钮进行调节。在掉电的情况下,显示屏上 面没有显示,但在时钟芯片 ds12cr887 内部已经集成了可充电锂离子电池, 其内部任然在不间断的工作中,即时在掉电的情况下 ds12cr887 至少也能工 作十年,所以当给单片机再次供电时,单片机对 ds12cr887 进行读数据,然 后通过显示屏显示准确无误的时间! 2.3 实时时钟芯片实时时钟芯片 ds12cr887 主要性能参数主要性能参数 1,时钟芯片,时钟芯片 ds12cr887,其引脚分布图如下所示其引脚分布图如下所示 mot (1 脚) :总线时序模式选择脚。接高电平,选择 motorola 总线 时;序;接低电平或悬空,择选择 intel 总线时序。 nc (2,3,16,20,21,22 脚):悬空脚。 ad0ad7(411 脚):地址/地址数据复用总线引脚。 cs(13 脚):片选脚,低电平有效。 - 8 - as(14 脚):地址锁存输入脚。下降沿时,地址被锁存,紧接着的上升 沿来时地址被清除。 r/w(15 脚):读/写输入脚。在选择 motorola 总线时序模式时,此引 脚用于指示当前的读写周期,高电平指示当前为读周期,低 电平指示当前为写周期;选择 intel 中线时序模式时,此 引脚为低电平有效的输入脚,相当于通用 ram 的写使能信 号(/we) ds(17 脚):选择 motorola 总线时序模式时,此引脚为数据锁存脚; 选择 intel 总线时序模式时,此引脚为读输入脚,低电平 有效,相当于典型的内存的输出使能信号(/oe) reset(18 脚):复位脚,低电平有效,复位不会影响到时钟、日历和 ram。 irq(19 脚):中断申请输出脚,低电平有效,可作为微处理器的中断输入。 sqw(23 脚):方波信号输出脚。可通过设置寄存器位 sqwe 关断此信 号输出,此信号的输出频率也可通过对芯片内部的寄存器编 程予以改变。 vcc(24 脚):+5v 电源端。 2,时钟芯片,时钟芯片 ds12cr887,其内存空间如下所示其内存空间如下所示 0 13 14 49 50 51 127 地址 0x000x09 共十个寄存器,分别存放秒、秒闹钟、分、分闹钟、 时、时闹钟、小时、时闹钟、星期、日、月、年和年信息,地址 0x32 为 世纪信息寄存器(解决了千年问题);地址 0x0a0x0dh 共 4 个寄存器, 分别为寄存器 a、b、c、d,它们用于控制和寄存某些状态信息;其余的 113 字节地址空间是留给用户使用的普通地址空间。 在所有的 128 字节中,寄存器 c 和 d 为只读寄存器,寄存器 a 的第 7 位属于只读位,秒字节的高阶位也是只读的,其余字节均为可直接读写 0秒 1 秒闹钟14 字节 2 分钟 3 分闹钟 4 时钟 5 时闹钟 6 星期 7 日 8 月 9 年 10 寄存器 a 11 寄存器 b 12 寄存器 c 13 寄存器 d 00 0d 0e 31 32 33 7f50 世纪 - 9 - 字节。 时钟,日历信息可以通过读取合适的内存字节获得:时钟、日历和闹钟可 以写合适的内存字节设置和初始化。对应时钟、日历和闹钟的 10 个寄存 器字节可以是二进制形式或者 bcd 码形式,在写这些寄存器时,寄存器 b 的 set 位必须置 1。 寄存器 a 字节的内容如下。 msb lsb uip: 更新标志位。为只读位且不受复位操作的影响,为 1 时,表示即将发 生的数据更新;为 0 时,表示至少 244us 不会更新数据。当 uip 为 0 时,可以 获得所有时钟、日历、闹钟信息。将寄存器 b 中的 set 位置 1 可以限制任何数 据更新操作,并且清除 uip 位。 dv2、dv1、dv0:此 3 位为 010 时将打开晶振,并开始计时。 res3、res2、res1、res0:用于设置周期性中断产生的时间周期和输出 方波的频率。 寄存器 b 字节的内容如下。 msb lsb set:设置位,可读写,不受复位操作影响。为 0 时,不处于设置状态, 芯片进行正常时间数据更新;为 1 时,抑制数据更新,可以通过程序设定时间 和日历信息。 pie:周期性中断使能位,可读写,复位时清除此位。为 1 时,允许寄存 器 c 中的周期中断标志位 pf,驱动/irq 引脚为低产生中断信号输出,中断信 号产生的周期由 rs3re0 决定。 aie:闹钟中断使能位,可读写。为 1 时,允许寄存器 c 中的闹钟中断标 志位 af、闹钟发生时就会通过/irq 引脚产生中断输出。 uie:数据更新结束中断使能位,可读写。复位或者 set 位为 1 时清除此 位。为 1 时允许寄存器 c 中的更新结束标志 uf,更新结束时就会通过/irq 引 脚产生中断输出。 sqwe:方波使能位,可读写,复位时清除此位。为 0 时,sqw 引脚保 持低电平;为 1 时,sqw 引脚输出方波信号,其频率由 rs3rs0 决定。 dm:数据模式位,可读写,不受复位操作影响。为 0 时,设置时间、日 历信息为二进制数据;为 1 时,设置为 bcd 码数据。 24/12:时间模式设置为,可读写,不受复位操作影响。为 0 时,设置为 12 小时模式;为 1 时,设置为 24 小时模式。 dse:为 1 时,会引起两次特殊的时间更新;4 月的第一个星期日凌晨 1:59:59 会直接更新到 3:00:00,10 月的最后一个星期日凌晨 1:59:59 会直接更新到 1:00:00;为 0 时,时间信息正常更新,此位可读写,不受复 位操作影响。 寄存器 c 字节内容如下。 msb lsb iqrf:中断申请标志位。为 1 时,/irq 引脚为低,产生中断申请。当 uip dv2 dv1 dv0 rs3 rs2 rs1 rs0 set pie aie uie sqwe dm24/12 dse irqf pf af uf 0 0 0 0 - 10 - pf、pie 为 1 时或者 af、ate 为 1 或者 uf、uie 为 1 时,此位为 1,否则置 0. pf:中期中断标志位。为 1 时,它是只读位,和 pie 位状态无关,由复 位操作或者寄存器 c 操作清除。 af:闹钟中断标志位。为 1 时,表示当前时间和闹钟设定时间一至,由复 位操作或读寄存器 c 操作清除。 uf:数据更新结束中断标志位。每个更新周期后此位都会置 1,当 uie 位位置 1 时,uf 若为 1 就会引起 irqf 置 1,将驱动/irq 引脚为低电平,申请 中断。此位由复位操作或读寄存器 c 操作清除。 寄存器 d 字节的内容如下。 msb lsb vrt;ram 和时间有效位。用于指示和 vbat 引脚连接的电池状态。此 位不可写,也不受操作为影响,正常情况下读取时总去为 1,如果出现读取为 0 的情况,则表示电池耗尽,时间数据和 ram 中的数据就会出现问题。 芯片 ds12cr887 的 113 字节普通 ram 空间为非易失性 ram 空间,他 不专门用于某些特别功能,而是可以在未处理器程序中作为非易失性内存空间 使用。 3,74ls273 其引脚分布图如下图所示其引脚分布图如下图所示 rd(1 脚):复位脚。低电平有效,当 1 脚是低电平时,输出脚 2(1q)、 5(2q)、6(3q)、9(4q)、12(5q)、15(6q)、 16(7q)、 19(8q)。 全部输出 0,即全部复位。 t(11 脚):锁存控制端。上升沿触发,当 1 脚为高电平时,且 11 脚有上升 沿时,立即锁存输入脚 3(1d)、4(2d)、7(3d)、 8(4d)、13(5d)、14(6d)、17(7d)、18(8d)上的电 平状态,并呈现在输出脚 2(1q)、5(2q)、6(3q)、 9(4q)、12(5q)、15(6q)、16(7q)、 19(8q)上。 4,七段数码管构成的显示电路工作原理。,七段数码管构成的显示电路工作原理。 本设计显示电路部分由六个共阳极数码构成。其中共阳极公共端用三级管 进行驱动, 段码由 74ls273 地址锁存器控制,并采用数码管总线动态扫描方 0 0 0 0 0 0 0 0 - 11 - 式进行时间,年、月、日的显示。具体硬件电路在后面的硬件设计中有提供! 第第 3 章章 硬件设计硬件设计 3.1 stc89c52 单片机编程器结构单片机编程器结构 由于 stc89c52 单片机只支持串口下载,加上手中没有现成的编程器,故 只能自己动手做个简单的编程。该编程器主要由 max232 电平转换芯片和单片 机最小系统构成,利用 rs-232 接口实现单片机和计算机通信,并由单片机专用 烧录软件将程序写在单片机中。由于 stc89c52 单片机在写程序进去时,具有 冷启动过程,所以在编程之前必去将主电源复位一次,本电路中复位按钮为 s1。其单片机烧录软件为 stcispv31,编程器电路如下图所示。 stc89c52 单片机编程器电路如下所示: - 12 - 3.2 电源和显示控制结构电路电源和显示控制结构电路 电源部分由一片 lm7805 构成 5v 的稳压电源,为整个电路提供电能。 由两片 74ls273,六个共阳极数码管,六个 npn 型三极管等元器件构成 了完整的时间、年、月、日、显示电路。其中 u2 控制六个数码管的段码,u3 控制三极管的基极再由三极管放大电流后驱动数码管的公共端!采用总线扫描 方式,利用人眼视觉暂留现象,在程序的控制下在数码管上面显示出所需要的 数值! 电源和显示控制电路如下所示: - 13 - 3.3 按键调时控制电路按键调时控制电路 该电路主要由 stc89c52 单片机最小系统,ds12cr887,调时按钮 s1s3 及其外为元器件所构成。通过编写程序让单片机读取 ds12cr887 里面的信息, 然后由 ds12cr887 控制地址锁存器 74ls273 进而控制数码管的显示。当按下 按钮时单片机都会由走时状态转到调时状态进入时间调整、年、月、日、闹钟 调整状态。当调整结束后又回到新的走时状态。 按键调时控制电路如下所示: - 14 - 3.4 闹钟电路闹钟电路 该电路主要由 tda2822 功率放大模块将单片机发出的闹钟信号进行放大, 进而推动一个 3w 喇叭。供电部分与单片机共用 5v 的电源,该设计的最大特 点就是能够清脆的听出闹钟时发出的音乐曲调。 闹钟电路如下所示: - 15 - 第第 4 章章单片机软件设计单片机软件设计 4.1 实时时钟芯片实时时钟芯片 ds12cr887 编程基础编程基础 1,在本设计中,ds12cr887 采用 intel 总线模式进行与单片机进行数据 读也写操作。当 1 脚(mot)为低电平时,ds12cr887 为 motorola 总线 模式,在此不做详述。当 1 脚(mot)为高电平或悬空时,ds12cr887 为 intel 总线模式,本设计中将 1 脚(mot)悬空。在编写程序的过程中首先应 将 ds12cr887 按 intel 总线模式初始化,在 intel 总线模式下将数据写在指 定的地址,在 intel 总线模式下将指定的地址读出数据。 2,intel 总线写时序时序图如下: 3,intel 总线读时序时序图如下: - 16 - 4,根据 intel 总线写时序时序图写数据程序: void write_12cr887(uchar add,uchar date)/在指定地址写入数据 cs=0; ds=1; rw=1; as=1; p0=add; as=0; rw=0; p0=date; rw=1; as=1; cs=1; 5,根据 intel 总线读时序时序图读数据程序: uchar read_12c887(uchar add)/在指定的地址读出数据 uchar read_data; ds=1; rw=1; as=1; cs=0; p0=add; as=0; ds=0; p0=0xff; read_data=p0; ds=1; as=1; cs=1; return(read_data); 4.24.2 时间调整,闹钟调整,年、月、日调整切换子程序设计时间调整,闹钟调整,年、月、日调整切换子程序设计 当按下按钮 sw1 时,中间标志位 i 会自动进行加操作。当 i 等于 1 时,时间调整标志 位置 1,进入时间调整状态。当 i 等于 2 时,闹钟调整标志位置 1,进入闹钟调整状态。当 i 等于 3 时,年、月、日调整标志位置 1,进入年、月、日调整状态。 1,时间调整,闹钟调整,年、月、日调整却换子程序如下: void gongneng_quehuan()/功能却换子程序 if(sw1=0) - 17 - delay(5); if(sw1=0) while(sw1=0); display(read_12c887(seconds),read_12c887(minutes),read_12c887(hours); i+; if(i=1) flag_set_time=1;/将时间调整标志位置 1 else if(i=2) flag_set_time=0; flag_set_alarm=1;/将闹钟调整标志位置 1 else if(i=3) i=0; flag_set_century=1;/将年、月、日调整标志位置 1 4.3 时间调整子程序设计时间调整子程序设计 由于本人想向单片机更高层次编程,本设计只用三个按钮根据不同的组合状 态进行时间,闹钟,年,月,日的调整。所以程序相对来说是比较复杂的。具 体时间调整过程是这样的,首先进行小时调整,然后进行分钟调整,最后进行 秒钟调整。在小时调整过程中,如果 sw2 按钮每按下一次时将对小时当前值 加 1 次,当加到 24 时小时清零;如果 sw3 按钮每被按下一次时将对小时当前 值减 1 次,当减到 0 后再按一次 sw3 时小时赋值到 23。小时调整完毕后将所 调整好的小时值写入小时寄存器中,然后又将写入到小时寄存器的数值从 ds12cr887 中读取出来并在显示屏上显示出来。在分钟调整过程中,如果 sw2 按钮每按下一次时将对分钟当前值加 1 次,当加到 60 时分钟清零,小时 加 1;如果 sw3 按钮每被按下一次时将对分钟当前值减 1 次,当减到 0 后再按 一次 sw3 时分钟赋值到 59。分钟调整完毕后将所调整好的分钟值写入分钟寄 存器中,然后又将写入到分钟寄存器的数值从 ds12cr887 中读取出来并在显 示屏上显示出来。在秒钟调整过程中,如果 sw2 按钮每按下一次时将对秒钟当 前值加 1 次,当加到 60 时秒钟清零,分钟加 1;如果 sw3 按钮每被按下一次 时将对秒钟当前值减 1 次,当减到 0 后再按一次 sw3 时秒钟赋值到 59。秒钟 调整完毕后将所调整好的秒钟值写入秒钟寄存器中,然后又将写入到秒钟寄存 器的数值从 ds12cr887 中读取出来并在显示屏上显示出来。当小时、分钟、 - 18 - 秒钟都调整完毕后按下确认键(sw1 和 sw2 都被按下时)时间调整完成,并 将当前所调整出来的数值在显示屏上面显示出来,进入时间显示状态。 1,时间调整子程序如下: void shijian_tiaozheng() char hours_timeset,timeset=0; if(flag_set_time=1) write_12c887(register_b,0xa6); flag_set_time=0; if(timeset=0) hours_timeset=read_12c887(hours);/读取当前小时的值 sw2=1; sw1=1; while(sw2=0) if(sw2=0) while(sw2=0) display(read_12c887(seconds),read_12c887(minutes),read_12c887(hours); hours_timeset+;/小时值加 1 if(hours_timeset=24) hours_timeset=0; write_12c887(hours,hours_timeset);/将调整后的小时的 值写入小时寄存器 /led2=1; if(sw3=0) delay(5); if(sw3=0) while(sw3=0) display(read_12c887(seconds),read_12c887(minutes),read_12c887(hours); hours_timeset-;/小时值减 1 if(hours_timeset=60) hours_timeset=0; write_12c887(minutes,hours_timeset); if(sw3=0) delay(5); if(sw3=0) while(sw3=0) display(read_12c887(seconds),read_12c887(minutes),read_12c887(hours); - 20 - hours_timeset-; if(hours_timeset=60) hours_timeset=0; write_12c887(seconds,hours_timeset); if(sw3=0) delay(5); if(sw3=0) while(sw3=0) - 21 - display(read_12c887(seconds),read_12c887(minutes),read_12c887(hours); hours_timeset-; if(hours_timeset=24) alarmset=0; - 23 - write_12c887(hours_alarm,alarmset);/将调整后的小时的 值写入小时寄存器 if(sw3=0) delay(5); if(sw3=0) while(sw3=0) display(read_12c887(seconds_alarm),read_12c887(minutes_alarm),read_12c88 7(hours_alarm); alarmset-;/小时值减 1 if(alarmset=60) alarmset=0; - 25 - write_12c887(minutes_alarm,alarmset); if(sw3=0) delay(5); if(sw3=0) while(sw3=0) display(read_12c887(seconds_alarm),read_12c887(minutes_alarm),read_12c88 7(hours_alarm); alarmset-; if(alarmset=60) alarmset=0; write_12c887(seconds_alarm,alarmset); - 27 - if(sw3=0) delay(5); if(sw3=0) while(sw3=0) display(read_12c887(seconds_alarm),read_12c887(minutes_alarm),read_12c88 7(hours_alarm); alarmset-; if(alarmset=99) century_set=0; write_12c887(year,century_set);/将调整后的年份写入年 寄存器 - 31 - if(sw3=0) delay(5); if(sw3=0) while(sw3=0) display(read_12c887(day_of_month),read_12c887(month),read_12c887(year); century_set-;/年份减 if(century_set12) month=1; write_12c887(month,month); if(sw3=0) delay(5); if(sw3=0) while(sw3=0) display(read_12c887(day_of_month),read_12c887(month),read_12c887(year); month-; if(month31) century_set=1; break; case 3: if(century_set31) century_set=1; break; case 5: if(century_set31) century_set=1; break; case 7: if(century_set31) century_set=1; break; case 8: if(century_set31) century_set=1; break; case 10: if(century_set31) century_set=1; break; case 12: - 36 - if(century_set31) century_set=1; break; case 4: if(century_set30) century_set=1; break; case 6: if(century_set30) century_set=1; break; case 9: if(century_set30) century_set=1; break; case 11: if(century_set30) century_set=1; break; case 2: if(flag_runnian=1) if(century_set29) century_set=1; - 37 - else if(century_set28) century_set=1; break; default: break; write_12c887(day_of_month,century_set); if(sw3=0) delay(5); if(sw3=0) while(sw3=0) display(read_12c887(day_of_month),read_12c887(month),read_12c887(year); century_set-; switch(month) case 1: if(century_set1) century_set=31; break; - 38 - case 3: if(century_set1) century_set=31; break; case 5: if(century_set1) century_set=31; break; case 7: if(century_set1) century_set=31; break; case 8: if(century_set1) century_set=31; break; case 10: if(century_set1) century_set=31; break; case 12: if(century_set1) century_set=31; break; - 39 - case 4: if(century_set1) century_set=30; break; case 6: if(century_set1) century_set=30; break; case 9: if(century_set1) century_set=30; break; case 11: if(century_set1) century_set=30; break; case 2: if(flag_runnian=1) if(century_set1) century_set=29; else if(century_set1) century_set=28; - 40 - break; default: break; write_12c887(day_of_month,century_set); display(read_12c887(day_of_month),read_12c887(month),read_12c887(year); centuryset=0; while(sw2 4.6 数码管显示子程序设计数码管显示子程序设计 数码管显示部分主要由两片 74ls273 地址锁存器对数码管进行控制。当 控制段码的 74ls273 锁存端(11 脚)为 0 时,将所要显示的段码送入 74ls273 的数据输入端口,然后将所存端(11 脚)置 1,使输入的数据锁存住并呈现在 输出数据端。然后将控制位码的 74ls273 的锁存端(11 脚)置 0,将要所显示 的位码送入 74ls273 的数据输入端口,然后将锁存端(11 脚)置 1,使输入的 数据锁存住并呈现在输出数据端。就这样利用数码管动态扫描方式,所要显示 的数据通过数码管显示出来。 1,数码管显示子程序如下: void display(uchar second,uchar minute,uchar hour) - 41 - uchar seconds0,seconds1,minutes0,minutes1,hours0,hours1; seconds1=second/10; /秒钟的十位求模 seconds0=second%10; /秒钟的个位求余 minutes1=minute/10; minutes0=minute%10; hours1=hour/10; hours0=hour%10; clkduan=0; p1=duantablesecon

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论