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

📄 1

📁 RM51单片机实验板配套实验例程库
💻
📖 第 1 页 / 共 2 页
字号:
                   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           ;开启定时器T0
                   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  		P1.0,CLOSEDIS  ;键按下时间小于1秒,关闭显示(省电)
                   MOV  	R2,#06H        ;进入调时状态,赋闪烁定时初值
                   MOV          70H,#00H       ;调时时秒单元为00 秒
                   MOV          71H,#00H
                   SETB 	ET1            ;允许T1中断
                   SETB 	TR1            ;开启定时器T1
            SET2:  JNB 		P1.0,SET1      ;P1.0口为0(键未释放),等待
                   SETB  	00H            ;键释放,分调整闪烁标志置1
            SET4:  JB  		P1.0,SET3      ;等待键按下
                   LCALL   	DL05S          ;有键按下,延时0.5秒
                   LCALL DS20MS                ;消抖
                   JNB    	P1.0,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   	 P1.0,CLOSE    ;无按键按下,等待。
                   LCALL DS20MS                ;消抖
                   JB    	P1.0,CLOSE     ;是干扰返回CLOSE等待
        WAITH:     JNB   	P1.0,WAITH     ;等待键释放
                   LJMP  	START1         ;返回主程序(LED数据显示亮)
           SETHH:  CLR  	 00H           ;分闪烁标志清除(进入调小时状态)
                   SETB         01H            ;小时调整标志置1
          SETHH1:  JNB 		P1.0,SET5      ;等待键释放
            SET6:  JB  		P1.0,SET7      ;等待按键按下
                   LCALL   	DL05S          ;有键按下延时0.5秒
                   LCALL DS20MS                 ;消抖
                   JNB    	P1.0,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   	P1.0,SETOUT1     ;调时退出程序。等待键释放
                   LCALL DS20MS                  ;消抖
                   JNB   	P1.0,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      P1.1, FUNSUB     ;减1分操作
                   AJMP     SET4             ;调分等待
            SET5:  LCALL    DISPLAY          ;键释放等待时调用显示程序(调小时)
                   AJMP     SETHH1           ;防止键按下时无时钟显示
            SET7:  LCALL    DISPLAY          ;等待调小时按键时时钟显示用
                   JNB      P1.1, FUNSUBB     ;小时减1操作
                   AJMP     SET6              ;调时等待
         SETOUT1:  LCALL    DISPLAY          ;退出时钟调整时键释放等待
                   AJMP    SETOUT            ;防止键按下时无时钟显示
;FUNSUB,分减1程序

⌨️ 快捷键说明

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