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

📄 clock.asm

📁 十五个关于AT89S51的源代码
💻 ASM
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;实例七:时钟  clock  
;
;现象:当系统上电复位时,时钟开始走时
;
;作者:杨欣,刘长焕,张延强  电路飞翔网    eedesign@163.com
;
;				http://www.circuitfly.com
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


		ORG		00H				; 起始地址00H
		JMP		MAIN				; 跳转到MAIN
		ORG		0BH				; Timer 0中断向量地址
		JMP		TIM0				; 跳转到TIM0

		; 这里是主程序段,使能中断、装载计数初始值等
MAIN:
		MOV		IE, #82H			; 使能Timer 0中断
		MOV		TMOD, #01H			; 使用Timer 0工作在模式1下
		MOV		TH0, #0F0H			; 装载计数初始值,每4ms中断一次
		MOV		TL0, #60H			; 
		MOV		R0, #00H			; Timer 0的中断计数器
		MOV		30H, #00H			; 秒的计数器
		MOV		31H, #00H			; 分的计数器
		MOV		32H, #00H			; 时的计数器
		MOV		R1, #00H			; 6位七段数码管扫描计数器
		SETB		TR0				; 启动Timer 0中断
		
		JMP		$
	
		; 这里是Timer 0中断服务子程序,用于秒、分、时计时及扫描显示
TIM0:		
		PUSH		ACC				; ACC压栈
		CJNE		R0, #250, SCAN			; 如果R0≠250,即不到1秒,跳到SCAN
		MOV		A, 30H				; 如果到1秒,将30H中的"秒"载入ACC
		ADD		A, #1				; ACC加1
		DA		A				; 十进制调整
		MOV		30H, A				; "秒"存回30H
		CJNE		A, #60H, INC_SEC		; 如R1≠60,说明不到1分钟,跳到INC_SEC
		MOV		A, 31H				; 如果到1分钟,将31H中的"分"载入ACC
		ADD		A, #1				; ACC加1
		DA		A				; 十进制调整
		MOV		31H, A				; "分"存回ACC
		CJNE		A, #60H, INC_MIN		; 如R2≠60,说明不到1小时,跳到INC_MIN
		MOV		A, 32H				; 如果到1小时,将32H中的"时"载入ACC
		ADD		A, #1				; ACC加1
		DA		A				; 十进制调整
		MOV		32H, A				; "时"存回ACC
		CJNE		A, #24H, INC_HR			; 如A≠24,说明不到24个小时,跳到INC_HR
		MOV		30, #00H			; 如果到24小时,则"秒"、"分"、"时"清0
		MOV		31, #00H			; 
		MOV		32, #00H			; 
INC_SEC:
		JMP		INC_TIM				; 跳到INC_TIM
INC_MIN: 
		MOV		30H, #00H			; "秒"清0
		JMP		INC_TIM				; 跳到INC_TIM
INC_HR:
		MOV		30H, #00H			; "秒"清0
		MOV		31H, #00H			; "分"清0
INC_TIM:
		MOV		R0, #00H			; R0清0
		
		; 以下程序段是扫描6位七段数码管的程序
SCAN:	
		CJNE		R1, #6, DISPLAY			; 如果扫描计数器R1≠6,则跳到DISPLAY
		MOV		R1, #00H			; 如果R1=6,说明已经扫描完6位
		JMP		SCAN				; 跳到SCAN
DISPLAY:
		CJNE		R1, #0, CHK_1			; 如果R1≠0,跳到CHK_1
								; 如果R1=0,选中的是最低位的数码管D1
		MOV		A, 30H				; 将"秒"载入ACC
		MOV		P0, #01H			; 
		JMP		RELOAD				; 跳到RELOAD
CHK_1:								
		CJNE		R1, #1, CHK_2			; 如果R1≠1,跳到CHK_2
								; 如果R1=1,选中的是七段数码管D2
		MOV		A, 30H				; 将"秒"载入ACC
		SWAP		A				; ACC的高、低位字节交换
		MOV		P0, #02H			; 
		JMP		RELOAD				; 跳到RELOAD
CHK_2:
		CJNE		R1, #2, CHK_3			; 如果R1≠2,跳到CHK_3
								; 如果R1=2,选中的是七段数码管D3
		MOV		A, 31H				; 将"分"载入ACC
		MOV		P0, #04H			; 
		JMP 		RELOAD				; 跳到RELOAD
CHK_3:
		CJNE		R1, #3, CHK_4			; 如果R1≠3,跳到CHK_4
								; 如果R1=3,选中的是七段数码管D4
		MOV		A, 31H				; 将"分"载入ACC
		SWAP		A				; ACC的高、低位字节交换
		MOV		P0, #08H			; 
		JMP		RELOAD				; 跳到RELOAD
CHK_4:
		CJNE		R1, #4, CHK_5			; 如果R1≠4,跳到CHK_5
								; 如果R1=4,选中的是七段数码管D5
		MOV		A, 32H				; 将"时"载入ACC
		MOV		P0, #10H			; 
		JMP		RELOAD				; 跳到RELOAD
CHK_5:
		CJNE		R1, #5, RELOAD			; 如果R1≠5,跳到RELOAD
								; 如果R1=5,选中的是最高位的数码管D6
		MOV		A, 32H				; 将"时"载入ACC
		SWAP		A				; ACC的高、低位字节交换
		MOV		P0, #20H			; 
				
RELOAD:
		MOV		P2, A				; ACC数据从P1口送出显示
		INC		R0				; 4ms延时计数器加1
		INC		R1				; 扫描计数器R1加1
		MOV		TH0, #0F0H			; 装载计数初始值,4ms延时
		MOV		TL0, #60H			; 
		POP		ACC				; ACC弹栈
		RETI						; 返回主程序

		END

⌨️ 快捷键说明

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