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

📄 clock.asm

📁 应用数码显示的电子时钟的源程序.51单片机作为控制核心,可以进行时 分 秒的设定.
💻 ASM
字号:
sec data 51h	;定义秒计数器使用内存区。
min data 53h	;定义分计数器使用内存区。
hou data 55h	;定义时计数器使用内存区。
;***************************************************
	org	0000h
	ajmp	main
	org	000bh
	ljmp	time		;调用计时中断子程序
	org	0100h
	
main:	mov	sp,#60h		;初始化堆栈
	mov	tmod,#01h	;使用tr0的十六位无分频模式
	mov	th0,#04h	;初始化定时器的溢出时间为50ms
	mov	tl0,#00h
	setb	ea		;启用全局中断
	setb	et0		;启用定时器0中断
	setb	tr0		;启用定时器0
	mov	r0,#14h		;初始化定时计数为20
	mov	r1,#00h
	mov	r6,#0ah
	mov	r7,#0ah
	;cpl	p1.1
	mov	sec,#00h	;初始化秒钟计数器
	mov	min,#00h	;初始化分钟计数器
	mov	hou,#00h	;初始化时钟计数器
;******************************************************
dusp:        ;扫描并显示秒钟的个位
	mov	dptr,#tab1	;获得表1首地址
	mov	a,sec		;提取当前秒数
	movc	a,@a+dptr	;查表找字符
	mov	p0,a		;输出
	mov	p2,#11111110b	;关闭其他位,点亮秒钟个位
	lcall	ysh2s		;延时(如果显示抖动,则时间应继续减小)
;扫描并显示秒钟的十位
	mov	dptr,#tab2
	mov	a,sec
	movc	a,@a+dptr
	mov	p0,a
	mov	p2,#11111101b
	lcall	ysh2s
;扫描并显示隔断
	mov	p0,#10111111b
	mov	p2,#11111011b
	lcall	ysh2s
;扫描并显示分钟的个位
	mov	dptr,#tab1
	mov	a,min
	movc	a,@a+dptr
	mov	p0,a
	mov	p2,#11110111b
	lcall	ysh2s		
;扫描并显示分钟的十位
	mov	dptr,#tab2
	mov	a,min
	movc	a,@a+dptr
	mov	p0,a
	mov	p2,#11101111b
	lcall	ysh2s
;扫描并显示隔断
	mov	p0,#10111111b
	mov	p2,#11011111b
	lcall	ysh2s
;扫描并显示时钟的个位
	mov	dptr,#tab1
	mov	a,hou
	movc	a,@a+dptr
	mov	p0,a
	mov	p2,#10111111b
	lcall	ysh2s
;扫描并显示时钟的十位
	mov	dptr,#tab2
	mov	a,hou
	movc	a,@a+dptr
	mov	p0,a
	mov	p2,#01111111b
	;mov	a,#10111111b
	;mov	p0,a
	lcall	ysh2s

	jnb	p3.4,key34		;开关k4按下则跳转
	jnb	p3.5,key35		;开关k3按下则跳转
	jnb	p3.6,key36		;开关k2按下则跳转
	jnb	p3.7,key37		;开关k1按下则跳转
	
	ajmp	dusp			;转到程序的主循环体
;*********************************************************************
;使用开关进行时钟分钟的调整
key34:	jnb	et0,key34_		
	clr	et0			;停止定时器中断
	clr	ea			;关闭全局中断
	mov	r6,#0bh			;控制其它键,允许按下产生动作
	ljmp	dusp			
	ret

key34_:	mov	r6,#0ah			;禁用key16,key15两键工作
	setb	et0			;启用定时器0
	setb	ea			;开启全局中断
	ljmp	dusp
	ret
;*********************************************************************
key35:	cjne	r6,#0bh,key35_		;判断k4是否按下,没按下则跳转
	inc	hou			;按下则增加时钟
	acall	disp			;呼叫延时
	mov	r1,hou			
	cjne	r1,#18h,key35_		;判断时钟是否为24
	mov	hou,#00h		;是,则归零
key35_:	ljmp	dusp
	ret
;**********************************************************************
key36:	cjne	r6,#0bh,key36_
	inc	min
	acall	disp
	mov	r1,min
	cjne	r1,#3ch,key36_
	mov	min,#00h
key36_:	ljmp	dusp
	ret
;***********************************************************************
key37:	cjne	r6,#0bh,key37_
	inc	sec
	acall	disp
	mov	r1,sec
	cjne	r1,#3ch,key37_
	mov	sec,#00h
key37_:	ljmp	dusp
	ret
;*********************************************************************
;延时子程序
ysh2s:	mov	r3,#01h
loop2:	mov	r4,#05h
loop21: mov	r5,3fh
	djnz	r5,$
	djnz	r4,loop21
	djnz	r3,loop2
	ret
;**********************************************************************
;计时子程序 入口参数 sec min hou 出口参数同样 参数传递给字符显示程序
;********************************************************************
time4:	;每秒计时一次
	cpl	p3.3		;p1.0清零
	inc	sec		;秒针加一
	mov	r1,sec
	cjne	r1,#3ch,time5	;判断秒针是否为60

	mov	sec,#00h	;是则秒针清零
	inc	min		;分针加一
	;setb	p1.1
	mov 	r1,min
	cjne	r1,#3ch,time5	;判断分针是否为60
	mov	min,#00h	;是则分针清零
	inc	hou		;时钟加一
	mov 	r1,hou
	cjne	r1,#18h,time5	;判断时钟是否为24
	mov 	hou,#00h	;是则时钟清零
time5:	ret
;*******************************************************************
;调时时调用的显示子程序
;*******************************************************************
disp:        
	mov	dptr,#tab1	;获得表1首地址
	mov	a,sec		;提取当前秒数
	movc	a,@a+dptr	;查表找字符
	mov	p0,a		;输去
	mov	p2,#11111110b	;关闭其他位,点亮秒钟个位
	lcall	ysh2s		;延时(如果显示抖动,则时间应继续减小)
;扫描并显示秒钟的十位
	mov	dptr,#tab2
	mov	a,sec
	movc	a,@a+dptr
	mov	p0,a
	mov	p2,#11111101b
	lcall	ysh2s
;扫描并显示隔断
	mov	p0,#10111111b
	mov	p2,#11111011b
	lcall	ysh2s
;扫描并显示分钟的个位
	mov	dptr,#tab1
	mov	a,min
	movc	a,@a+dptr
	mov	p0,a
	mov	p2,#11110111b
	lcall	ysh2s		
;扫描并显示分钟的十位
	mov	dptr,#tab2
	mov	a,min
	movc	a,@a+dptr
	mov	p0,a
	mov	p2,#11101111b
	lcall	ysh2s
;扫描并显示隔断
	mov	p0,#10111111b
	mov	p2,#11111011b
	lcall	ysh2s
;扫描并显示时钟的个位
	mov	dptr,#tab1
	mov	a,hou
	movc	a,@a+dptr
	mov	p0,a
	mov	p2,#10111111b
	lcall	ysh2s
;扫描并显示时钟的十位
	mov	dptr,#tab2
	mov	a,hou
	movc	a,@a+dptr
	mov	p0,a
	mov	p2,#01111111b
;	mov	a,#10111111b
;	mov	p0,a
	lcall	ysh2s
	djnz	r7,disp
	mov	r7,#0ah
	ret
;*************************************************************************************
;中断服务子程序
;***************************************************************************************
time:	clr	et0		;关闭定时其零中断
	clr	tr0		;关闭定时器零
	mov	th0,#4ch	;定时器赋初值
	mov	tl0,#00h
	djnz	r0,time2	;判断20次技术是否完成
	lcall	time4		;完成则进入时间子程序
	mov	r0,#14h
time2:	setb	tr0
	setb	et0
	reti
;***************************************************************************************
tab1:
	db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h;
	db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h;
	db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h;
	db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h;
	db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h;
	db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h;
tab2:  	db 0c0h,0c0h,0c0h,0c0h,0c0h,0c0h,0c0h,0c0h,0c0h,0c0h;
	db 0f9h,0f9h,0f9h,0f9h,0f9h,0f9h,0f9h,0f9h,0f9h,0f9h;
	db 0a4h,0a4h,0a4h,0a4h,0a4h,0a4h,0a4h,0a4h,0a4h,0a4h;
	db 0b0h,0b0h,0b0h,0b0h,0b0h,0b0h,0b0h,0b0h,0b0h,0b0h;
	db 099h,099h,099h,099h,099h,099h,099h,099h,099h,099h;
	db 092h,092h,092h,092h,092h,092h,092h,092h,092h,092h;
	
	end

⌨️ 快捷键说明

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