目录
单片机的个性化电子钟设计报告. 1
一、设计背景. 1
二、作品介绍. 1
三、设计目的及意义. 1
四、设计要求. 1
五、总体方案设计. 2
5.1硬件设计. 2
1.单片机最小系统 AT89S52 2
2、显示模块. 2
3.按键模块. 2
4.晶振模块. 3
5.2 软件设计. 3
1 硬件框图. 3
2 程序流程图. 3
六、遇到的困难和解决的办法. 4
七、总结及建议. 5
单片机的个性化电子钟设计报告
一、设计背景
数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。尽管目前市场上已有现成的数字钟集成电路芯片出售,价格便宜、使用也方便,但鉴于单片机的定时器功能也可以完成数字钟电路的设计,因此进行数字钟的设计是必要的。在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路,写程序、调试电路的能力。
单片机具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。
二、作品介绍
该作品是个性化电子钟设计,技术上主要用单片机(AT89S52)主控,4位LED数码显示,分别显示“小时:分钟”秒在下一步中。该作品主要用于24小时计时显示,能整时报时,能定时闹铃1分钟。
使用方法:开机后时钟在00:00起开始计时。
长按P3.2进入调分状态:分单元闪烁,按P3.2加1,按P3.3减1.再长按P3.2进入时调整状态,时单元闪烁,加减调整同调分.按长按退出调整状态。
(2)按P3.3进入设定闹时状态: 12:00: ,可进行分设定,按P3.4分加1,再按P3.2为时调整,按P3.4时加1,按P3.3调闹钟结束.在闹铃时可按P3.2停闹,不按闹铃1分钟。
三、设计目的及意义
(1)巩固、加深和扩大51系列单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力;
(2)培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力;
(3)对课题设计方案的分析、选择、比较、熟悉用51单片机做系统开发、研制的过程,软硬件设计的方法、内容及步骤。
四、设计要求
(1)上电以后自动进入计时状态,起始于00:00。
(2)设计键盘调整时间,完成时间设计,并设置闹钟。
(3)定时时间为1/100秒,采用定时器实现。
(4)采用LED数码管显示,时、分采用数字显示。
(5)采用24小时制,具有方便的时间调校功能。
五、总体方案设计
5.1硬件设计
1.单片机最小系统 AT89S52
AT89S52概述:是一款非常适合单片机初学者学习的单片机,它完全兼容传统的8051,8031的指令系统,他的运行速度要比8051快最高支持达33MHz的晶体震荡器,在此系统中使用12MHz的晶振。AT89S52具有以下标准功能: 8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止……
详述:AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16位定时器/计数器。一个6向量2级中断结构,全双工串行口及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止.
2、显示模块
LED数码管是由发光二极管构成的,亦称半导体数码管。将条状发光二极管按照共阴极(负极)或共阳极(正极)的方法连接,组成“8”字,再把发光二极管另一电极作笔段电极,就构成了LED数码管。若按规定使某些笔段上的发光二极管发光,就能显示从0~9的…系列数字。同荧光数码管(VFD)、辉光数码管(NRT)相比,它具有:体积小、功耗低、耐震动、寿命长、亮度高、单色性好、发光响应的时间短,能与TTL、CMOS电路兼容等的数显器件。+、-分别表示公共阳极和公共阴极。a~g是7个笔段电极,DP为小数点。另有一种字高为7.6mm的超小型LED数码管,管脚从左右两排引出,小数点则是独立的。
本系统利用4位LED数码管显示时间,共阴极结构。LED数码管由7段发光二极管组成,当要显示某个数字时只要将数字所对应的引脚送入低电平。
3.按键模块
本设计中主要有三个控制按键,按键功能为:
(1)P3.2为调时间模式,长按P3.2进入调分状态:分单元闪烁,按P3.2加1,按P3.3减1.再长按P3.2进入时调整状态,时单元闪烁,加减调整同调分.按长按退出调整状态。
(2)按P3.3进入设定闹时状态: 12:00: ,可进行分设定,按P3.4分加1,再按P3.2为时调整,按P3.4时加1,按P3.3调闹钟结束.在闹铃时可按P3.2停闹,不按闹铃1分钟。
(3)按下P3.4进入秒表状态:再按P3.4秒表又启动,按P3.4暂停,再按P3.4秒表清零,按P3.4退出秒表回到时钟状态。
4.晶振模块
在AT89S51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
5.2 软件设计
1 硬件框图
根据以上的电子时钟的设计要求可以分为以下的几个硬件电路模块:单片机模块、数码显示模块、晶振模块、电源模块与按键模块等,模块之间的关系图如下面得方框电路图所示。
2 程序流程图
(1)总体流程图
(4)秒表模式
六、遇到的困难和解决的办法
本次课程设计与我们以往的相比难度有所增加,主要是此次设计对知识的要求较为综合,我们用到了单片机、数字电路、模拟电路、protel/proteuse、keil-c51等知识,所以,才开始时,我们不知道从何下手。不过后来在老师的帮助下,以及自己不断的查找资料,和同学商量,终于开始有点头目了,慢慢的便进入了状态。
不过在利用protel软件画图时,我们还是遇到了不小的麻烦。最主要的便是对软件使用方法的陌生和不知道元件名称,画不了图。由于学了protel后自己很少使用,所以渐渐地忘记了对软件的使用。而我们的原理图都是参照人家的原理图来制作的,所以对很多元件我们都不知道其名称,也就不能查找元件画图。不过后来经过问老师、问同学、查资料,这些难题都一一解决。
另一个问题就是将编写好的源程序输入电脑,编译后出现很多错误,这些错误有许多是平时的实验遇到过的,例如:输入的分号格式不正确,零和字母O弄混淆了,LOOP5出现了几次,CJNE写成了CJNZ等等,幸好这些错误在平时的实验中遇到了,所以改错误很容易,但同时也说明了,平时的错误现在还在犯,证明错误我还没有完全的改正,这点我们以后一定要注意了。争取错误犯了两次就不能在犯了。除了常见的错误外,还有几条错误时我从来没有遇到过的,如:LJMP跳转指令跳不回指定的位置,是因为跳转的长度大于LJMP跳转的长度,最后只好设置跳转两次后才能跳到指定的位置。
经过多次的修改和向别人请教,错误都排除了,编译通过了,但功能没有达到设计的要求,最主要的就是设计的原理图太多错误,不能进行仿真。最后,在老师另外给了我们一个原理图后,经过几天在机房的努力,终于实现了时钟的全部要求。
七、总结及建议
本次课程设计是用AT89S52单片机CPU及接口电路设计一个数字时钟,经过一个星期的调试,结果满足设计要求,验证无误。通过单片机硬件电路的调试,实现了预先设定的功能,设计主要用到了多种芯片,程序也比较长比较麻烦,同时也遇到了不少困难,尤其是关于校时模块的设计实现。关于显示模块,在以前的实验中做过,所以问题很容易解决。
随着集成电路和计算机技术的迅速发展,使电子仪器的整体水平发生巨大变化,传统的仪器逐步的被智能仪器所取代。智能仪器的核心部件是单片机,因其极高的性价比得到广泛的应用与发展,从而加快了智能仪器的发展。而传感器作为测控系统中对象信息的入口,越来越受到人们的关注。传感器好比人体“五官”的工程模拟物,它是一种能将特定的被测量信息(物理量、化学量、生物量等)按一定规律转换成某种可用信号输出的器件或装置本次课设中的半桥电子秤就是在以上仪器的基础上设计而成的。因此,只有充分了解有关智能仪器、单片机、传感器以及各部分之间的关系才能达到要求。
通过本次设计,我们系统的了解了实时时钟的设计流程,尤其是硬、软件的设计方法,掌握了键盘显示电路的基本功能及编程方法,掌握了键盘电路和显示电路的一般原理,也进一步掌握了89S52定时器的使用和中断处理器程序的编程方法。开拓了思路,锻炼了实践动手能力,提高了分工协作能力和分析问题,解决问题的能力,达到了本次课程设计的目的。在调试电路的过程中也积累了一些宝贵的经验,比如说,在I/O口要保证标准的高电平”1”的产生,一般要上拉电阻5.1k,在一些需要高电平的地方,不能用悬空来模拟,必须严格的按照“+5v”来连接,特别是调试过程中的分部分进行很重要。
此次单片机课程设计,从选题到定稿,从理论到实践,在整整两个星期里,学到了很多的东西。同时不仅巩固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。这次的课程设计还让我学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。更重要的是,我在这一设计过程中,学会了坚持不懈,不轻言放弃。
设计过程,好比是我们人类成长的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。我们通过查阅大量有关资料,并在小组中互相讨论,交流经验和自学,若遇到实在搞不明白的问题就会及时请教老师,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。
在整个设计中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。而且大大提高了动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。虽然这个设计做的也不太好,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富。
单片机课程设计虽然结束了,但通过设计所学到的东西将长久存在。相信这次设计带给我们的严谨的学习态度和一丝不苟的科学作风将会给我们未来的工作和学习打下一个更坚实的基础。
单片机课程设计,是对单片机知识的验证,可以帮助我们理解巩固所学知识,激发我们对单片机课程的兴趣,更锻炼了我们独立思考、开拓创新的能力。
在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。我们是在做单片机课程设计,但我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。
其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:CAD制图、汇编语言、模拟和数字电路知识等。虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。
最后,要做好一个课程设计,就必须做到:在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。另外,这次课程设计让我感到了团队合作的重要性。在团队中,我们互帮互助,对整个课程设计来说,这是至关重要的,缺少每一个人都会对我们的设计产生影响。还有要感谢指导老师在我们遇到困难时,给予我们的建议与鼓励。
第二篇:单片机电子时钟设计报告
四、设计思路
1、硬件设计思路
1) 本人使用Proteus软件绘制硬件系统。硬件系统以AT89C51单片机、显示系统、键控系统构成。晶振电路由12MHz振荡器和两个25pF电容构成。复位电路采用按键脉冲复位电路,由一个SW-SPST按键、一个10k和一个1k电阻、两个22uf电容构成。
2) 显示系统由六位共阴极红色数码管进行动态扫描输出。
3) 按键部分由三个SW-SPST键构成。
4) 扬声器为交流SOUNDER。
5) 如图, P0口上拉电阻为RESPACK-8,每位均为10k欧姆。
由于使用Proteus进行仿真,所以省去设置keil软件的麻烦,只要把WAVE编译产生的烧写HEX文件导入单片机即可仿真。
2、软件设计思路
根据电路可以设计一个带整点报时、调时功能的电子钟。
根据要求对硬件功能进行分配:本系统由 P0口做段码口,P2口做位码口。P3.0为启停键(控制电子钟的启动和停止),P3.1,P3.2为调时键,其中P3.1为取码键(选择要调的位),P3.2为加一键(对选择的位进行加1操作)。
据功能程序可以由以下几部分组成:主程序、定时器中断子程序、显示子程序、延时子程序、启停子程序、调时子程序、调时比较子程序(调表时检测所调位是否溢出,并进行清0处理)、整点报时子程序。
1)主程序说明:
本程序利用定时计数器T0进行定时。首先设置T0工作模式为模式1,显示缓冲区清零,设置调时取位寄存器(存储所调位的地址)初值。启动定时器。进入循环模块后先调用显示子程序,然后判断启停键是否闭合。如果闭合则调用启停子程序,如果断开就跳到下一项判断定时器是否停止,若停止则调用调时子程序,若启动则直接调用整点报时子程序。
主程序流程图
2)中断子程序
先介绍一下定时器产生秒的过程:定时器在模式1时为16位计数器,记到65535才溢出,最长计时65.535ms。可以每隔50ms中断一次,中断20次为1秒。计算初值由公式
(216-X)×12/6/106=10-1
得 X=15536=3CB0H
因此THO=3CH,TL0=0B0H
此程序工作过程为:此程序把时分秒的个位和十位分开计算。
首先要堆栈保护现场,把定时器循环次数20送入让,然后时钟运行,秒个位到10进位,秒十位到6进位,分个位到10进位,分十位到6进位,时个位到10进位,到4时检查时位是否为2,如果是就全部清零,如果不是就进位。另外分十位进位时整点报时标志位置1。并将3送入响铃延时寄存器。中断子程序流程图如下:
Y
3)显示子程序:此程序把显示缓冲区内容通过查表得到段码,再把段码送到P0口并依次送入六位数码管。实现动态扫描输出。
显示子程序流程图
4)延时子程序:用两个寄存器做两层嵌套循环实现延时,MOV指令执行时间为1T,NOP为1T,DJNZ指令为2T,因晶体振荡频率为fosc12MHz,则机器周期T=1us,该程序可以延时时间
t =(1+ (1+1+2)×200+2)×5=4015us
延时子程序流程图
5)启停子程序
该程序用来检查启停键的动作,如果闭合则对TR0取反,以此控制定时器的启停,进而启停时钟。
6)调时子程序
调时程序是在定时器停止的时候通过P3.1口的取位键和P3.2口的加一键进行调时。在定时器暂停期间,程序反复扫描P3.1与 P3.2。
这里用到了寄存器来存储所调的位地址。每按一次取位键,寄存器所存地址加一,即所调的文位左移一次。加一键闭合时对R1所存地址内的数据加一。然后调用比较子程序以确定每一位是否溢出。
7)调时比较子程序
此程序在调时时调用以确定所调位,再检测该位是否溢出,溢出则清0。
调时比较子程序流程图
8)整点报时程序
通过测试闹铃标志位来确定是否响铃,再对SPERKER电平循环取反产生方波。
同时将秒个位数字与响铃延迟时间比较,时间到了就清0标志位。
五、调试过程
软件调试的过程据功能的增加分为几步:
首先,根据原来的100进制显示程序的基础上编写成时分秒六位显示的主干程序。该程序将时分秒分成个位和十位分别计算,所以将60进制和24进制变成10进制、6进制和2进制。又因为如果时十位为2的话,不能大于3,所以在分十位向时个位进位时得判断时十位是否为2,在组员的帮助下经过不断试验和修改终于完成。过程比较顺利。
接下来是增加暂停的功能,先构想按下启停键时关闭中断,等待第二次按下时再开启。但总不得要领,却在整点报时取得突破。过程是这样的:先在时个位加一时将一个标志位置1,然后在主程序循环部分判断此标志位,以决定是否开启响铃。所以就增加了整点报时子程序,响铃时间在标志位置1时就送进R3中,就取得是响铃3秒的效果。可是编译时用户标志位F1通不过,就改成了B.1。现在就差启停功能就完成了。
启停的功能后经过同学提醒可以在按下启停键时对定时器控制位进行取反,原来如此,经过调试完全可行。到此可以说整个程序就算完成了。但是还有时间啊,不妨把调时的功能也加上。
我决定用两个键来调时,一个用来选择所要调的位,另外一个对位进行加1,前提是时钟暂停。这个功能很快实现了,但问题也来了。选位是从秒个位到时十位依次选取,但到时十位以后就回不到秒个位了,就是不会循环。所以就得对选的位进行检查,如果到了时十位再按取位键就重新赋给秒个位地址。这样就可以循环选位了。但在后来的测试中又有了新的问题,如果该位到了9,对一个位进行加1调整就会显示乱码。时分秒的十位都会调到9!
对于这个问题费看一些周折。起先构思再加一个减一的键,但不但没有解决这个乱码问题而且减到了0一下很可能也会出现乱码。所以就转而寻求程序解决。调时的时候让它也像正常运行的时候进位?没见过这样的。继而决定在进行加1调时的时候检测该位是否到10或6或3。所以就产生了所谓的调时比较子程序,就是在调时的时候将该位跟10或6或3比较(总感觉这个名字不太合适,但想不到更好的了)。程序很快写好了,调试的时候却总是出现这样的情况:所调的位超过了9或5或2就变成乱码。比原来进步的地方就是时分秒的十位不用超过9就变成乱码。这说明虽然还没成功,但还是有前途的。就继续调试。
在这里调试了很多遍,最后终于发现了程序的问题:在对位清0的时候指令写成了这样子
MOV 3﹡H,0
就是在该位超过9或5或2时送进了一个0,但这个0不是立即数。因为少个#号。由此可见一个小小的符号的巨大的作用。
到此程序才完满完成了。
感谢所以帮助我的人!
六、源程序
资源分配情况:30H至35H为显示缓冲区,寄存器R0为显示数字寄存,寄存器R1为调时取位寄存,R2为显示位码寄存,R3为报时时间寄存,R4,R5为延时寄存,R7为定时器循环寄存,B.1为报时标志位。
程序如下:ORG 0000H
LJMP MAIN
ORG 000BH
LJMP CTC0
ORG 0030H
MAIN:SETB EA ;开中断
SETB ET0 ;开定时器中断
MOV TMOD,#01H ;设置定时器工作模式
MOV TH0,#3CH ;设置定时器初值
MOV TL0,#0B0H
MOV 30H,#0 ;设置显示初值
MOV 31H,#0
MOV 32H,#0
MOV 33H,#0
MOV 34H,#0
MOV 35H,#0
MOV R7,#20
MOV R1,#30H ;设置取位寄存器初值
SETB TR0 ;启动定时器
LOOP:LCALL DISPLAY;调用显示子程序
JB P3.0,KEY1 ;启停键是否闭合
LCALL KEY ;调用启停子程序
KEY1:JB TR0,XIANG ;判断启动或停止
LCALL KEYDO ;调用调时子程序
XIANG:LCALL BAOSHI;调用报时子程序
LJMP LOOP
;定时器中断子程序
CTC0:PUSH ACC ;保护现场
PUSH PSW
DJNZ R7,BACK
MOV R7,#20
INC 30H ;秒个位加一
MOV A,30H
CJNE A,#0AH,BACK ;秒十位是否到10
MOV 30H,#0
INC 31H 秒十位加1
MOV A,31H
CJNE A,#06H,BACK ;判断是否到6
MOV 31H,#0
INC 32H ;分个位加1
MOV A,32H
CJNE A,#0AH,BACK ;分个位是否到10
MOV 32H,#0
INC 33H ;分十位加1
MOV A ,33H
CJNE A,#06H,BACK ;分十位是否到6
MOV 33H,#0
INC 34H ;时个位加1
SETB B.1 ;整点报时标志置1
MOV A,30H
ADD A,#03H ;定时闹铃3秒
MOV R3,A ;送入报时定时寄存器
MOV A,35H
CJNE A,#02H,NEXT ;时十位是否到2
MOV A,34H
CJNE A,#04H,BACK ;时个位是否到4
MOV 34H,#0
MOV 35H,#0
NEXT:MOV A,34H
CJNE A,#0AH,BACK ;时个位是否到10
INC 35H
BACK:MOV TH0,#3CH ;重装初值,校正时间
MOV TL0,#0B0H
POP PSW ;恢复现场
POP ACC
RETI
;显示子程序
DISPLAY:MOV R0,#30H;显示取位寄存器赋初值
MOV R2,#01H ;位码取初值
MOV DPTR,#TAB ;查表
L1:MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A ;显示输出
MOV A,R2
CPL A
MOV P2,A
LCALL DELAY
MOV P0,#00H
INC R0
MOV A,R2
JB ACC.5,L2
RL A ;位码左移
MOV R2,A
SJMP L1
L2:RET
;延时子程序
DELAY:MOV R4,#5
DEL2:MOV R5,#200
DEL1:NOP
DJNZ R5,DEL1
DJNZ R4,DEL2
RET
;查表
TAB:DB 3FH,06H,5BH,4FH
DB 66H,6DH,7DH,07H
DB 7FH,6FH,00H
;启停子程序
KEY:LCALL DISPLAY
JNB P3.0,KEY ;等待启停键释放
CPL TR0 ;启停定时器
RET
;调时子程序
KEYDO:JB P3.1,TIAO ;取位键是否闭合
ZHUAN:LCALL DISPLAY;循环显示
JNB P3.1,ZHUAN ;等待取位键释放
INC R1 ;位码左移
MOV A,R1
CJNE A,#36H,TIAO ;左移是否到头
MOV R1,#30H
TIAO:JB P3.2,RETURN ;加一键是否闭合
ZHU:LCALL DISPLAY ;循环显示
JNB P3.2,ZHU ;等待释放
INC @R1 ;加一调时
LCALL BIJIAO ;显示是否越位(过10或过6)
RETURN:RET
;调时比较子程序
BIJIAO:CJNE R1,#30H,MIAOSHI;是否为秒个位
CJNE @R1,#0AH,RETU ;是否到10
MOV 30H,#0
LJMP RETU
MIAOSHI:CJNE R1,#31H,FENGE;是否为秒十位
CJNE @R1,#06H,RETU ;是否到6
MOV 31H,#0
LJMP RETU
FENGE:CJNE R1,#32H,FENSHI;是否为分个位
CJNE @R1,#0AH,RETU ;是否到10
MOV 32H,#0
LJMP RETU
FENSHI:CJNE R1,#33H,SHIGE;是否为分十位
CJNE @R1,#06H,RETU ;是否到6
MOV 33H,#0
LJMP RETU
SHIGE:CJNE R1,#34H,SHISHI;是否为时个位
CJNE @R1,#0AH,SHISHI ;是否到10
MOV 34H,#0
LJMP RETU
SHISHI:CJNE @R1,#03H,RETU;是否到3
MOV 35H,#0
RETU:RET
;整点报时子程序
BAOSHI:JNB B.1,RE ;判断闹铃标志位
CPL P1.3 ;取反产生方波
MOV A,R3
CJNE A,30H,RE ;响铃是否到时
CLR B.1 ;清零报时标志位
RE:RET