1、目录第一章 方案论证 1 1.1 电子钟 11.2 电子钟主要功能模块11.2.1 数字时钟模块方案11.2.2 数码管显示模块方案11.3 总体设计21.3.1 计时方案21.3.2 控制方案21.3.3 具体设计及框图2第二章 硬件系统的设计32.1 硬件资源32.1.1 AT89S51芯片 3 2.1.2 74LS47芯片52.1.3 74LS138芯片 72.2 晶振电路 92.3 复位电路 92.4 数码管显示模块设计 102.5 按键模块 11第三章 软件系统设计 133.1 软件系统程序流程 133.1.1 主程序 133.1.2 系统程序流程图 143.2 系统仿真与实验测试
2、163.2.1 系统仿真 163.2.2 实验测试 16小结 17参考文献 18附录 源程序代码19第一章 方案论证1.1电子钟一般电子钟是一个将“时”,“分”,“秒”显示于人的视觉器官的计时装置。它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能和报时功能。因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”计数器、校时电路、报时电路和振荡器组成。主电路系统由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、电路组成。秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。将标准秒信号送入“秒计数器”,“
3、秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计时器,可实现对一天24小时的累计。译码显示电路将“时”、“分”、“秒”计数器的输出状态用七段显示译码器译码,通过七段显示器显示出来。校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整。 该电子时钟由AT89S51,六段数码管等构成,采用晶振电路作为驱动电路,由延时程序和循环程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一
4、天。而电路中唯一的一个控制键却拥有多种不同的功能,按下又松开,可以实现屏蔽数码管显示的功能,达到省电的目的;直接按下不松开,则可以通过按键实现分钟的累加,每按一次分钟加一;而连续两次按下按键不放松,则可实现小时的调节,同样每按一次小时加一。1.2 电子钟主要功能模块1.2.1 数字时钟模块方案本方案完全用软件实现数字时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。
5、该方案具有硬件电路简单的特点。但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。1.2.2 数码管显示模块方案 动态显示。所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口,降低了能耗。1.3 总体设计1.3.1 计时方案利用AT89S51单片机内部的定时/计数器进行中断时,配合软件
6、延时实现时、分、秒的计时。该方案节省硬件成本,且能使读者在定时/计数器的使用、中断及程序设计方面得到锻炼与提高,对单片机的指令系统能有更深入的了解,从而对学好单片机技术这门课程起到一定的作用。1.3.2 控制方案AT89S51的P0口和P2口外接由八个LED数码管(LED8LED1)构成的显示器,用P0口作LED的段码输出口,P2口作八个LED数码管的位控输出线,P1口外接四个按键A、B、C构成键盘电路。AT89S51 是一种低功耗,高性能的CMOS 8位微型计算机。它带有8K Flash 可编程和擦除的只读存储器(EPROM),该器件采用ATMEL的高密度非易失性存储器技术制造,与工业上标准
7、的80C51和80C52的指令系统及引脚兼容,片内Flash 集成在一个芯片上,可用与解决复杂的问题,且成本较低。简易电子钟的功能不复杂,采用其现有的I/O便可完成,所以本设计中采用此的设计方案。1.3.3 具体设计分析及框图利用单片机(AT89S51)制作简易电子时钟,由六个LED数码管分别显示小时十位、小时个位、分钟十位、分钟个位、秒钟十位、秒钟个位。结合本设计实验来说,要求显示的时间为时,分,秒,并且都用两位数码管来实现显示。因此,具体设计程序时,应尽可能多用一些子程序与数据暂寄存器单元。本程序设计中,在主程序之外,可以设置时间值处理子程序,时间值显示前的处理子程序,按键情况扫描子程序,
8、1S定时中断子程序以及5ms延时消除按键抖动子程序等多个小型的子程序。另外,可以设置一些数据单元作为数据寄存器。用28H,2AH,2BH和2CH地址单元分别作为显示位数的扫描指针值寄存器,时寄存器,分寄存器和秒寄存器,再用20H地址单片 元作为显示寄存器。 单片 机数码管显示译码器晶振时间调整按图1.1系统框图第二章 硬件系统的设计2.1 硬件资源2.1.1 AT89S51芯片AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易
9、失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。AT89S51具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。 此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CP
10、U暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。选用的AT89S51与同系列的AT89C51在功能上有明显的提高,最突出是的可以实现在线的编程。用于实现系统的总的控制。其主要功能列举如下:1、为一般控制应用的 8 位单片机2、晶片内部具有时钟振荡器(传统最高工作频率可至 33MHz)3、内部程式存储器(ROM)为 4KB4、内部数据存储器(RAM)为 128B5、外部程序存储器可扩充至 64KB6、外部数据存储器可扩充至
11、 64KB7、32 条双向输入输出线,且每条均可以单独做 I/O 的控制8、5 个中断向量源9、2 组独立的 16 位定时器10、1 个全双工串行通信端口11、8751 及 8752 单芯片具有数据保密的功能12、单芯片提供位逻辑运算指令AT89S51各引脚功能介绍:VCC:ATAT89S51 电源正端输入,接+5V。VSS:电源地端。XTAL1:单芯片系统时钟的反向放大器输入端。XTAL2:系统时钟的反向放大器输出端,一般在设计上只要在 XTAL1 和 XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两个引脚与地之间加入一个 20PF 的小电容,可以使系统更稳定,避免噪声干扰而
12、死机。RESET:AT89S51的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。EA/Vpp:EA为英文External Access的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。如果是使用 8751 内部程序空间时,此引脚要接成高电平。此外,
13、在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。图2.1 AT89S51引脚图ALE/PROG:ALE是英文Address Latch Enable的缩写,表示地址锁存器启用信号。ATAT89S51可以利用这支引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0A7)锁进锁存器中,因为ATAT89S51是以多工的方式送出地址及数据。平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。PSEN:此为Program
14、Store Enable的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。ATAT89S51可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K的定址范围。PORT0(P0.0P0.7):端口0是一个8位宽的开路电极(Open Drain)双向输出入端口,共有8个位,P0.0表示位0,P0.1表示位1,依此类推。其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当作I/O用时可以推动8个LS的T
15、TL负载。如果当EA引脚为低电平时(即取用外部程序代码或数据存储器),P0就以多工方式提供地址总线(A0A7)及数据总线(D0D7)。设计者必须外加一个锁存器将端口0送出的地址锁住成为A0A7,再配合端口2所送出的A8A15合成一组完整的16位地址总线,而定位地址到64K的外部存储器空间。PORT2(P2.0P2.7):端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。P2除了当作一般I/O端口使用外,若是在ATAT89S51扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8A15,这个时候P
16、2便不能当作I/O来使用了。PORT1(P1.0P1.7):端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LS TTL负载,同样地,若将端口1的输出设为高电平,便是由此端口来输入数据。如果是使用8052或是8032的话,P1.0又当作定时器2的外部脉冲输入脚,而P1.1可以有T2EX功能,可以做外部中断输入的触发引脚。PORT3(P3.0P3.7):端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。其引脚分配如下:P3.0:RX
17、D,串行通信输入。P3.1:TXD,串行通信输出。P3.2:INT0,外部中断0输入。P3.3:INT1,外部中断1输入。P3.4:T0,计时计数器0输入。P3.5:T1,计时计数器1输入。P3.6:WR:外部数据存储器的写入信号。P3.7:RD,外部数据存储器的读取信号。2.1.2 74LS47芯片74LS47是BCD-7段数码管译码器/驱动器, 74LS47的功能用于将BCD码转化成数码块中的数字,通过它解码, 可以直接把数字转换为数码管的显示数字, 从而简化了程序。74LS47译码器原理:译码为编码的逆过程。它将编码时赋予代码的含义“翻译”过来。实现译码的逻辑电路成为译码器。译码器的输出
18、与输入代码有唯一的对应关系。74LS47是输出低电平有效的七段字形译码器,它在这里与数码管配合使用。下表列出了74LS47的真值表,表示出了它与数码管之间的关系。如表2.1所示。表2.1 74LS47的真值表LT RBI A3 A2 A1 A0 BI RBO a b c d e f g1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 X 0 0 0 1 1 1 0 0 1 1 1 1 1 1 X 0 0 1 0 1 0 0 1 0 0 1 0 2 1 X 0 0 1 1 1 0 0 0 0 1 1 0 3 1 X 0 1 0 0 1 1 0 0 1 1 0 0 4 1 X 0 1
19、 0 1 1 0 1 0 0 1 0 0 5 1 X 0 1 1 0 1 1 1 0 0 0 0 0 6 1 X 0 1 1 1 1 0 0 0 1 1 1 1 7 1 X 1 0 0 0 1 0 0 0 0 0 0 0 8 1 X 1 0 0 1 1 0 0 0 1 1 0 0 9 X X X X X X 0 1 1 1 1 1 1 1 熄灭 1 0 0 0 0 0 0 1 1 1 1 1 1 1 熄灭0 X X X X X 1 0 0 0 0 0 0 0 8图2.2 74LS47引脚图2.1.3 74LS138芯片74HC138:74LS138 为3 线8 线译码器,共有 54/74S13
20、8和 54/74LS138 两种线路结构型式。74LS138工作原理如下: 当其中一个选通端(G1)为高电平,另两个选通端(/(G2A)和/(G2B))为低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平译出。 图2.3 74LS138引脚图74LS138的作用:利用 G1、/(G2A)和/(G2B)可级联扩展成 24 线译码器;若外接一个反相器还可级联扩展成 32 线译码器。若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器无论从逻辑图还是功能表我们都可以看到74LS138的八个输出引脚,任何时刻要么全为高电平1芯片处于不工作状态,要么只有一个为低电平0
21、,其余7个输 出引脚全为高电平1。如果出现两个输出引脚同时为0的情况,说明该芯片已经损坏。71LS138有三个附加的控制端、和。当、时,输出为高电平(S1),译码器处于工作状态。否则,译码器被禁止,所有的输出端被封锁在高电平,如表3.3.5所示。这三个控制端也叫做“片选”输入端,利用片选的作用可以将多篇连接起来以扩展译码器的功能。 图2.4 用与非门组成的3线-8线译码器74LS138带控制输入端的译码器又是一个完整的数据分配器。在下图电路中如果把作为“数据”输入端(同时),而将作为“地址”输入端,那么从送来的数据只能通过所指定的一根输出线送出去。这就不难理解为什么把叫做地址输入了。例如当10
22、1时,门的输入端除了接至输出端的一个以外全是高电平,因此的数据以反码的形式从输出,而不会被送到其他任何一个输出端上。表2.2 3线-8线译码器74LS138的功能表2.2 晶振电路下图所示为时钟电路原理图,在AT89S51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机时钟脉冲信号。图2.5 晶振电路图2.3 复位电路单片机复位条件是:必须使RST/VPD 或RST引(9)加上持续两个机器周期(即24个
23、振荡周期)的高电平。例如,若时钟频率为12 MHz,每机器周期为1s,则只需2s以上时间的高电平,在RST引脚出现高电平后的第二个机器周期执行复位。单片机常见的复位如图所示。电路为上电复位电路,它是利用电容充电来实现的。在接电瞬间,RESET端的电位与VCC相同,随着充电电流的减少,RESET的电位逐渐下降。只要保证RESET为高电平的时间大于两个机器周期,便能正常复位。该电路除具有上电复位功能外,若要复位,只需按图中的RESET键,此时电源VCC经电阻R1、R2分压,在RESET端产生一个复位高电平。图2.6 复位电路图2.4 数码显示模块设计数码管是一种把多个LED显示段集成在一起的显示设
24、备。有两种类型,一种是共阳型,一种是共阴型。图2.7数码显像管共阳型就是把多个LED显示段的阳极接在一起,又称为公共端。共阴型就是把多个LED显示段的阴极接在一起,即为公共商。阳极即为二极管的正极,又称为正极,阴极即为二极管的负极,又称为负极。通常的数码管又分为8段,即8个LED显示段,这是为工程应用方便如设计的,分别为A、B、C、D、E、F、G、DP,其中DP 是小数点位段。而多位数码管,除某一位的公共端会连接在一起,不同位的数码管的相同端也会连接在一起。即,所有的A段都会连在一起,其它的段也是如此,这是实际最常用的用法。数码管显示方法可分为静态显示和动态显示两种。静态显示就是数码管的8段输
25、入及其公共端电平一直有效。动态显示的原理是,各个数码管的相同段连接在一起,共同占用8 位段引管线;每位数码管的阳极连在一起组成公共端。利用人眼的视觉暂留性,依次给出各个数码管公共端加有效信号,在此同时给出该数码管加有效的数据信号,当全段扫描速度大于视觉暂留速度时,显示就会清晰显示出来。图2.8共阴数码管系统采用动态显示方式,用P0口来控制LED数码管的段控线,而用P2口来控制其位控线。动态显示通常都是采用动态扫描的方法进行显示,即循环点亮每一个数码管,这样虽然在任何时刻都只有一位数码管被点亮,但由于人眼存在视觉残留效应,只要每位数码管间隔时间足够短,就可以给人以同时显示的感觉。图2.9 数码管
26、的引脚图图2.5 按键模块时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器、时个位和时十位计数器及星期计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,时个位和时十位计数器为24进制计数器。图2.10 按键模块电路原理图图2.11 系统总电路原理图第三章 软件系统设计3.1 软件系统程序流程3.1.1 主程序先对显示单元和定时器/计数器初始化,然后重复调用数码管显示模块和按键处理模块,当有按键按下时,则转入相应的功能程序。这次的电子钟用到很多子程序,主程序是先开始的,然后启动定时器在进行按键检测,待检测完后,就可以显示时间。根据主程序的操作流程,可以确定主
27、程序的控制流程如下图:开始初始化定时器设置显示初始值设置中断允许调用显示子程序按键否?Y进入功能子程序图3.1 主程序流程图图3.1.2 系统程序流程图按键处理是先检测秒按键是否按下,秒按键如果按下,秒就加1;如果没有按下,就检测分按键是否按下,分按键如果按下,分就加1;如果没有按下,就检测时按键是否按下,时按键如果按下,时就加1;如果没有按下,就把时间显示出来。定时器中断时是先检测1秒是否到,1秒如果到,秒单元就加1;如果没到,就检测1分钟是否到,1分钟如果到,分就加1;如果没到,就检测1小时是否到,1小时如果到,时单元就加1,如果没到,就显示时间。基本的程序流程应该是:在主程序中检测各个时
28、间按钮是否有动作。若有,就储存并修改相关的的时间寄存器的值。若没有,就继续检测。在计时子程序中将各时间寄存器的值逐个加1,每加一次就要检查是否已超过显示的上限值,这样在后面就便于处理,在扫描显示子程序中,将扫描位数指针与20H相加,从而得到相应的显示数据;然后按照显示的位数加显示数就的格式,将数据从P1口输出到数码管上去显示,当然还有定时中断子程序,在这里,它实现计时1S的时间延时。 开始分按键了?定时器T0初始化分寄存器加1设置显示初始值为12:00:00秒寄存器=60?设置定时4ms初值N设置中断允许使分寄存器清0设中断250次分按键松开?N启动T0中断时按键了?秒按键了?N时寄存器值加1
29、秒寄存器加1时寄存器值=20秒寄存器加1NY使寄存器清0秒寄存器加1秒按松开了?秒按键了?NYN图3.3 系统程序流程图3.2 系统仿真与实验测试3.2.1 系统仿真运用proteus软件进行仿真现在proteus软件中建立一个新的文件,再根据自己的要求选择所需的器件,把器件进行适当的排位后进行连接,连接后运行软件进行仿真。3.2.2 实验测试电子时钟主要的设计要求是能够实现时钟的一般功能,以及包括时间的调整功能,这个基于单片机的电子时钟基本上实现了上述功能,能够通过时间调整电路对时间进行调整以及复位。下述为仿真图:图3.4 12:00:00时刻的仿真图小结本设计重点研究实现了基于单片机与芯片
30、这种模式的时钟,从原理上对单片机和芯片有了深一步的认识。由单片机AT89S51芯片和LED数码管为核心,辅以必要的电路,构成了一个单片机电子时钟。在基于单片机的数字时钟电路设计过程中,我学到了很多重要的东西,其中最重要的是如何将实践和理论相联系,怎样将我所学到的知识运用到我以后的工作中去。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。设计过程,好比是我们人类成长的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,不能灵活运用。大学的课堂的学习只是在给我们灌
31、输专业知识,而我们应把所学的用到我们现实的生活中去,此次的时钟设计给我奠定了一个实践基础。这次课程设计为使我得到了很大收获:不仅学到了许多了关于单片机方面的知识,而且提高了实验技能;也使我的动手能力和电路设计能力得到了极大的提高。在此次设计中,我的难点是程序的调试,由于以前仅仅学了一点汇编语言的皮毛,所以编一个完整的程序很是吃力!但是经过一些资料的学习,解决了一些问题,对软件的使用还须更进一步的熟练掌握。由于时间比较仓促,我只能做到达到现在这样的水平;其他的希望以后的工作中,再做深刻地研究。参考文献【1】谢永宁. 单片微型计算机及接口技术.中国铁道部出版社,2012.【2】安徽工程大学微型计算
32、机及接口技术实验指导书,2012.【3】殷代红. 微型计算机原理及应用实验.化学工业出版社,2010.【4】刘乐善. 微型计算机接口技术及应用.华中科技大学出版社,1998.【5】李敬兆. 汇编语言程序设计.中国科学技术大学出版社,2003.【6】刘乐喜. 微机计算机接口技术及应用M.华中科技大学出版社,2005.【7】谢自美,等 . 电子线路设计、实验、测试.M.华中科技大学出版社,2010.【8】石东海. 单片机数据通信技术从入门到精通.M.西安电子科技大学出版社,2000.附录:源程序代码:ORG 00H;主程序起始地址JMP START;主程序STARTORG 0BH;定时器T0中断起
33、始地址JMP TIM0;定时器T0中断子程序TIM0START: MOV SP;#70H;设置堆栈指针MOV 28H,#00;设置显示位数扫描指针初值为0MOV 2AH,#12H;设置时钟显示寄存器初值为12HMOV 2BH,#00;设置分钟显示寄存器初值为00HMOV 2CH,#00;设置秒钟显示寄存器初值为00HMOV TMOD,#01H;设置定时器T0工作在方式1MOV TH0,#0F0H;定时4ms的初值,即0F060HMOV TL0,#60H;初值的低位MOV IE,#82H;定时器T0中断允许MOV R4,#250;保证后面实现中断250次,即1s的延时SETB TR0;启动定时器
34、T0LOOP: JB P0.0,N2;若秒没有按键,就转去下一步检查分CALL DELAY;延时5ms消除抖动MOV A,2CH;将秒寄存器的值载入累加器A ADD A,#01H;A的内容加1DA A;十进制调整MOV 2CH,A;A 的值存入秒寄存器CJNE A,#60H,N1;看是否已经是60秒,若不是就继续检查MOV 2CH,#00;已经是60秒,就清空秒寄存器的值N1: JNB P0.0,$;秒按键还没有放开就循环等待CALL DELAY;延时5ms,消除抖动N2: JB P0.1,N4;若分没有按键,就转去下一步检查时钟CALL DELAY;延时5ms,消除抖动MOV A,2BH;将
35、分寄存器的值载入累加器AADD A,#01H;A的内容加1DA A;十进制调整MOV 2BH,A;A的值存入分寄存器CJNE A,#60H,N3;看是否已经是60分MOV 2BH,#00;已经是60分,就清空秒寄存器的值N3: JNB P0.1,$;分按键还没有放开就循环等待CALL DELAY;延时5ms,消除抖动N4: JB P0.2,LOOP;若时没有按键,就转回去继续检查看是否秒有按键CALL DELAY;延时5ms,消除抖动MOV A,2AH;将时寄存器的值载入累加器AADD A,#01H;A的内容加1DA A;十进制调整MOV 2AH,A;A的值存入时寄存器CJNE A,#24H,
36、N5;看是否已经是24时,若不是就继续检查MOV 2AH,#00;已经是24时,就清空寄存器的值N5: JNB P0.2,$;时钟按键还没有放开就循环等待CALL DELAY;延时5ms,消除抖动JMP LOOP;返回重新检查看是否有按键;*定时器T0中断子程序*TIM0: MOV TH0,#0F0H;定时初值重设MOV TL0,#60HPUSH ACC;将累加器A的值暂存于堆栈PUSH PSW;将PSW的值暂存于堆栈DJNZ R4,X2;计时中断不满1s就退出继续中断MOV R4,#250;计时1sCALL CLOCK;调用计时子程序CLOCKCALL DISP;调用显示子程序DISPX2:
37、 CALL SCAN;调用扫描子程序SCADPOP PSW;到堆栈取回PSW的值POP ACC;到堆栈取回累加器ACC的值RETI;返回主程序;*扫描子程序*SCAN: MOV R0,#28HINC R0;显示位数扫描值加1CJNE R0,#6,X3;扫描位数不为6就准备控制输出MOV R0,#0;扫描位数为6,就另其值为0X3:MOV A,R0;扫描位数载入AADD A,#20H;A加上20H(显示寄存器地址)=各时间显示区地址MOV R1,A;各时间显示区地址存入AMOV A,R0;扫描位数存入ASWAP A;将A的高低4位交换(其高4位为扫描 ;的位数,低4位为显示数据值)ORL A,R
38、1;将扫描值与显示数据组合MOV P1,A;显示输出RET;*计时子程序*CLOCK: MOV A,2CH;秒寄存器值载入AADD A,#1;加1秒DA A;十进制调整MOV 2CH,A;A的值存入秒寄存器CJNE A,#60H,X4;A不等于60秒,就跳出程序去显示MOV 2CH,#00;已经是60秒,就清0MOV A,2BH;分寄存器值载入AADD A,#1;加1分DA A;十进制调整MOV 2BH,A;A的值存入分寄存器 CJNE A,#60H,X4;A不等于60分,就跳出程序去显示MOV 2BH,#00;已经是60分就清0MOV A,2AH;时寄存器值载入AADD A,#1;加1小时D
39、A A;十进制调整MOV 2AH,A;A的值存入是寄存器CJNE A,#24H,X4;A不等于24时,就跳出程序去显示MOV 24H,#00;已经是24时,就清0X4: RET;*显示子程序*DISP: MOV R1,20H;20H为显示寄存器单元MOV A,2CH;将秒寄存器的内容存入AMOV B,#10H;设B累加器的值为10HDIV AB;A/B,商存入A(十位数),余数存入(个位数)MOV R1,B;将显示的个位数存入20H显示寄存器单元INC R1MOV R1,;A将显示的十位数存入21H显示寄存器单元INC R1MOV A,2BH;将分寄存器的内容存入AMOV B,#10H;设B累
40、加器的值为10HDIV AB;A/B,商存入A(十位数),余数存入(个位数)MOV R1,B;将显示的个位数存入22H显示寄存器单元INC R1MOV R1,A;将显示的十位数存入23H显示寄存器单元INC R1MOV A,2AH;将时寄存器的内容存入AMOV B,#10H;设B累加器的值为10HDIV AB;A/B,商存入A(十位数),余数存入(个位数)MOV R1,B;将显示的个位数存入24H显示寄存器单元INC R1MOV R1,A;将显示的十位数存入25H显示寄存器单元RET;*延时5ms消除抖动*DELAY: MOV R6,#60D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETEND - 26 -