课程设计(论文)基于单片机的多功能电子表设计_第1页
课程设计(论文)基于单片机的多功能电子表设计_第2页
课程设计(论文)基于单片机的多功能电子表设计_第3页
课程设计(论文)基于单片机的多功能电子表设计_第4页
课程设计(论文)基于单片机的多功能电子表设计_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、课程设计(论文)题 目 名 称 基于单片机的多功能电子表设计 课 程 名 称 单片机原理及在电气测控学科中的应用 学 生 姓 名 学 号 系 、专 业 电气工程系 08 级电气测控类 指 导 教 师 2010 年 06 月 30 日1摘摘 要要 单片计算机即单片微型计算机。由 ram ,rom,cpu 构成,定时,计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。而 51 系列单片机是各单片机中最为典型和最有代表性的一种。这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。本设计是通过单片机设计一个多功能电子表,要求不仅具有电子时钟

2、的功能还具有闹铃、设定闹铃时间、整点报时、生日提醒功能,而且能够预置生日时间关键字:关键字:单片机;多功能电子表;跑表;数码管显示。2目 录摘 要 .41 引言 .71.1 多功能电子表简介 .71.2 多功能电子表的基本特点 .71.3 多功能电子表的原理 .72 单片机识的相关知识 .72.1 单片机简介 .72.2 单片机的发展史 .82.3 单片机的特点 .92.4 89c51 单片机介绍 .93 控制系统的硬件设计 .123.1 单片机型号的选择 .123.2 数码管显示工作原理 .123.3 按键电路、复位键设计 .143.4 系统电路原理图 .144 控制系统的软件设计 .154

3、.1 程序设计 .154.2 程序流程图 .154.3 仿真图 .204.4 仿真结果分析 .22总结 .23附录 .24a2424.3附 b28参考文献 .29致谢4引言引言 1957 年,ventura 发明了世界上第一个电子表,从而奠定了电子表的基础,电子表开始迅速发展起来。现代的电子表是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人民日常生活不可缺少的工具。 现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精

4、度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用 led 显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。51 1、 at89s52at89s52 单片机介绍单片机介绍 at89s52 具有以下标准功能:8k 字节 flash,256 字节 ram,32 位 i/o 口线,看门狗定时器,2 个数据指针,三个 16 位定时器/计数器,一个 6 向量 2 级中断结构,全双工串行口,片内晶振及时钟电路。另外,at89s52 可降至 0hz 静态逻辑操作,支持 2 种软件可选择节电

5、模式。空闲模式下,cpu 停止工作,允许 ram、定时器/计数器、串口、中断继续工作。掉电保护方式下,ram 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。 图 1.1 单片机引脚图vcc : 电源 gnd: 地p0 口:p0 口是一个 8 位漏极开路的双向 i/o 口。作为输出口,每位能驱动 8 个 ttl 逻辑电平。对 p0 端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,p0 口也被作为低 8 位地址/数据复用。在这种模式下,p0 具有内部上拉电阻。在 flash 编程时,p0 口也用来接收指令字节;在程序校验时,输出指令字节。程序校时,需

6、要外部上拉电阻。p1 口:p1 口是一个具有内部上拉电阻的 8 位双向 i/o 口,p1 输出缓冲器能驱动 4 个 ttl 逻辑电平。对 p1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(iil)。此外,p1.0 和 p1.2 分别作定时器/计数器 2 的外部计数输入(p1.0/t2)和时器/计数器 2 的触发输入(p1.1/t2ex),具体如下表所示。6表 1.1 at89s52 p1 口第二功能表脚号第二功能p1.0t2(定时器/计数器 t2 的外部计数输入),时钟输出p1.1t2ex(定时器/计数器 t2

7、 的捕捉/重载触发信号和方向控制)p1.5mosi(在系统编程用)p1.6miso(在系统编程用)p1.7sck(在系统编程用)p2 口:p2 口是一个具有内部上拉电阻的 8 位双向 i/o 口,p2 输出缓冲器能驱动 4 个 ttl 逻辑电平。对 p2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(iil)在访问外部程序存储器或用 16 位地址读取外部数据存储器(例如执行 movx dptr)时,p2 口送出高八位地址p3 口:p3 口是一个具有内部上拉电阻的 8 位双向 i/o 口,p2 输出缓冲器能驱动 4

8、 个 ttl 逻辑电平。对 p3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(iil)。p3 口亦作为 at89s52 特殊功能(第二功能)使用,如下表所示。表 1.1 at89s52 p3 口第二功能表脚号第二功能p3.0rxd(串行输入)p3.1txd(串行输出)p3.2int0(外部中断 0)p3.3int0(外部中断 0)p3.4t0(定时器 0 外部输入)p3.5t1(定时器 1 外部输入)p3.6wr(外部数据存储器写选通)p3.7rd(外部数据存储器写选通)rst: 复位输入。晶振工作时,rst

9、脚持续 2 个机器周期高电平将使单片机复位。看门狗计时完成后,rst 脚输出 96 个晶振周期的高电平。特殊寄存器 auxr(地址 8eh)上的 disrto 位可以使此功能无效。disrto 默认状态下,复位高电平有效。7ale/prog:地址锁存控制信号(ale)是访问外部程序存储器时,锁存低 8 位地址的输出脉冲。在 flash 编程时,此引脚(prog)也用作编程输入脉冲。在一般情况下,ale 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ale 脉冲将会跳过。psen:外部程序存储器选通信号(psen)是外部程序存储器选

10、通信号。当 at89s52 从外部程序存储器执行外部代码时,psen 在每个机器周期被激活两次,而在访问外部数据存储器时,psen 将不被激活。ea/vpp:访问外部程序存储器控制信号。为使能从 0000h 到 ffffh 的外部程序存储器读取指令,ea 必须接 gnd。为了执行内部程序指令,ea 应该接 vcc。在 flash 编程期间,ea 也接收 12 伏 vpp 电压。xtal1:振荡器反相放大器和内部时钟发生电路的输入端。xtal2:振荡器反相放大器的输出端。82 2、设计功能及说明、设计功能及说明电子数字钟实现的主要功能: 实现正常走时(秒分时日月年进位) 能够预置时间和日期 能够

11、自动区分平闰年和大小月 具有闹铃及设定闹铃时间功能 具有整点报时功能 具有生日提醒功能,能够预置生日时间 在任何一种预置状态下,预置项目会闪烁显示其它设计说明 优先级:预置闹铃报时生日提醒正常显示,即预置状态下闹铃、报时功能及生日提醒功能都无效 生日时间到五个数码管显示“happy” 生日显示状态下,按下中断int0恢复正常显示且此后只有在下更改生日日期或第二年生日显示才有效。 正常显示状态下按下中断int0进入预置状态,再按一次恢复。 用数码管(k0,k1)控制显示状态:00:时间,01:闹铃时间,10:日期,11。生日时间且显示样板如下图所示:生日:6 月1 日生日,最 闹铃:于早晨6 点

12、10 分响,最后后两位bd 为birthday 的缩写 一位为一表示使能有效。日期:08 年2 月29 日 时间:12 点39 分45 秒9 预置由拨码开关k2/k3/k4分别控制数码管12/34/56显示值,预置优先级:led34led12led56(相应数码管显示的项目,显示状态下才能预置) 整点报时声音为59分51、53、55、57秒的后半秒报四声低音, 59秒的后半秒报一声高音 闹铃每次响一分钟 不论是预置状态还是正常走时状态均能够自动区分平闰年和大小月 闹铃使能由拨码开关k5控制并实时显示103 3、整体设计方案、整体设计方案系统硬件电路根据系统功能可知,需要六个数码管,一个外部中断

13、 int0,一个扬声器,由此结合单片机课程学习中对实验面板的了解,做出如下电路:图 3.1 系统硬件电路图如图,晶振频率 12mhz,拨码开关数值由 p0 口读入;p2 口的输出作为控制数码管的段控信号,经 74ls573 即 8 位数据锁存器接到数码管中。数码管采用共阴接法(图中未标示);p1.0-p1.5 作为数码管的位控信号出端;开关 w2 经一个基本 rs 锁存器接入 int0,每按一次开关 into 取反次,按两次输入一个下降沿;扬声器由p1.6 口控制。114 4、单模块流程设计及程序设计、单模块流程设计及程序设计在完成了系统总流程设计后,便进入到了系统设计中工作量最大的模块流程设

14、计。由于系统模块划分虽然是系统设计的基础,但比较简单而且模块划分有多种方法,因此单模块的设计可以认为是本程序中最关键的部分。单模块设计的好坏与否决定了系统功能能否被稳定地实现以及下一阶段调试程序的难度。鉴于单模块设计的重要性,我在设计中并不急于对模块进行编码,而是反复论证模块的可行性和流程图,为下一阶段的工作做好准备,同时也能够尽早发现系统模块划分的错误,加以解决。各模块设计概述初始化模块(one)初始化模块包含了各中断的跳转语句、存储资源的分配、各存储器和寄存器的赋值以及中断及计时器的状态设置。源程序中共使用了 17 字节的内部数据存储地址,其中包含 3 字节位寻址地址以便于进行位判断。三字

15、节的位寻址地址分配如下:22h秒的存储地址,方便对整点报时条件进行判断23h月的存储地址,方便对大小月平闰年进行判断另外一个位寻址字节 00h 地址拆开用做程序状态标志位00h(bit,bs)生日标志位,到生日那天为 1 使程序转入生日显示段01h(bit,ss)预置标志,以 int0 控制其值,控制预置闪烁的实现02h(bit,gs)闪烁标志,在预置标志有效时控制闪烁项目的亮和灭两状态03h(bit,fc)频率控制,在整点报时时控制产生低音还是高音04h(bit,nb)忽略生日标志,控制预置及报时的优先级高于生日显示05h(bit)控制生日信号的有效与否,其使用目的参见调试过程源程序中使用了

16、两个寄存器 r1、r0,r1 用于控制闪烁的间隔时间, r0 用于显示延时。在初始化模块中设定了中断的优先级、定时计数器的工作模式、并打开了定时计数器 to 开始计时其他资源分配项目参见源程序集合及注释。初始化模块指令很大一部分都是伪指令,方便了后面程序的编写。开关检测模块(two)开关检测模块主要执行两个任务:1读取闹铃使能控制拨码开关 k5 的值并赋予闹铃使能相应值;读取显示选择开关(k0,k1)的值并将要显示的项目值送入显示缓存led12、led34、led56 当 k5 为1 时将 a1h 送入 re 反之送入a1h,其中 a 为“”的字型码查表偏移量。当显示生日日期时,将生日 bir

17、thday 的缩写“bd”的字型码送入显示缓存 led56。图 4.1 开关检测流程图显示主程序(three)显示主程序是程序中最复杂的模块,实现的功能也最多,占用了程序运行过程当中 90%以上的执行时间。流程图中由判断 ss(预置信号)开始分成两个分支,当ss=1,即预置状态下程序进入预置闪烁部分。1图 4.2 显示主程序流程图预置闪烁的优先级是:led34led12led56 即同预置优先级相同(参见调试部分的详细说明)闪烁首先判断是否对 led34 进行判断闪烁,如果是则另外两个显示值直接显示,否则判断是否对 led12 进行闪烁,如果是则直接显示 led56 的值,只有当前两个显示值都

18、不闪烁的时候,才判断是否对 led56 进行闪烁,这样就确保了每次只有一个显示值闪烁。预置通过 gs 标志位判断预置的亮/灭,由 r1 控制每 50 轮显示对 gs 取反一次。当 ss=0 时进入判断闹铃/报时及正常显示模块,模块 eight(参见其说明)对闹铃及报时条件进行判断,符合条件则对 p1.6 取反一次并使 nb(忽略生日)有效,此时行对 bs(生日标志)的判断,即使响铃优先级高于生日显示(其实也可以对程序进行修改使响铃和生日显示不发生冲突,修改方法参见程序优化)。当不响铃并且生日标志 bs 有效时显示 happy 其单列开来。本程序由生日标志 bs 控制,当到达生日时间时,t0 中

19、断程序会将 bs 置 1 使之有效在显示主程序中通过判断 bs 的置来控制是否执行本模块标志 bs 有效时显示 happy 其单列开来。本程序由生日标志 bs 控制,当到达生日时间时,t0 中断程序会将 bs 置 1 使之有效在显示主程序中通过判断 bs 的置来控制是否执行本模块闹铃及整点报时判断程序(eight)在显示主程序中每隔一段时间调用一次本程序来实现闹铃及报时功能。符合闹铃条件时,每调用一次本程序对 p1.6 取反一次,调节调用的时间间隔便可以调节报时的输出频率。在主程序中设置每完成对一个数码管的显示变调用一次本程序,显示一个数码管的时间大约为 1ms,因此响铃频率高音约为 500h

20、z,低音约为 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

21、每 50ms 中断一次,中断 20 次到达一秒)。通过增加一个标志位 fc 来24时下对高低音的区分,高音不受 fc 的影响,低音只有当 fc=0 的时候才对 p1.6 取反一次。并且每调用一次本程序便对 fc 取反一次,便达到每调用两次取反一次 p1.6的效果。本程序的执行时间小于 40us,因此多次调用不过分影响执行。中断(to)计时程序(nine)中断计时程序的流程比较简单。程序除实现正常走时外还需要判断是否到达生日时间置生日标志位有效。程序的输出均为 bcd 码,方便了显示程序对高低位的分离并查表显示。程序比较复杂的地方在于对平闰年及大小月的判断。把月 month 存储在位寻址区,当

22、month=02h 时判断是否是平闰年,先将年由 bcd 码转化为二进制码,此时当年的后两位为全零的时候为闰年(由于只显示年的个位和十位,由 2000年开始,00 年、04 年为闰年,其共同特点就是二进制后两位为零),否则为平年。当 month2 时判断是否为大小月,mouth7 时双月为大月。中断(t1)预置程序(ten)t1 通过中断 int0 控制开启或关闭,每次定时 50 毫秒,存储地址 counts 计数15 次执行一次中断程序。由开关(k0,k1)控制预置项目,通过开关 k2/k3/k4 来分别控制 led12/led34/led56 的预置,当两个开关都是有效时,具有优先级的区分

23、,确保无论按几个开关都最多只有一个项目被预置。判断预置的优先级顺序是:led34led12led56这样安排的原因是由于根据生活经验 led34 所对应的 4 个项目(小时、闹铃分、月、生日日)被预置的可能性最大。在预置日期和生日是要注意对大小月及平闰年进行判断(判断方法与中断计时程序中说明的方法类似,但不需要考虑进位)且月和日在溢出后应置一而不是归零。中断(int0)设定程序(eleven)中断 int0 设置是否进行预置以及对生日标志的清除。且有如下设置顺序:清除预置信号并关 t1清除生日标志设定预置信号并开 t1。每按一次中断都只执行其中一个项目15 5、总结、总结在赵宇红老师耐心的指导

24、下,我顺利完成了这次单片机课程设计课题中的多功能电子表的设计,通过这次的设计使我认识到本人对单片机方面的知识知道的太少了,对于书本上的很多知识还不能灵活运用,尤其是对程序设计语句的理解和运用,不能够充分理解每个语句的具体含义,导致编程的程序过于复杂,使得需要的存储空间增大。损耗了过多的内存资源。本次的设计使我从中学到了一些很重要的东西,那就是如何从理论到实践的转化,怎样将我所学到的知识运用到我以后的工作中去。在大学的课堂的学习只是在给我们灌输专业知识,而我们应把所学的用到我们现实的生活中去,此次的多功能电子版表设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应于以后的竞争

25、,同时在查找资料的过程中我也学到了许多新的知识,在和同学协作过程中增进同学间的友谊,使我对团队精神的积极性和重要性有了更加充分的理解。2致谢致谢最后,感谢尹进田老师对我的细心的指导,正是由于尹老师的细心的辅导和他提供给我们的参考资料,使得我的课程设计能够顺利的完成,同时感谢所以在课程设计过程中给于我帮助过的老师和同学,非常感谢。 张婷 2010 年 6 月 30 日3参考文献:参考文献:1 谢自美电子线路设计实验测试m武汉:华中理工大学出版社,1992.2 何立民单片机应用系统设计m北京:北京航空航天大学出版社,1993.3 楼然笛单片机开发m北京:人民邮电出版社,1994.4 付家才单片机控

26、制工程实践技术m北京:化学工业出版社 2004.3.5 李光才单片机课程设计 实例指导m 北京:北京航空航天大学出版社 2004.6 朱定华单片机原理及接口技术实验m北京:北方交通大学出版社 2002.11.7 刘湘涛江世明单片机原理与应用m. 北京:电子工业出版社,2006.4附录附录 a a5附录附录 b:b:;*one 初始化org 0sjmp oneorg 0003hljmp elevenorg 000bhljmp nineorg 001bhljmp tenone:led12 equ 30h ;数码管 12 显示缓存led34 equ 31h ;数码管 34 显示缓存led56 equ

27、 32h ;数码管 56 显示缓存count equ 33h ;定时器 t0(用来走时)计数值存储器(计数中断 20 次到 1 秒)counts equ 34h ;定时器 t1(用来预置)计数值存储器(计数中断 15 次到预置值加 1)hour equ 40h ;以下为时间,日期,闹铃时间,生日的存储地址min equ 41hsecond equ 22hyear equ 50hmonth equ 23hday equ 52hrh equ 60h ;闹铃小时rm equ 61h ;闹铃分re equ 62h ;闹铃使能bm equ 71h ;生日月份bd equ 72h ;生日天6mov led

28、12,#0mov led34,#0mov led56,#0mov count,#0mov counts,#0mov hour,#0mov min,#0mov second,#0mov year,#0mov month,#1mov day,#1mov rh,#0mov rm,#0mov re,#0mov bm,#6mov bd,#1bs bit 00h ;birthday symbol 生日标志(到生日那天就为 1)ss bit 01h ;set symbol 预置信号(按下中断预置为 1,便开始闪烁和预置)gs bit 02h ;glisten symbol 闪烁标志fc bit 03h ;f

29、requency control 频率控制nb bit 04h ;neglect bitrhday symbol 忽略生日标志clr bsclr ssclr gsclr fcclr nbsetb 05h ;生日显示有效标志位mov ip,#02h;中断优先级:t0int0t1mov tmod,#11hmov ie,#8bh7setb it0mov th0,#3ch ;50msmov tl0,#0b0hsetb tr0mov r1,#50 ;显示延时用mov r0,#0 ;显示延时用;* two 检测开关号two:mov p0,#0ffhjb p0.5,two1mov re,#0a0h ;0a0

30、 表示闹铃无效,送 0a0 是为了方便将使能查表显示,表中第 a项为-sjmp two2two1:mov re,#0a1htwo2:jb p0.0,two4jb p0.1,two3mov led12,hourmov led34,minmov led56,secondsjmp threetwo3:mov led12,yearmov led34,monthmov led56,daysjmp threetwo4:jb p0.1,two5mov led12,rhmov led34,rmmov led56,resjmp three8two5:mov led12,bmmov led34,bdmov led

31、56,#0bchsjmp three;* three 显示主程序(同时包含了闹铃,预置闪烁,闹铃功能)three:mov p1,#0mov p0,#0ffhmov dptr,#tab3jnb ss,threeb ;判断预置信号是否有效,预置有效则转入判断闪烁显示模块,否则转入正常显示模块sjmp threeathreeb:ljmp three11 ;three11 是正常显示并判断整点报时及闹铃模块threea:jnb p0.3,three1 ;开始是判断闪烁显示,这句判断是否预置分/月/生日的日/闹铃分jnb gs,three1 ;是否闪烁?lcall twelve ;闪烁则调用延时不显示

32、led34sjmp three4three1:mov a,led34anl a,#0fhmovc a,a+dptrmov p2,athree2:setb p1.3nopdjnz r0,three2clr p1.3mov a,led34swap a9anl a,#0fhmovc a,a+dptrmov p2,athree3:setb p1.2nopdjnz r0,three3clr p1.2jnb p0.2,three4 ;判断是否预置小时/年/生日月/闹铃的小时jnb gs,three4 ;是否显示小时/年/生日月/闹铃的小时lcall twelvesjmp three7three4:mov

33、a,led12anl a,#0fhmovc a,a+dptrmov p2,athree5:setb p1.1nopdjnz r0,three5clr p1.1mov a,led12swap aanl a,#0fhmovc a,a+dptrmov p2,athree6:setb p1.0nopdjnz r0,three6clr p1.0jb p0.0,three7 ;数码管 56 只有在显示日期的天时才有预置闪烁功能,其余三项都不需要判断闪烁10jnb p0.1,three7jb p0.3,three7jnb p0.4,three7jnb gs,three7lcall twelvesjmp th

34、ree10three7:mov a,led56anl a,#0fhmovc a,a+dptrmov p2,athree8:setb p1.5nopdjnz r0,three8clr p1.5mov a,led56swap aanl a,#0fhmovc a,a+dptrmov p2,athree9:setb p1.4nopdjnz r0,three9clr p1.4three10:djnz r1,twoasjmp twobtwoa:ljmp twotwob:mov r1,#50 ;判断闪烁一次是否完成cpl gs ;取反闪烁标志,用于控制闪烁的亮和灭ljmp two ;一轮显示完后再判断开关号

35、;*正常显示11three11:lcall eight ;判断是否取反 p1.6 即输出闹铃或整点报时,以下每次显示都要调用一次jb nb,three12 ;如果是在整点报时状态就不显示生日提醒,报时过后显示提醒jnb bs,three12sjmp seven ;跳到生日提醒程序three12:clr nb ;开始正常显示时间及判断闹铃输出mov a,led34anl a,#0fhmovc a,a+dptrmov p2,athree13:setb p1.3nopdjnz r0,three13clr p1.3mov a,led34swap aanl a,#0fhmovc a,a+dptrmov

36、p2,athree14:setb p1.2nopdjnz r0,three14clr p1.2lcall eightmov a,led12anl a,#0fhmovc a,a+dptrmov p2,athree15:setb p1.1nop12djnz r0,three15clr p1.1mov a,led12swap aanl a,#0fhmovc a,a+dptrmov p2,athree16:setb p1.0nopdjnz r0,three16clr p1.0lcall eightmov a,led56anl a,#0fhmovc a,a+dptrmov p2,athree17:set

37、b p1.5nopdjnz r0,three17clr p1.5mov a,led56swap aanl a,#0fhmovc a,a+dptrmov p2,athree18:setb p1.4nopdjnz r0,three18clr p1.4ljmp two ;一轮显示完后判开关13tab3: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,#01hmov p

38、2,#76hdjnz r0,sevenseven1:mov p1,#02hmov p2,#77hdjnz r0,seven1seven2:mov p1,#04hmov p2,#73hdjnz r0,seven2seven3:mov p1,#08hmov p2,#73hdjnz r0,seven3seven4:mov p1,#10hmov p2,#6ehdjnz r0,seven4ljmp two;*eight判断是否闹铃子程序eight:mov a,recjne a,#0a1h,eight1mov a,mincjne a,rm,eight1mov a,hourcjne a,rh,eight1s

39、jmp eight4 ;闹铃时间到则 cplp1.6 一次并忽略生日标志(即 nb 有效)14eight1:mov a,mincjne a,#59h,eight7mov a,secondcjne a,#59h,eight5 ;是否等于 59 分 59 秒eight2:mov a,count ;是否到达后半秒cjne a,#10,eight3eight3:jc eight7eight4:cpl p1.6setb nbsjmp eight7eight5:mov a,secondcjne a,#51h,eight6 ;是否大于 51 秒eight6:jc eight7jnb 10h,eight7 ;

40、判断是否报低音jb fc,eight7 ; 只有 fc 有效时才输出sjmp eight2eight7:cpl fc ;用来控制报低音和高音,满足报低音条件时,调用两次本程序对 p1.6 取反一次,高音时调用一次取反一次ret;* nine 中断(t0)计时程序(包含了秒分时日月年间的进位及判断大小月,平闰年)nine:mov th0,#3ch ;开定时器mov tl0,#0b0hsetb tr0inc countmov a,countcjne a,#20,ineaasjmp aaa15ineaa:ljmp nine1aaa:mov count,#0 ; 计时mov a,secondadd a

41、,#01da a ;换成 bcd 码以方便显示mov second,acjne a,#60h,ineaamov second,#0mov a,minadd a,#01da amov min,acjne a,#60h,ineaamov min,#0mov a,houradd a,#01da amov hour,acjne a,#24h,ineaamov hour,#0mov a,dayadd a,#01da amov day,a;*判断平闰年及大小月mov a,monthcjne a,#02h,ten6amov a,year ;把年由 bcd 码换成二进制码anl a,#0f0hswap a16

42、mov b,#10mul abmov 24h,amov a,yearanl a,#0fhadd a,24hjb acc.0,ten5a ;二进制码后两位为 00 表示为闰年jb acc.1,ten5amov 24h,#01mov a,daycjne a,#30h,nine1mov day,#1sjmp nine0ten5a:mov a,daycjne a,#29h,nine1mov day,#1sjmp nine0;*判断大小月;大于等于 8 月时双月为大月,小于 8 月时单月为大月ten6a:mov a,monthcjne a,#08h,ten7aten7a:jc ten9ajb 18h,t

43、en8amov a,daycjne a,#32h,nine1mov day,#1sjmp nine0ten8a:mov a,daycjne a,#31h,nine1mov day,#1sjmp nine017ten9a:jnb 18h,ten10amov a,daycjne a,#32h,nine1mov day,#1sjmp nine0ten10a:mov a,daycjne a,#31h,nine1mov day,#1;*nine0:mov a,monthadd a,#01da amov month,asetb 05hcjne a,#13h,nine1mov month,#1mov a,y

44、earadd a,#01da amov year,anine1:mov a,monthcjne a,bm,nine2mov a,daycjne a,bd,nine2jnb 05h,nine2setb bsnine2:reti;*ten 中断(t1)预置加一程序由int0 控制其的开启与关闭18;*判断预置项目ten:mov th1,#3chmov tl1,#0b0hsetb tr1inc countsmov a,countscjne a,#15,tenemov counts,#0jb p0.0,rbrbjb p0.1,datsjmp timedat: ljmp daterbrb:jb p0.1

45、,bdatljmp rtimebdat:ljmp bdatetene:reti;*预置时间time: jnb p0.3,ten1mov a,minadd a,#01da amov min,acjne a,#60h,tenamov min,#0sjmp tenaten1:jnb p0.2,tenamov a,houradd a,#01da amov hour,a19cjne a,#24h,tenamov hour,#0tena:reti;*预置日期date:jnb p0.3,ten3mov a,monthadd a,#01da amov month,acjne a,#13h,tenbmov mo

46、nth,#1sjmp tenbten3:jnb p0.2,ten4mov a,yearadd a,#01da amov year,asjmp tenbten4:jnb p0.4,tenbmov a,dayadd a,#01da amov day,a;*判断平闰年mov a,monthcjne a,#02h,ten6mov a,yearanl a,#0f0hswap amov b,#1020mul abmov 24h,amov a,yearanl a,#0fhadd a,24hjb acc.0,ten5jb acc.1,ten5mov a,daycjne a,#30h,tenbmov day,#

47、1sjmp tenbten5:mov a,daycjne a,#29h,tenbmov day,#1sjmp tenb;*判断大小月ten6:cjne a,#08h,ten7ten7:jc ten9jb 18h,ten8mov a,daycjne a,#32h,tenbmov day,#1sjmp tenbten8:mov a,daycjne a,#31h,tenbmov day,#1sjmp tenbten9:jnb 18h,ten10mov a,daycjne a,#32h,tenb21mov day,#1sjmp tenbten10:mov a,daycjne a,#31h,tenbmo

48、v day,#1tenb: reti;*预置闹铃时间rtime:jnb p0.3,ten12mov a,rmadd a,#01da amov rm,acjne a,#60h,tencmov rm,#0sjmp tencten12:jnb p0.2,tencmov a,rhadd a,#01da amov rh,acjne a,#24h,tencmov rh,#0tenc:reti;*预置生日日期bdate:jnb p0.3,ten14mov a,bdadd a,#01da amov bd,amov a,bm22cjne a,#02h,ten15mov a,bdcjne a,#30h,tendmov bd,#1sjmp tendten15:cjne a,#08h,ten16ten16:jc ten18jb 18h,ten17mov a,bdcjne a,#32h,tendmov bd,#1sjmp tendten17:mov a,bdcj

温馨提示

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

评论

0/150

提交评论