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

📄 timer.asm

📁 在80C51上用汇编语言实现的数字钟程序
💻 ASM
字号:
ORG 0000H
AJMP MAIN
ORG 0003H
LJMP INTRUPT0
ORG 0013H
LJMP INTRUPT1

MAIN:  
	SETB EX0   ;外部中断源0(P3.2--外部中断0申请,低电平有效)
	SETB EX1
	CLR IT0   ;脉冲触发方式,低电平有效
	SETB EA
	
	MOV 30H ,#00H   ;个位秒
	MOV 31H ,#00H   ;十位秒
	MOV 32H ,#00H   ;个位分
	MOV 33H ,#00H   ;十位分
	MOV 34H ,#00H   ;个位小时
	MOV 35H ,#00H   ;十位小时
	MOV 21H,  #80H  ;用于主程序计时1秒
	MOV 22H,  #0FEH  ;位码显示,每次只显示一位码
	MOV 38H, #0FFH  ;闹钟十位秒初值
        MOV 39H, #0FFH  ;闹钟个位分初值

; ===================================================
;主程序
START:  
 	MOV P3,#0FFH
	MOV R1, 21H
	MOV R2, 22H
	MOV P0,#0FFH
START0: MOV A,39H      		;闹钟的个位分的值
        CJNE A,32H,START1       ;个位分的值与设定的个位分的值不等则转移
        MOV A,38H     		;闹钟的十位秒的值
        CJNE A,31H,START1       ;个位分的值与设定的十位秒的值不等则转移
	CLR P0.5
	
START1:	;MOV P3,#0FFH
        CALL DELAY
        CALL DISPLAY
	DJNZ R1,START1       ;减 1,不为0转移  
	SETB P0.5
	MOV R1,21H

	MOV P0,#0FEH         ;低电平亮,每1秒亮P0.0
	CALL DELAY
	INC 30H              ;个位秒加1	
	MOV P0,#0FFH
	MOV A,30H
	CJNE A,#0AH,S1
	MOV 30H,#00H
        MOV P0,#0FCH         ;低电平亮,每10秒亮P0.0 P0.1
	CALL DELAY
	INC 31H              ;十位秒加1
        MOV P0,#0FFH

	MOV A,31H           
	CJNE A,#06H,S1
	MOV 31H,#00H
	MOV P0,#0F8H         ;低电平亮,每1分亮P0.0 P0.1 P0.2
	CALL DELAY
	INC 32H              ;个位分加1
	MOV P0,#0FFH

	MOV A,32H            
	CJNE A,#0AH,S1
	MOV 32H,#00H
	MOV P0,#0F0H         ;低电平亮,每10分亮P0.0 P0.1 P0.2 P0.3
	CALL DELAY
	INC 33H              ;十位分加1
        MOV P0,#0FFH

	MOV A,33H            
	CJNE A,#06H,S1
	MOV 33H,#00H
	INC 34H              ;个位小时加1
 
	MOV A,34H           
	CJNE A,#0AH,S1
	MOV 34H,#00H
	INC 35H              ;十位小时加1

	MOV A,35H           
	CJNE A,#06H,S1
	LJMP START
S1:	
        LJMP START0

;==================================================
;中断0入口,设置对时或闹铃

INTRUPT0:
YS0:    JNB P3.2,YS0   ;为0跳转(延时作用)
	SETB P3.2
	CLR EA	
	MOV P0,#0F0H         ;低电平亮,进入中断0亮P0.0 P0.1 P0.2 P0.3
	CALL DELAY
        MOV P0,#0FFH
	
LOOP:	JNB P3.3,BELL       ;P3.3为0进入设置闹铃程序
        CALL DISPLAY
        JNB P3.2,LOP1       ;P3.2为0进入对时功能程序
	SJMP LOOP	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;对时重写代码如下:
LOP1:   
YS2:    JNB P3.2,YS2   ;为0跳转
	SETB P3.2
LP:	CALL DISPLAY
	JNB P3.4,ADDHOUR       ;P3.4按下则个位时增加1
	JNB P3.2,MIDD1          ;P3.2按下则退出中断
	JNB P3.5,ADDMINU       ;P3.5按下则个位分增加1
	AJMP LP
ADDHOUR:
	JNB P3.2,MIDD1        ;P3.2按下则退出中断
YS4:    JNB P3.4,YS4   ;为0跳转
	SETB P3.4
        MOV P0,#0F3H         ;低电平亮,个位时增加亮P0.2 P0.3
	CALL DELAY
	JNB P3.2,MIDD1        ;P3.2按下则退出中断
        MOV P0,#0FFH
	INC 34H                 ;个位时增加1
	MOV A,34H           
	CJNE A,#0AH,LOP1  	;个位时不等10则转移
	MOV 34H,#00H
	INC 35H
	AJMP LOP1

ADDMINU:
	JNB P3.2,MIDD1        ;P3.2按下则退出中断
YS5:    JNB P3.5,YS5   ;为0跳转
	SETB P3.5
	MOV P0,#0FCH         ;低电平亮,个位分增加亮P0.0 P0.1
	CALL DELAY
	JNB P3.2,MIDD1        ;P3.2按下则退出中断
        MOV P0,#0FFH
	INC 32H                 ;个位分增加1
	MOV A,32H           
	CJNE A,#0AH,LOP1  	;个位分不等10则转移
	MOV 32H,#00H
	INC 33H
	MOV A,33H
	CJNE A,#06H,LOP1        ;十位分不等6则转移
	MOV 33H,#00H
	AJMP LOP1

MIDD1:  LJMP YS11       ;因为JNB范围有限,利用了中转,除P3.2按下,不会进入该语句
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;设置闹铃
BELL:   
YS3:    JNB P3.3,YS3   ;为0跳转
	SETB P3.3
	MOV 36H,31H       ;保存设置前十位秒的值
	MOV 37H,32H       ;保存设置前个位分的值

;设置闹钟重写代码如下:
LOP2:	CALL DISPLAY
	JNB P3.4,ADDMIN         ;P3.4按下则个位分增加1
	JNB P3.2,EXIT3          ;P3.2按下则退出中断
	JNB P3.5,ADDTENSEC      ;P3.5按下则十位秒增加1
	AJMP LOP2
ADDMIN:
	JNB P3.2,EXIT3          ;P3.2按下则退出中断 
YS6:    JNB P3.4,YS6   ;为0跳转 
	SETB P3.4
	MOV P0,#0F3H         ;低电平亮,个位分增加亮P0.2 P0.3
	CALL DELAY
        MOV P0,#0FFH
	INC 32H                 ;个位分增加1
	MOV A,32H           
	CJNE A,#0AH,LOP2  	;个位分不等10则转移
	MOV 32H,#00H
	INC 33H
	MOV A,33H           
	CJNE A,#06H,LOP2  	;十位分不等6则转移
	MOV 33H,#00H
	INC 34H
	AJMP LOP2

ADDTENSEC:
	JNB P3.2,EXIT3          ;P3.2按下则退出中断
YS7:    JNB P3.5,YS7   ;为0跳转
  	SETB P3.5
	MOV P0,#0FCH         ;低电平亮,十位秒增加亮P0.0 P0.1
	CALL DELAY
        MOV P0,#0FFH
	INC 31H                 ;十位秒增加1
	MOV A,31H           
	CJNE A,#06H,LOP2  	;十位秒不等6则转移
	MOV 31H,#00H
	AJMP LOP2
EXIT3:  
	SETB P3.2 
 	MOV 38H,31H       ;闹铃十位秒的值存入38H
	MOV 39H,32H       ;闹铃个位分的值存入39H
        MOV 31H,36H
        MOV 32H,37H
YS11: 	SETB P3.2  
	JNB P3.2,YS11          ;为0跳转
	SETB P3.2
	SETB EA
RETI

;==================================================
;中断1入口,设置秒表

INTRUPT1:
YS1:    JNB P3.3,YS1          ;为0跳转 
	SETB P3.3     
        CLR EA
	
	MOV P0,#0F0H         ;低电平亮,进入中断1亮P0.0 P0.1 P0.2 P0.3
	CALL DELAY
        MOV P0,#0FFH
        SETB P3.3             ;外中断1进入秒表功能
       	MOV 70H,30H           ;保存原有个位秒
	MOV 71H,31H 
	MOV 72H,32H 
	MOV 73H,33H 
	MOV 74H,34H 
	MOV 75H,35H 
       	MOV 30H ,#00H   ;0.01个位秒
	MOV 31H ,#00H   ;0.1个位秒
	MOV 32H ,#00H   ;个位秒
	MOV 33H ,#00H   ;十位秒
	MOV 34H ,#00H   ;个位分
	MOV 35H ,#00H   ;十位分
        CALL DISPLAY
START2:
YS10:   JNB P3.4,YS10          ;为0跳转
	SETB P3.4
 	JNB P3.2,MIDD2   ;P3.2为0时退出中断
        JNB P3.3,PAUSE
	MOV R3,#1H
PER:    CALL DISPLAY
 	JNB P3.4,YS10          ;为0跳转
	MOV P0,#0FFH
	CALL DISPLAY
	DJNZ R3,PER
	INC 30H              ;0.01个位秒加1	
	MOV A,30H
	CJNE A,#0AH,S2
	MOV 30H,#00H
	INC 31H              ;0.1个位秒加1

	MOV A,31H           
	CJNE A,#06H,S2
	MOV 31H,#00H
	MOV P0,#0FEH         ;低电平亮,每1秒亮P0.0
	CALL DELAY
	INC 32H              ;个位秒加1	
	;MOV P0,#0FFH

	MOV A,32H            
	CJNE A,#0AH,S2
	MOV 32H,#00H
        MOV P0,#0FCH         ;低电平亮,每10秒亮P0.0 P0.1
	CALL DELAY
	INC 33H              ;十位秒加1
        ;MOV P0,#0FFH
	
	MOV A,33H            
	CJNE A,#06H,S2
	MOV 33H,#00H
	INC 34H              ;个位分加1
 
	MOV A,34H           
	CJNE A,#0AH,S2
	MOV 34H,#00H
        MOV P0,#0F8H        ;低电平亮,每十位分亮P0.0 P0.1 P0.2
	CALL DELAY
	INC 35H              ;十位分加1
        ;MOV P0,#0FFH

	MOV A,35H           
	CJNE A,#06H,S2
	MOV 35H,#00H
	MOV P0,#0F0H        ;低电平亮,每达到60分亮P0.0 P0.1 P0.2 P0.3
	CALL DELAY
        ;MOV P0,#0FFH
S2:	CALL DISPLAY
        JNB P3.2,YS8    ;P3.2为0时退出中断
	LJMP YS10
MIDD2:  AJMP YS8         ;因为JNB范围有限,利用了中转,除P3.2按下,不会进入该语句
PAUSE:  SETB P3.3
	JNB P3.4,START2
        JNB P3.2,YS8   ;P3.2为0时退出中断
	CALL DISPLAY
        JNB P3.5,CLEAR
	CALL DELAY
       	LJMP PAUSE
	
CLEAR:	
YS9:    JNB P3.5,YS9          ;为0跳转
	SETB P3.5
	MOV 30H ,#00H   ;0.01个位秒 ;清零
	MOV 31H ,#00H   ;0.1个位秒
	MOV 32H ,#00H   ;个位秒
	MOV 33H ,#00H   ;十位秒
	MOV 34H ,#00H   ;个位分
	MOV 35H ,#00H   ;十位分
        LJMP PAUSE
 
YS8:    SETB P3.2
	JNB P3.2,YS8          ;为0跳转
  	MOV 30H ,70H   ;个位秒还原
	MOV 31H ,71H   ;十位秒
	MOV 32H ,72H   ;个位分
	MOV 33H ,73H   ;十位份
	MOV 34H ,74H   ;个位小时
	MOV 35H ,75H   ;十位小时
	SETB EA
	SETB P3.2
	RETI
;===================================================
;显示子程序
DISPLAY:
	;MOV P0,#0FFH
	
	MOV DPTR,#TABLE    ;共阳极
	MOV A , 30H        ;显示个位秒
	MOVC A, @A+DPTR    ;取段码
	MOV P1, A          ;P1对应段码
	MOV R2,#0FEH       ;设位码初值
	MOV A, R2          ;位码
	MOV P2, A          ;P2对应位码
	CALL DELAY
	CALL DELAY

	MOV A, R2           ;位码左移一位,显示左边相邻的数码管
	RL A
	MOV R2, A
	MOV P2, A
	MOV A , 31H         ;显示十位秒
	MOVC A, @A+DPTR
	MOV P1, A            
	CALL DELAY
	CALL DELAY

	MOV A, R2
	RL A
	MOV R2, A
	MOV P2, A
	MOV A , 32H           ;显示个位分
	MOVC A, @A+DPTR
	MOV P1, A           
	CALL DELAY
	CALL DELAY

	MOV A, R2
	RL A
	MOV R2, A
	MOV P2, A
	MOV A , 33H           ;显示十位分
	MOVC A, @A+DPTR
	MOV P1, A
	CALL DELAY
	CALL DELAY
	
	MOV A, R2
	RL A
	MOV R2, A
	MOV P2, A
	MOV A , 34H            ;显示个位小时
	MOVC A, @A+DPTR
	MOV P1, A
	CALL DELAY
	CALL DELAY

	MOV A, R2
	RL A
	MOV R2, A
	MOV P2, A
	MOV A , 35H            ;显示十位小时
	MOVC A, @A+DPTR
	MOV P1, A
	CALL DELAY
	CALL DELAY
	RET



TABLE:	DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

DELAY:	MOV R6,#11H
	DEY0:MOV R7, #11H
	DEY1: DJNZ R7, DEY1
	DJNZ R6, DEY0
	RET
END

⌨️ 快捷键说明

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