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

📄 text1.a51

📁 电子钟试验 电子钟试验以protel实现电子钟
💻 A51
字号:

	ORG 0000H
	LJMP MAIN      				;转入主程序
	ORG 000BH
	LJMP GT0       				;转入中断T0
	ORG 0200H
;-------------------------主程序--------------------------;
MAIN:
	MOV SP,#60H                             ;给堆栈赋初值
	MOV P0,#00H    				;熄灭所有LED灯
	MOV DPTR,#TAB  				;表地址入口
	CLR A
	MOV 30H,A     				;小时清零
	MOV 31H,A     				;分钟清零
	MOV 32H,A     				;秒清零
	MOV R0,#20    				;1秒中断次数
	MOV TMOD,#01H  				;T0方式1定时
	MOV TH0,#3CH   				;50毫秒初值
	MOV TL0,#0BH
	SETB EA        				;开中断
	SETB ET0                                ;允许T0中断
	SETB TR0      				;启动T0
M0:
	LCALL JIAN    				;调用按键子程序
	LCALL XIANSHI  				;调用显示子程序
	LJMP M0
;-----------------------T0中断程序------------------------;
GT0:
	PUSH ACC
	MOV TH0,#3CH   				;重新赋值
	MOV TL0,#0BH   
	DJNZ R0,RET0     			;不够20次返回
	MOV R0,#20				;否则重新赋20给R0
	INC 32H        				;秒加一
	MOV A,32H
	CJNE A,#60,RET0   			;比较秒是否到60;不到RET0
	MOV 32H,#00H        			;到60改为0
	INC 31H     		    		;分钟加一
	MOV A,31H
	CJNE A,#60,RET0   			;比较分钟是否到60;不到RET0
	MOV 31H,#00H       			;到60改为0
	LJMP XIANG                              ;调用蜂鸣器
	INC 30H           			;小时加一
	MOV A,30H
	CJNE A,#24,RET0   			;比较小时是否到24;不到RET0
	MOV 30H,#00H        			;到24改为0   
RET0:
	POP ACC
	RETI                                    ;中断返回
XIANG:
	SETB P3.0
;-----------------------显示子程序------------------------;
XIANSHI:
	MOV A,30H   				;小时显示程序段
	MOV B,#10				;把10送入寄存器B中
	DIV AB					;分离小时高低位
	MOVC A,@A+DPTR    			;查十位数据表
	SETB P0.0				;点亮时十位数码管
	MOV P2,A				;送P2口显示
	DJNZ R1,$				;延时等待
	CLR P0.0       				;熄灭时十位数码管
	MOV A,B					;时个位送入A
	MOVC A,@A+DPTR    			;查个位数据表
	SETB P0.1				;点亮时个位数码管
	MOV P2,A				;送P2口显示
	DJNZ R1,$				;延时等待
	CLR P0.1				;熄灭时个位数码管
	MOV A,31H     				;分钟显示程序段
	MOV B,#10				;把10送入寄存器B中
	DIV AB					;分离分钟高低位
	MOVC A,@A+DPTR   			;查十位数据表
	SETB P0.2				;点亮分十位数码管
	MOV P2,A				;送P2口显示
	DJNZ R1,$                               ;延时等待
	CLR P0.2				;熄灭分十位数码管				
	MOV A,B					;分个位送入A
	MOVC A,@A+DPTR    			;查个位数据表
	SETB P0.3				;点亮分个位数码管
	MOV P2,A				;送P2口显示
	DJNZ R1,$				;延时等待	
	CLR P0.3				;熄灭分个位数码管
	MOV A,32H  		                ;秒显示程序段
	MOV B,#10				;把10送入寄存器B中
	DIV AB					;分离秒高低位
	MOVC A,@A+DPTR   			;查十位数据表
	SETB P0.4				;点亮秒十位数码管
	MOV P2,A				;送P2口显示
	DJNZ R1,$				;延时等待
	CLR P0.4				;熄灭秒十位数码管
	MOV A,B					;秒个位送入A
	MOVC A,@A+DPTR                          ;查个位数据表
	SETB P0.5				;点亮秒个位数码管
	MOV P2,A				;送P2口显示
	DJNZ R1,$				;延时等待
	CLR P0.5				;熄灭秒个位数码管
	RET
;-----------------------按键子程序------------------------;
JIAN:
	PUSH PSW       				;保护现场
	PUSH ACC
	JB P1.3,S1       			;查键,改秒钟数,否则转S1
J0:	
	LCALL DEL_10MS                          ;按键消抖
	LCALL XIANSHI    			;调显示子程序
	JNB P1.3,J0  				;按键松开后才加一
	INC 32H					;秒加一
	MOV A,32H
	CJNE A,#60,RET1  			;秒钟不到60就转RET1
	MOV 32H,#00H				;否则清零
	LJMP RET1
S1:
	JB P1.1,M1        			;查键,改分钟数,否则转M1
J1:
	LCALL DEL_10MS                          ;按键消抖
	LCALL XIANSHI				;调显示子程序
	JNB P1.1,J1				;按键松开后才加一	
	INC 31H					;分加一
	MOV A,31H				
	CJNE A,#60,RET1  			;分钟不到24就转RET1
	MOV 31H,#00H				;否则清零
	LJMP RET1
M1:	
	JB P1.2,RET1      			;查键,改小时数,否则转RET1
J2:
	LCALL DEL_10MS                          ;按键消抖
	LCALL XIANSHI				;调显示子程序
	JNB P1.2,J2				;按键松开后才加一
	INC 30H					;时加一
	MOV A,30H				
	CJNE A,#24,RET1    			;小时不到24就转RET1
	MOV 30H,#00H				;否则清零
RET1:
	POP PSW          			;退出保护
	POP ACC
	RET					;返回
;-----------------------延时子程序------------------------;
DEL_10MS:
	MOV R6,#10			      
L1:     MOV R7,#248			        
L2:     DJNZ R7,L2			        
	DJNZ R6,L1                              
	RET                                     
TAB:
	DB 3FH,06H,5BH,4FH,66H			;共阴极数码管0-9数字
	DB 6DH,7DH,07H,7FH,6FH
END

⌨️ 快捷键说明

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