资源描述
单片机原理课程设计
——秒表时钟计时器的设计
专 业:电气工程及其自动化
方 向:电力系统
姓 名:韦敏
学 号:201120305415
指导老师:汪厚新
目 录
第1章 方案论证 1
第2章 硬件设计 3
2.1秒表/时钟计时器的总体设计 3
2.2 AT89C52单片机最小系统 4
2.3 74LS244芯片说明 6
2.4 LED显示器的显示方法及其与单片机的接口 6
2.5电源电路的设计 8
第3章 软件设计 9
3.1主程序 9
3.2显示子程序 9
3.3定时器T0中断服务程序 10
3.4 T1中断服务程序 10
3.5调时功能程序 11
3.6整点响程序 11
3.7时钟/秒表功能程序 11
3.8 程序清单 11
第4章 设计总结 21
第1章 方案论证
现今的计时器通常只能通过启/停按键实现断点计时的功能,即通过启/停按键来记录一段时间。这种计时器查看的时间只能为计时结束时刻。实际的应用中往往需要在不影响正常计时的基础上,能查看记录过程中的某些点的时间。
本课设即针对此问题,设计了一种能通过按键方式查看记录过程中任一时刻值的计时器。这种计时器在查看中间值时不会影响整个记录过程,并且能把相应数据送入存储模块及显示模块,以便查看。
本系统采用AT89C52单片机作控制器,LED数码管,实现显示时、分、秒,以24小时计时方式。为了实现LED显示器的数字显示,可以采用静态显示法和动态显示法。由于静态显示法需要数据锁存器等硬件,结构较为复杂,考虑时钟显示只有六位,且系统没有其他复杂的处理任务,所以采用动态扫描法实现LED的显示。单片机采用AT89C52系列,有足够的空余硬件资源实现其它的扩充功能。
秒表/时钟计时器的总体设计框图如下图所示。
六位LED显示器
列驱动
AT89C52
P0单片机
控制器
P2
图1.1 系统总体设计框图
系统主要实现如下功能:
1.时钟功能
对于时钟功能,需要在数码管上显示小时、分钟和秒钟,因此,可以在内部存储空间分别定义它们的显示缓存空间,来存放小时、分钟和秒钟的BCD码,各2个字节。
由于时钟是不能停止的,因此需要采用内部定时器自动计时,并使用定时器中断处理程序来定时进行时间数值的刷新。52单片机的2个定时器都具有16位定时器的
工作模式。当晶振为12MHz时,16位定时器的最大定时值为65.536mS;要达到1秒钟,可以采用两种方法:采用一个定时器定时与软件计数相结合的方法;或者采用两个定时器级联的方法。由于秒表在计时功能时也需要用到1个定时器,因此,我们采用第一个方法,只使用1个定时器,例如使用T0。为了达到较为准确的计时,使T0的溢出时间为50ms,使用一个字节作为软件计数器ST,计数值为20。定时器的中断处理程序对ST进行减1操作,当ST为0时,1秒到达,此时更新存放小时、分钟、秒钟的显示缓存区。
2.计时功能
当秒表用作计时功能时,也需要一个定时器进行10MS的定时,在本例中使用单片机的TIMER1。在TIMER1的中断处理程序中对SS和ss的缓存空间进行更新,与上面类似。
3.功能按键
再看按键的处理。这3个键可以采用中断的方法,也可以采用查询的方法来识别。对于A、B键,主要功能在于功能切换和数值复位,对于时间的要求不是很严格,而C键主要用于时间的锁定,需要比较准确的控制。因此可以考虑,对A、B键采用查询的方式,而对于C 键采用外部中断。
4.中断嵌套和控制
现在在我的方案中有3个中断,T0、T1中断和外部中断INT0。这3个中断的特点是:T0的工作是连续的,可以在误差范围内可以被打断但不可以停止;T1的工作同样可以在误差范围内被打断,但可以被INT0停止;INT0是用来启动或停止T1的。
第2章 硬件设计
2.1秒表/时钟计时器的总体设计
秒表/时钟计时器的硬件电路设计如图2.1所示。
图2.1 总体硬件设计图
采用AT89C52单片机,数字显示采用共阳六段LED显示器,P0口输出段码数据,P2.0-P2.5口作为列扫描输出,P1.0、P1.1 、P1.3口接三个开关按钮,用以实现调时及秒表/时钟功能切换设置。为了给共阳LED数码管提供驱动电压,采用三极管作电源驱动输出。采用12MHZ晶振,有利于提高系统计时的精确性。对于A、B键,主要功能在于功能切换和数值复位,对于时间的要求不是很严格,而C键主要用于时间的锁定,需要比较准确的控制。因此可以考虑,对A、B键采用查询的方式,而对于C 键采用外部中断。
2.2 AT89C52单片机最小系统
最小系统的核心是AT89C52单片机,其内部带有8KB的FLASH ROM,256B片内RAM,基本上能满足最小系统的设计要求。如接上时钟电路、复位电路即可加电工作。如图2.2所示。
图2.2 单片机最小系统图
AT89C52单片机各引脚的功能和应用介绍如下:
1. 输入/输出引脚
(1) P0口(39~32脚):P0.0~P0.7统称为P0口。在不接片外存储器与不扩展I/O口时,可作为准双向输入/输出口。在接有片外存储器或扩展I/O口时,P0口分时复用为低8位地址总线和双向数据总线。
(2) P1口(1~8脚):P1.0~P1.7统称为P1口,可作为准双向I/O口使用。对于52子系列,P1.0与P1.1还有第二功能:P1.0可用作定时器/计数器2的计数脉冲输入端T2,P1.1可用作定时器/计数器2的外部控制端T2EX。
(3) P2口(21~28脚):P2.0~P2.7统称为P2口,一般可作为准双向I/O口使用;在接有片外存储器或扩展I/O口且寻址范围超过256字节时,P2口用作高8位地址总线
引脚功能如下:
P3.0 RXD 串行口输入
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 外部数据存储器读选通信号输入端,低电平有效
(4) P3口(10~17脚):P3.0~P3.7统称为P3口。除作为准双向I/O口使用外,还可以将每一位用于第二功能,而且P3口的每一条引脚均可以独立定义为第一功能的输入输出或第三功能。
2. 控制线
(1) ALE/PROG(30脚):地址锁存有效信号输入端。ALE在每个机器周期内输出两个脉冲。在访问片外程序存储器期间,下降沿用于控制锁存P0输出的低8位地址;在不访问片外程序存储器期间,可作为对外输出的时钟脉冲或用于定时目的。但要注意,在访问片外数据存储器期间,ALE脉冲会跳空一个,此时作为时钟输出就不妥了。
对于片内含有EPROM的机型,在编程期间,该引脚用作编程脉冲PROG的输入端。
(2) PSEN(29脚):片外程序存储器读选通信号输出端,低电平有效。当从外部程序存储器读取指令或常数期间,每个机器周期该信号两次有效,以通过数据总线P0口读回指令或常数。在访问片外数据存储器期间,PSEN信号将不再出现。
(3) RST/VPD引脚(9脚):RST即为RESET,VPD为备用电源。该引脚为单片机的上电复位或掉电保护端。当单片机振荡器工作时,该引脚上出现持续两个机器周期的高电平,就可实现复位操作,使单片机回复到初始状态。上电时,考虑到振荡器有一定的起振时间,该引脚上高电平必须持续10ms以上才能保证有效复位。
当Vcc发生故障,降低到低电平规定值或掉电时,该引脚可接上备用电源VPD(+5V)为内部RAM供电,以保证RAM中的数据不丢失。
(4)EA/Vpp(31脚):EA为片外程序存储器选用端。该引脚有效(低电平)时,只选用片外程序存储器,否则单片机上电或复位后选用片内程序存储器。
对于片内含有EPROM的机型,在编程期间,此引脚用作21V编程电源Vpp的输入端。
2.3 74LS244芯片说明
开关量输入的扩展经常使用的芯片是74LS244/74LS245/74LS240等;这些芯片的特点是三态门,可以把多个芯片的输出,并联在一起而不会互相影响;通过138、139、153等译码选通芯片,把RD/WR/地址的高位信号(高3位或者高4位,看单片机系统中的芯片的数量)接到译码芯片,把译码芯片的输出接到锁存器的锁存输入,或者缓冲器的选通输入。
图2.3 74LS244引脚
244内部包含8个单向三态门,分为两组,同时作为总线芯片的另外一个特点是驱动能力加强了,可以提供比较大的输出电流,所以经常用来直接驱动光耦、发光管等,也可以用于驱动微型的继电器。
2.4 LED显示器的显示方法及其与单片机的接口
在单片机系统中,通常用LED数码显示器来显示各种数字或符号。由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。
LED显示器又称数码管,八段LED显示器由8个发光二极管组成。其中7个发光二极管构成字型“8”的各个笔画段,另一个小数点为dp发光二极管。LED显示器有两种不同的形式:一种是发光二极管的阳极都连在一起的,称之为共阳极LED显示器;另一种是发光二极管的阴极都连在一起的,称之为共阴极LED显示器。如图2.4所示。
共阴和共阳结构的LED显示器各笔划段名和安排位置是相同的。当二极管导通时,相应的笔划段发亮,由发亮的笔划段组合而显示各种字符。8个笔划段hgfedcba对应于一个字节(8位)的D7 D6 D5 D4 D3 D2 D1 D0,于是用8位二进制码就可以表示欲显示字符的字型代码。例如,对于共阴LED显示器,当公共阴极接地(为零电平),而阳极hgfedcba各段为0111011时,显示器显示"P"字符,即对于共阴极LED显示器,“P”字符的字形码是73H。如果是共阳LED显示器,公共阳极接高电平,显示“P”字符的字形代码应为10001100(8CH)。
图2.4 LED显示器及工作原理
LED显示方式有动态显示和静态显示两种方式。本系统采用动态扫描显示接口电路,动态显示接口电路是把所有显示器的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM各自独立地受I/O线控制。CPU向字段输出口送出字型码时,所有显示器接收到相同的字型码,但究竟是哪个显示器亮,则取决于COM端。也就是说我们可以采用分时的方法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
数码管采用共阳极接法,将各位数码管的段选线并联在一起,由一片74HC595八位输出口控制,图中增加了一个驱动器,用以提高信号驱动能力。共阳极点COM接到另一片74HC595八位输出口。单片机通过口线把要显示的数据串行传给74HC595,由74HC595把串行的数据转换成并行数据, 分别控制数码管的段选线a-h同名端和位选线COM端。
2.5电源电路的设计
在系统中,电源的设计是相当重要的一部分。因为在设计过程中我们需要考虑功率、输出电压及抗干扰等因素的影响,我们选定的电源应满足整个系统顺利运行的要求。本系统采用+5V直流稳压电源做为工作电源。+5V直流稳压的工作电路,传统方式采用分立元件构成,目前均采用集成三端稳压器7805构成。集成三端稳压器因其稳压精度高、工作稳定可靠、外围电路简单、容易设计和制作、体积小、重量轻、成本低、维修简单等优点,所以在各种电源电路中得到了普遍的应用。
7805集成三端稳压器的典型应用电路如图所示,这是一个输出+5V直流电压的稳压电路。IC采用集成三端稳压器7805,C2、C4分别为输入端和输出端滤波电容,RL为负载电阻。PBU605是由4个二极管构成的整流电路,用来稳定输入的12V电压。
图2.5 电源电路
变压器TF将交流电网220V的电压V1变为所需要的交流电压V2,然后通过全波整流将交流电压V2变成脉动的直流电压。由于此脉动的直流电压还含有较大的纹波,必须通过滤波电容C4加以滤除,从而得到平滑的直流电压Vi。但这样的电压还随电网电压波动(一般有±10%左右的波动)、负载和温度的变化而变化。
第3章 软件设计
3.1主程序
本设计中,计时采用定时器T0中断完成,其余状态循环调用显示子程序,当端口开关按下时,转入相应功能程序。其主程序执行流程见下图。
n
y
y
调用显示子程序
开始
显示单元清0
T0,T1设为16位计数器模式
允许T0中断
进入功能程序
键按下?
调用整点报时
图3.1
3.2显示子程序
数码管显示的数据存放在内存单元70H-75H中。其中70H-71H存放秒数据,72H-73H存放分数据,74H-75H存放时数据,每一地址单元内均为十进制BCD码。由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。显示时,先取出70H-75H某一地址中的数据,然后查得对应的显示用段码,并从P0口输出,P2口将对应的数码管选中供电,就能显示该地址单元的数据值。为了显示小数点及“-”、“A”等特殊字符,在显示班级及计时时采用不同的显示子程序。
3.3定时器T0中断服务程序
定时器TO用于时间计时,定时溢出中断周期可分别设为50ms和10ms.中断进入后,现判断是时钟计时还是秒表计时,时钟计时累计中断20次(即1s)时,对秒计数单元进行加1操作,秒表计时每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为调整按钮,P0口为字符输出口,采用共阳显示管。
3.4 T1中断服务程序
T1中断服务程序用于指示调整单元数字的亮闪。在时间调整状态下,每过0.3s,将对应单元的显示数据换成“熄灭符”数据(#0AH)。这样在调整时间时,对应调整单元的显示数据会间隔闪亮。
3.5调时功能程序
调时功能程序的设计方法时:按下P1.0口按键,若按下时间短于1s ,则进入省电状态(数码管不亮,时钟不停);否则进入调分状态,等待操作,此时计时器停止走动。当再按下按钮时,若按下时间短于0.5s ,则时间加1分;若按下时间长于0.5s,则进入小时调整状态。在小时调整状态下,当按键按下的时间长于0.5s,退出调整状态,时钟继续走动。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 R0,#70H /* 清零70H~7AH共11个内存单元*/
MOV R7,#0BH
CLEARDISP:MOV @R0,#00H
INC R0
DJNZ R7,CLEARDISP
MOV 20H,#00H / *清20H(标志用)*/
MOV 7AH,#0AH /* 放入“熄灭符”数据*/
MOV TMOD,#11H /*设置T0、T1为16位定时器*/
MOV TL0,#0B0H /* 50ms定时初值(T0计时用)*/
MOV TH0,#3CH
MOV TL1,#0B0H /*50ms定时初值(T1闪烁定时用)*/
MOV TH1,#3CH /*50ms定时初值*/
SETB EA /*总中断开放*/
SETB ET0 /*允许T0中断*/
SETB TR0
MOV R4,#14H
START1: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,START1
WAIT11: JNB P1.1,WAIT11
CPL 03H
MOV 70H,#00H
MOV 71H,#00H
MOV 76H,#00H
MOV 77H,#00H
MOV 78H,#00H
MOV 79H,#00H
AJMP START1
ACALL ZDBS
FUNPT:LCALL DS20MS
JB P1.2,START1
WAIT22:JNB P1.2,WAIT21
CLR ET0
CLR TR0
WAIT33:JB P1.2,WAIT31
LCALL DS20MS
JB P1.2,WAIT33
WAIT66:JNB P1.2,WAIT61 /*清70~79H共10个内存单元*/
MOV R0,#70H
MOV R7,#0AH
CLEARP:MOV @R0,00H
INC R0
DJNZ R7,CLEARP
WAIT44:JB P1.2,WAIT41
LCALL DS20MS
JB P1.2,WAIT44
WAIT55:JNB P1.2,WAIT51
SETB ET0
SETB TR0
AJMP START1
WAIT21:LCALL DISPLAY
AJMP WAIT22
WAIT31:LCALL DISPLAY
AJMP WAIT33
WAIT41:LCALL DISPLAY
AJMP WAIT44
WAIT51:LCALL DISPLAY
AJMP WAIT55
WAIT61:LCALL DISPLAY
AJMP WAIT66
/*中断入口程序*/
ORG 0000H; /*程序执行开始地址*/
LJMP START; /*跳到标号START执行*/
ORG 0003H; /*外部中断0中断程序入口
RETI /*外部中断0中断返回*/
ORG 000BH /*定时器T0中断程序入口*/
LJMP INTT0
ORG 0013H /*外部中断1中断程序入口*/
TETI /*外部中断1中断返回*/
ORG 001BH
LJMP INTT1 /*跳至INTT1执行*/
ORG 0023H /*串行中断程序入口地址*/
RETI
/*T0中断服务程序*/
INTT0:PUSH ACC /*累加器入栈保护*/
PUSH PSW /*状态字入栈保护*/
CLR ET0 /*关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,TH0
MOV HT0,A /*重装初值(高8位修正值)*/
SETB TR0 /*开始定时器T0*/
DJNZ R4,OUTT0 /*20次中断未到中断退出*/
ADDSS:MOV R4,#14H /*20次中断到(1s)重赋初值*/
MOV R0,#71H /*指向秒计时单元(71H~72H)
ACALL ADD1 /*调用加1程序(加1s操作)
MOV A,R3
CLR C /*清进位标志*/
CJNE A,#60H,ADDMM
ADDMM:JC OUTT0 /*短于60s时中断退出*/
ACALL CLR0 /*长与或者等于60s时对秒计时单元清零*/
MOV R0,#77H /*指向分计时单元(76H~77H)*/
ACALL ADD1 /*分计时单元加1min*/
MOV A,R3 /*分数据放入A*/
CLR C /*清零位标志*/
CJNE A,#60H,ADDHH
ADDHH:JC OUTT0 /*短于60min时中断退出*/
ACALL LCR0 /*长与或者等于60s时对秒计秒单元清零*/
MOV R0,#79H /*指向小时计时单元(78H~79H)*/
ACALL ADD1 /*小时计时单元加1h*/
MOV A,R3 /*时数据放入A*/
CLR C /*清进位标志*/
JB 03H,OUTT0 /*秒表时最大数为99*/
CJNE A,#24H,HOUR
HOUR: JC OUTT0 /*短于24h时中断退出*/
ACALL CLR0 /*长与或者等于24h时对秒计时单元清零*/
OUTT0:MOV 72H,76H /*中断退出时将分、时计时单元数据移
MOV 73H,77H 入对应显示单元*/
MOV 74H,78H
MOV 75H,79H
POP PSW /*恢复状态字(出栈)*/
POP ACC /*恢复累加器*/
SETB ET0 /*开放T0中断*/
RETI /*中断返回*/
/*秒表计时程序(10min加1),低2位为0.1、0.01秒,中间2位为秒,最高2位为分。*/
最大计数值为99分59.99秒
FSS: MOV A, #0F7H
ADD A, TL0
MOV TL0, A
MOV A, #0D8H
ADDC A, THO
MOV THO, A
SETB THO
MOV R0, #71H
ACALL ADD1
CLR C
MOV A, R3
JZ FSS1
SETB C
FSS1: AJMP ADDMM
/*闪动调时程序*/
/*T1中断服务程序,用作时间调整时时调整单元闪烁指示*/
INTT1:PUSH ACC /*中断现场保护*/
PUSH PSW
MOV TL1,#0B0H /*装入定时器T1定时初值*/
MOV TH1,#3CH
DJNZ R2,INTT1OUT
MOV R2,#06H
CPL 02H
JB 02H,FLASH1
MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
INTT1OUT:POP PSW /*恢复现场*/
POP ACC
RET1
FLASH1:JB 01H,FLASH2 /*01位为1时,转[小]时熄灭控制*/
MOV 72H,7AH
MOV 73H,7AH
MOV 74H,78H
MOV 75H,79H
AJMP INTT1OUT
FLASH2:MOV 72H,76H
MOV 73H,77H
MOV 74H,7AH
MOV 75H,7AH
AJMP INTT1OUT
/*加1子程序*/
ADD1:MOV A,@R0 /*取当前计时单元数据到A*/
DEC R0
SWAP A
ORL A,@R0
ADD A,#01H
DA A
MOV R3,A
ANL A,#0FH
MOV @R0,A
MOV A,R3
INC R0
SWAP A
ANL A,#0FH
MOV @R0,A
RET
/*分减1子程序*/
SUB1:MOV A,@R0 /*取当前计时单元数据到A*/
DEC R0
SWAP A
ORL A,@R0
JZ SUB11
DEC A
SUB111:MOV R3,A /*移入R3中暂存数据*/
ANL A,#0FH
CLR C
SUBB A,#0AH
SUB1111:JC SUB1110
MOV @R0,#09H
SUB110:MOV A,R3 /*取回R3中存数据*/
INC R0
SWAP A
ANL A,#0FH
MOV @R0,A
RET
SUB11:MOV A,#59H
AJMP SUB111
SUB1110:MOV A,R3 /*移入R3存储器*/
ANL A,#0FH
MOV @R0,A
AJMP SUB110
/*时减1子程序*/
SUBB1:MOV A,@R0 /*取当前计时单元数据到A*/
DEC R0
SWAP A
ORL A,@R0
JZ SUBB11
DEC A
SUBB111:MOV R3,A /*移入R3存储器*/
ANL A,#0FH
CLR C
SUBB A,#0AH
SUBB1111:JC SUBB1110
MOV @R0,#09H
SUBB110:MOV A,R3
INC R0
SWAP A
ANL A,#0FH
MOV @R0,A
RET
SUBB11:MOV A,#23H
AJMP SUBB111
SUBB1110:MOV A,R3
ANL A,#0FH
MOV @R0,A
AJMP SUBB110
/*清0程序*/
/*为计时单元复0用*/
CLR0:CLR A
MOV @R0,A
DEC R0
MOV @R0,A
RET
/*时钟调整程序*/
当调时按键按下进入此程序
SETMM:CLR ET0 /*关定时器T0中断*/
CLR TR0 /*关定时器T0 */
LCALL DLIS
JB P1.0,CLOSEDIS
MOV R2,#06H
SETB ET1
SETB TR1
SET2:JNB P1.0,SET1 /*P1口为0,等待*/
SETB 00H
SET4:JB P1.0,SET3 /*等待键按下*/
LCALL DL05S
JNB P1.0,SETHH
MOV R0,#77H
LCALL ADD1
MOV A,R3
CLR C
CJNE A,#60H,HHH
HHH:JC SET4
LCALL CLR0
CLR C
AJMP SET4
CLOSEDIS:SETB ET0
SETB TR0
CLOSE:JB P1.0,CLOSE /*无键按下,等待*/
LCALL DISPLAY
JB P1.0,CLOSE
WAITH:JNB P1.0,WAITH
LJMP START1
SETHH:CLR 00H
SETHH1:JNB P1.0,SET5
SETB 01H
SET6:JB P1.0,SET7 /*等待键按下*/
LCALL DL05S
JNB P1.0,SETOUT
MOV R0,#79H
LCALL ADD1
MOV A,R3
CLR C
CJNE A,#2
展开阅读全文