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

📄 dianzinaozhong.asm

📁 能实现日常时钟和普通闹钟功能
💻 ASM
字号:

;使用说明:
;P1口送段码,P0口选通
;P2.0闹钟和时间调节的切换
;P2.1时钟加1
;P2.2分钟加1
;P2.3在显时间状态下按下则停止闹铃,在闹铃调节状态下为开关闹铃的切换


;*********************************************************************
MIAO	EQU        30H         	;秒寄存器
FEN     EQU        31H         	;分寄存器
SHI     EQU        32H         	;時寄存器
N_FEN   EQU	   33H		;闹铃分寄存器	
N_SHI   EQU	   34H		;闹铃时寄存器
ORG     00H
LJMP    START 
ORG     0BH                 	;定時中斷入口
LJMP    TIMER             

ORG     30H
;***************初始化部分******************************************

START:
MOV	MIAO,#0
MOV	FEN,#0
MOV	SHI,#0
MOV	N_FEN,#0			;闹铃的初值为7:00
MOV	N_SHI,#07			
MOV     20H,  #10        		;0.5秒鐘中斷次數,0.5s=500ms=50msx10
MOV     21H,  #2      			;2個0.5秒即為1秒
MOV     SP,   #40H       		;堆棧指針設置
MOV     IE,   #82H       		;開定時器0中斷及總中斷
MOV     TMOD, #01H       		;定時器0模式1
MOV     TH0,  #03CH  		   	;50ms初值
MOV     TL0,  #0B0H
MOV	P0,   #00H			;*************清P1口
MOV	R5,   #250
MOV	R1,   #0
SETB    TR0                             ;啟動定時器0
MOV     DPTR, #TAB              	;表地址送數據指針
SETB	24H.0
CLR	23H.0
CLR	22H.0

;******时间主导程序****************************************
LOOP1:

ACALL       DISP                       	;調用顯示
JNB	    P2.3,	 TING		;一旦按下响铃就去处理使响铃停
JNB         P2.2,        MT          	;查詢分調整鍵
JNB         P2.1,        HT           	;查詢時調整鍵
JNB	    P2.0,	 QIEHUAN1	;切换

MOV	    A,FEN			;这里到T3:为止都是响铃的判断程序
CJNE	    A,N_FEN,L_2			;当分不等时,跳开,不响
MOV	    A,SHI
CJNE	    A,N_SHI,T_3			;时不相等跳开,不响
MOV	    A,MIAO			
CJNE	    A,#30,L_1			;CJNE和JC结合来判断秒是否大于30(可改,即改其响铃的时间长短),
L_1:
ANL	    C,24H.0			;只有24H.0和C都为1的时候才响铃		
JC	    XIANGLING			;大于30,C的值受影响变为0,小于为1,所以可用来判断是否要响铃
AJMP        T_3
L_2:
SETB	    24H.0			;分钟不等的时候再把1还给它    

T_3:
CJNE	    R1,#1,LOOP1			;查询整点到了没有,到了就往下走去报时
					;(在中断里整点到的时候已给R1赋1)

;******整点报时*************************************
SETB	    P0.6			;整点报时
BAOSHI:
ACALL       DISP
DJNZ	    R5,BAOSHI				
CLR	    P0.6
MOV	    R1,#0
MOV	    R5,#250
AJMP	    LOOP1

;*******切换到闹铃显示的按键程序********************************

QIEHUAN1:
ACALL       DISP
DJNZ	    R5,QIEHUAN1
MOV	    R5,#250
JB	    P2.0,LOOP1
AJMP	    LOOP2

;**********闹铃响铃程序******************************
XIANGLING:				
JNB	23H.0,LOOP1			;响铃总允许,=0就跳过不响
CPL	P0.6
MOV	R2,#25				;调此值可改变响声的频率
T_5:
ACALL	DISP
ACALL	DISP
DJNZ	R2,T_5
AJMP	LOOP1
;********** 闹铃停止响程序***************************

TING:
ACALL	  N_DISP
JNB	  P2.3,TING
CLR	  P0.6				
CLR	  24H.0				;把它清0,不让铃声响
AJMP	  LOOP1


;******调时程序*****************************************
MT:					;分調整

ACALL       DISP
ACALL       DISP
JNB         P2.2,        MT          	;鍵消抖
INC         FEN                         ;分加1
MOV         A,    FEN                 
CJNE        A,    #60, LOOP1      	;沒到60分返回,到60分清0 
MOV         FEN,        #0
AJMP        LOOP1

HT:                                     ;時調整

ACALL       DISP
ACALL       DISP
JNB         P2.1,         HT
INC         SHI
MOV         A,SHI
CJNE        A,#24,LOOP1
MOV         SHI,#0
AJMP        LOOP1

; *******时间显示子程序******************************************
DISP:                                   ;显示子程序

;秒显示*******
MOV	  A,		MIAO
MOV	  B,		#10
DIV	  AB
MOVC	  A,		@A+DPTR
MOV	  P1,		A
SETB	  P0.1
ACALL	  D1MS
CLR	  P0.1
MOV	  A,		B
MOVC	  A,		@A+DPTR
MOV	  P1,		A
SETB      P0.0
ACALL	  D1MS
CLR       P0.0

;分显示*******
MOV       A,            FEN             ;分送A
MOV       B,            #10                  
DIV       AB                            ;十進制調整
MOVC      A,            @A+DPTR      	;查表        
MOV       P1,           A               ;分十位送p1口顯示
SETB      P0.3                          ;開分十位顯示
ACALL     D1MS                          ;延時1ms
CLR       P0.3                          ;關顯示
MOV       A,            B               ;分個位p1口顯示              
ADD       A,            R0                    
MOVC      A,            @A+DPTR
MOV       P1,           A
SETB      P0.2
ACALL     D1MS
CLR       P0.2

;时显示*******

MOV	  A,		SHI
MOV       B,            #10
DIV       AB
MOVC      A,            @A+DPTR
MOV       P1,           A                     
SETB      P0.5                        ;顯示時十位
ACALL     D1MS
CLR       P0.5
MOV       A,            B
ADD       A,            R0
MOVC      A,            @A+DPTR
MOV       P1,           A
SETB      P0.4                        ;顯示時個位
ACALL     D1MS
CLR       P0.4
RET                                   ;返回


;*********闹铃主导程序******************************

LOOP2:

ACALL	N_DISP
JNB	P2.0,QIEHUAN2			;查询按键,决定是否该跳回时间显示
JNB     P2.1,N_SHIT			;查询按键,决定是否给闹铃时钟加1
JNB	P2.2,N_FENT			;查询按键,决定是否给闹铃分钟加1
JNB	P2.3,N_K			;查询按键,决定是否调节闹钟开关
AJMP	LOOP2

;**********闹铃调时程序******************************

N_FENT:

ACALL	N_DISP
ACALL	N_DISP
JNB	P2.2,N_FENT
INC	N_FEN
MOV	A,N_FEN
CJNE	A,#60,LOOP2
MOV	N_FEN,#0
AJMP	LOOP2

N_SHIT:
ACALL	N_DISP
ACALL	N_DISP	
JNB	P2.1,N_SHIT
INC	N_SHI
MOV	A,N_SHI
CJNE	A,#24,LOOP2
MOV	N_SHI,#0
AJMP	LOOP2


N_K:
ACALL	N_DISP
ACALL	N_DISP
JNB	P2.3,N_K
CPL	22H.0				;为1就显示闹铃开
CPL	23H.0				;为1就标志开闹铃
AJMP	LOOP2

;**********切换回去显示时间的按键程序****************
QIEHUAN2:
ACALL       N_DISP
ACALL	    N_DISP
DJNZ	    R5,QIEHUAN2
MOV	    R5,#250
JB	    P2.0,LOOP2
AJMP	    LOOP1

;**********闹铃显示程序********************************

N_DISP:

;分显示*******
MOV	A,N_FEN				;把闹铃时间分给A
MOV	B,#10
DIV	AB
MOVC	A,@A+DPTR
MOV	P1,A				;显示闹铃分十位
SETB	P0.3
ACALL	D1MS
CLR	P0.3

MOV	A,B
ADD	A,R0
MOVC	A,@A+DPTR
MOV	P1,A				;显示闹铃分个位
SETB	P0.2
ACALL	D1MS
CLR	P0.2
;时显示*******
MOV	A,N_SHI
MOV	B,#10
DIV	AB
MOVC	A,@A+DPTR
MOV	P1,A				;显示闹铃时十位
SETB	P0.5
ACALL	D1MS
CLR	P0.5

MOV	A,B
ADD	A,	R0
MOVC	A,@A+DPTR
MOV	P1,A				;显示闹铃时个位
SETB	P0.4
ACALL	D1MS
CLR	P0.4

JNB	22H.0,SET_1			;=0,就跳
;闹铃开标志显示****			;这段是可选择的,如果开闹铃(22H.0=1)就往下走显示;否则无显示
MOV	P1,#40H				
SETB	P0.1
ACALL	D1MS
CLR	P0.1

MOV	P1,#40H
SETB	P0.0
ACALL	D1MS
CLR	P0.0

SET_1:
RET


;**********中断服务程序******************************

TIMER:                                ;定時中斷程序

PUSH      ACC                         ;數據保護
PUSH      PSW
MOV       TL0,          #0B2H         ;重置50ms定時值(本来是B0的,现在校正了一点用B2就准点了)
MOV       TH0,          #03CH

DJNZ      20H,          RETI_1        ;到0.5秒了嗎?(-1/=0,就跳,到了就往下)
MOV       20H,          #10
CPL       25H                         ;取反秒秒閃爍標志位
JNB       25H,          T_1           ;标志位为0转T-1(就是为0就显示秒点)--.
MOV       R0,           #0            ;查表偏移量寄存器置0(不顯示秒点)    !
AJMP      T_2			      ;		          		    !
				      ;					    !									
				      ;					    !
T_1:				      ;					    !	
				      ;					    V
MOV       R0,           #10  	      ;查表偏移量寄存器置10(顯示秒点,秒点每秒閃爍1次)


T_2:
 
DJNZ      21H,   RETI_1  	      ;到1秒了嗎?(-1/=0,就跳)
MOV       21H,   #2
INC       MIAO                        ;秒加1
MOV       A,          MIAO
CJNE      A,     #60,   RETI_1        ;到60秒了嗎?
MOV       MIAO,  #0                   ;到60秒清0
INC       FEN                         ;分加1
MOV       A,     FEN
CJNE      A,     #60,     RETI_1      ;到60分了嗎?
MOV       FEN,   #0
MOV	  R1,    #1		      ;一个小时到,开始报时
INC       SHI                         ;時加1
MOV       A,     SHI
CJNE      A,     #24,    RETI_1       ;到24小時了嗎?
MOV       SHI,   #0    


RETI_1:

POP       PSW
POP       ACC
RETI


;*******延时子程序*************************************
D1MS:					;1毫秒延時

MOV       R7,           #2
D_1:
MOV       R6,           #250
DJNZ      R6,           $
DJNZ      R7,           D_1
RET


;*******显示列表***************************************
TAB:
DB   3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH                ;不带小数点
DB   0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH        ;带小数点


END

⌨️ 快捷键说明

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