




已阅读5页,还剩34页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计(论文) 题 目 名 称 基于单片机的多功能电子表设计 课 程 名 称 单片机原理及在电气测控学科中的应用 学 生 姓 名 学 号 系 、专 业 电气工程系 08 级电气测控类 指 导 教 师 2010 年 06 月 30 日 1 摘摘 要要 单片计算机即单片微型计算机。由 ram ,rom,cpu 构成,定时,计数和多种 接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业 自动化上。而 51 系列单片机是各单片机中最为典型和最有代表性的一种。这次课 程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。 本设计是通过单片机设计一个多功能电子表,要求不仅具有电子时钟的功能还 具有闹铃、设定闹铃时间、整点报时、生日提醒功能,而且能够预置生日时间 关键字:单片机;多功能电子表;跑表;数码管显示。 2 目 录 摘 要 4 1 引言 .7 1.1 多功能电子表简介 .7 1.2 多功能电子表的基本特点 .7 1.3 多功能电子表的原理 .7 2 单片机识的相关知识 .7 2.1 单片机简介 7 2.2 单片机的发展史 8 2.3 单片机的特点 .9 2.4 89c51 单片机介绍 9 3 控制系统的硬件设计 12 3.1 单片机型号的选择 12 3.2 数码管显示工作原理 12 3.3 按键电路、复位键设计 14 3.4 系统电路原理图 14 4 控制系统的软件设计 15 4.1 程序设计 15 4.2 程序流程图 15 4.3 仿真图 20 4.4 仿真结果分析 22 总结 .23 3 附录 .24 a2424 附 b28 参考文献 .29 致谢 4 引言引言 1957 年,ventura 发明了世界上第一个电子表,从而奠定了电子表的基础,电子 表开始迅速发展起来。现代的电子表是基于单片机的一种计时工具,采用延时程序 产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满 六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人民日常生活 不可缺少的工具。 现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、 石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调 试,数字式电子钟用集成电路计时时,译码代替机械式传动,用 led 显示器代替指 针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能, 还可以进行时和分的校对,片选的灵活性好。 5 1 1、 at89s52at89s52 单片机介绍单片机介绍 at89s52 具有以下标准功能:8k 字节 flash,256 字节 ram,32 位 i/o 口线, 看门狗定时器,2 个数据指针,三个 16 位定时器/计数器,一个 6 向量 2 级中断 结构,全双工串行口,片内晶振及时钟电路。另外,at89s52 可降至 0hz 静态逻辑 操作,支持 2 种软件可选择节电模式。空闲模式下,cpu 停止工作,允许 ram、定 时器/计数器、串口、中断继续工作。掉电保护方式下,ram 内容被保存,振荡器被 冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。 图 1.1 单片机引脚图 vcc : 电源 gnd: 地 p0 口:p0 口是一个 8 位漏极开路的双向 i/o 口。作为输出口,每位能驱动 8 个 ttl 逻辑电平。对 p0 端口写“1”时,引脚用作高阻抗输入。当访问外部程 序和数据存储器时,p0 口也被作为低 8 位地址/数据复用。在这种模式下,p0 具 有内部上拉电阻。在 flash 编程时,p0 口也用来接收指令字节;在程序校验时, 输出指令字节。程序校时,需要外部上拉电阻。 p1 口:p1 口是一个具有内部上拉电阻的 8 位双向 i/o 口,p1 输出缓冲器能 驱动 4 个 ttl 逻辑电平。对 p1 端口写“1”时,内部上拉电阻把端口拉高,此时 可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因, 6 将输出电流(iil)。此外,p1.0 和 p1.2 分别作定时器/计数器 2 的外部计数输 入(p1.0/t2)和时器/计数器 2 的触发输入(p1.1/t2ex),具体如下表所示。 表 1.1 at89s52 p1 口第二功能表 脚号第二功能 p1.0 t2(定时器/计数器 t2 的外部计数输入),时钟输出 p1.1 t2ex(定时器/计数器 t2 的捕捉/重载触发信号和方向控制) p1.5 mosi(在系统编程用) p1.6 miso(在系统编程用) p1.7 sck(在系统编程用) p2 口:p2 口是一个具有内部上拉电阻的 8 位双向 i/o 口,p2 输出缓冲器能 驱动 4 个 ttl 逻辑电平。对 p2 端口写“1”时,内部上拉电阻把端口拉高,此时 可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因, 将输出电流(iil)在访问外部程序存储器或用 16 位地址读取外部数据存储器(例 如执行 movx dptr)时,p2 口送出高八位地址 p3 口:p3 口是一个具有内部上拉电阻的 8 位双向 i/o 口,p2 输出缓冲器能 驱动 4 个 ttl 逻辑电平。对 p3 端口写“1”时,内部上拉电阻把端口拉高,此时 可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因, 将输出电流(iil)。p3 口亦作为 at89s52 特殊功能(第二功能)使用,如下表所 示。 表 1.1 at89s52 p3 口第二功能表 脚号第二功能 p3.0 rxd(串行输入) p3.1 txd(串行输出) p3.2 int0(外部中断 0) p3.3 int0(外部中断 0) p3.4 t0(定时器 0 外部输入) p3.5 t1(定时器 1 外部输入) p3.6 wr(外部数据存储器写选通) p3.7 rd(外部数据存储器写选通) rst: 复位输入。晶振工作时,rst 脚持续 2 个机器周期高电平将使单片机复 位。看门狗计时完成后,rst 脚输出 96 个晶振周期的高电平。特殊寄存器 auxr(地址 8eh)上的 disrto 位可以使 7 此功能无效。disrto 默认状态下,复位高电平有效。 ale/prog:地址锁存控制信号(ale)是访问外部程序存储器时,锁存低 8 位 地址的输出脉冲。在 flash 编程时,此引脚(prog)也用作编程输入脉冲。在一般 情况下,ale 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟 使用。然而,特别强调,在每次访问外部数据存储器时,ale 脉冲将会跳过。 psen:外部程序存储器选通信号(psen)是外部程序存储器选通信号。当 at89s52 从外部程序存储器执行外部代码时,psen 在每个机器周期被激活两次,而 在访问外部数据存储器时,psen 将不被激活。 ea/vpp:访问外部程序存储器控制信号。为使能从 0000h 到 ffffh 的外部程序 存储器读取指令,ea 必须接 gnd。为了执行内部程序指令,ea 应该接 vcc。在 flash 编程期间,ea 也接收 12 伏 vpp 电压。 xtal1:振荡器反相放大器和内部时钟发生电路的输入端。 xtal2:振荡器反相放大器的输出端。 8 2 2、设计功能及说明、设计功能及说明 电子数字钟实现的主要功能: 实现正常走时(秒分时日月年进位) 能够预置时间和日期 能够自动区分平闰年和大小月 具有闹铃及设定闹铃时间功能 具有整点报时功能 具有生日提醒功能,能够预置生日时间 在任何一种预置状态下,预置项目会闪烁显示 其它设计说明 优先级:预置闹铃报时生日提醒正常显示,即预置状态下闹铃、报时功 能及生日提醒功能都无效 生日时间到五个数码管显示“happy” 生日显示状态下,按下中断int0恢复正常显示且此后只有在下更改生日日期 或第二年生日显示才有效。 正常显示状态下按下中断int0进入预置状态,再按一次恢复。 用数码管(k0,k1)控制显示状态:00:时间,01:闹铃时间,10:日期, 11。 生日时间且显示样板如下图所示: 生日:6 月1 日生日,最 闹铃:于早晨6 点10 分响,最后 后两位bd 为birthday 的缩写 一位为一表示使能有效。 9 日期:08 年2 月29 日 时间:12 点39 分45 秒 预置由拨码开关k2/k3/k4分别控制数码管12/34/56显示值,预置优先级: led34led12led56(相应数码管显示的项目,显示状态下才能预置) 整点报时声音为59分51、53、55、57秒的后半秒报四声低音, 59秒的后半 秒报一声高音 闹铃每次响一分钟 不论是预置状态还是正常走时状态均能够自动区分平闰年和大小月 闹铃使能由拨码开关k5控制并实时显示 10 3 3、整体设计方案、整体设计方案 系统硬件电路根据系统功能可知,需要六个数码管,一个外部中断 int0,一个 扬声器,由此结合单片机课程学习中对实验面板的了解,做出如下电路: 图 3.1 系统硬件电路图 如图,晶振频率 12mhz,拨码开关数值由 p0 口读入;p2 口的输出作为控制数码 管的段控信号,经 74ls573 即 8 位数据锁存器接到数码管中。数码管采用共阴接法 (图中未标示);p1.0-p1.5 作为数码管的位控信号出端;开关 w2 经一个基本 rs 锁 存器接入 int0,每按一次开关 into 取反次,按两次输入一个下降沿;扬声器由 p1.6 口控制。 11 4 4、单模块流程设计及程序设计、单模块流程设计及程序设计 在完成了系统总流程设计后,便进入到了系统设计中工作量最大的模块流程设 计。由于系统模块划分虽然是系统设计的基础,但比较简单而且模块划分有多种方 法,因此单模块的设计可以认为是本程序中最关键的部分。单模块设计的好坏与否 决定了系统功能能否被稳定地实现以及下一阶段调试程序的难度。鉴于单模块设计 的重要性,我在设计中并不急于对模块进行编码,而是反复论证模块的可行性和流 程图,为下一阶段的工作做好准备,同时也能够尽早发现系统模块划分的错误,加 以解决。 各模块设计概述 初始化模块(one) 初始化模块包含了各中断的跳转语句、存储资源的分配、各存储器和寄存器的 赋值以及中断及计时器的状态设置。源程序中共使用了 17 字节的内部数据存储地址, 其中包含 3 字节位寻址地址以便于进行位判断。 三字节的位寻址地址分配如下: 22h秒的存储地址,方便对整点报时条件进行判断 23h月的存储地址,方便对大小月平闰年进行判断 另外一个位寻址字节 00h 地址拆开用做程序状态标志位 00h(bit,bs)生日标志位,到生日那天为 1 使程序转入生日显示段 01h(bit,ss)预置标志,以 int0 控制其值,控制预置闪烁的实现 02h(bit,gs)闪烁标志,在预置标志有效时控制闪烁项目的亮和灭两状态 03h(bit,fc)频率控制,在整点报时时控制产生低音还是高音 04h(bit,nb)忽略生日标志,控制预置及报时的优先级高于生日显示 05h(bit)控制生日信号的有效与否,其使用目的参见调试过程 源程序中使用了两个寄存器 r1、r0,r1 用于控制闪烁的间隔时间, r0 用于显 示延时。在初始化模块中设定了中断的优先级、定时计数器的工作模式、并打开了 定时计数器 to 开始计时其他资源分配项目参见源程序集合及注释。初始化模块指令 很大一部分都是伪指令,方便了后面程序的编写。 开关检测模块(two) 开关检测模块主要执行两个任务: 1 读取闹铃使能控制拨码开关 k5 的值并赋予闹铃使能相应值; 读取显示选择开关(k0,k1)的值并将要显示的项目值送入显示缓存 led12、led34、led56 当 k5 为 1 时将 a1h 送入 re 反之送入 a1h,其中 a 为“”的字型码 查表偏移量。当显示生日日期时, 将生日 birthday 的缩写“bd” 的字型码送入显示缓存 led56。 图 4.1 开关检测流程图 显示主程序(three) 显示主程序是程序中最复杂的模块,实现的功能也最多,占用了程序运行过程 当中 90%以上的执行时间。流程图中由判断 ss(预置信号)开始分成两个分支,当 ss=1,即预置状态下程序进入预置闪烁部分。 1 图 4.2 显示主程序流程图 预置闪烁的优先级是:led34led12led56 即同预置优先级相同(参见调试部分 的详细说明)闪烁首先判断是否对 led34 进行判断闪烁,如果是则另外两个显示值 直接显示,否则判断是否对 led12 进行闪烁,如果是则直接显示 led56 的值,只有 当前两个显示值都不闪烁的时候,才判断是否对 led56 进行闪烁,这样就确保了每 次只有一个显示值闪烁。预置通过 gs 标志位判断预置的亮/灭,由 r1 控制每 50 轮 显示对 gs 取反一次。 当 ss=0 时进入判断闹铃/报时及正常显示模块,模块 eight(参见其说明)对闹 铃及报时条件进行判断,符合条件则对 p1.6 取反一次并使 nb(忽略生日)有效, 此时行对 bs(生日标志)的判断,即使响铃优先级高于生日显示(其实也可以对程序 进行修改使响铃和生日显示不发生冲突,修改方法参见程序优化)。当不响铃并且 生日标志 bs 有效时显示 happy 其单列开来。本程序由生日标志 bs 控制,当到达生 日时间时,t0 中断程序会将 bs 置 1 使之有效在显示主程序中通过判断 bs 的置来控 制是否执行本模块标志 bs 有效时显示 happy 其单列开来。本程序由生日标志 bs 控 制,当到达生日时间时,t0 中断程序会将 bs 置 1 使之有效在显示主程序中通过判 断 bs 的置来控制是否执行本模块 闹铃及整点报时判断程序(eight) 在显示主程序中每隔一段时间调用一次本程序来实现闹铃及报时功能。符合闹 铃条件时,每调用一次本程序对 p1.6 取反一次,调节调用的时间间隔便可以调节报 时的输出频率。在主程序中设置每完成对一个数码管的显示变调用一次本程序,显 示一个数码管的时间大约为 1ms,因此响铃频率高音约为 500hz,低音约为 250hz。 程序判断闹铃使能 re 后分成两个分支,当 re=a1 时判断闹铃条件是否满足,满足则 对 p1.6 取反一次,否则跳转判断整点报时条件是否满足。当 re=0 时,直接怕暖整 点报时条件是否满足。判断整点报时条件时当当前时间满足: (min=59)(second=59) (count10) 时报高音;当满足: (min=59)(second=51/53/55/57) (count10) 时报低音。利用位寻址区来存储 second 的方法,(second50)(second.0=1) 时便满足报低音的秒条件。利用 to 中断次数存储器 count 的大小可以判断是否到了 后半秒(t0 每 50ms 中断一次,中断 20 次到达一秒)。通过增加一个标志位 fc 来 24 时下对高低音的区分,高音不受 fc 的影响,低音只有当 fc=0 的时候才对 p1.6 取反 一次。并且每调用一次本程序便对 fc 取反一次,便达到每调用两次取反一次 p1.6 的效果。本程序的执行时间小于 40us,因此多次调用不过分影响执行。 中断(to)计时程序(nine) 中断计时程序的流程比较简单。程序除实现正常走时外还需要判断是否到达生 日时间置生日标志位有效。程序的输出均为 bcd 码,方便了显示程序对高低位的分 离并查表显示。程序比较复杂的地方在于对平闰年及大小月的判断。把月 month 存 储在位寻址区,当 month=02h 时判断是否是平闰年,先将年由 bcd 码转化为二进制 码,此时当年的后两位为全零的时候为闰年(由于只显示年的个位和十位,由 2000 年开始,00 年、04 年为闰年,其共同特点就是二进制后两位为零),否则为平年。 当 month2 时判断是否为大小月,mouth7 时双月为大月。 中断(t1)预置程序(ten) t1 通过中断 int0 控制开启或关闭,每次定时 50 毫秒,存储地址 counts 计数 15 次执行一次中断程序。由开关(k0,k1)控制预置项目,通过开关 k2/k3/k4 来分 别控制 led12/led34/led56 的预置,当两个开关都是有效时,具有优先级的区分, 确保无论按几个开关都最多只有一个项目被预置。判断预置的优先级顺序是: led34led12led56 这样安排的原因是由于根据生活经验 led34 所对应的 4 个项目(小时、闹铃分、 月、生日日)被预置的可能性最大。在预置日期和生日是要注意对大小月及平闰年 进行判断(判断方法与中断计时程序中说明的方法类似,但不需要考虑进位)且月 和日在溢出后应置一而不是归零。 中断(int0)设定程序(eleven) 中断 int0 设置是否进行预置以及对生日标志的清除。且有如下设置顺序:清除 预置信号并关 t1清除生日标志设定预置信号并开 t1。每按一次中断都只执行其中 一个项目 1 5 5、总结、总结 在赵宇红老师耐心的指导下,我顺利完成了这次单片机课程设计课题中的多功 能电子表的设计,通过这次的设计使我认识到本人对单片机方面的知识知道的太少 了,对于书本上的很多知识还不能灵活运用,尤其是对程序设计语句的理解和运用, 不能够充分理解每个语句的具体含义,导致编程的程序过于复杂,使得需要的存储 空间增大。损耗了过多的内存资源。 本次的设计使我从中学到了一些很重要的东西,那就是如何从理论到实践的转 化,怎样将我所学到的知识运用到我以后的工作中去。在大学的课堂的学习只是在 给我们灌输专业知识,而我们应把所学的用到我们现实的生活中去,此次的多功能 电子版表设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使 自己适应于以后的竞争,同时在查找资料的过程中我也学到了许多新的知识,在和 同学协作过程中增进同学间的友谊,使我对团队精神的积极性和重要性有了更加充 分的理解。 2 致谢致谢 最后,感谢尹进田老师对我的细心的指导,正是由于尹老师的细心的辅导和他 提供给我们的参考资料,使得我的课程设计能够顺利的完成,同时感谢所以在课程 设计过程中给于我帮助过的老师和同学,非常感谢。 张婷 2010 年 6 月 30 日 3 参考文献:参考文献: 1 谢自美电子线路设计实验测试m武汉:华中理工大学出版社,1992. 2 何立民单片机应用系统设计m北京:北京航空航天大学出版社,1993. 3 楼然笛单片机开发m北京:人民邮电出版社,1994. 4 付家才单片机控制工程实践技术m北京:化学工业出版社 2004.3. 5 李光才单片机课程设计 实例指导m 北京:北京航空航天大学出版社 2004. 6 朱定华单片机原理及接口技术实验m北京:北方交通大学出版社 2002.11. 7 刘湘涛江世明单片机原理与应用m. 北京:电子工业出版社,2006. 4 附录附录 a a 5 附录附录 b:b: ;*one 初始化 org 0 sjmp one org 0003h ljmp eleven org 000bh ljmp nine org 001bh ljmp ten one:led12 equ 30h ;数码管 12 显示缓存 led34 equ 31h ;数码管 34 显示缓存 led56 equ 32h ;数码管 56 显示缓存 count equ 33h ;定时器 t0(用来走时)计数值存储器(计数中断 20 次到 1 秒) counts equ 34h ;定时器 t1(用来预置)计数值存储器(计数中断 15 次到预置值 加 1) hour equ 40h ;以下为时间,日期,闹铃时间,生日的存储地址 min equ 41h second equ 22h year equ 50h month equ 23h day equ 52h rh equ 60h ;闹铃小时 rm equ 61h ;闹铃分 re equ 62h ;闹铃使能 bm equ 71h ;生日月份 bd equ 72h ;生日天 6 mov led12,#0 mov led34,#0 mov led56,#0 mov count,#0 mov counts,#0 mov hour,#0 mov min,#0 mov second,#0 mov year,#0 mov month,#1 mov day,#1 mov rh,#0 mov rm,#0 mov re,#0 mov bm,#6 mov bd,#1 bs bit 00h ;birthday symbol 生日标志(到生日那天就为 1) ss bit 01h ;set symbol 预置信号(按下中断预置为 1,便开始闪烁和预置) gs bit 02h ;glisten symbol 闪烁标志 fc bit 03h ;frequency control 频率控制 nb bit 04h ;neglect bitrhday symbol 忽略生日标志 clr bs clr ss clr gs clr fc clr nb setb 05h ;生日显示有效标志位 mov ip,#02h;中断优先级:t0int0t1 mov tmod,#11h mov ie,#8bh 7 setb it0 mov th0,#3ch ;50ms mov tl0,#0b0h setb tr0 mov r1,#50 ;显示延时用 mov r0,#0 ;显示延时用 ;* two 检测 开关号 two:mov p0,#0ffh jb p0.5,two1 mov re,#0a0h ;0a0 表示闹铃无效,送 0a0 是为了方便将使能查表显示,表中第 a 项为“-“ sjmp two2 two1:mov re,#0a1h two2:jb p0.0,two4 jb p0.1,two3 mov led12,hour mov led34,min mov led56,second sjmp three two3:mov led12,year mov led34,month mov led56,day sjmp three two4:jb p0.1,two5 mov led12,rh mov led34,rm mov led56,re sjmp three 8 two5:mov led12,bm mov led34,bd mov led56,#0bch sjmp three ;* three 显示主程序(同时包含了闹铃, 预置闪烁,闹铃功能) three:mov p1,#0 mov p0,#0ffh mov dptr,#tab3 jnb ss,threeb ;判断预置信号是否有效,预置有效则转入判断闪烁显示模块,否则 转入正常显示模 块 sjmp threea threeb:ljmp three11 ;three11 是正常显示并判断整点报时及闹铃模块 threea:jnb p0.3,three1 ;开始是判断闪烁显示,这句判断是否预置分/月/生日的 日/闹铃分 jnb gs,three1 ;是否闪烁? lcall twelve ;闪烁则调用延时不显示 led34 sjmp three4 three1:mov a,led34 anl a,#0fh movc a,a+dptr mov p2,a three2:setb p1.3 nop djnz r0,three2 clr p1.3 mov a,led34 swap a 9 anl a,#0fh movc a,a+dptr mov p2,a three3:setb p1.2 nop djnz r0,three3 clr p1.2 jnb p0.2,three4 ;判断是否预置小时/年/生日月/闹铃的小时 jnb gs,three4 ;是否显示小时/年/生日月/闹铃的小时 lcall twelve sjmp three7 three4:mov a,led12 anl a,#0fh movc a,a+dptr mov p2,a three5:setb p1.1 nop djnz r0,three5 clr p1.1 mov a,led12 swap a anl a,#0fh movc a,a+dptr mov p2,a three6:setb p1.0 nop djnz r0,three6 clr p1.0 jb p0.0,three7 ;数码管 56 只有在显示日期的天时才有预置闪烁功能,其余三项都 不需要判断闪烁 10 jnb p0.1,three7 jb p0.3,three7 jnb p0.4,three7 jnb gs,three7 lcall twelve sjmp three10 three7:mov a,led56 anl a,#0fh movc a,a+dptr mov p2,a three8:setb p1.5 nop djnz r0,three8 clr p1.5 mov a,led56 swap a anl a,#0fh movc a,a+dptr mov p2,a three9:setb p1.4 nop djnz r0,three9 clr p1.4 three10:djnz r1,twoa sjmp twob twoa:ljmp two twob:mov r1,#50 ;判断闪烁一次是否完成 cpl gs ;取反闪烁标志,用于控制闪烁的亮和灭 ljmp two ;一轮显示完后再判断开关号 ;*正常显示 11 three11:lcall eight ;判断是否取反 p1.6 即输出闹铃或整点报时,以下每次显示 都要调用一次 jb nb,three12 ;如果是在整点报时状态就不显示生日提醒,报时过后显示提醒 jnb bs,three12 sjmp seven ;跳到生日提醒程序 three12:clr nb ;开始正常显示时间及判断闹铃输出 mov a,led34 anl a,#0fh movc a,a+dptr mov p2,a three13:setb p1.3 nop djnz r0,three13 clr p1.3 mov a,led34 swap a anl a,#0fh movc a,a+dptr mov p2,a three14:setb p1.2 nop djnz r0,three14 clr p1.2 lcall eight mov a,led12 anl a,#0fh movc a,a+dptr mov p2,a three15:setb p1.1 nop 12 djnz r0,three15 clr p1.1 mov a,led12 swap a anl a,#0fh movc a,a+dptr mov p2,a three16:setb p1.0 nop djnz r0,three16 clr p1.0 lcall eight mov a,led56 anl a,#0fh movc a,a+dptr mov p2,a three17:setb p1.5 nop djnz r0,three17 clr p1.5 mov a,led56 swap a anl a,#0fh movc a,a+dptr mov p2,a three18:setb p1.4 nop djnz r0,three18 clr p1.4 ljmp two ;一轮显示完后判开关 13 tab3:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h 7fh,6fh,40h,7ch,5eh ;0.1.2.3.4.5.6.7.8.9.-.b.d,的字形表“bd“在显示生日时间时显示在 led56 ;*seven 生日时显示生日祝 福语”happy” seven:mov p1,#01h mov p2,#76h djnz r0,seven seven1:mov p1,#02h mov p2,#77h djnz r0,seven1 seven2:mov p1,#04h mov p2,#73h djnz r0,seven2 seven3:mov p1,#08h mov p2,#73h djnz r0,seven3 seven4:mov p1,#10h mov p2,#6eh djnz r0,seven4 ljmp two ;*eight 判断是否闹铃子程序 eight:mov a,re cjne a,#0a1h,eight1 mov a,min cjne a,rm,eight1 mov a,hour cjne a,rh,eight1 sjmp eight4 ;闹铃时间到则 cplp1.6 一次并忽略生日标志(即 nb 有效) 14 eight1:mov a,min cjne a,#59h,eight7 mov a,second cjne a,#59h,eight5 ;是否等于 59 分 59 秒 eight2:mov a,count ;是否到达后半秒 cjne a,#10,eight3 eight3:jc eight7 eight4:cpl p1.6 setb nb sjmp eight7 eight5:mov a,second cjne a,#51h,eight6 ;是否大于 51 秒 eight6:jc eight7 jnb 10h,eight7 ;判断是否报低音 jb fc,eight7 ; 只有 fc 有效时才输出 sjmp eight2 eight7:cpl fc ;用来控制报低音和高音,满足报低音条件时,调用两次本程序 对 p1.6 取反一 次,高音时调用一次取反一次 ret ;* nine 中断(t0)计时程序(包含了秒分时日月年间的进位及 判断大小月,平闰年) nine:mov th0,#3ch ;开定时器 mov tl0,#0b0h setb tr0 inc count mov a,count cjne a,#20,ineaa sjmp aaa 15 ineaa:ljmp nine1 aaa:mov count,#0 ; 计时 mov a,second add a,#01 da a ;换成 bcd 码以方便显示 mov second,a cjne a,#60h,ineaa mov second,#0 mov a,min add a,#01 da a mov min,a cjne a,#60h,ineaa mov min,#0 mov a,hour add a,#01 da a mov hour,a cjne a,#24h,ineaa mov hour,#0 mov a,day add a,#01 da a mov day,a ;*判断平闰年及大小月 mov a,month cjne a,#02h,ten6a mov a,year ;把年由 bcd 码换成二进制码 anl a,#0f0h swap a 16 mov b,#10 mul ab mov 24h,a mov a,year anl a,#0fh add a,24h jb acc.0,ten5a ;二进制码后两位为 00 表示为闰年 jb acc.1,ten5a mov 24h,#01 mov a,day cjne a,#30h,nine1 mov day,#1 sjmp nine0 ten5a:mov a,day cjne a,#29h,nine1 mov day,#1 sjmp nine0 ;*判断大小月;大于等于 8 月时双月为大月,小于 8 月时单月为大月 ten6a:mov a,month cjne a,#08h,ten7a ten7a:jc ten9a jb 18h,ten8a mov a,day cjne a,#32h,nine1 mov day,#1 sjmp nine0 ten8a:mov a,day cjne a,#31h,nine1 mov day,#1 sjmp nine0 17 ten9a:jnb 18h,ten10a mov a,day cjne a,#32h,nine1 mov day,#1 sjmp nine0 ten10a:mov a,day cjne a,#31h,nine1 mov day,#1 ;* nine0:mov a,month add a,#01 da a mov month,a setb 05h cjne a,#13h,nine1 mov month,#1 mov a,year add a,#01 da a mov year,a nine1:mov a,month cjne a,bm,nine2 mov a,day cjne a,bd,nine2 jnb 05h,nine2 setb bs nine2:reti ;*ten 中断(t1)预置加一程序由 int0 控制其的开启与关闭 18 ;*判断预置项目 ten:mov th1,#3ch mov tl1,#0b0h setb tr1 inc counts mov a,counts cjne a,#15,tene mov counts,#0 jb p0.0,rbrb jb p0.1,dat sjmp time dat: ljmp date rbrb:jb p0.1,bdat ljmp rtime bdat:ljmp bdate tene:reti ;*预置时间 time: jnb p0.3,ten1 mov a,min add a,#01 da a mov min,a cjne a,#60h,tena mov min,#0 sjmp tena ten1:jnb p0.2,tena mov a,hour add a,#01 da a mov hour,a 19 cjne a,#24h,tena mov hour,#0 tena:reti ;*预置日期 date:jnb p0.3,ten3 mov a,month add a,#01 da a mov month,a cjne a,#13h,tenb mov month,#1 sjmp tenb ten3:jnb p0.2,ten4 mov a,year add a,#01 da a mov year,a sjmp tenb ten4:jnb p0.4,tenb mov a,day add a,#01 da a mov day,a ;*判断平闰年 mov a,month cjne a,#02h,ten6 mov a,year anl a,#0f0h swap a mov b,#10 20 mul ab mov 24h,a mov a,year anl a,#0fh add a,24h jb acc.0,ten5 jb acc.1,ten5 mov a,day cjne a,#30h,tenb mov day,#1 sjmp tenb ten5:mov a,day cjne a,#29h,tenb mov day,#1 sjmp tenb ;*判断大小月 ten6:cjne a,#08h,ten7 ten7:jc ten9 jb 18h,ten8 mov a,day cjne a,#32h,tenb mov day,#1 sjmp tenb ten8:mov a,day cjne a,#31h,tenb mov day,#1 sjmp tenb ten9:jnb 18h,ten10 mov a,day cjne a,#32h,tenb 21 mov day,#1 sjmp tenb ten10:mov a,day cjne a,#31h,tenb mov day,#1 tenb: reti ;*预置闹铃时间 rtime:jnb p0.3,ten12 mov a,rm add a,#01 da a mov rm,a cjne a,#60h,tenc mov rm,#0 sjmp tenc ten12:jnb p0.2,tenc mov a,rh add a,#01 da a mov rh,a cjne a,#24h,tenc mov rh,#0 tenc:reti ;*预置生日日期 bdate:jnb p0.3,ten14 mov a,bd add a,#01 da a mov bd,a mov a,bm 22 cjne a,#02h,ten15 mov a,bd cjne a,#30h,tend mov bd,#1 sjmp tend ten15:cjne a,#08h,ten16 ten16:jc ten18 jb 18h,ten17 mov a,bd cjne a,#32h,tend
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数字藏品在环保产业中的应用与市场潜力研究报告2025
- 教师招聘之《小学教师招聘》强化训练模考卷附完整答案详解(典优)
- 接待站建筑方案设计
- 建筑领域转型金融方案设计
- 潮州铁路安全培训课件
- 家庭教育咨询室装修方案
- 爬升式布料机施工方案
- 滨州行车安全培训课件
- 建筑园林景观方案设计
- 春节药店活动策划方案创意
- 新转型九年一贯制学校三年发展规划(2025年-2028年)
- 期神丁鹏期货交易课件
- 反走私课件教学课件
- 大货车闯红灯安全培训课件
- 2025年人教版三年级数学上册全册教案
- (2025秋新版)苏教版科学三年级上册全册教案
- 《中国人首次进入自己的空间站》导学案 部编语文八年级上册
- 四川省土地开发项目预算定额标准
- 2025年小儿惊厥的应急预案演练脚本
- 2025年新教材道德与法治三年级上册第一单元《做学习的主人》教案设计
- 云南大学博士、硕士研究生学位论文写作规范
评论
0/150
提交评论