基于51单片机的电子日历的设计(编辑修改稿)内容摘要:

充电功能,并且可以关闭充电功能。 采用普通 晶振。 它是一种一种高性能、低功耗、带 RAM的实时时钟电路,可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为 ~。 采用三线接口与 CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或 RAM 数据。 图 34 示出 DS1302 的引脚排列图。 淮安信息职业技术学院毕业设计论文 8 图 34 DS1302的引脚图 其中 Vcc1 为后备电源, Vcc2 为主电源。 在主电源关闭的情况下,也能保持时钟的连续运行。 DS1302 由 Vcc1 或 Vcc2 两者中的较大者供电。 当 Vcc2 大于Vcc1+ 时, Vcc2 给 DS1302 供电。 当 Vcc2 小于 Vcc1 时, DS1302 由 Vcc1 供电。 X1和 X2 是振荡源,外接 晶振。 RST是复位 /片选线,通过把 RST 输入驱动置高电平来启动所有的数据传送。 RST 输入有两种功能:首先, RST接通控制逻辑,允许地址 /命令序列送入移位寄存器;其次, RST 提供终止单字节或多字节数据的传送手段。 当 RST 为高电平时,所有的数据传送被初始化,允许对 DS1302 进行操作。 如果在传送过程中RSTS 置为低电平,则会终止此次数据传送, I/O 引脚变为高阻态。 上电动行时,在 Vcc 大于等于 之前, RST必须保持低电平。 中有在 SCLK 为 低电平时,才能将 RST 置为高电平, I/O 为串行数据输入端(双向)。 SCLK 始终是输入端。 使用 DS1302 时可参考它的硬件接线图,如图 35 所示。 V C C 2X1X2GNDR S TI / OS L C KV C C 1U1D S 1 3 0 2 V C C12Y1C12012P1H e a d e r 2C220P 1 .2P 1 .1P 1 .032.768KHZ 图 35 DS1302的硬件接线图 DS1302 的工作原理: DS1302 在每次进行读、写程序前都必须初始化,先把 SCLK 端置 “ 0”,接着把 RST 端置“ 1”,最后才给予 SCLK 脉冲;读 /写时序如下图 4所示。 DS1302 的控制字的位 7必须置 1,若为 0 则不能把对 DS1302 进行读写数据。 对于位 6,若对程序进行读 /写时 RAM=1,对时间进行读 /写时, CK=0,位 1至位 5指操作单元的地址。 位 0是读 /写操作位,进行读操作时,该位为 1;该位为 0则表示进行的是写操作。 控制字节总是从最低位开始输入 /输出的。 表 .2为 DS1302 的日历、时间第三章 系统的硬件设计与实现 9 寄存器内容:“ CH”是时钟暂停标志位,当该位为 1 时,时钟振荡器停止, DS1302处于低功耗状态;当该位为 0时,时钟开始运行。 “ WP”是写保护位,在任何的对时钟和 RAM 的写操作之前, WP 必须为 0。 当“ WP”为 1时,写保护位防止对任一寄存器的写操作。 的控制字节: DS1302 控制字节的高有效位(位 7)必须是逻 辑 1,如果它为 0,则不能把数据写入 DS1302 中,位 6 如果 0,则表示存取日历时钟数据,为 1表示存取 RAM数据;位 5 至位 1指示操作单元的地址;最低有效位(位 0)如为 0表示要进行写操作,为 1表示进行读操作,控制字节总是从最低位开始输出 ( I/O) 在控制指令字输入后的下一个 SCLK 时钟的上升沿时,数据被写入 DS1302,数据输入从低位即位 0开始。 同样,在紧跟 8 位的控制指令字后的下一个 SCLK脉冲的下降沿读出 DS1302 的数据,读出数据时从低位 0 位到高位 7。 的寄存器 DS1302 有 12 个寄存器,其中有 7个寄存器与日历、时钟相关,存放的数据位为 BCD 码形式。 此外, DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与 RAM 相关的寄存器等。 时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302 与 RAM 相关的寄存器分为两类:一类是单个 RAM 单元,共 31个,每个单元组态为一个 8位的字节,其命令控制字为 C0H~ FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的 RAM 寄存器,此方式下可一次性读写所有的 RAM的 31 个字节,命令控制字为 FEH(写 )、 FFH(读 )。 显示模块设计 本设计中由于要对年、月、日、星期、时、分、秒、显示,选择液晶显示器1602 字符型 LCD 通常有 14 条引脚线或 16 条引脚线的 LCD。 它可以显示两行,每行 16个字符,采用单 +5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。 它可以显示的字符有:阿拉伯数字、英文字母的大小写、常用的符号等,每一个字符都有一个固定的代码,例如大写的英文字母“ A”的代码是 01000001B( 41H),显示时模块把地址 41H 中的点阵字符图形显示出来,我们就能看到字母“ A”。 如图 36即 为 LCD 显示模块的接口线路,和附录一的连线一样,无需修改。 淮安信息职业技术学院毕业设计论文 10 图 36 LCD液晶显示模块 键盘模块 键盘模块用于调节、校准万年历的时间,更根据各个键盘的功能选择合适的键盘使用。 按键功能自上而下依次为: 1 选择修改项键、 2 增大键、 3 减小键、 4 确定键 . 文中系统软件设计使用开关做键盘使用如下图 37所示。 图 37 开关第四章 系统的软件设计 11 第四章 系统的软件设计 主程序设计 电子万年历的功能是在程序控制下实现的。 首先系统初 始化,系统开始运行,当有设置键按下时进入修改时间模式,无按键按下时读取时间等数据送入液晶屏显示;在修改时间模式下设置时间完成后再送数据到液晶屏显示。 该系统的软件设计方法按整体功能分成多个不同的程序模块,分别进行设计、编程和调试,最后通过主程序将各程序模块连接起来。 这样有利于程序修改和调试,增强了程序的可移植性。 万年历的主程序流程图如图 41 所示。 图 41 主程序流程图 开始 初始化 读日期、时间 写日期、时间 显示子程序 开关控制子程序 时间修改子程序 日期修改子程序 显示结果 返回 淮安信息职业技术学院毕业设计论文 12 万年历优化算法 阳历算法: 阳历的算法比较简单,每十月的总的天数相对 来说是固定的。 只有 2 月份,在闰年是 29天,在非闰年是 28天。 每个月的日历排法.主要是确定每个月第一天是星期几。 我们知道 1901 年 1月 1日是星期二,星期的变化是 7 天一个周期,比如说要计算 1901 年 2 月 1 日是星期几,可以这样推算:从 1901 年 1月 1日到1901 年 2 月 1 日总共经过了 31天 (从表 1可 看出 ), 31对 7取模是 3: i901 年 1月 1 日是星期二,加三后,是星期五。 因此 1901 年 2 月 1 日是星期五。 同理,可以推算出从 1901— 2100 年任何一天是星期几,如下表 所示。 表 月份 1 2 3 4 5 6 7 8 9 10 11 12 闰年 31 29 31 30 31 30 31 31 30 31 30 31 非闰年 31 28 31 30 31 30 31 31 30 31 30 31 下图 42是阳历计算程序流程图。 图 42 阳历计算程序流程图 第四章 系统的软件设计 13 阳历与星期的换算方法 在现行阳历中,历年的长度 365 天 (平年 )或者 366 天 (闰年 )都不是七的整数倍,所以日期与星期之间没有明显的对应关系。 一般情况下,不看日历牌就无法知道某月某日是星期几。 不过,它们之间还是有一定规律可循的,只要经过 简单计算,或者查找表格,就可以知道与任何日期相对应的星期数。 这里列出两种方法供读者选用。 ( 1)公式法:设 y麦示公元年数, d 表示从 1 月 1 日起算的日数。 首先求出 1月 0日 (即上一年 12 月 31 日 )的星期序数,然后与日数 d相加,其和用 7除,余数就是答案。 为了推导公式,我们想一想,第一年 1月 0日的星期序数与第二年 1月 0日的星期序数有什么关系 ?平年 365 天,等于 52 个星期零1 天,所以第二年 1 月 0 日的星期序数比第一年的多 l,但这个 l 已包含在 y 中了,因为第二年的年数 y比第一年大 1;闰年 366天,等于 52 个星期零二天,所以第二年 1 月 0 日的星期序数等于第一年 (闰年 )的星期序数加 2,除了 y 中包含的 1 外,还需加修正值 1。 根据这些道理我们可以推得三个公式,将式中 S 用 7除,余数就表示星期几。 从公元 1900 年 1 月 1 日到公元 2101 年 1 月 1 日之间这 201年,可用公式: S = y- 1900 + [(y- 1901)/4] + d 方括号表示取商的整数部分,对于1900 年 — 1904 年这五年方括号值为 0。 这个公式是这样来的: 1900 年 1 月 0 日 (即1899 年 12月 31 日 )是星期天。 这年是 平年,以后直到 2100 年前都是每隔 4 年一闰,闰年多出的那一天,影响到下一年 1 月 0日的星期序数,并不影响闰年本身,闰年产生的修正值应加到下一年上去,所以〔 (y- 1901)/4〕中,计算时用 190l而不是 1900。 例:求 2020 年 12 月 31 日是星期几 ? 2020 年是闰年,从 1月 1日算起, 12 月 31 日是第 366天,所以 d= 366。 根据公式有: S= 2020- 1900 +〔 (2020- 1901)/4〕 + 366 = 100 +〔 99/4〕 + 366 = l00 + 24 + 366 = 490 490 为 7的整数倍,即余数为 0,所以 2020 年 12月 31 日为星期日。 ( 2)更普遍的公式为: s= v- 1 +〔 (y- 1/4〕-〔 (y- 1/100〕 +〔 (y- 1/400〕 + d 对于这个公式,我们不妨这样考虑:阳历 400年中有 97 个闰年,共 365x 400 + 97 = 天, 146, 097= 20, 871 7,即正好是 7 的整数倍。 这表明某年某月某日所对应的星期序数与四百年前同月同日所对应的星期序数完全相同。 淮安信息职业技术学院毕业设计论文 14 前边例中我们已算出公元 2020 年 1月 0日 (即 2020 年 12 月 31 日 )是星期日,那么,公元 1601 年、 1201 年„„以及公元 1 年的 1月 0日都是星期日。 假如每个历年都是 365 天的话,那么,由于公元 1 年 1 月 0 日是星期日,只要公式 S= y- 1 + d 就可以了,但实际上闰年是 366 天,所以我们必须根据闰年的有关规定进行修正。 〔 (y- 1)/4〕是四年一闺产生的修正值。 如果只取这一个修正项,就会多修正以至造成错误,这是因为,根据阳历的规定,逢百之年虽然能被 4整除,却不一定是闰年,所以必须减去多修正的值,它等于〔 (y- 1/100)〕。 如果逢百之年都是平年,只要这两个修正项也就可 以了。 可是,公元年数能被 400 整除的年 (当然也一定能被 100 整除 )仍是闰年,所以还必须加上〔 (y- 1/400)〕。 这个修正项才行。 方括号中之所以用 y- 1而不用 y,是由于修正值是加到闰年的下一年上去,而不是加到闰年本身上。 万年历工作的简易流程图 在万年里程序中,单片机的工作流程图如下图 43所示。 图 43 单片机的简易工作流程图 开始 单片机读 DS1302数据 单片机送数据到 LCD1602 单片机判断按键 单片机处理。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。