C51单片机实验——24小时时钟显示(proteus+asm)

前言

  • 外部中断0控制计数器的启动/停止
    外部中断1控制计数器的清零复位
  • P1.0控制LED的段选口使能信号
    P1.1控制LED的位选口使能信号

Proteus电路图在这里插入图片描述

asm代码

ORG		0000H
LJMP	INIT
ORG		0003H				//外部中断0
LJMP	INT0SUB		
ORG		000BH				//定时器T0
LJMP	T0INTP				
ORG		0013H				//外部中断1
LJMP	INT1SUB

ORG		0100H
INIT:	CLR		P1.0		//控制端复位
		CLR		P1.1
		MOV		DPTR,#TABLE	//指向表头
		
		MOV		TMOD,#01H	//工作模式
		MOV		40H,#00H	//时单元清零
		MOV		41H,#00H	//分单元清零
		MOV		42H,#00H	//秒单元清零
		MOV		43H,#00H	//50ms单元清零
		MOV		TH0,#3CH	//设置T0定时初值
		MOV		TL0,#0B0H	
		SETB	EA			//CPU允许中断
		SETB	ET0			//T0允许中断
		SETB	EX0			//启动外部中断0
		SETB	EX1			//启动外部中断1
		SETB	TR0			//启动T0定时
		
MAIN:	SETB	TR0
		LCALL	DISPLAY
		SJMP	MAIN	

DISPLAY:MOV		A,42H		//传入秒单元
		MOV		B,#10
		DIV		AB
		MOV		44H,B		//秒个位
		MOV		45H,A		//秒十位	

		MOV		A,#7FH		//第一位
		MOV		P0,A		//输出位信号
		SETB	P1.1		//上升沿
		CLR		P1.1
		MOV		A,44H		//秒个位
		MOVC	A,@A+DPTR
		MOV		P0,A		//输出段信号
		SETB	P1.0		//上升沿
		CLR		P1.0
		LCALL	DELAY		//延时1ms

		MOV		A,#0BFH		//第二位
		MOV		P0,A		//输出位信号
		SETB	P1.1		//上升沿
		CLR		P1.1
		MOV		A,45H		//秒十位
		MOVC	A,@A+DPTR
		MOV		P0,A		//输出段信号
		SETB	P1.0		//上升沿
		CLR		P1.0
		LCALL	DELAY		//延时1ms
		
		
		MOV		A,41H		//传入分单元
		MOV		B,#10
		DIV		AB
		MOV		44H,B		//分个位
		MOV		45H,A		//分十位	

		MOV		A,#0DFH		//第三位
		MOV		P0,A		//输出位信号
		SETB	P1.1		//上升沿
		CLR		P1.1
		MOV		A,44H		//分个位
		MOVC	A,@A+DPTR
		MOV		P0,A		//输出段信号
		SETB	P1.0		//上升沿
		CLR		P1.0
		LCALL	DELAY		//延时1ms

		MOV		A,#0EFH		//第四位
		MOV		P0,A		//输出位信号
		SETB	P1.1		//上升沿
		CLR		P1.1
		MOV		A,45H		//分十位
		MOVC	A,@A+DPTR
		MOV		P0,A		//输出段信号
		SETB	P1.0		//上升沿
		CLR		P1.0
		LCALL	DELAY		//延时1ms
		
		
		MOV		A,40H		//传入时单元
		MOV		B,#10
		DIV		AB
		MOV		44H,B		//时个位
		MOV		45H,A		//时十位	

		MOV		A,#0F7H		//第五位
		MOV		P0,A		//输出位信号
		SETB	P1.1		//上升沿
		CLR		P1.1
		MOV		A,44H		//时个位
		MOVC	A,@A+DPTR
		MOV		P0,A		//输出段信号
		SETB	P1.0		//上升沿
		CLR		P1.0
		LCALL	DELAY		//延时1ms

		MOV		A,#0FBH		//第六位
		MOV		P0,A		//输出位信号
		SETB	P1.1		//上升沿
		CLR		P1.1
		MOV		A,45H		//时十位
		MOVC	A,@A+DPTR
		MOV		P0,A		//输出段信号
		SETB	P1.0		//上升沿
		CLR		P1.0
		LCALL	DELAY		//延时1ms

		RET		

T0INTP:	PUSH	PSW
		PUSH	ACC
		MOV		TH0,#3CH	//重装载定时初值
		MOV		TL0,#0B0H
		INC		43H			//50ms个数+1
		MOV		A,43H		
		CJNE	A,#20,RETURN//是否到1秒,未到则返回
		MOV		43H,#00H	//50ms个数清0
		INC		42H			//秒数+1
		MOV		A,42H
		CJNE	A,#60,RETURN//是否到60秒,未到则返回
		MOV		42H,#00H	//秒数清0
		INC		41H			//分数+1
		MOV		A,41H
		CJNE	A,#60,RETURN//是否到60分,未到则返回
		MOV		41H,#00H	//分数清0
		INC		40H			//时数+1
		MOV		A,40H
		CJNE	A,#24,RETURN//是否到24时,未到则返回
		MOV		40H,#00H	//时数清0
RETURN:	POP		ACC			//恢复现场
		POP		PSW
		RETI				//中断返回
		
INT0SUB:CLR		TR0				//启动|停止
		RETI

INT1SUB:MOV		40H,#00H		//时单元清零
		MOV		41H,#00H		//分单元清零
		MOV		42H,#00H		//秒单元清零
		MOV		43H,#00H		//50ms单元清零
		RETI

TABLE:	DB  3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH	//段选表
	
DELAY:	MOV		30H,#2		//延时1ms
		MOV		31H,#234
NEXT:	DJNZ	31H,NEXT
		DJNZ	30H,NEXT
		RET

END

效果图

在这里插入图片描述


版权声明:本文为qq_52516071原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。