⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1

📁 RM51单片机实验板配套实验例程库
💻
📖 第 1 页 / 共 2 页
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           AT89C52时钟程序         ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;*********************************************************************************************;
;以下程序能用于24小时计时,能作为秒表使用,能定时闹铃1分钟(也可关).
;使用方法:开机后在00:00:00起开始计时,(1)长按P1.0进入调分状态:分单元闪烁
;按P1.0加1,按P1.1减1.再长按P1.0进入时调整状态,时单元闪烁,加减调整同调分.
;按长按退出调整状态.  (2)按下P1.1进入秒表状态:按P1.2暂停,再按P1.2秒表清零,再按
;P1.2秒表又启动,按P1.1退出秒表回到时钟状态. (3)按P1.3进入设定闹时状态: 00:00: -,可进
;行分设定,按P1.2分加1,再按P1.3为时调整,00:00:- ,按P1.2时加1,按P1.1闹铃有效,显示为00:00:-0,再按
;P1.1闹铃无效(显示00:00:- ,),按P1.3调闹钟结束.在闹铃时可按P1.3停闹,不按闹铃1分钟.
;定时器T0、T1溢出周期为50MS,T0为秒计数用, T1为调整时闪烁及秒表定时用,
;P1.0、P1.1、P1.2、P1.3为调整按钮,P0口为字符输出口,P2为扫描口,P1.7为蜂呜器口,采用共阳显示管。
;50H-55H为闹钟定时单元,60H-65H为秒表计时单元,70H-75H为显示时间单元,76H-79H为分时计时单元。
;03H标志=0时钟闪烁,=1秒表,    05H=0,不闹铃,=1要闹铃.    07H每秒改变一次,用作间隔呜叫.
;***********************************************************************************************;
           DISPFIRST  EQU  30H     ;显示首址存放单元
           BELL       EQU  P1.7    ;小喇叭
           CONBS      EQU  2FH     ;存放报时次数
;
;****************************************
;;           中断入口程序              ;;
;****************************************
;
              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 DS20MS
                   LCALL DL1S
                   LCALL DL1S
                   LCALL DL1S
                   DJNZ CONBS,BSLOOP
                   CLR   08H          ;清整点报时标志
                   AJMP  START1
;
;****************************************
;;          主程序开始                 ;;
;****************************************
;
            START: LCALL ST             ;上电显示年月日及班级学号
                   MOV   R0,#00H      	;清00H-7FH内存单元
                   MOV   R7,#80H      	;
       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   	;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 	 P1.0,SETMM1    ;P1.0口为0时转时间调整程序
                   JNB   P1.1,FUNSS     ;秒表功能,P1.1按键调时时作减1加能
                   JNB   P1.2,FUNPT     ;秒表STOP,PUSE,CLR
                   JNB   P1.3,TSFUN     ;定时闹铃设定
                   JB   08H,  QQQQ
                   AJMP  START1         ;P1.0口为1时跳回START1
;
          FUNPT:  LJMP  FUNPTT
;以下闹铃时间设定程序,按P1.3进入设定
            TSFUN: LCALL DS20MS
                   JB    P1.3,START1     ;
         WAIT113:  JNB   P1.3,WAIT113    ;等待键释放
                   JB   05H,CLOSESP      ;闹铃已开的话,关闹铃
                   MOV   DISPFIRST,#50H  ;进入闹铃设定程序,显示50-55H闹钟定时单元
                   MOV   50H,#0CH        ;"-"   闹铃设定时显示格式00:00: -
                   MOV   51H,#0AH        ;"黑"
;
         DSWAIT:   SETB   EA
                   LCALL DISPLAY
                   JNB  P1.2,DSFINC       ;分加1
                   JNB  P1.0,DSDEC        ;分减1
                   JNB  P1.3,DSSFU        ;进入时调整
                   AJMP DSWAIT
;
          CLOSESP: CLR  05H              ;关闹铃标志
                   CLR  BELL
                   AJMP  START1
           DSSFU:  LCALL DS20MS         ;消抖
                   JB  P1.3, DSWAIT
                   LJMP  DSSFUNN         ;进入时调整
;
           SETMM1:      LJMP SETMM     ;转到时间调整程序SETMM
;
        DSFINC :   LCALL DS20MS         ;消抖
                   JB  P1.2, DSWAIT
        DSWAIT12: LCALL DISPLAY         ;等键 释放
                  JNB   P1.2, 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  P1.0, DSWAIT
        DSWAITEE: LCALL DISPLAY         ;等键 释放
                  JNB   P1.0, DSWAITEE
                  CLR   EA
                  MOV   R0,#53H            ;
                  LCALL sub1               ;闹铃设定分减1
                  LJMP DSWAIT

;以下秒表功能/时钟转换程序
;按下P1.1 可进行功能转换
            FUNSS: LCALL DS20MS
                   JB    P1.1,START11
         WAIT11:   JNB   P1.1,WAIT11
                   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定时初值
                   SETB  TR1
                   SETB  ET1
         START11:  LJMP  START1
            TIMFUN:MOV   DISPFIRST,#70H  ;显示时钟数据单元
                   CLR   ET1
                   CLR   TR1
       START12:    LJMP  START1
;以下秒表暂停\清零功能程序
;按下P1.2暂停或清0,按下P1.1退出秒表回到时钟计时
            FUNPTT: LCALL DS20MS
                   JB    P1.2,START12
         WAIT22:   JNB   P1.2,WAIT21
                   CLR   ET1
                   CLR   TR1
         WAIT33:   JNB  P1.1,FUNSS
                   JB   P1.2,WAIT31
                   LCALL DS20MS
                   JB    P1.2,WAIT33
        WAIT66:    JNB   P1.2,WAIT61
                   MOV   60H,#00H
                   MOV   61H,#00H
                   MOV   62H,#00H
                   MOV   63H,#00H
                   MOV   64H,#00H
                   MOV   65H,#00H
       WAIT44:     JNB  P1.1,FUNSS
                   JB   P1.2,WAIT41
                   LCALL DS20MS
                   JB    P1.2,WAIT44
       WAIT55:     JNB   P1.2,WAIT51
                   SETB  ET1
                   SETB  TR1
                   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
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           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小时中断退出

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -