LED数码管电子时钟电路- bg3nde的日志- 网易博客

LED数码管电子时钟电路

2010-03-29 15:53:15 阅读69 评论0 字号:

LED数码管电子时钟电路采用24h记时方式,日期和时间用6位数码管显示。该电路采用AT98c2051单片机,使用5V电池供电,只要使用一个按键开关即可以进入调时、省电(不显示LED 数码管)和正常显示三种状态。
一、 电子时钟的技术指标
显示范围:年份99年,如2001-2099;日月正常显示,能识别闰年闰月;时间采用24小时制
显示格式:日期按年月日排列,年取后两位显示如2005年12月20日显示为:051220;时间按时分秒排列,显示如12点30分55秒显示为123055
显示位数:6位8段LED数码管作正常、调时和节电显示
时钟误差:24小时误差3~5秒
二、 硬件电路的选择
1、单片机的选择   选用AT89C2051单片机,配备11.0592MHz晶振,复位电路采用上电复位
    2、显示电路选择  采用软件译码动态显示,P3.0-P3.5作数码管的位选口,P1.0-P1.6作数
码管的段选口。考虑直接用单片机I/O口作位选时可能驱动功率不够,可采用三极管9012作驱动,
共阳极数码管显示。
    3、电源选择  采用直流5V电源供电,可用7805将9V电池转换成5V
三、设计分析
    1、定时计数的误差分析
主要误差来源及补偿 :
[1]、硬件电路在线路手工焊接时可能存在虚焊,或者有接触不良的情况,以及外界环境的影
响,通过使用印刷电路板机器焊接,可以减少硬件误差影响。
[2]、采用11.0592MHz晶振计算定时计数初值时存在小数舍入误差
公式: ,定时器/计数器采用工作方式1,定时器T0、T1溢出周期为50ms,计
算得到N=19456=4C00H,TH0=4CH,TL0=00H.若仍采用理论上的12MHz计算初值,则有:
N1=3CB0H,那么用11.0592MHz,N1不变,益出周期约为54.25ms,每次溢出比实际的要慢4.3ms,
那么一秒钟要慢85ms,从而影响24h比实际的要慢122min。修正后误差处理通过软件实现,最终
的时钟误差测得值为3-5s。
补偿方法:
1)、xx定时计数时可采用12MHz的晶振。
2)、用软件补偿,通用方法如下:
   MCS-51单片机的中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3~8个机器周期。无论是哪一种原因引起的误差,在xx定时的应用场合,必须考虑它们的影响,以确保xx的定时控制。根据定时中断的不同应用情况,应选择不同的xx定时编程方法。以定时器T1工作在定时方式1为例,晶振频率为12MHz 。在定时器溢出中断得到响应时,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据此计数值算出到下一次中断时,需多长时间,由此来重装载和启动定时器。例如定时周期为1ms,则通常定时器重装载值为-1000(0FC18H)。下面的程序在计算每个定时周期的xx重装载值时,考虑了由停止计数(CLR TR1)到重新启动计数(SETB TR1)之间的7个机器周期时间。程序中#LOW(-1000+7)和#HIGH(-1000+7)是汇编符号,分别表示-1000+7=0FC1FH这个立即数的低位字节(1FH)和高位字节(0FCH)。

CLR EA ;禁止所有中断
CLR TR1 ;停止定时器T1
MOV A,#LOW(-1000+7) ;期望数的低位字节
ADD A,TL1 ;进行修正
MOV TL1,A ;重装载低位字节
MOV A,#HIGH(-1000+7) ;对高位字节处理
ADDC A,TH1
MOV TH1,A
SETB TR1 ;重启动定时器
SETB EA ;重开中断
……   
;本次设计的软件误差补偿
CLR  ET0          ;关T0中断允许
              CLR  TR0          ;关闭定时器T0
              MOV  A,#0B7H      ;中断响应时间同步修正
              ADD  A,TL0        ;低8位初值修正
              MOV  TL0,A        ;重装初值(低8位修正值)
              MOV  A,#3CH        ;高8位初值修正
              ADDC  A,TH0        ;
              MOV  TH0,A        ;重装初值(高8位修正值)
              SETB  TR0          ;开启定时器T0
………

  2、按键xx抖动的设计分析
由于键的按下与释放是通过机械触点的闭合与断开来实现的,因机械触点的弹性作用,在闭合与断开的瞬间均有一个抖动过程,所以键闭合与断开会产生如附图所示的电压波形,抖动时间一般在5~10ms。这个抖动对判断键是否按下或释放有较大影响,因此必需xx键的抖动,只有这样,才能可靠地判断键的状态。


在单片机应用系统中,xx抖动有硬件和软件两种方法。硬件去抖动方法主要有利用R-S触发器和滤波器电路,如图所示。软件去抖动通常是程序检测到键被按下时,延时10ms后再检测键是否仍然闭合,若是则确认是一次真正的闭合,否则就忽略次此按键。
本次设计时采用的软件消抖程序
CLOSE:JB  P3.7,CLOSE        ;无按键按下,等待。
                  LCALL  DISPLAY          ;有键按下,调显示子程序延时消抖
                  JB      P3.7,CLOSE        ;是干扰返回CLOSE等待
3、驱动电路的设计
9012三极管为NPN型小功率管,可作共阳数码管的驱动,也可用9013PNP型驱动共阴数码管
4、数码管及其限流电阻的选用
数码管共阳型和共阴型的外型相同,共阴极是把所有的发光二极管的阴极俩在一起,通常接地,通过控制每一只的阳极电平来使其发光或者熄灭。阳极为高电平发光,为低电平熄灭。共阳极是把所有的阳极连在一起,通常接高电平(+5V),通过控制每一只的阴极电平使其发光或者熄灭,阴极为低电平发光,为高电平熄灭。COM口作为位选端,8只发光二极管被分成两个组,所以有两个COM端,在使用时把它们并联起来。
为了保证发光二极管经久耐用而不被烧毁,需要外接限流电阻。取值一般是流经的电流在10~20mA,由于高亮度数码管的使用,电流还可以取得小一些。发光二极管开启电压,红色在1.6~1.8V之间,绿色约为2.0V。设导通电压为 =1.6V,正向电流为5~20mA ,限流电阻R取值在170 ~680 ,考虑单片机本身的驱动能力很大,实际设计取值560 。计算如下:
         
5、数码管显示技术
(1)静态显示技术
静态显示技术就是当数码管显示某一字符时,相应的发光二极管连续恒定地处于点亮或熄灭状态,直到更换显示内容为止。采用这种显示方式占用的硬件资源多,以七段LED显示器为例,如果用软件进行字段译码,每显示一个字符就需要一个锁存器,如果用硬件进行字段译码,每显示一个字符就需要一个锁存译码器。静态显示的数码管由于连续地工作,因此功耗大,但程序简单,亮度高。随着高度数码管的出现,动态显示同样可以达到很好的显示效果,所以在多数应用情况,不会采用静态显示方式,而采取动态显示方式。
(2)动态显示技术
在多位LED显示时,为了降低成本和功耗,将所有位的段选线并联起来,由一个8位口控制,由另一个端口进行显示位的控制。但是,由于段选是公用的,要让各位数码管显示不同的字符,就必须采用扫描方式,即动态扫描显示方式。首先从段选线上送出字段码,再控制位选线,字符就显示在指定位置上,持续1~5ms时间,然后关闭所有显示;接下来又送出新的字段码,按照上述过程又显示在新的位置上,直到每一位数码管都扫描完为止,即为一个扫描周期。由于人的视觉停留效应,因此当扫描周期小到一定程度时,人就感觉不出字符的移动或闪烁,觉得每位数码管到一直在显示,达到一种稳定的视觉效果。
动态扫描显示的扫描方式有程序控制和定时中断扫描两种。程序控制扫描方式要占用许多CPU时间,在计算机的任务较重时,难以得到好的效果,所以在实际中常采用定时中断扫描方式,这种方式是每隔一定时间(如1ms)显示一位数码管,假设有8位数码管,显示扫描周期为8ms,显示效果十分良好。本次设计采用这种方法。
(3)数码管的字型码设计
八段LED显示器由8个发光二极管组成。基中7个长条形的发光管排列成"日"字形,另一个贺点形的发光管在显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。LED显示器有两种不同的形式:一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED显示器;另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED显示器。如下图所示。`共阴和共阳结构的LED显示器各笔划段名和安排位置是相同的。当二极管导通时,相应的笔划段发亮,由发亮的笔划段组合而显示的各种字符。8个笔划段HGFEDCBA对应于一个字节(8位)的D7 D6 D5 D4 D3 D2 D1 D0,于是用8位二进制码就可以表示欲显示字符的字形代码。例如,对于共阴LED显示器,当公共阴极接地(为零电平),而阳极HGFEDCBA各段为0111011时,显示器显示"P"字符,即对于共阴极LED显示器,"P"字符的字形码是73H。如果是共阳LED显示器,公共阳极接高电平,显示"P"字符的字形代码应为10001100(8CH)。这里必须注意的是:很多产品为方便接线,常不按规则的方法去对应字段与位的关系,这时字形码就必须根据接线来自行设计了。数码管的管脚对照图如附图1(中间两个长的为选通端com,连接只需要连接一个)
设为共阳型,也就是相应的输出位为0时笔段亮,则字型码为:
位选口 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 字型码
显示字符 H E D C G F A B
0 1 0 0 0 1 0 0 0 88H
1 1 1 1 0 1 1 1 0 EEH
2 1 0 0 1 0 1 0 0 94H
3 1 1 0 0 0 1 0 0 C4H
4 1 1 1 0 0 0 1 0 E2H
5 1 1 0 0 0 0 0 1 C1H
6 1 0 0 0 0 0 0 1 81H
7 1 1 1 0 1 1 0 0 ECH
8 1 0 0 0 0 0 0 0 80H
9 1 1 0 0 0 0 0 0 C0H
不亮 1 1 1 1 1 1 1 1 FFH
6、AT89C2051单片机的性能简介
AT89C2051是一个低电压,高性能CMOS 8位单片机,片内含2k bytes的可反复擦写的只读Flash程序存储器和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大AT89C2051单片机可为您提供许多高xxx的应用场合。
AT89C2051是一个功能强大的单片机,但它只有20个引脚,15个双向输入/输出(I/O)端口,其中P1是一个完整的8位双向I/O口,两个外中断口,两个16位可编程定时计数器,两个全双向串行通信口,一个模拟比较放大器。 同时AT89C2051的时钟频率可以为零,即具备可用软件设置的睡眠省电功能,系统的唤醒方式有RAM、定时/计数器、串行口和外中断口,系统唤醒后即进入继续工作状态。省电模式中,片内RAM将被冻结,时钟停止振荡,所有功能停止工作,直至系统被硬件复位方可继续运行。
主要功能特性:
·兼容MCS51指令系统
·15个双向I/O口
·两个16位可编程定时/计数器
· 时钟频率0-24MHz
· 两个外部中断源
· 可直接驱动LED
· 低功耗睡眠功能
· 可编程UARL通道
· 2k可反复擦写(>1000次)Flash ROM
· 6个中断源
· 2.7-6.V的宽工作电压范围                           
· 128x8bit内部RAM
· 两个串行中断
· 两级加密位
· 内置一个模拟比较放大器
· 软件设置睡眠和唤醒功能

7、主要程序设计分析
(1) 主程序  设计中采用定时器T0中断完成,其余状态循环调用显示子程序,当P3.7端口
或者P1.7端口开关按下时,转入调整时间或者调整日期功能程序。系统主流程图如附图2所示:
(2) 显示子程序
数码管显示的数据存放在内存单元70H-75H中,其中70H~71H存放秒数据,72H~73H存放分数据,74H~75H存放时数据,每一地址单元内均为十进制BCD码。由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。显示时,先取出70H~75H某一地址中的数据,然后查的对应的显示段码从P1口输出。P3口将对应的数码管选中,就是显示该地址单元的数据值。
(3) 定时器T0中断服务程序
定时器T0用于时间计时。定时溢出中断周期设为50ms,中断累计20次(即1s)时对秒计数
单元进行加1操作。时间计数单元地址分别在70H~71H(s)、76H~77H(min)、78H~79H(h),7AH单元存放“熄灭符”数据(#0AH)。在计数单元中采用十进制BCD码计数,满60进位。T0中断服务程序流程图3所示。
(4)T1中断服务程序
T1中断服务程序应用于指示调整单元数字的亮闪。在时间调整状态下,每过0.3秒,将对应
单元的显示数据换成熄灭符数据(#0AH)。这样,在调整时间时,对应调整单元的显示数据就会间隔闪亮。
(5)调时功能程序
调时功能程序的设计方法是:按下按键,若按下时间小于1秒,进入省电状态(数码管不亮,
时钟不停),否则进入调分状态,等待操作,此时计时器停止走动。当再次按下按钮时,若按下的时间小于0.5秒,则时间加1分钟;若按下时间大于0.5秒,则进入小时调整状态。在小时调整状态下,当按键按下的时间大于0.5秒时退出调整状态,时钟继续走动。
四、时钟电路硬件设计
数码管时钟电路硬件附图。采用AT98c2051单片机最小化应用设计,LED显示采用动态扫描方式实现,P1口输出段码数据,P3.0-P3.5口作扫描输出,P3.7口接时间按钮开关,P1.7口接日期按钮开关。为了提供LED数码管的驱动电流,用三极管9012作电源驱动输出。实际设计按情况采用11.0592MHz的晶振。
五、程序设计
;  定时器T0、T1溢出周期为50MS,T0为秒计数用, T1为调整时闪烁用,
;  P3.7为调整按钮,P1口 为字符输出口,采用共阳显示管。
; ******************************************
;;          中断入口程序              ;;
; ******************************************
ORG 0000H        ;程序执行开始地址
LJMP      START  ;跳到标号START执行
ORG 0003H        ;外中断0中断程序入口
RETI            ;外中断0中断返回
ORG 000BH        ;定时器T0中断程序入口
LJMP      INTT0  ;跳至INTTO执行
ORG 0013H        ;外中断1中断程序入口
RETI            ;外中断1中断返回
ORG 001BH        ;定时器T1中断程序入口
LJMP      INTT1  ;跳至INTT1执行
ORG 0023H        ;串行中断程序入口地址
RETI            ;串行中断程序返回
; ******************************************
;;          主 程 序                ;;
; ******************************************
            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,#00H  ;50MS定时初值(T0计时用)
                  MOV  TH0,#4CH  ;50MS定时初值
                  MOV  TL1,#00H  ;50MS定时初值(T1闪烁定时用)
                  MOV  TH1,#4CH    ;50MS定时初值
                  SETB  EA            ;总中断开放
                  SETB  ET0            ;允许T0中断
                  SETB  TR0            ;开启T0定时器
                  MOV  R4,#14H        ;1秒定时用初值(50MS×20)
          START1: LCALL DISPLAY        ;调用显示子程序
                  JNB P3.7,SETMM1    ;P3.7口为0时转时间调整程序
                  SJMP  START1        ;P3.7口为1时跳回START1
            SETMM1:      LJMP SETMM    ;转到时间调整程序SETMM
; ******************************************
;;          1秒计时程序              ;;
; ******************************************
;T0中断服务程序
            INTT0: PUSH  ACC          ;累加器入栈保护
                  PUSH  PSW          ;状态字入栈保护
                  CLR  ET0          ;关T0中断允许
                  CLR  TR0          ;关闭定时器T0
                  MOV  A,#0B7H      ;中断响应时间同步修正
                  ADD  A,TL0        ;低8位初值修正
                  MOV  TL0,A        ;重装初值(低8位修正值)
                  MOV  A,#4CH        ;高8位初值修正
                  ADDC  A,TH0        ;
                  MOV  TH0,A        ;重装初值(高8位修正值)
                  SETB  TR0          ;开启定时器T0
                  DJNZ  R4, OUTT0        ;20次中断未到中断退出
          ADDSS:  MOV R4,#14H          ;20次中断到(1秒)重赋初值
                  MOV R0,#71H          ;指向秒计时单元(71H-72H)
                  ACALL ADD1              ;调用加1程序(加1秒操作)
                  MOV  A,R3              ;秒数据放入A(R3为2位十进制数组合)
                  CLR C                ;清进位标志
                  CJNE  A,#60H,ADDMM      ;
          ADDMM:  JC  OUTT0            ;小于60秒时中断退出
                  ACALL CLR0              ;大于或等于60秒时对秒计时单元清0
                  MOV R0,#77H          ;指向分计时单元(76H-77H)
                  ACALL ADD1              ;分计时单元加1分钟
                  MOV A,R3              ;分数据放入A
                  CLR  C                ;清进位标志
                  CJNE  A,#60H,ADDHH      ;
            ADDHH: JC OUTT0            ;小于60分时中断退出
                  ACALL CLR0              ;大于或等于60分时分计时单元清0
                  MOV R0,#79H          ;指向小时计时单元(78H-79H)
                  ACALL ADD1              ;小时计时单元加1小时
                  MOV  A,R3              ;时数据放入A
                  CLR  C                ;清进位标志
                  CJNE  A,#24H,HOUR      ;
            HOUR: JC    OUTT0            ;小于24小时中断退出
                  ACALL CLR0              ;大于或等于24小时小时计时单元清0
            OUTT0: MOV  72H,76H          ;中断退出时将分、时计时单元数据移
                  MOV  73H,77H          ;入对应显示单元
                  MOV  74H,78H          ;
                  MOV  75H,79H          ;
                  POP PSW              ;恢复状态字(出栈)
                  POP  ACC              ;恢复累加器
                  SETB  ET0              ;开放T0中断
                  RETI                    ;中断返回
; ******************************************
;;          闪动调时 程 序            ;;
; ******************************************
;T1中断服务程序,用作时间调整时调整单元闪烁指示
INTT1:          PUSH    ACC                ;中断现场保护
                PUSH    PSW                ;
                MOV    TL1,  #00H      ;装定时器T1定时初值
                MOV    TH1,  #4CH  ;
                DJNZ    R2,INTT1OUT  ;0.3秒未到退出中断(50MS中断6次)
                MOV    R2,#06H      ;重装0.3秒定时用初值
                CPL    02H          ;0.3秒定时到对闪烁标志取反
                JB      02H,FLASH1    ;02H位为1时显示单元"熄灭"
                MOV    72H,76H      ;02H位为0时正常显示
                MOV    73H,77H      ;
                MOV    74H,78H      ;
                MOV    75H,79H      ;
INTT1OUT:      POP    PSW        ;恢复现场
                POP    ACC          ;
                RETI                  ;中断退出
FLASH1:        JB      01H,FLASH2    ;01H位为1时,转小时熄灭控制
                MOV    72H,7AH      ;01H位为0时,"熄灭符"数据放入分
                MOV    73H,7AH      ;显示单元(72H-73H),将不显示分数据
                MOV    74H,78H      ;
                MOV    75H,79H      ;
                AJMP    INTT1OUT      ;转中断退出
FLASH2:        MOV    72H,76H      ;01H位为1时,"熄灭符"数据放入小时
                MOV    73H,77H      ;显示单元(74H-75H),小时数据将不显示
                MOV    74H,7AH      ;
                MOV    75H,7AH      ;
                AJMP    INTT1OUT      ;转中断退出
; ******************************************
;;          加1子 程 序              ;;
; ******************************************
            ADD1: MOV A,@R0      ;取当前计时单元数据到A
                  DEC R0          ;指向前一地址
                  SWAP  A          ;A中数据高四位与低四位交换
                  ORL A,@R0      ;前一地址中数据放入A中低四位
                  ADD A,#01H      ;A加1操作
                  DA A          ;十进制调整
                  MOV  R3,A        ;移入R3寄存器
                  ANL A,#0FH      ;高四位变0
                  MOV @R0,A      ;放回前一地址单元
                  MOV A,R3        ;取回R3中暂存数据
                  INC R0          ;指向当前地址单元
                  SWAP A          ;A中数据高四位与低四位交换
                  ANL A,#0FH      ;高四位变0
                  MOV @R0,A      ;数据放入当削地址单元中
                  RET                  ;子程序返回
; ******************************************
;;          清零程序                  ;;
; ******************************************
;对计时单元复零用
            CLR0: CLR A          ;清累加器
                  MOV @R0,A      ;清当前地址单元
                  DEC R0          ;指向前一地址
                  MOV @R0,A      ;前一地址单元清0
                  RET                      ;子程序返回
; ******************************************
;;          时钟调整程序              ;;
; ******************************************
;当调时按键按下时进入此程序
          SETMM:  cLR  ET0            ;关定时器T0中断
                  CLR  TR0            ;关闭定时器T0
                  LCALL  DL1S          ;调用1秒延时程序
                  JB  P3.7,CLOSEDIS  ;键按下时间小于1秒,关闭显示(省电)
                  MOV  R2,#06H        ;进入调时状态,赋闪烁定时初值
                  SETB ET1            ;允许T1中断
                  SETB TR1            ;开启定时器T1
            SET2:  JNB P3.7,SET1      ;P3.7口为0(键未释放),等待
                  SETB  00H            ;键释放,分调整闪烁标志置1
            SET4:  JB  P3.7,SET3      ;等待键按下
                  LCALL  DL05S          ;有键按下,延时0.5秒
                  JNB    P3.7,SETHH    ;按下时间大于0.5秒转调小时状态
                  MOV R0,#77H        ;按下时间小于0.5秒加1分钟操作
                  LCALL ADD1          ;调用加1子程序
                  MOV A,R3          ;取调整单元数据
                  CLR C              ;清进位标志
                  CJNE A,#60H,HHH    ;调整单元数据与60比较
              HHH: JC SET4          ;调整单元数据小于60转SET4循环
                  LCALL CLR0          ;调整单元数据大于或等于60时清0
                  CLR C              ;清进位标志
                  AJMP  SET4          ;跳转到SET4循环
        CLOSEDIS:  SETB ET0          ;省电(LED不显示)状态。开T0中断
                  SETB TR0          ;开启T0定时器(开时钟)
        CLOSE:    JB  P3.7,CLOSE    ;无按键按下,等待。
                  LCALL DISPLAY      ;有键按下,调显示子程序延时削抖
                  JB    P3.7,CLOSE    ;是干扰返回CLOSE等待
        WAITH:    JNB  P3.7,WAITH    ;等待键释放
                  LJMP  START1        ;返回主程序(LED数据显示亮)
          SETHH:  CLR  00H          ;分闪烁标志xx(进入调小时状态)
          SETHH1:  JNB P3.7,SET5      ;等待键释放
                  SETB        01H            ;小时调整标志置1
            SET6:  JB  P3.7,SET7      ;等待按键按下
                  LCALL  DL05S          ;有键按下延时0.5秒
                  JNB    P3.7,SETOUT    ;按下时间大于0.5秒退出时间调整
                  MOV R0,#79H      ;按下时间小于0.5秒加1小时操作
                  LCALL ADD1            ;调加1子程序
                  MOV A,R3            ;
                  CLR C                ;
                  CJNE A,#24H,HOUU      ;计时单元数据与24比较
            HOUU:  JC SET6            ;小于24转SET6循环
                  LCALL CLR0            ;大于或等于24时清0操作
                  AJMP  SET6            ;跳转到SET6循环
          SETOUT: JNB  P3.7,SETOUT1    ;调时退出程序。等待键释放
                  LCALL DISPLAY          ;延时削抖
                  JNB  P3.7,SETOUT      ;是抖动,返回SETOUT再等待
                  CLR  01H              ;清调小时标志
                  CLR  00H              ;清调分标志
                  CLR  02H              ;清闪烁标志
                  CLR  TR1              ;关闭定时器T1
                  CLR  ET1              ;关定时器T1中断
                  SETB  TR0              ;开启定时器T0
                  SETB  ET0              ;开定时器T0中断(计时开始)
                  LJMP START1          ;跳回主程序
            SET1:  LCALL    DISPLAY          ;键释放等待时调用显示程序(调分)
                  AJMP    SET2            ;防止键按下时无时钟显示
            SET3:  LCALL    DISPLAY          ;等待调分按键时时钟显示用
                  AJMP    SET4
            SET5:  LCALL    DISPLAY          ;键释放等待时调用显示程序(调小时)
                  AJMP    SETHH1          ;防止键按下时无时钟显示
            SET7:  LCALL    DISPLAY          ;等待调小时按键时时钟显示用
                  AJMP    SET6
        SETOUT1:  LCALL    DISPLAY          ;退出时钟调整时键释放等待
                    AJMP    SETOUT          ;防止键按下时无时钟显示
; ******************************************
;;          显示程序                  ;;
; ******************************************
; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P1口输出段码数据,P3口作
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。
          DISPLAY: MOV R1,#70H      ;指向显示数据首址
                  MOV R5,#0FEH      ;扫描控制字初值
            PLAY: MOV A,R5          ;扫描字放入A
                  MOV P3,A          ;从P3口输出
                  MOV A,@R1        ;取显示数据到A
                  MOV DPTR,#TAB    ;取段码表地址
                  MOVC A,@A+DPTR    ;查显示数据对应段码
                  MOV P1,A          ;段码放入P1口
                  LCALL DL1MS        ;显示1MS
                  INC R1            ;指向下一地址
                  MOV A,R5            ;扫描控制字放入A
                  JNB ACC.5,ENDOUT    ;ACC.5=0时一次显示结束
                  RL A              ;A中数据循环左移
                  MOV R5,A            ;放回R5内
                  AJMP PLAY            ;跳回PLAY循环
          ENDOUT: SETB P3.5            ;一次显示结束,P3口复位
                  MOV P1,#0FFH      ;P1口复位
                  RET                      ;子程序返回
            TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;共阳段码表          "0""1""2""3""4""5""6""7""8""9""不亮"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;          延时程序                  ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;1MS延时程序,LED显示程序用
            DL1MS: MOV R6,#14H
            DL1:  MOV R7,#19H
            DL2:  DJNZ R7,DL2
                    DJNZ R6,DL1
                    RET
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
          DS20MS: ACALL DISPLAY
                  ACALL DISPLAY
                  ACALL DISPLAY
                  RET
;延时程序,用作按键时间的长短判断
          DL1S:  LCALL      DL05S
                  LCALL      DL05S
                  RET
          DL05S:  MOV        R3,#20H      ;8毫秒*32=0.196秒
          DL05S1:  LCALL      DISPLAY
                  DJNZ      R3,DL05S1
                  RET
                  END                    ;程序结束

<#--{zx1}日志--> <#--推荐日志--> <#--引用记录--> <#--相关日志--> <#--推荐日志--> <#--推荐阅读--> <#--相关文章 2010.04.29="" by="" yangfan--=""> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构-->
郑重声明:资讯 【LED数码管电子时钟电路- bg3nde的日志- 网易博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——