单片机电子时钟课程设计设计报告

单片机电子时钟设计

一、作品功能介绍

该作品是个性化电子钟设计,技术上主要用单片机(AT89S52)主控,6位LED数码显示,分别显示“小时:分钟:秒”。该作品主要用于24小时计时显示,能整时报时,能作为秒表使用,能定时闹铃1分钟。

功能介绍:

(1)上电以后自动进入计时状态,起始于00:00:00。

(2)设计键盘调整时间,完成时间设计,并设置闹钟。

(3)定时时间为1/100秒,可采用定时器实现。

(4)采用LED数码管显示,时、分,秒采用数字显示。

(5)采用24小时制,具有方便的时间调校功能。

(6)具有时钟和秒表的切换功能。  

使用方法:

开机后时钟在00:00:00起开始计时。

(1)长按P3.2进入调分状态:分单元闪烁,按P3.2加1,按P3.3减1.再长按P3.2进入        时调整状态,时单元闪烁,加减调整同调分.按长按退出调整状态。

(2)(2)按P3.3进入设定闹时状态: 12:00: ,可进行分设定,按P3.4分加1,再按P3.2为时调整,按P3.4时加1,按P3.3调闹钟结束.在闹铃时可按P3.2停闹,不按闹铃1分钟。

(3)按下P3.4进入秒表状态:再按P3.4秒表又启动,按P3.4暂停,再按P3.4秒表清零,按P3.4退出秒表回到时钟状态。

二、电路原理图

     如原理图所示,硬件系统主要由单片机最小应用系统、LED数码管显示模块、电源模块、晶振模块、按键模块等组成。

电子时钟原理图

各个模块设计

1.单片机系统                          AT89S52              AT89S52概述:是一款非常适合单片机初学者学习的单片机,它完全兼容传统的8051,8031的指令系统,他的运行速度要比8051快最高支持达33MHz的晶体震荡器,在此系统中使用12MHz的晶振。

AT89S52具有以下标准功能: 8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止……

主要性能:与MCS-51单片机产品兼容 、8K字节在系统可编程Flash存储器、 1000次擦写周期、 全静态操作:0Hz~33Hz 、 三级加密程序存储器 、 32个可编程I/O口线 、三个16位定时器/计数器 八个中断源 、全双工UART串行通道、 低功耗空闲和掉电模式 、掉电后中断可唤醒、看门狗定时器 、双数据指针 、掉电标识符 。

2、显示模块 

LED数码管是由发光二极管构成的,亦称半导体数码管。将条状发光二极管按照共阴极(负极)或共阳极(正极)的方法连接,组成“8”字,再把发光二极管另一电极作笔段电极,就构成了LED数码管。若按规定使某些笔段上的发光二极管发光,就能显示从0~9的…系列数字。同荧光数码管(VFD)、辉光数码管(NRT)相比,它具有:体积小、功耗低、耐震动、寿命长、亮度高、单色性好、发光响应的时间短,能与TTL、CMOS电路兼容等的数显器件。+、-分别表示公共阳极和公共阴极。a~g是7个笔段电极,DP为小数点。另有一种字高为7.6mm的超小型LED数码管,管脚从左右两排引出,小数点则是独立的。                              

本系统利用6位LED数码管显示时间,共阴极结构。LED数码管由7段发光二极管组成,当要显示某个数字时只要将数字所对应的引脚送入低电平。

 3.按键模块

     本设计中主要有三个控制按键,按键功能为:

(1)P3.2为调时间模式,长按P3.2进入调分状态:分单元闪烁,按P3.2加1,按P3.3减1.再长按P3.2进入时调整状态,时单元闪烁,加减调整同调分.按长按退出调整状态。

(2)按P3.3进入设定闹时状态: 12:00: ,可进行分设定,按P3.4分加1,再按P3.2为时调整,按P3.4时加1,按P3.3调闹钟结束.在闹铃时可按P3.2停闹,不按闹铃1分钟。

(3)按下P3.4进入秒表状态:再按P3.4秒表又启动,按P3.4暂停,再按P3.4秒表清零,按P3.4退出秒表回到时钟状态。

4.晶振模块

在AT89S51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。

晶振电路             

三、程序设计

源程序代码

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;           AT89S52时钟程序         ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

*****************************************************************定时器T0、T1溢出周期为50MS,T0为秒计数用, T1为调整时闪烁及秒表定时用,

P3.2、P3.3、P3.4为调整按钮,P0口为字符输出口,P2为扫描口,P1.2为蜂呜器口,采

用共阳显示管。

50H-55H为闹钟定时单元,60H-65H为秒表计时单元,70H-75H为显示时间单元,76H-79H

为分时计时单元。

03H标志=0时钟闪烁,=1秒表,    05H=0,不闹铃,=1要闹铃.    07H每秒改变一次,

用作间隔呜叫.

*****************************************************************

           DISPFIRST  EQU  30H     ;显示首址存放单元

           BELL   EQU   P1.2

           CONBS      EQU  2FH     ;存放报时次数

           CLOCK      EQU  2DH

****************************************

           中断入口程序             

****************************************

              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             ;串行中断程序返回

****************************************

以下程序开始                 ;;

****************************************

整点报时用

             QQQQ: MOV  A,#10H

                   MOV  B,79H

                   MUL  AB

                   ADD  A,78H

                   MOV  CONBS,A

           BSLOOP: LCALL DS21MS

                   LCALL DL1S

                   LCALL DL1S

                   LCALL DL1S

                   DJNZ CONBS,BSLOOP

                   CLR   08H          ;清整点报时标志

                   AJMP  START1

****************************************

          主程序开始                 ;;

****************************************

            START: LCALL ST             ;上电显示00:00:00

                   MOV   R0,#00H        ;清00H-7FH内存单元

                   MOV   R7,#80H        ;

       CLEARDISP:  MOV   @R0,#00H      ;

                   INC   R0             ;

                   DJNZ  R7,CLEARDISP   ;

                   MOV   20H,#00H       ;清20H(标志用)

                   MOV   55H,#1

                   MOV   54H,#2

                   MOV   7AH,#0AH       ;放入"熄灭符"数据

                   MOV  TMOD,#11H      ;设T0、T1为16位定时器

                   MOV   TL0,#0B0H      ;50MS定时初值(T0计时用)

                   MOV   TH0,#3CH       ;50MS定时初值

                   MOV   TL1,#0B0H      ;50MS定时初值(T1闪烁定时用)

                   MOV   TH1,#3CH       ;50MS定时初值

                   SETB  EA             ;总中断开放

                   SETB  ET0            ;允许T0中断

                   SETB  TR0            ;开启T0定时器

                   MOV   R4,#14H        ;1秒定时用计数值(50MS×20)

                   MOV   DISPFIRST,#70H ;显示单元为70-75H

;以下主程序循环

           START1: LCALL DISPLAY        ;调用显示子程序

                   JNB  P3.2,SETMM1    ;P3.2口为0时转时间调整程序

                   JNB   P3.3,TSFUN     ;定时闹铃设定

                   JNB   P3.4,FUNPT     ;秒表功能(STOP,RUN,CLR)

                   JB   08H,  QQQQ

                   AJMP  START1         ;P3.2口为1时跳回START1

           FUNPT:   LJMP  FUNPTT

         START12:   LJMP  START1

以下闹铃时间设定程序,按P3.3进入设定

           TSFUN:  LCALL DS20MS

                   JB    P3.3,START1     ;

         WAIT113:  JNB   P3.3,WAIT113    ;等待键释放

                   JB   05H,CLOSESP      ;闹铃已开的话,关闹铃

                   MOV   DISPFIRST,#52H  ;进入闹铃设定程序,显示52-55H闹钟定时单元

         DSWAIT:   SETB   EA

                   LCALL DISPLAY

                   JNB  P3.4,DSFINC       ;分加1

                   JNB  P3.2,DSDEC        ;分减1

                   JNB  P3.3,DSSFU        ;进入时调整

                   AJMP DSWAIT

          CLOSESP: CLR  05H              ;关闹铃标志

                   CLR  BELL                                    

                   AJMP  START1

           DSSFU:  LCALL DS20MS          ;消抖

                   JB    P3.3, DSWAIT

                   LJMP  DSSFUNN         ;进入时调整

;           SETMM1: LJMP  SETMM       ;转到时间调整程序SETMM

        DSFINC :   LCALL  DS20MS          ;消抖

                   JB     P3.4, DSWAIT

        DSWAIT12: LCALL   DISPLAY         ;等键 释放

                  JNB   P3.4, DSWAIT12

                  CLR    EA

                  MOV    R0,#53H            ;

                  LCALL  ADD1               ;闹铃设定分加1

                  MOV    A,R3              ;分数据放入A

                  CLR   C                 ;清进位标志

                  CJNE  A,#60H,ADDHH22      ;

        ADDHH22:  JC    DSWAIT             ;小于60分时返回

                  ACALL  CLR0               ;大于或等于60分时分计时单元清0

                  AJMP   DSWAIT

         DSDEC :  LCALL  DS20MS             ;消抖

                   JB  P3.2, DSWAIT

        DSWAITEE: LCALL  DISPLAY            ;等键 释放

                  JNB    P3.2, DSWAITEE

                  CLR    EA

                  MOV    R0,#53H            ;

                  LCALL  sub1               ;闹铃设定分减1

                  LJMP  DSWAIT

;以下秒表暂停\清零功能程序

;按下P3.4切换秒表功能,再按开始计时,暂停或清0,最后按P3.4退出秒表回到时钟计时

           FUNPTT: LCALL   DS20MS

                   JB      P3.4,START12

        WAIT22:    JNB     P3.4,WAIT21

                   CPL   03H

                   JNB   03H,TIMFUN

                   MOV   DISPFIRST,#60H  ;显示秒表数据单元

                   MOV   60H,#00H

                   MOV   61H,#00H

                   MOV   62H,#00H

                   MOV   63H,#00H

                   MOV   64H,#00H

                   MOV   65H,#00H

                   MOV   TL1,#0F0H      ;10MS定时初值

                   MOV   TH1,#0D8H      ;10MS定时初值

         WAIT88:LCALL   DS20MS

                JB     P3.4,WAIT81

         WAIT99:JNB    P3.4,WAIT99

                   SETB    TR1           ;T1运行控制软件

                   SETB    ET1           ;T1溢出中断允许

        WAIT33:    LCALL  DS20MS

                   JB     P3.4,WAIT31

        WAIT44:    JNB    P3.4,WAIT41

                   CLR    ET1

                   CLR    TR1

        WAIT55:   LCALL  DS20MS

                   JB    P3.4,WAIT51

        WAIT66:    JNB   P3.4,WAIT61

                   MOV   60H,#00H

                   MOV   61H,#00H

                   MOV   62H,#00H

                   MOV   63H,#00H

                   MOV   64H,#00H

                   MOV   65H,#00H

                  TIMFUN:MOV   DISPFIRST,#72H  ;显示时钟数据单元

                   CLR   ET1

                   CLR   TR1

                   AJMP  FUNSS11

        FUNSS11:   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

    WAIT81:        LCALL DISPLAY

                   AJMP  WAIT88

    WAIT91:        LCALL DISPLAY

                   AJMP  WAIT99

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;           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,#3CH        ;高8位初值修正

                   ADDC  A,TH0         ;

                   MOV   TH0,A         ;重装初值(高8位修正值)

                   SETB  TR0           ;开启定时器T0

                   DJNZ  R4, OUTT0     ;20次中断未到中断退出

           ADDSS:  MOV  R4,#14H           ;20次中断到(1秒)重赋初值

                   CPL   07H              ;闹铃时间隔呜叫用

                   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

                   LCALL DS20MS             ;正点报时

                   SETB  08H

                   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           ;

                   LCALL  BAOJ

                   POP  PSW               ;恢复状态字(出栈)

                   POP   ACC               ;恢复累加器

                   SETB  ET0               ;开放T0中断

                   RETI                    ;中断返回

;****************************************

;;    闪动调时程序\秒表功能程序        ;;

;****************************************

;T1中断服务程序,用作时间调整时调整单元闪烁指示或秒表计时

INTT1:          PUSH    ACC                ;中断现场保护

                PUSH    PSW                ;

                JB      03H, MMFUN         ;=1时秒表

                MOV     TL1,   #0B0H       ;装定时器T1定时初值

                MOV     TH1,   #3CH         ;

                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      ;转中断退出

;

MMFUN :            CLR  TR1

                   MOV   A,#0F7H       ;中断响应时间同步修正,重装初值(10ms)

                   ADD   A,TL1         ;低8位初值修正

                   MOV   TL1,A         ;重装初值(低8位修正值)

                   MOV   A,#0D8H        ;高8位初值修正

                   ADDC  A,TH1         ;

                   MOV   TH1,A         ;重装初值(高8位修正值)

                   SETB  TR1           ;开启定时器T1

                   MOV  R0,#61H           ;指向秒计时单元(71H-72H)

                   ACALL ADD1              ;调用加1程序(加1秒操作)

                   CLR   C                 ;

                   MOV   A,R3              ;

                   JZ    FSS1              ;加1后为00,C=0

                   AJMP  OUTT01            ;加1后不为00,C=1

  FSS1:            ACALL CLR0              ;大于或等于60秒时对秒计时单元清0

                   MOV  R0,#63H           ;指向分计时单元(76H-77H)

                   ACALL ADD1              ;分计时单元加1分钟

                   MOV  A,R3              ;分数据放入A

                   CLR   C                 ;清进位标志

                   CJNE  A,#60H,ADDHH1      ;

            ADDHH1: JC  OUTT01             ;小于60分时中断退出

                   LCALL CLR0              ;大于或等于60分时分计时单元清0

                   MOV  R0,#65H           ;指向小时计时单元(78H-79H)

                   ACALL ADD1              ;小时计时单元加1小时

            OUTT01:

                   POP  PSW               ;恢复状态字(出栈)

                   POP   ACC               ;恢复累加器

                   RETI                    ;中断返回

****************************************

;;           加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                  ;子程序返回

;****************************************

;;           分减1子 程 序              ;;

;****************************************

;

             SUB1: MOV  A,@R0       ;取当前计时单元数据到A

                   DEC  R0          ;指向前一地址

                   SWAP  A           ;A中数据高四位与低四位交换

                   ORL  A,@R0       ;前一地址中数据放入A中低四位

                   JZ    SUB11

                   DEC  A           ;A减1操作

           SUB111: MOV   R3,A        ;移入R3寄存器

                   ANL  A,#0FH      ;高四位变0

                   CLR  C           ;清进位标志

                   SUBB  A,#0AH

          SUB1111: JC   SUB1110

                   MOV  @R0,#09H    ;大于等于0AH,为9

          SUB110:  MOV  A,R3        ;取回R3中暂存数据

                   INC  R0          ;指向当前地址单元

                   SWAP A           ;A中数据高四位与低四位交换

                   ANL  A,#0FH      ;高四位变0

                   MOV  @R0,A       ;数据放入当削地址单元中

                   RET               ;子程序返回

   ;

            SUB11: MOV   A,#59H

                   AJMP  SUB111

           SUB1110:MOV   A,R3        ;移入R3寄存器

                   ANL  A,#0FH      ;高四位变0

                   MOV   @R0,A

                   AJMP  SUB110

;****************************************

;;           时减1子 程 序             ;;

;****************************************

             SUBB1:MOV  A,@R0       ;取当前计时单元数据到A

                   DEC  R0          ;指向前一地址

                   SWAP  A           ;A中数据高四位与低四位交换

                   ORL  A,@R0       ;前一地址中数据放入A中低四位

                   JZ    SUBB11      ;00减1为23(小时)

                   DEC  A           ;A减1操作

           SUBB111:MOV   R3,A        ;移入R3寄存器

                   ANL  A,#0FH      ;高四位变0

                   CLR  C           ;清进位标志

                   SUBB  A,#0AH      ;时个位大于9为9

         SUBB1111: JC   SUBB1110    ;

                   MOV  @R0,#09H    ;大于等于0AH,为9

          SUBB110: MOV  A,R3        ;取回R3中暂存数据

                   INC  R0          ;指向当前地址单元

                   SWAP A           ;A中数据高四位与低四位交换

                   ANL  A,#0FH      ;高四位变0

                   MOV  @R0,A       ;时十位数数据放入

                   RET               ;子程序返回

   ;

           SUBB11: MOV   A,#23H

                   AJMP  SUBB111

          SUBB1110:MOV   A,R3        ;时个位小于0A不处理

                   ANL  A,#0FH      ;高四位变0

                   MOV   @R0,A       ;个位移入

                   AJMP  SUBB110

;****************************************

;;           清零程序                  ;;

;****************************************

;对计时单元复零用

             CLR0: CLR      A           ;清累加器

                   MOV      @R0,A       ;清当前地址单元

                   DEC      R0          ;指向前一地址

                   MOV      @R0,A       ;前一地址单元清0

                   RET                      ;子程序返回

;

;****************************************

;;           时钟时间调整程序          ;;

;****************************************

;当调时按键按下时进入此程序

           SETMM:  CLR      ET0            ;关定时器T0中断

                   CLR      TR0            ;关闭定时器T0

                   LCALL    DL1S           ;调用1秒延时程序

                   LCALL DS20MS                ;消抖

                   JB       P3.2,CLOSEDIS  ;键按下时间小于1秒,关闭显示(省电)

                   MOV      R2,#06H        ;进入调时状态,赋闪烁定时初值

                   MOV          70H,#00H       ;调时时秒单元为00 秒

                   MOV          71H,#00H

                   SETB     ET1            ;允许T1中断

                   SETB     TR1            ;开启定时器T1

            SET2:  JNB      P3.2,SET1      ;P3.2口为0(键未释放),等待

                   SETB     00H            ;键释放,分调整闪烁标志置1

            SET4:  JB       P3.2,SET3      ;等待键按下

                   LCALL   DL05S          ;有键按下,延时0.5秒

                   LCALL DS20MS                ;消抖

                   JNB      P3.2,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.2,CLOSE    ;无按键按下,等待。

                   LCALL DS20MS                ;消抖

                   JB       P3.2,CLOSE     ;是干扰返回CLOSE等待

        WAITH:     JNB      P3.2,WAITH     ;等待键释放

                   LJMP     START1         ;返回主程序(LED数据显示亮)

         SETHH:    CLR      00H            ;分闪烁标志清除(进入调小时状态)

                   SETB         01H            ;小时调整标志置1

          SETHH1:  JNB      P3.2,SET5      ;等待键释放

            SET6:  JB       P3.2,SET7      ;等待按键按下

                   LCALL   DL05S          ;有键按下延时0.5秒

                   LCALL DS20MS                 ;消抖

                   JNB      P3.2,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.2,SETOUT1     ;调时退出程序。等待键释放

                   LCALL DS20MS                  ;消抖

                   JNB      P3.2,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          ;等待调分按键时时钟显示用

                   JNB      P3.3, FUNSUB     ;减1分操作

                   AJMP     SET4             ;调分等待

            SET5:  LCALL    DISPLAY          ;键释放等待时调用显示程序(调小时)

                   AJMP     SETHH1           ;防止键按下时无时钟显示

            SET7:  LCALL    DISPLAY          ;等待调小时按键时时钟显示用

                   JNB      P3.3, FUNSUBB     ;小时减1操作

                   AJMP     SET6              ;调时等待

         SETOUT1:  LCALL    DISPLAY          ;退出时钟调整时键释放等待

                   AJMP    SETOUT            ;防止键按下时无时钟显示

;FUNSUB,分减1程序

          FUNSUB:  LCALL DS20MS              ;消抖

                   JB       P3.3,SET41       ;干扰,返回调分等待

          FUNSUB1: JNB      P3.3,FUNSUB1     ;等待键放开

                   MOV     R0,#77H          ;

                   LCALL    SUB1             ;分减1程序

                   LJMP     SET4             ;返回调分等待

;

            SET41: LJMP     SET4             ;

;FUNSUBB,时减1程序                                            ;

         FUNSUBB:  LCALL DS20MS              ;消抖

                   JB       P3.3,SET61       ; 干扰,返回调时等待

         FUNSUBB1: JNB      P3.3,FUNSUBB1    ; 等待键放开

                   MOV     R0,#79H          ;

                   LCALL    SUBB1            ; 时减1程序

                   LJMP     SET6             ; 返回调时等待

;

            SET61: LJMP  SET6

;***************************************

;;           显示程序                  ;;

;***************************************

; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P0口输出段码数据,P2口作

; 扫描控制,每个LED数码管亮1MS时间再逐位循环。

          DISPLAY: MOV      R1,DISPFIRST       ;指向显示数据首址

                   MOV      R5,#0FEH      ;扫描控制字初值

             PLAY: MOV      A,R5          ;扫描字放入A

                   MOV      P2,A          ;从P2口输出

                   MOV      A,@R1         ;取显示数据到A

                   MOV      DPTR,#TAB     ;取段码表地址

                   MOVC     A,@A+DPTR     ;查显示数据对应段码

                   MOV      P0,A          ;段码放入P1口

                   MOV          A,R5          ;

                   JB           ACC.2,LOOP5   ;小数点处理

                   CLR          P0.7          ;

       LOOP5:      JB           ACC.4,LOOP6   ;小数点处理

                   CLR          P0.7          ;

       LOOP6:      LCALL    DL1MS         ;显示1MS

                   INC      R1            ;指向下一地址

                   MOV      A,R5            ;扫描控制字放入A

                   JNB      ACC.5,ENDOUT    ;ACC.5=0时一次显示结束

                   RL       A               ;A中数据循环左移

                   MOV      R5,A            ;放回R5内

                   MOV      P0,#0FFH

                   AJMP     PLAY            ;跳回PLAY循环

           ENDOUT: MOV          P2,#0FFH            ;一次显示结束,P2口复位

                   MOV      P0,#0FFH       ;P0口复位

                   RET                      ;子程序返回

             TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH

;共阴段码表          "0""1""2" "3""4""5""6""7" "8""9""不亮"“A”“-”

;

;****************************

; SDISPLAY ,上电显示子程序

;****************************

;不带小数点显示,有“A”“-”显示功能

         SDISPLAY: MOV          R1,DISPFIRST

                   MOV      R5,#0FEH      ;扫描控制字初值

            SPLAY: MOV      A,R5          ;扫描字放入A

                   MOV      P2,A          ;从P2口输出

                   MOV      A,@R1         ;取显示数据到A

                   MOV      DPTR,#TABS     ;取段码表地址

                   MOVC     A,@A+DPTR     ;查显示数据对应段码

                   MOV      P0,A          ;段码放入P1口

                   MOV          A,R5          ;

                   LCALL    DL1MS         ;显示1MS

                   INC      R1            ;指向下一地址

                   MOV      A,R5            ;扫描控制字放入A

                   JNB      ACC.5,ENDOUTS    ;ACC.5=0时一次显示结束

                   RL       A               ;A中数据循环左移

                   MOV      R5,A            ;放回R5内

                   AJMP     SPLAY            ;跳回PLAY循环

          ENDOUTS: MOV          P2,#0FFH            ;一次显示结束,P2口复位

                   MOV      P0,#0FFH       ;P0口复位

                   RET                      ;子程序返回

TABS:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0C6H,0BFH,88H

             ; 显示数  "0    1    2    3    4   5   6   7   8    9  不亮  C   -    A  "

             ; 内存数  "0    1    2    3    4   5   6   7   8    9  0AH   0BH 0CH  0DH "

STAB:DB

0AH,0AH,0AH,0AH,0AH,09H,06H,04H,02H,00H,00H,06H,00H,01H,03H,0AH

                DB 0AH,09H,01H,0CH,06H,00H,0CH,09H,00H,00H,02H,0AH,0AH,0AH,0AH,0AH

;          注:0A不亮,0B显示“A”,0C显示“-”

;*************************************

;以下是闹铃时间设定程序中的时调整程序

;*************************************

DSSFUNN:          LCALL DISPLAY         ;等待键释放

                  JNB   P3.3, DSSFUNN

        WAITSS:    SETB  EA

                  LCALL DISPLAY

                  JNB   P3.4,FFFF      ;时加1键

                  JNB   P3.2,DDDD      ;时减1

                  JNB   P3.3,OOOO      ;闹铃设定退出键

                  AJMP  WAITSS

       OOOO:      LCALL DS20MS         ;消抖

                  JB   P3.3,WAITSS

     DSSFUNNM:    LCALL DISPLAY         ;键释放等待

                  JNB   P3.3, DSSFUNNM

                  MOV  DISPFIRST,#72H

                  LJMP START1

       FFFF:      LCALL DS20MS            ;消抖

                  JB   P3.4, WAITSS

     DSSFUNMM:    LCALL DISPLAY         ;键释放等待

                  JNB   P3.4, DSSFUNMM

                  CLR   EA

                  MOV   R0,#55H

                  LCALL ADD1

                  MOV    A,R3            ;

                  CLR   C                 ;

                  CJNE  A,#24H,ADDHH33N   ;

        ADDHH33N: JC    WAITSS    ;小于24点返回

                  ACALL CLR0              ;大于等于24点清零

                  AJMP  WAITSS

     DDDD  :      LCALL DS20MS            ;消抖        ;

                  JB   P3.2, WAITSS

     DSSFUNDD:    LCALL DISPLAY         ;键释放等待

                  JNB   P3.2, DSSFUNDD

                  CLR   EA

                  MOV   R0,#55H

                  LCALL SUBB1

                  LJMP  WAITSS

;*********************

;以下是闹铃判断子程序

;*********************

BAOJ:               MOV    A,79H         ;从时十位、个位、分十位、分个位顺序比较

                    CJNE   A,55H,BBAO

                    MOV    A,78H

                    CLR    C

BB3:                CJNE   A,54H,BBAO

                    MOV    A,77H

                    CLR    C

                    CJNE   A,53H,BBAO

                    MOV    A,76H

                    CLR    C

                 ;   CJNE   A,52H,BBAO

                   ; CLR    C

                   ; CLR    BELL

                   ; RET

BB2:                CJNE   A,52H,BBAO

                    JNB   07H,BBAO        ;07H在1秒到时会取反

                    CLR    BELL           ;时分相同时呜叫(1秒间隔叫)

                    RET

;

              BBAO: SETB  BELL            ;不相同或闹铃不开

                    RET

;***********************************************************

上电显示程序

;***********************************************************

           ST:      MOV        R0,#40H      ;将显示内容移入40H-5FH单元

                    MOV        R2,#20H      ;

                    MOV        R3,#00H      ;

                    CLR        A            ;

                    MOV        DPTR,#STAB   ;

           SLOOP:   MOVC       A,@A+DPTR    ;

                    MOV        @R0,A        ;

                    MOV        A,R3         ;

                    INC        A            ;

                    MOV        R3,A         ;

                    INC        R0           ;

                    DJNZ       R2,SLOOP     ;移入完毕

                    MOV        DISPFIRST,#40H  ;以下程序从左往右移

          SSLOOP:   MOV        R2,#50          ;控制移动速度

          SSLOOP1:  LCALL      SDISPLAY        ;

                    DJNZ       R2,SSLOOP1      ;

                    INC        DISPFIRST

                    MOV        A,DISPFIRST

                    CJNE       A,#5AH, SSLOOP  ;

                    MOV        DISPFIRST,#5AH  ;以下程序从右往左移

                    MOV        R3,#1BH         ;显示27个单元

          SSLOOP2:  MOV        R2,#100        ;控制移动速度

          SSLOOP12: LCALL      SDISPLAY       ;

                    DJNZ       R2,SSLOOP12     ;

                    DEC        DISPFIRST

                    DJNZ       R3,SSLOOP2      ;

                    RET

;*******************************************

;;           延时程序                     ;;

;*******************************************

;

;1MS延时程序,LED显示程序用

             DL1MS: MOV     R6,#14H

             DL1:   MOV     R7,#19H

             DL2:   DJNZ    R7,DL2

                    DJNZ    R6,DL1

                    RET

;延时程序,采用调用显示子程序以改善LED的显示闪烁现象

           DS20MS: ;CLR           BELL

                   LCALL         DISPLAY

                   LCALL    DISPLAY

                   LCALL    DISPLAY

                  ; SETB          BELL

                   RET

           DS21MS: CLR           BELL

                   LCALL     DISPLAY

                   LCALL    DISPLAY

                   LCALL    DISPLAY

                   SETB          BELL

                   RET

;延时程序,用作按键时间的长短判断

           DL1S:   LCALL      DL05S

                   LCALL      DL05S

                   RET

          DL05S:   MOV        R3,#20H      ;8毫秒*32=0.196秒

          DL05S1:  LCALL      DISPLAY

                   DJNZ       R3,DL05S1

                   RET

;********************************************************

                   END                     ;程序结束

四、仿真分析

   

图一 原理图

图二 仿真图一

图三 仿真图二

平时作业

单片机的特点和应用

1、单片机的特点

(1)高集成度,体积小,高可靠性

单片机将各功能部件集成在一块晶体芯片上,集成度很高,体积自然也是最小的。芯片本身是按工业测控环境要求设计的,内部布线很短,其抗工业噪音性能优于一般通用的CPU。单片机程序指令,常数及表格等固化在ROM中不易破坏,许多信号通道均在一个芯片内,故可靠性高。

(2)控制功能强

为了满足对对象的控制要求,单片机的指令系统均有极丰富的条件:分支转移能力,I/O口的逻辑操作及位处理能力,非常适用于专门的控制功能。

(3)低电压,低功耗,便于生产便携式产品

为了满足广泛使用于便携式系统,许多单片机内的工作电压仅为1.8V~3.6V,而工作电流仅为数百微安。

(4)易扩展

片内具有计算机正常运行所必需的部件。芯片外部有许多供扩展用的三总线及并行、串行输入/输出管脚,很容易构成各种规模的计算机应用系统。

(5)优异的性能价格比

单片机的性能极高。为了提高速度和运行效率,单片机已开始使用RISC流水线和DSP等技术。单片机的寻址能力也已突破64KB的限制,有的已可达到1MB和16MB,片内的ROM容量可达62MB,RAM容量则可达2MB。由于单片机的广泛使用,因而销量极大,各大公司的商业竞争更使其价格十分低廉,其性能价格比极高。

2、单片机的应用领域

(1)单片机在智能仪器仪表中的应用

在各类仪器仪表中引入单片机,使仪器仪表智能化,提高测试的自动化程度和精度,简化仪器仪表的硬件结构,提高其性能价格比。

(2)单片机在机电一体化中的应用

机电一体化是机械工业发展的方向。机电一体化产品是指集成机械技术、微电子技术、计算机技术于一体,具有智能化特征的机电产品,例如微机控制的车床、钻床等。单片机作为产品中的控制器,能充分发挥它的体积小、可靠性高、功能强等优点,可大大提高机器的自动化、智能化程度。

(3)单片机在日常生活及家用电器领域的应用

自从单片机诞生以后,它就步入了人类生活,如洗衣机、电冰箱、空调器、电子玩具、

电饭煲、视听音响设备等家用电器配上单片机后,提高了智能化程度,增加了功能,倍受人们喜爱。单片机将使人类生活更加方便、舒适、丰富多彩。

(4)在实时过程控制中的应用

用单片机实时进行数据处理和控制,使系统保持最佳工作状态,提高系统的工作效率和产品的质量。

(5)办公自动化设备

现代办公室使用的大量通信和办公设备多数嵌入了单片机。如打印机、复印机、传真机、绘图机、考勤机、电话以及通用计算机中的键盘译码、磁盘驱动等。

(6)商业营销设备

在商业营销系统中已广泛使用的电子称、收款机、条形码阅读器、IC卡刷卡机、出租车计价器以及仓储安全监测系统、商场保安系统、空气调节系统、冷冻保险系统等都采用了单片机控制。

(7)在计算机网络和通信领域中的应用

现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。

(8)单片机在医用设备领域中的应用

单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。

(9)汽车电子产品

现代汽车的集中显示系统、动力监测控制系统、自动驾驶系统、通信系统和运行监视器(黑匣子)等都离不开单片机。

(10)航空航天系统和国防军事、尖端武器等领域

单片机的应用更是不言而喻。

综合所述,单片机已成为计算机发展和应用的一个重要方面。另一方面,单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。

相关推荐