1、 单片机原理课程设计秒表时钟计时器的设计专 业:电气工程及其自动化方 向:电力系统姓 名:韦敏学 号:201120305415指导老师:汪厚新1目 录第 1 章 方案论证 .1第 2 章 硬件设计 .32.1 秒表/时钟计时器的总体设计 32.2 AT89C52 单片机最小系统 42.3 74LS244 芯片说明 .62.4 LED 显示器的显示方法及其与单片机的接口 62.5 电源电路的设计 .8第 3 章 软件设计 .93.1 主程序 .93.2 显示子程序 .93.3 定时器 T0 中断服务程序 .103.4 T1 中断服务程序 103.5 调时功能程序 .113.6 整点响程序 .11
2、3.7 时钟/秒表功能程序 113.8 程序清单 11第 4 章 设计总结 .212第 1 章 方案论证现今的计时器通常只能通过启/停按键实现断点计时的功能,即通过启 /停按键来记录一段时间。这种计时器查看的时间只能为计时结束时刻。实际的应用中往往需要在不影响正常计时的基础上,能查看记录过程中的某些点的时间。本课设即针对此问题,设计了一种能通过按键方式查看记录过程中任一时刻值的计时器。这种计时器在查看中间值时不会影响整个记录过程,并且能把相应数据送入存储模块及显示模块,以便查看。本系统采用 AT89C52 单片机作控制器,LED 数码管,实现显示时、分、秒,以 24 小时计时方式。为了实现 L
3、ED 显示器的数字显示,可以采用静态显示法和动态显示法。由于静态显示法需要数据锁存器等硬件,结构较为复杂,考虑时钟显示只有六位,且系统没有其他复杂的处理任务,所以采用动态扫描法实现 LED 的显示。单片机采用 AT89C52系列,有足够的空余硬件资源实现其它的扩充功能。秒表/时钟计时器的总体设计框图如下图所示。六位 LED 显示器列驱动AT89C52P0单片机控制器P2图 1.1 系统总体设计框图系统主要实现如下功能:1时钟功能对于时钟功能,需要在数码管上显示小时、分钟和秒钟,因此,可以在内部存储空间分别定义它们的显示缓存空间,来存放小时、分钟和秒钟的 BCD 码,各 2 个字节。由于时钟是不
4、能停止的,因此需要采用内部定时器自动计时,并使用定时器中断处理3程序来定时进行时间数值的刷新。52 单片机的 2 个定时器都具有 16 位定时器的工作模式。当晶振为 12MHz 时,16 位定时器的最大定时值为 65.536mS;要达到 1 秒钟,可以采用两种方法:采用一个定时器定时与软件计数相结合的方法;或者采用两个定时器级联的方法。由于秒表在计时功能时也需要用到 1 个定时器,因此,我们采用第一个方法,只使用 1 个定时器,例如使用 T0。为了达到较为准确的计时,使 T0 的溢出时间为50ms,使用一个字节作为软件计数器 ST,计数值为 20。定时器的中断处理程序对 ST 进行减 1 操作
5、,当 ST 为 0 时,1 秒到达,此时更新存放小时、分钟、秒钟的显示缓存区。2计时功能当秒表用作计时功能时,也需要一个定时器进行 10MS 的定时,在本例中使用单片机的 TIMER1。在 TIMER1 的中断处理程序中对 SS 和 ss 的缓存空间进行更新,与上面类似。3功能按键再看按键的处理。这 3 个键可以采用中断的方法,也可以采用查询的方法来识别。对于 A、B 键,主要功能在于功能切换和数值复位,对于时间的要求不是很严格,而 C 键主要用于时间的锁定,需要比较准确的控制。因此可以考虑,对 A、B 键采用查询的方式,而对于 C 键采用外部中断。4中断嵌套和控制现在在我的方案中有 3 个中
6、断,T0、T1 中断和外部中断 INT0。这 3 个中断的特点是:T0 的工作是连续的,可以在误差范围内可以被打断但不可以停止;T1 的工作同样可以在误差范围内被打断,但可以被 INT0 停止;INT0 是用来启动或停止 T1 的。4第 2 章 硬件设计2.1 秒表/时钟计时器的总体设计秒表/时钟计时器的硬件电路设计如图 2.1 所示。123456ABCD654321D C B ATitleNumberRevisionSize B Date:11-Jul-2007Shet of File:D:OTHERDESIGN EXPLORER 9SEEXAMPLESMyDesign.dbDrawn B:
7、EA/VP31XTAL119XTAL218RESET/VPD9 RD/P3.717WR/P3.616INT0/P3.212INT1/P3.313T0/P3.414T1/P3.515P1.01 P1.12 P1.23 P1.34 P1.45 P1.56 P1.67 P1.78P0.039P0.138P0.237P0.336P0.435P0.534P0.633P0.732P2.021P2.122P2.223P2.324P2.425P2.526P2.627P2.728PSEN29ALE/PROG30TXD/P3.111RXD/P3.010VC40VS20U1 AT89C521 2374HC08SW4
8、VCGND3 PFI4PFO5WDI6RESET7WDO8MR1 VC2U2 MAX813LR17 51K24MHZY233FC6 33FC7+5Va bf cg deDPY1 2 3 4 5 6 7a b c d e f g 8dpdpDS? DPY_7-SEG_DPa bf cg deDPY1 2 3 4 5 6 7a b c d e f g 8dpdpDS? DPY_7-SEG_DPa bf cg deDPY1 2 3 4 5 6 7a b c d e f g 8dpdpDS? DPY_7-SEG_DPa bf cg deDPY1 2 3 4 5 6 7a b c d e f g 8dp
9、dpDS? DPY_7-SEG_DPa bf cg deDPY1 2 3 4 5 6 7a b c d e f g 8dpdpDS? DPY_7-SEG_DPa bf cg deDPY1 2 3 4 5 6 7a b c d e f g 8dpdpDS? DPY_7-SEG_DPQ? NPNQ? NPNQ? NPNQ? NPNQ? NPNQ? NPNR? RES2R? RES2R? RES2R? RES2R? RES2R? RES2R? RES2R? RES2R? RES2ABC1E12E231A141A251A361A472A182A292A3102A4111Y1121Y2131Y3141Y
10、4152Y1162Y2172Y3182Y474LS244R4 R5 R6 R7 R8 R9 R10 R1+5V+5V图 2.1 总体硬件设计图5采用 AT89C52 单片机,数字显示采用共阳六段 LED 显示器,P0 口输出段码数据,P2.0-P2.5 口作为列扫描输出,P1.0、P1.1 、P1.3 口接三个开关按钮,用以实现调时及秒表时钟功能切换设置。为了给共阳 LED 数码管提供驱动电压,采用三极管作电源驱动输出。采用 12MHZ 晶振,有利于提高系统计时的精确性。对于 A、B 键,主要功能在于功能切换和数值复位,对于时间的要求不是很严格,而 C 键主要用于时间的锁定,需要比较准确的控制
11、。因此可以考虑,对 A、B 键采用查询的方式,而对于 C 键采用外部中断。2.2 AT89C52 单片机最小系统最小系统的核心是 AT89C52 单片机,其内部带有 8KB 的 FLASH ROM,256B 片内 RAM,基本上能满足最小系统的设计要求。如接上时钟电路、复位电路即可加电工作。如图 2.2 所示。1 2 3 4 5 6ABCD654321DCBATitleNumber RevisionSizeCDate: 8-Jul-2007 Sheet of File: C:Documents and Settingsnbuser哥哥哥哥.DDBDrawn By:EA/VPP 31XTAL11
12、9 XTAL218RESET/VPD9RD/P3.717 WR/P3.616INT0/P3.212 INT1/P3.313T0/P3.414 T1/P3.515P1.01 P1.12P1.23 P1.34P1.45 P1.56P1.67 P1.78P0.0 39P0.1 38P0.2 37P0.3 36P0.4 35P0.5 34P0.6 33P0.7 32P2.0 21P2.122P2.2 23P2.3 24P2.425P2.5 26P2.6 27P2.728PSEN 29ALE/PROG 30TXD/P3.111 RXD/P3.010VCC 40VSS20U1AT89C5212 374HC
13、08SW4VCCGND3 PFI4 PFO 5WDI 6RESET7WDO 8MR1 VCC2U2MAX813LR1751K24MHZY233FC633FC7P26P20GNDALEP00P01P02P03P04P05P06P07P21P22P23P24P25图 2.2 单片机最小系统图AT89C52 单片机各引脚的功能和应用介绍如下:1. 输入/输出引脚(1) P0 口(3932 脚):P0.0 P0.7 统称为 P0 口。在不接片外存储器与不扩展 I/O口时,可作为准双向输入/输出口。在接有片外存储器或扩展 I/O 口时,P0 口分时复用为低 8 位地址总线和双向数据总线。(2) P1 口
14、(18 脚):P1.0 P1.7 统称为 P1 口,可作为准双向 I/O 口使用。对于52 子系列,P1.0 与 P1.1 还有第二功能: P1.0 可用作定时器/ 计数器 2 的计数脉冲输入端6T2,P1.1 可用作定时器/计数器 2 的外部控制端 T2EX。(3) P2 口( 2128 脚):P2.0 P2.7 统称为 P2 口,一般可作为准双向 I/O 口使用;在接有片外存储器或扩展 I/O 口且寻址范围超过 256 字节时,P2 口用作高 8 位地址总线引脚功能如下:P3.0 RXD 串行口输入P3.1 TXD 串行口输出端P3.2 INT0 外部中断 0 请求输入端,低电平有效P3.
15、3 INT1 外部中断 1 请求输入端,低电平有效P3.4 T0 定时器/计数器 0 计数脉冲输入端P3.5 T1 定时器/计数器 1 计数脉冲输入端P3.6 WR 外部数据存储器写选通信号输入端,低电平有效P3.7 RD 外部数据存储器读选通信号输入端,低电平有效(4) P3 口(1017 脚):P3.0 P3.7 统称为 P3 口。除作为准双向 I/O 口使用外,还可以将每一位用于第二功能,而且 P3 口的每一条引脚均可以独立定义为第一功能的输入输出或第三功能。2. 控制线(1) ALE/PROG(30 脚):地址锁存有效信号输入端。ALE 在每个机器周期内输出两个脉冲。在访问片外程序存储
16、器期间,下降沿用于控制锁存 P0 输出的低 8 位地址;在不访问片外程序存储器期间,可作为对外输出的时钟脉冲或用于定时目的。但要注意,在访问片外数据存储器期间,ALE 脉冲会跳空一个,此时作为时钟输出就不妥了。对于片内含有 EPROM 的机型,在编程期间,该引脚用作编程脉冲 PROG 的输入端。(2) PSEN(29 脚):片外程序存储器读选通信号输出端,低电平有效。当从外部程序存储器读取指令或常数期间,每个机器周期该信号两次有效,以通过数据总线 P0 口读回指令或常数。在访问片外数据存储器期间,PSEN 信号将不再出现。(3) RST/VPD 引脚(9 脚):RST 即为 RESET,VPD
17、 为备用电源。该引脚为单片机的上电复位或掉电保护端。当单片机振荡器工作时,该引脚上出现持续两个机器周期的高电平,就可实现复位操作,使单片机回复到初始状态。上电时,考虑到振荡器有一定的起振时间,该引脚上高电平必须持续 10ms 以上才能保证有效复位。当 Vcc 发生故障,降低到低电平规定值或掉电时,该引脚可接上备用电源 VPD(+5V)为内部 RAM 供电,以保证 RAM 中的数据不丢失。7(4)EA/Vpp(31 脚):EA 为片外程序存储器选用端。该引脚有效(低电平)时,只选用片外程序存储器,否则单片机上电或复位后选用片内程序存储器。对于片内含有 EPROM 的机型,在编程期间,此引脚用作
18、21V 编程电源 Vpp 的输入端。2.3 74LS244 芯片说明开关量输入的扩展经常使用的芯片是 74LS244/74LS245/74LS240 等;这些芯片的特点是三态门,可以把多个芯片的输出,并联在一起而不会互相影响;通过 138、139、153等译码选通芯片,把 RD/WR/地址的高位信号(高 3 位或者高 4 位,看单片机系统中的芯片的数量)接到译码芯片,把译码芯片的输出接到锁存器的锁存输入,或者缓冲器的选通输入。1E12E231 A141 A251 A361 A472 A182 A292 A31 02 A41 1 1 Y11 2 1 Y21 3 1 Y31 4 1 Y41 5 2
19、 Y11 6 2 Y21 7 2 Y31 8 2 Y474LS244图 2.3 74LS244 引脚244 内部包含 8 个单向三态门,分为两组,同时作为总线芯片的另外一个特点是驱动能力加强了,可以提供比较大的输出电流,所以经常用来直接驱动光耦、发光管等,也可以用于驱动微型的继电器。2.4 LED 显示器的显示方法及其与单片机的接口在单片机系统中,通常用 LED 数码显示器来显示各种数字或符号。由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。LED 显示器又称数码管 ,八段 LED 显示器由 8 个发光二极管组成。其中 7 个发光二极管构成字型“8”的各个笔画段 ,另一
20、个小数点为 dp 发光二极管。 LED 显示器有两种不同的形式:一种是发光二极管的阳极都连在一起的,称之为共阳极 LED 显示器;另一种是发光二极管的阴极都连在一起的,称之为共阴极 LED 显示器。如图 2.4 所示。共阴和共阳结构的 LED 显示器各笔划段名和安排位置是相同的。当二极管导通时,8相应的笔划段发亮,由发亮的笔划段组合而显示各种字符。8 个笔划段 hgfedcba 对应于一个字节(8 位)的 D7 D6 D5 D4 D3 D2 D1 D0,于是用 8 位二进制码就可以表示欲显示字符的字型代码。例如,对于共阴 LED 显示器,当公共阴极接地(为零电平) ,而阳极hgfedcba 各
21、段为 0111011 时,显示器显示“P“ 字符,即对于共阴极 LED 显示器, “P”字符的字形码是 73H。如果是共阳 LED 显示器,公共阳极接高电平,显示“P”字符的字形代码应为 10001100(8CH) 。图 2.4 LED 显示器及工作原理LED 显示方式有动态显示和静态显示两种方式。本系统采用动态扫描显示接口电路,动态显示接口电路是把所有显示器的 8 个笔划段 a-h 同名端连在一起,而每一个显示器的公共极 COM 各自独立地受 I/O 线控制。CPU 向字段输出口送出字型码时,所有显示器接收到相同的字型码,但究竟是哪个显示器亮,则取决于 COM 端。也就是说我们可以采用分时的
22、方法,轮流控制各个显示器的 COM 端,使各个显示器轮流点亮。在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约 1ms) ,但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。数码管采用共阳极接法,将各位数码管的段选线并联在一起,由一片 74HC595 八位输出口控制,图中增加了一个驱动器,用以提高信号驱动能力。共阳极点 COM 接到另一片 74HC595 八位输出口。单片机通过口线把要显示的数据串行传给 74HC595,由74HC595 把串行的数据转换成并行数据, 分别控制数码管的
23、段选线 a-h 同名端和位选线COM 端。92.5 电源电路的设计在系统中,电源的设计是相当重要的一部分。因为在设计过程中我们需要考虑功率、输出电压及抗干扰等因素的影响,我们选定的电源应满足整个系统顺利运行的要求。本系统采用+5V 直流稳压电源做为工作电源。 +5V 直流稳压的工作电路 ,传统方式采用分立元件构成,目前均采用集成三端稳压器 7805 构成。集成三端稳压器因其稳压精度高、工作稳定可靠、外围电路简单、容易设计和制作、体积小、重量轻、成本低、维修简单等优点,所以在各种电源电路中得到了普遍的应用。7805 集成三端稳压器的典型应用电路如图所示,这是一个输出+5V 直流电压的稳压电路。I
24、C 采用集成三端稳压器 7805,C2、C4 分别为输入端和输出端滤波电容,RL 为负载电阻。PBU605 是由 4 个二极管构成的整流电路,用来稳定输入的 12V 电压。1234VD2PBU6051234J212V VD4TVS100+C33330uC2104+C311000uC4104IN1GND2OUT3U2 7805R2 1KVD8PowerLED-TVD62N4148VCC1GNDT图 2.5 电源电路变压器 TF 将交流电网 220V 的电压 V1 变为所需要的交流电压 V2,然后通过全波整流将交流电压 V2 变成脉动的直流电压。由于此脉动的直流电压还含有较大的纹波,必须通过滤波电
25、容 C4 加以滤除,从而得到平滑的直流电压 Vi。但这样的电压还随电网电压波动(一般有 10%左右的波动)、负载和温度的变化而变化。10第 3 章 软件设计3.1 主程序本设计中,计时采用定时器 T0 中断完成,其余状态循环调用显示子程序,当端口开关按下时,转入相应功能程序。其主程序执行流程见下图。3.2 显示子程序数码管显示的数据存放在内存单元 70H75H 中。其中 70H-71H 存放秒数据,72H-73H 存放分数据,74H-75H 存放时数据,每一地址单元内均为十进制 BCD 码。由于采用软件动态扫描实现数据显示功能,显示用十进制 BCD 码数据的对应段码存放在 ROM 表中。nyy
26、调用显示子程序开始显示单元清 0T0,T1 设为 16 位计数器模式允许 T0 中断进入功能程序键按下?调用整点报时 图 3.111显示时,先取出 70H-75H 某一地址中的数据,然后查得对应的显示用段码,并从 P0 口输出,P2 口将对应的数码管选中供电,就能显示该地址单元的数据值。为了显示小数点及“”、“A”等特殊字符,在显示班级及计时时采用不同的显示子程序。3.3 定时器 T0 中断服务程序定时器 TO 用于时间计时,定时溢出中断周期可分别设为 50ms 和 10ms.中断进入后,现判断是时钟计时还是秒表计时,时钟计时累计中断 20 次(即 1s)时,对秒计数单元进行加 1 操作,秒表
27、计时每 10ms 进行加 1 操作。时钟计数单元地址分别在 70H-71H(秒)、76H-77H(分)和 78H-79H(时),最大计时值为 23 时 59 分 59 秒。而秒表计数单元地址也在 70H-71H(0.01 毫秒)、76H-77H(秒)和 78H-79H(分),最大计时值为 99 分 59.99秒。7AH 单元内存放“熄灭符”数据(0AH)。在计数单元中采用十进制 BCD 码计数,满 60(秒表功能时有 100)进位,T0 中断服务程序执行流程见下图图 3.2定时器 T0、T1 溢出周期为 50ms(10ms),T0 为秒计数用,T1 为调整时闪烁用;P1.0,P1.1,P1.2
28、 为调整按钮,P0 口为字符输出口,采用共阳显示管。3.4 T1 中断服务程序T1 中断服务程序用于指示调整单元数字的亮闪。在时间调整状态下,每过 0.3s,将12对应单元的显示数据换成“熄灭符”数据(0AH)。这样在调整时间时,对应调整单元的显示数据会间隔闪亮。3.5 调时功能程序调时功能程序的设计方法时:按下 P1.0 口按键,若按下时间短于 1s ,则进入省电状态(数码管不亮,时钟不停);否则进入调分状态,等待操作,此时计时器停止走动。当再按下按钮时,若按下时间短于 0.5s ,则时间加 1 分;若按下时间长于 0.5s,则进入小时调整状态。在小时调整状态下,当按键按下的时间长于 0.5
29、s,退出调整状态,时钟继续走动。P1.1 口 按键在调时状态下可实现减 1 功能。3.6 整点响程序如果在时钟状态下,如果是整点那么就用 P3.2 这个引脚来控制蜂鸣器。3.7 时钟/秒表功能程序在正常计时状态下,若按下 P1.1 口按键,则进行时钟 /秒表功能的转换,转换后计时从开始。当按下 P1.2 口的按键时,可实现清 0、计时启动、暂停功能。3.8 程序清单/*AT89C52 秒表/时钟程序*/*定时器 T0、T1 溢出周期为 50ms(10ms),T0 为秒计数用,T1 为调整时闪烁用*/*P1.0P1.1P1.2 为字符输出口,采用共阳显示管。*/*主程序*/START:MOV R
30、0,70H /* 清零 70H7AH 共 11 个内存单元*/MOV R7,0BHCLEARDISP:MOV R0,00HINC R0DJNZ R7,CLEARDISPMOV 20H,00H / *清 20H(标志用)*/MOV 7AH,0AH /* 放入“熄灭符”数据*/MOV TMOD,11H /*设置 T0、T1 为 16 位定时器*/MOV TL0,0B0H /* 50ms 定时初值(T0 计时用)*/MOV TH0,3CH 13MOV TL1,0B0H /*50ms 定时初值(T1 闪烁定时用)*/MOV TH1,3CH /*50ms 定时初值*/SETB EA /*总中断开放*/
31、SETB ET0 /*允许 T0 中断*/SETB TR0MOV R4,14HSTART1:LCALL DISPLAY /*调用显示子程序*/JNB P1.0,SETMM1 /*P1.0 口为 0 时,转时间调整程序*/JNB P1.1,FUNSS /*秒表功能,P1.1 按键调时时作减 1 操作*/JNB P1.2,FUNPT /*STOP、PUSE、CLR*/SJMP START1 /*P1.0 口为 1 时跳回 START1*/SETMM1:LJMP SETMM /*转到时间调整程序 SETMM*/FUNSS: LCALL DS20MS JB P1.1,START1WAIT11: JNB
32、 P1.1,WAIT11CPL 03HMOV 70H,00HMOV 71H,00HMOV 76H,00HMOV 77H,00HMOV 78H,00HMOV 79H,00HAJMP START1ACALL ZDBSFUNPT:LCALL DS20MSJB P1.2,START1WAIT22:JNB P1.2,WAIT21CLR ET0CLR TR0WAIT33:JB P1.2,WAIT31LCALL DS20MSJB P1.2,WAIT33WAIT66:JNB P1.2,WAIT61 /*清 7079H 共 10 个内存单元*/MOV R0,70HMOV R7,0AHCLEARP:MOV R0,
33、00HINC R0DJNZ R7,CLEARPWAIT44:JB P1.2,WAIT41LCALL DS20MSJB P1.2,WAIT44WAIT55:JNB P1.2,WAIT51SETB ET014SETB TR0AJMP START1WAIT21:LCALL DISPLAYAJMP WAIT22WAIT31:LCALL DISPLAYAJMP WAIT33WAIT41:LCALL DISPLAYAJMP WAIT44WAIT51:LCALL DISPLAYAJMP WAIT55WAIT61:LCALL DISPLAYAJMP WAIT66/*中断入口程序*/ORG 0000H; /*程
34、序执行开始地址*/LJMP START; /*跳到标号 START 执行*/ORG 0003H; /*外部中断 0 中断程序入口RETI /*外部中断 0 中断返回*/ORG 000BH /*定时器 T0 中断程序入口*/LJMP INTT0ORG 0013H /*外部中断 1 中断程序入口*/TETI /*外部中断 1 中断返回*/ORG 001BHLJMP INTT1 /*跳至 INTT1 执行*/ORG 0023H /*串行中断程序入口地址*/RETI /*T0 中断服务程序*/INTT0:PUSH ACC /*累加器入栈保护*/PUSH PSW /*状态字入栈保护*/CLR ET0 /
35、*关 T0 中断允许*/CLR TR0 /*关闭定时器 T0*/JB 03H,FSS /*标志为 1 转秒表处理程序(10ms 定时)*/MOV A,0B7H /*中断响应时间同步修正*/ADD A,TL0 /*低 8 位初值修正*/MOV TL0, A /*重装初值(低 8 位修正值)*/MOV A,3CH /*高 8 位初值修正*/ADCC A,TH0MOV HT0,A /*重装初值(高 8 位修正值)*/SETB TR0 /*开始定时器 T0*/DJNZ R4,OUTT0 /*20 次中断未到中断退出*/ADDSS:MOV R4,14H /*20 次中断到(1s)重赋初值*/MOV R0
36、, 71H /*指向秒计时单元(71H72H)ACALL ADD1 /*调用加 1 程序(加 1s 操作)MOV A,R315CLR C /*清进位标志*/CJNE A,60H,ADDMMADDMM:JC OUTT0 /*短于 60s 时中断退出*/ACALL CLR0 /*长与或者等于 60s 时对秒计时单元清零*/MOV R0,77H /*指向分计时单元(76H77H)*/ACALL ADD1 /*分计时单元加 1min*/MOV A,R3 /*分数据放入 A*/CLR C /*清零位标志*/CJNE A,60H,ADDHHADDHH:JC OUTT0 /*短于 60min 时中断退出*/
37、ACALL LCR0 /*长与或者等于 60s 时对秒计秒单元清零*/MOV R0,79H /*指向小时计时单元(78H79H)*/ACALL ADD1 /*小时计时单元加 1h*/MOV A,R3 /*时数据放入 A*/CLR C /*清进位标志*/JB 03H,OUTT0 /*秒表时最大数为 99*/CJNE A,24H,HOURHOUR: JC OUTT0 /*短于 24h 时中断退出*/ACALL CLR0 /*长与或者等于 24h 时对秒计时单元清零*/OUTT0:MOV 72H,76H /*中断退出时将分、时计时单元数据移MOV 73H,77H 入对应显示单元*/MOV 74H,7
38、8HMOV 75H,79HPOP PSW /*恢复状态字(出栈)*/POP ACC /*恢复累加器*/SETB ET0 /*开放 T0 中断*/RETI /*中断返回*/*秒表计时程序(10min 加 1) ,低 2 位为 0.1、0.01 秒,中间 2 位为秒,最高 2 位为分。*/最大计数值为 99 分 59.99 秒FSS: MOV A, #0F7HADD A, TL0MOV TL0, AMOV A, #0D8HADDC A, THOMOV THO, ASETB THOMOV R0, #71HACALL ADD1CLR CMOV A, R3JZ FSS1SETB CFSS1: AJMP
39、ADDMM16/*闪动调时程序*/*T1 中断服务程序,用作时间调整时时调整单元闪烁指示*/INTT1:PUSH ACC /*中断现场保护*/PUSH PSW MOV TL1,0B0H /*装入定时器 T1 定时初值*/MOV TH1,3CHDJNZ R2,INTT1OUTMOV R2,06HCPL 02HJB 02H,FLASH1MOV 72H,76HMOV 73H,77HMOV 74H,78HMOV 75H,79HINTT1OUT:POP PSW /*恢复现场*/POP ACCRET1FLASH1:JB 01H,FLASH2 /*01 位为 1 时,转小时熄灭控制*/MOV 72H,7AH
40、MOV 73H,7AHMOV 74H,78HMOV 75H,79HAJMP INTT1OUT FLASH2:MOV 72H,76HMOV 73H,77HMOV 74H,7AHMOV 75H,7AHAJMP INTT1OUT/*加 1 子程序*/ ADD1:MOV A,R0 /*取当前计时单元数据到 A*/DEC R0SWAP AORL A,R0ADD A,01HDA AMOV R3,AANL A,0FHMOV R0,A MOV A,R3INC R0SWAP AANL A,0FHMOV R0,ARET17/*分减 1 子程序*/SUB1:MOV A,R0 /*取当前计时单元数据到 A*/DEC
41、R0SWAP AORL A,R0JZ SUB11DEC ASUB111:MOV R3,A /*移入 R3 中暂存数据*/ANL A,0FH CLR CSUBB A,0AHSUB1111:JC SUB1110MOV R0,09HSUB110:MOV A,R3 /*取回 R3 中存数据*/INC R0SWAP AANL A,0FHMOV R0,ARETSUB11:MOV A,59HAJMP SUB111SUB1110:MOV A,R3 /*移入 R3 存储器*/ANL A,0FHMOV R0,AAJMP SUB110/*时减 1 子程序*/SUBB1:MOV A,R0 /*取当前计时单元数据到 A
42、*/DEC R0SWAP AORL A,R0JZ SUBB11DEC ASUBB111:MOV R3,A /*移入 R3 存储器*/ANL A,0FHCLR CSUBB A,0AHSUBB1111:JC SUBB1110MOV R0,09HSUBB110:MOV A,R3INC R0SWAP A ANL A,0FHMOV R0,ARET18SUBB11:MOV A,23HAJMP SUBB111SUBB1110:MOV A,R3ANL A,0FHMOV R0,A AJMP SUBB110/*清 0 程序*/*为计时单元复 0 用*/CLR0:CLR AMOV R0,ADEC R0MOV R0,
43、ARET/*时钟调整程序*/当调时按键按下进入此程序SETMM:CLR ET0 /*关定时器 T0 中断*/CLR TR0 /*关定时器 T0 */LCALL DLISJB P1.0,CLOSEDISMOV R2,06HSETB ET1SETB TR1SET2:JNB P1.0,SET1 /*P1 口为 0,等待*/SETB 00HSET4:JB P1.0,SET3 /*等待键按下*/LCALL DL05SJNB P1.0,SETHHMOV R0,77HLCALL ADD1MOV A,R3CLR CCJNE A,60H,HHHHHH:JC SET4LCALL CLR0CLR CAJMP SET
44、4CLOSEDIS:SETB ET0SETB TR0CLOSE:JB P1.0,CLOSE /*无键按下,等待*/LCALL DISPLAYJB P1.0,CLOSEWAITH:JNB P1.0,WAITHLJMP START1SETHH:CLR 00H19SETHH1:JNB P1.0,SET5SETB 01HSET6:JB P1.0,SET7 /*等待键按下*/LCALL DL05SJNB P1.0,SETOUTMOV R0,79HLCALL ADD1MOV A,R3CLR CCJNE A,24H,HOUUHOUU:JC SET6LCALL CLR0AJMP SET6SETOUT:JNB
45、P1.0,SETOUT1LCALL DISPLAYJNB P1.0,SETOUTCLR 01HCLR 00HCLR 02HCLR TR1CLR ET1SETB TR0SETB ET0LJMP START1SET1:LCALL DISPLAY /*键释放等待时调用显示程序(调分)*/AJMP SET2 /*防止键按下时无时钟显示*/SET3:LCALL DISPLAYJNB P1.1,FUNSUBAJMP SET4SET5:LCALL DISPLAY /*键释放等待时调用显示程序(调时)*/AJMP SETHH1SET7:LCALL DISPLAYJNB P1.1,FUNSUBBAJMP SET6SETOUT1:LCALL DISPLAYAJMP SETOUT /*防止键按下时无时钟显示*/*FUNSUB,分减 1 程序?*/ FUNSUB:LCALL DISPLAY /*消抖动*/JB P1.1,SET41FUNSUB1:JNB P1.1,FUNSUB1MOV R0,77HLCALL SUB1