单片机课程设计数字钟实验报告

单片机课程设计:电子钟

一、    实现功能

1、         能够实现准确计时,以数字形式显示时、分、秒的时间。

2、         小时以24小时计时形式,分秒计时为60进位,能够调节时钟时间。

3、         闹钟功能,一旦走时到该时间,能以声或光的形式告警提示。

4、         能够实现按键启动与停止功能。

5、         能够实现整点报时功能。

6、         能够实现秒表功能。

二、设计思路

1、芯片介绍

    

    VCC:电源。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程 序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

  P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作 输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。

    P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻 拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存 储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器 的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

  P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:

口管脚 备选功能

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(外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器 时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。

  PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

EA/VPP:当/EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时, /EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

2、显示电路

就时钟而言,通常可采用液晶显示或数码管显示。由于一般的段式液晶屏,需要专门的驱动电路,而且液晶显示作为一种被动显示,可视性相对较差;对于具有驱动电路和微处理器接口的液晶显示模块(字符或点阵),一般多采用并行接口,对微处理器的接口要求较高,占用资源多。另外,89C2051本身无专门的液晶驱动接口,因此,本时钟采用数码管显示方式。数码管作为一种主动显示器件,具有亮度高、价格便宜等优点,而且市场上也有专门的时钟显示组合数码管。

对于实时时钟而言,显示显然是另一个重要的环节。通常LED显示有两种方式:动态显示和静态显示。

静态显示的优点是程序简单、显示亮度有保证、单片机CPU的开销小,节约CPU的工作时间。但占有I/O口线多,每一个LED都要占有一个I/O口,硬件开销大,电路复杂。需要几个LED就必须占有几个并行口,比较适用于LED数量较少的场合。当然当LED数量较多的时候,可以使用单片机的串行口通过移位寄存器的方式加以解决,但程序编写比较麻烦。

LED动态显示硬件连接简单,但动态扫描的显示方式需要占有CPU较多的时间,在单片机没有太多实时测控任务的情况下可以采用。

本系统需要采用6位LED数码管来分别显示时、分、秒,因数码管个数较多,故本系统选择动态显示方式。

       此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:显示电路用6个共阴数码管分别显示,小时、分钟和秒,通过动态扫描进行显示,从而避免了译码器的使用,同时节约了I/0端口,使电路更加简单。单片机采用AT89S51系列,这种单片机应用简单,适合电子钟设计。

针对要实现的功能,采用AT89S51单片机进行设计,AT89S51单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。这样,既能做到经济合理又能实现预期的功能。

在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。程序可分为闹钟的声音程序、时间显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序、整点报时等。运用这种方法,关键在于各模块的兼容和配合,以免各模块不匹配会出现意想不到的错误。

首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第二部分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。第三部分是软件部分:先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。第四部分是软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。在已经正确的设计基础上,添加额外的功能!

在设计的的过程中,主要采用分块设计的方法,进行分块调试在进行整体组合。在设计实时显示时间和秒表时主要是时间的计算,才能精确计时间,和两个定时器的优先级问题才能进行两个模块的切换。

三、设计流程图

四、设计功能模块

1、         时间调整模块

s4按键按下(p1.3)进入时间调整状态,判断S4键,若再次按下开始进行小时调整,每次按下s4键时小时加一,若S4键未按下判断S0键(p1.4)是否按下,若S0键按下,分钟加一,若S0未按下,判断S1键,若s1键按下,返回主程序,进行时间与闹钟的切换。

2、         闹钟模块

若S0键按下,开启闹钟,进入闹钟判断模块,若满足闹钟的分钟与时钟的分钟相等,并且闹钟的小时与时钟的小时相等,进入喇叭响应模块。S0键释放则关闭闹钟。

3、             秒表模块

若S2键(P1.1)按下,进入秒表模块,显示秒表初始值。若S5键(p3.0)按下,显示秒表初始值并开始秒表计时。若弹起S5键则停止秒表计数并复位。若弹起S2键重新进行时间显示。

4、             整点报时模块

26H中存放整点报时的标志位,若时间模块中存放分钟的地址中数为60,则将存放小时的数传递给A并使A自增1,若A不等于0,,进入喇叭响应模块,若A为0返回主程序。

5、              时钟定时模块

定时50ms,定时为T0方式1,初始值TH0=3CH   TL0=0B0H,

X=216-50X0.001/0.000001=15536

6、          秒表定时模块

由于使用两个定时器,T0的自然优先级高于T1的,所以在执行秒表按键时,T1的优先级应高于T0,应对IP进行设置,使IP为08H。定时10ms,定时为T1方式1,初始值TH0=0FCH   TL0=18H,

X=216-10X0.001/0.000001=64536

7、           

延时模块

 延时25ms

DELAY:   MOV R4,#015H

DL00:    MOV R5,#0FFH

DL11:    MOV R6,#9H

DL12:    DJNZ R6,DL12

         DJNZ R5,DL11

         DJNZ R4,DL00

    RET

四、    proteus程序仿真图

五、    仿真结果分析

通过S1、S0、S3和S4四个按键,对时间进行修改和闹钟的设置,S0控制闹钟的启动和停止。通过S2来进入秒表模式,按下S5进行秒表正确计时。弹起

S5和S2进入时间显示。

按下S1键显示闹钟,松开后显示时间;按 进入时间修改模式,再按S4键时间的时加1,按S2分加1,调整结束后按下S1恢复正常显示;按下S3键进入闹钟修改模式,再按S3键闹钟的时加1,按S2分加1,调整结束后按下S1恢复正常显示。

六、    设计心得体会

本次课程设计,即将告一段落,但收获却是弥足珍贵。一分耕耘,一分收获。部亲自去尝试,你很难去体验那份开心。我们经过了这半年对单片机由一无所知到逐步了解,现在开始了一些小的制作。课程设计是一项好的方向,让我们去自我提高,很有裨益。

实验开始前,同组的同伴就开始了收集资料,尝试着去努力实现一些功能。起初,我对单片机知道很少,还是经过看看细节性的东西,才渐渐有些入门。当然,实验的过程中也遇到了许多的难题。

1、实现电子钟的数码显示,在这一过程中,显示部分总是会出现这样那样的问题。

2、按键问题

我的设计中,大部分功能选择是通过按键开关实现的。在仿真中发现,调整数值时,有时按键反应太快,按一次,跳了几下,使设置时间很不方便。但是仿真多了之后,找到了按键(实际上是按鼠标)的节奏,对按键的掌控力提高了不少,不怎么会出现跳变的情况了。有些开关我采用了长按键的方式来防抖,效果不错,但是每次都要长按键,调整效率太低,我没有普及。本来想把所有的按键都加延时防抖电路,但仿真中感觉对键盘的控制力没提高多少。

3、定时/计数器的使用问题。

   在实验过程中多次运用到定时器T0\T1,我们在使用时忽略了中断的优先级,从而使同级的中断存在时,而不能很好 的达到目的。

程序:

       ORG 0000H

       LJMP START

       ORG 000BH

       LJMP TIME

    ORG 001BH

       LJMP TIMEA

;********初始化*********

START:   MOV SP, #50H

            MOV 20H,#00H             ;定义秒

            MOV 21H,#00H             ;定义分

         MOV 22H,#00H             ;定义时

         MOV 23H,#01H             ;定义闹钟分钟

         MOV 24H,#01H             ;定义闹钟小时

         MOV 25H,#00H                                     

            MOV 26H,#00H

         MOV 30H,#00H             ;时间SECOND送显缓冲区

         MOV 31H,#00H

         MOV 32H,#00H             ;时间MINUTE送显缓冲区

         MOV 33H,#00H

         MOV 34H,#00H             ;时间HOUR送显缓冲区

         MOV 35H,#00H

         MOV 36H,#01H                   ;闹钟分钟送显缓冲区

         MOV 37H,#00H

         MOV 38H,#01H                   ;闹钟小时十位送显缓冲区

         MOV 39H,#00H                   ;闹钟小时个位送显缓冲区

            MOV 50H,#00H                      ;按键次数

               MOV 27H,#00H                  ;秒表最低两位

               MOV 28H,#00H                  ;秒表秒计数单元

               MOV 29H,#00H                  ;秒表分计数单元

               MOV TMOD,#11H            ;16位计数器

         MOV TH0, #03CH           ;赋初值

         MOV TL0, #0B0H

               MOV TH1, #0FCH           ;赋初值

         MOV TL1, #018H

         MOV IE,  #8AH            ;中断允许

         SETB TR0                 ;启动T0

         MOV R2,#14H

               MOV R1,#0AH

         MOV P2,#0FFH

;*********主程序**********

MAIN:   

         JB P1.4,GB

         LCALL TIMEPRO                           ;调用闹钟判断

GB:              LCALL DISPLAY1                          ;调用时间显示

         JB P1.3,M1                    ;P1.3=1时转移    S4没有按下

         LCALL SETTIME                 ;调用SETTIME调时子程序

         LJMP MAIN

M1:      JB P1.2,M2                    ;P1 g.2=1时转移   S3

         LCALL SETATIME                ;调用SETATIME子程序

         LJMP MAIN

M2:      JB P1.0,M4                    ;P1.01时转移 S1

         LCALL LOOKATIME               ;调用LOOKATIME显示闹钟子程序

         LJMP MAIN

M4:            JB P1.1,M5                                   ;P1.11时转移主程序

         LCALL DISPLAY1                ;调用秒表显示

         LCALL LOOK           

M5:      LJMP MAIN

;*********存时间程序**********

M7:     MOV       A,20H

        MOV    B,#0AH

        DIV    AB

        MOV    31H,A                  ;A的低4位存入31单元

        MOV    30H,B                  ;A的高4位存入30单元

           MOV    A,21H

        MOV    B,#0AH

        DIV    AB

        MOV    33H,A                 ;A的低4位存入33单元

        MOV    32H,B                 ;A的高4位存入32单元

        MOV        A,22H

        MOV     B,#0AH

        DIV     AB

        MOV     35H,A               ;A的低4位存入35单元

        MOV     34H,B

M8:             RET

;*********秒表送出始值到显示缓冲区**********

MJ:       MOV 27H,#00H

               MOV 28H,#00H

               MOV 29H,#00H

         MOV     A,27H

         MOV    B,#0AH

         DIV    AB

         MOV    31H,A                 ;A的低4位存入31单元

         MOV    30H,B                 ;A的高4位存入30单元

            MOV    A,28H

         MOV    B,#0AH

         DIV    AB

         MOV    33H,A                 ;A的低4位存入33单元

         MOV    32H,B                 ;A的高4位存入32单元

         MOV      A,29H

         MOV     B,#0AH

         DIV     AB

         MOV     35H,A                ;A的低4位存入35单元

         MOV     34H,B

MK:             RET  

;*********延时子程序********

LOOK:     LCALL DISPLAY1

 MM1:     JNB P3.0,LER

           LCALL M7

                 LCALL MJ

           CLR TR1                                   

                 CLR PT1

                LCALL DISPLAY1

                LJMP M6 

LER:      MOV IP,#08H

          SETB TR1

          LCALL DISPLAY1

M6:               RET

;***********时间调整*******

SETTIME:                                   ;设置时间

L0:      LCALL DISPLAY1

         JB P1.3,L1            ;P1.3=1时转移

         MOV C,P1.3

         JC MM1

         LCALL  DELAY1         ;延时

         JC MM1

MSTOP1:  MOV C,P1.3              ;P1.30时转移

         JNC MSTOP1                     

         LCALL DELAY1              ;延时

               MOV A,50H

               INC 50H                      

               CJNE A,#00H,HJ1

           LJMP L0

HJ1:    

         INC 22H               ;小时自加一

         MOV A,22H

         CJNE A,#18H,GO12     ;小时计数循环 

         MOV 22H,#00H           ;复位

         MOV 34H,#00H

         MOV 35H,#00H

         LJMP L0

L1:      JB P1.4,L2           ;P1.1=1时转移

         MOV C,P1.4

         JC L1

         LCALL  DELAY1        ;延时

         JC L1

MSTOP2:  MOV C,P1.4               ;P1.10时转移

         JNC MSTOP2    

         LCALL DELAY1         ;延时

         MOV  C,P1.4

         JNC  MSTOP2

         INC 21H              ;分钟加一

         MOV A,21H

         CJNE A,#3CH,GO11     ;分钟计数循环

         MOV 21H,#00H         ; 复位

         MOV 32H,#00H

         MOV 33H,#00H

         LJMP L0

GO11:   MOV B,#0AH

         DIV AB

         MOV 32H,B             ; A的低4位存入32单元

         MOV 33H,A             ; A的高4位存入33单元

         LJMP L0

GO12:    MOV B,#0AH

         DIV AB

         MOV 34H,B             ;A的低4位存入34单元

         MOV 35H,A             ;  A的高4位存入35单元

         LJMP L0

L2:      JB P1.0,L0           ;  P1.01时转移

         MOV C,P1.0

         JC  L2

         LCALL  DELAY1         ;延时

         MOV  C,P1.0

         JC  L2

STOP1:   MOV  C,P1.0               ; P1.00时转移

         JNC STOP1              

         LCALL  DELAY1         ;延时

         MOV  C,P1.0

         JNC STOP1

               MOV 50H,#00H

 MMM:    LJMP  MAIN

;*******设置闹钟*******

SETATIME:LCALL DISPLAY2       ; 调用DISPLAY2显示闹钟

N0:      LCALL DISPLAY2

MM2:     JB P1.2,N1           ;P1.2=1时转移

         MOV C,P1.2

         JC MM2

         LCALL  DELAY1        ;  延时

         JC MM2

MSTOP3:  MOV C,P1.2                  ; P1.20时转移

         JNC MSTOP3                         

         LCALL DELAY1         ; 延时

               MOV A,50H

               INC 50H

               CJNE A,#00H,HJ2

         LJMP N0

HJ2:    

         INC 24H              ;小时加一

         MOV A,24H

         CJNE A,#24,GO22      ;小时计数循环

         MOV 24H,#00H         ;复位

         MOV 38H,#00H

         MOV 39H,#00H

         LJMP N0

N1:      JB P1.4,N2           ;P1.11时转移

         MOV C,P1.4

         JC N1

         LCALL  DELAY1        ;延时

         JC N1

MSTOP4:  MOV C,P1.4                  ;P1.10时转移

         JNC MSTOP4                         

         LCALL DELAY1         ;延时

         MOV  C,P1.4

         JNC  MSTOP4

         INC 23H              ;分钟加一

         MOV A,23H

         CJNE A,#60,GO21      ;分钟计数循环

         MOV 23H,#00H         ;复位

         MOV 36H,#00H

         MOV 37H,#00H

         LJMP N0

GO21:    MOV  B,#0AH

         DIV  AB

         MOV  36H,B          ;A的低4位存入36单元

         MOV  37H,A          ;A的高4位存入37单元

         LJMP N0

GO22:    MOV  B,#0AH

         DIV  AB

         MOV  38H,B         ;A的低4位存入38单元

         MOV  39H,A         ;A的高4位存入39单元

         LJMP N0

N2:      JB P1.0 ,N0        ;P1.01时转移

         MOV C,P1.0

         JC  N2

         LCALL  DELAY1       ;延时

         MOV  C,P1.0

         JC  N2

STOP2:   MOV  C,P1.0

         JNC STOP2

         LCALL  DELAY1

         MOV  C,P1.0

         JNC STOP2

               MOV 50H,#00H

         LJMP MAIN

;*******闹钟判断*****************

TIMEPRO: MOV A,21H

         MOV B,23H

         CJNE A,B,BK           ;判断定时闹钟的分钟

         MOV A,22H

         MOV B,24H

         CJNE A,B,BK          ;判断定时闹钟的小时

         SETB 25H.0

         MOV C,25H.0

         LCALL TIMEOUT        ;调用TIMEOUT

      BK:RET

;**************喇叭报警*****************

TIMEOUT: CLR  26H

     X1: LCALL BZ            ;调用喇叭响应程序

         CLR 25H.0           ;调用喇叭响应程序结束

         LCALL    DELAY                 ;延时

         CLR 25H.0

         LJMP DISPLAY1         

     BZ:MOV C,25H.1

        MOV P1.6,C

         CLR P1.7

         MOV R7,#0FFH        ;喇叭响应时间

     T2: MOV R6,#0FFH

     T3: DJNZ R6,T3

         DJNZ R7,T2

         SETB P1.7

         RET

;*************显示闹钟时间************

LOOKATIME:LCALL DISPLAY2

 MM:      JNB P1.0,LOOKATIME 

          LCALL  DELAY1

          LJMP  MAIN

DELAY1:   MOV  R4,#15H             ;时间延时

DL001:    MOV  R5,#0FFH

DL111:    DJNZ R5,DL111

          DJNZ R4,DL001

          RET

;***********定时**************

TIME:   PUSH ACC                       ;保护现场

        PUSH PSW

        MOV     TH0,#03CH                  ;初值

        MOV    TL0,#0B0H

           DJNZ R2,RET0

           MOV R2,#14H

           MOV A,20H

          

           INC  A                         ;秒自加一

       CJNE   A,#3CH,GO1             ;秒计数循环

          MOV 20H,#0                     ;复位

        MOV 30H,#0

        MOV 31H,#0

           MOV A,21H

           INC  A                          ;分钟自加一

        CJNE A,#3CH,GO2

              SETB 26H

              JB 26H,AA

       AA:LCALL TIMEOUT1

          CLR  26H                       ;分钟计数循环

        MOV  21H,#0H                  ;复位

        MOV  32H,#0

        MOV  33H,#0

           MOV   A,22H

           INC      A                       ;小时自加一

           CJNE  A,#18H,GO3              ;小时计数循环

           MOV   22H,#00H                ;复位

        MOV   34H,#0

        MOV   35H,#0

           AJMP  RET0

GO1:    MOV       20H,A

        MOV    B,#0AH

        DIV    AB

        MOV    31H,A                  ;A的低4位存入31单元

        MOV    30H,B                  ;A的高4位存入30单元

           AJMP   RET0

GO2:    MOV    21H,A

        MOV    B,#0AH

        DIV    AB

        MOV    33H,A                 ;A的低4位存入33单元

        MOV    32H,B                 ;A的高4位存入32单元

       AJMP   RET0

GO3:    MOV        22H,A

        MOV     B,#0AH

        DIV     AB

        MOV     35H,A               ;A的低4位存入35单元

        MOV     34H,B               ;A的高4位存入34单元

           AJMP   RET0

RET0:   POP PSW                       ;恢复现场

        POP ACC

        RETI

TIMEOUT1:

         MOV R1,22H

                INC R1 

X11:     LCALL BZ1

            LJMP DISPLAY1           ;调用喇叭响应程序

         LCALL DELAY2

         LJMP DISPLAY1         

BZ1:     MOV C,25H.1

         MOV P1.6,C

         CLR P1.7

         MOV R7,#0FFH            ;喇叭响应时间

T21:     MOV R6,#0FFH

T31:     DJNZ R6,T31

         DJNZ R7,T21

         SETB P1.7

               DJNZ R1,X11

         RET

DELAY:   MOV R4,#015H

DL00:    MOV R5,#0FFH

DL11:    MOV R6,#9H

DL12:    DJNZ R6,DL12

         DJNZ R5,DL11

         DJNZ R4,DL00

         RET

;*********秒表定时**********

TIMEA:

        MOV     TH1,#0FCH                  ;初值

        MOV    TL1,#018H

           DJNZ R1,RET0

           MOV R1,#0AH

           MOV A,27H

        INC  A                        ;毫秒自加一

       CJNE   A,#60H,GO1A           ;毫秒秒计数循环

          MOV 27H,#0                    ;复位

        MOV 30H,#0

        MOV 31H,#0

           MOV A,28H

           INC  A                        ;秒自加一

        CJNE A,#3CH,GO2A

           MOV  28H,#0H                  ;复位

        MOV  32H,#0

        MOV  33H,#0

           MOV   A,29H

           INC      A                        ;分钟自加一

           CJNE  A,#3CH,GO3A              ;分钟计数循环

           MOV   29H,#00H                 ;复位

        MOV   34H,#0

        MOV   35H,#0

           AJMP  RET0

GO1A: MOV       27H,A

        MOV    B,#0AH

        DIV    AB

        MOV    31H,A                  ;A的低4位存入31单元

        MOV    30H,B                  ;A的高4位存入30单元

           AJMP   RET0

GO2A:   MOV    28H,A

        MOV    B,#0AH

        DIV    AB

        MOV    33H,A                 ;A的低4位存入33单元

        MOV    32H,B                 ;A的高4位存入32单元

       AJMP   RET0

GO3A: MOV        29H,A

        MOV     B,#0AH

        DIV     AB

        MOV     35H,A                ;A的低4位存入35单元

        MOV     34H,B                ;A的高4位存入34单元

           AJMP   RET0

RET0A: 

        RETI

;********显示子程序**********

DISPLAY1:

            MOV    R0,#30H

            MOV   R3,#0FEH

            MOV   A,R3

PLAY1:      MOV   P2,A

            MOV   A,@R0                ;取要显示的数据

            MOV   DPTR,#DSEG1          ;指向字形段码首地址

            MOVC  A,@A+DPTR

            CJNE R0,#34H,PA

            ORL A,#80H

PA:         CJNE R0,#32H,PB

            ORL A,#80H 

PB:         CPL A                   ;查表取字形段码

            MOV   P0,A                 ;指向P0

            LCALL DL1

            MOV    P2,#0FFH

            MOV   A,R3               ;判断是否显示到最低位

            RL    A                   ;左移一位

            JNB    ACC.6,LD1

            INC    R0                 ;缓冲器地址加一

            MOV   R3,A

            LJMP  PLAY1

LD1:        RET

;*********闹钟显示区**********

DISPLAY2:   PUSH ACC                  ;保护现场

            PUSH PSW

            MOV    R0,#36H

               MOV       R3,#0FBH

               MOV   A,R3

PLAY2:      MOV   P2,A

            MOV   A,@R0              ;取要显示的数据

            MOV   DPTR,#DSEG1        ;指向字形段码首地址

            MOVC  A,@A+DPTR

            CJNE R0,#38H,PP

            ORL A,#80H

PP:         CPL A                    ;查表取字形段码

            MOV   P0,A               ;指向P0

            LCALL DL1                ;调用DL1

            MOV   P2,#0FFH

            MOV   A,R3               ;判断是否显示到最低位

            RL    A                  ;左移一位

            JNB    ACC.6,LD2

            INC    R0                ;缓冲器地址加一

            MOV   R3,A

            LJMP  PLAY2              ;调用PLAY2

LD2:        POP   PSW

            POP ACC                   ;恢复现场

            RET

;*********延时子程序**********

DELAY2:   MOV R4,#0FFH

                LCALL DISPLAY1     

DL002:    MOV R5,#0FFH

DL112:    MOV R6,#0FFH

                LCALL DISPLAY1

DL132:     MOV R3,#0FFH  

DL122:    DJNZ R3,DL122

          DJNZ R6,DL132

                DJNZ R5,DL112

                DJNZ R4,DL002

          RET

DL1:        MOV     R7,#20H

DL:        MOV   R6,#20H

DL6:        DJNZ  R6,$

              DJNZ  R7,DL

              RET

DSEG1:     DB 3FH,06H,5BH,4FH,66H     ;七段码表

           DB 6DH,7DH,07H,7FH,6FH

            END

相关推荐