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

📄 timer.asm

📁 是基于51单片机的电子时钟程序(汇编代码)
💻 ASM
字号:
		/************************************************************/
		/* 程序名称:	时、分、秒计时器设计                      	*/
		/* 功能:		动态显示六位数字,可以通过按键调整时间    	*/
		/* 设计者:		代云启;	  							    */
		/* EMEL:		yunqi145@yahoo.com.cn;	QQ:		99399143	*/
		/* Date:		2007-05-05									*/
		/************************************************************/

		/************************* 主程序 ***************************/
			ORG		0000H
			AJMP	MAIN
			ORG		000BH
			AJMP	TIMER0
MAIN:		MOV		SP,		#6FH
			MOV		R5,		#08H
			MOV		R0,		#20H
			MOV		2AH,	#00H
			MOV		2BH,	#00H
			MOV		2CH,	#00H
			MOV		TMOD,	#01H
			MOV		TH0,	#0ECH
			MOV		TL0,	#78H
			SETB	EA
			SETB	ET0
			MOV		R4,		#200
			SETB	TR0
		/********************************************************/
		/* 以下为循环扫描按键以检测外界对时、分、秒的设置和修改 */
		/* 其中,K1、K2、K3为加1调整,K4、K5、K6为减1调整,K8为 */
		/* 清零按钮											    */
		/********************************************************/
LOOP:		JB		P1.7,	NEXT2  			/* K7复位键检测 */
			LCALL	DELAY
			JB		P1.7,	NEXT2
NEXT1:		JNB		P1.7,	NEXT1
			MOV		2CH,	#00H
			MOV		2BH,	#00H
			MOV		2AH,	#00H
NEXT2:		JB		P1.0,	NEXT4  			/* K1、K2、K3键检测 */
			LCALL	DELAY
			JB		P1.0,	NEXT4
NEXT3:		JNB		P1.0,	NEXT3
			MOV		A,		2CH
			ADD		A,		#01H
			DA		A
			MOV		2CH,	A
			CJNE	A,		#60H,	NEXT4
			MOV		2CH,	#00H
NEXT4:		JB		P1.1,	NEXT6
			ACALL	DELAY
			JB		P1.1,	NEXT6
NEXT5:		JNB		P1.1,	NEXT5
			MOV		A,		2BH
			ADD		A,		#01H
			DA		A
			MOV		2BH,	A
			CJNE	A,		#60H,	NEXT6
			MOV		2BH,	#00H
NEXT6:		JB		P1.2,	NEXT8
			ACALL	DELAY							 
			JB		P1.2,	NEXT8
NEXT7:		JNB		P1.2,	NEXT7
			MOV		A,		2AH
			ADD		A,		#1H
			DA		A
			MOV		2AH,	A
			CJNE	A,		#24H,	NEXT8
			MOV		2AH,	#00H
NEXT8:		JB		P1.3,	NEXT10			//* K4、K5、K6键检测 
			ACALL	DELAY
			JB		P1.3,	NEXT10
NEXT9:		JNB		P1.3,	NEXT9
			MOV		A,		2CH
			CLR		C
			SUBB	A,		#01H
			MOV		2CH,	A
			CJNE	A,		#0FFH,	NEXT10
			MOV		2CH,	#59H
NEXT10:		JB		P1.4,	NEXT12
			ACALL	DELAY
			JB		P1.4,	NEXT12
NEXT11:		JNB		P1.4,	NEXT11
			MOV		A,		2BH
			CLR		C
			SUBB	A,		#01H
			MOV		2BH,	A
			CJNE	A,		#0FFH,	NEXT12
			MOV		2BH,	#59H
NEXT12:		JB		P1.5,	NEXT14
			ACALL	DELAY
			JB		P1.5,	NEXT14
NEXT13:		JNB		P1.5,	NEXT13
			MOV		A,		2AH
			CLR		C
			SUBB	A,		#01H
			MOV		2AH,	A
			CJNE	A,		#0FFH,	NEXT14
			MOV		2AH,	#23H
NEXT14:		LJMP	LOOP

		/*******************************************************************************/
		/* 以下为T0中断子程序。每500us中断一次,在该子程序中判断是否1s计时到,并做相应 */
		/* 调整和处理(CLK_CHANGE子程序和CONVERT子程序),同时实现每5000us的显示更新。   */
		/*******************************************************************************/
TIMER0:			MOV		TH0,	#0ECH
			MOV		TL0,	#78H
			PUSH	ACC
			PUSH	PSW
			DJNZ	R4,		TIMLP1
			MOV		R4,		#200
			ACALL	CLK_CHANGE
			ACALL	CONVERT
TIMLP1:		ACALL	DISP
			POP		PSW
			POP		ACC
			RETI
		/*******************************************************/
		/* DISP子程序实现时、分、秒计时值在数码管上的动态显示,*/
		/* 每一次调用(相隔5000us)只驱动显示8个数码管中的一个。 */										  
		/*******************************************************/
DISP:		MOV		A,		30H		   /* 循环显示位码*/
			MOV		DPTR,	#BITTAB
			MOVC	A,		@A+DPTR
			MOV		P2,		A

			MOV		DPTR,	#DISTAB	   /* 查表显示段码*/
			MOV		A,		@R0
			MOVC	A,		@A+DPTR
			MOV		P0,		A

			INC		30H
			INC		R0
			DJNZ	R5,		DISPEND
			MOV		30H,	#00H
			MOV		R5,		#08H
			MOV		R0,		#20H
DISPEND:	RET

BITTAB:		DB 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH           /* 位码表,一次只选中一位 */
DISTAB:		DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH		 	/* "0","1",...."9"        */
			DB 40H												/* "-"                    */

		/*******************************************************/
		/* CLK_CHANGE子程序为计时到各时、分、秒数据的处理程序  */
		/*******************************************************/
CLK_CHANGE:	MOV		A,		2CH
			ADD		A,		#1
			DA		A
			MOV		2CH,	A
			CJNE	A,		#60H,	CLKEND
			MOV		2CH,	#00
			MOV		A,		2BH
			ADD		A,		#1
			DA		A
			MOV		2BH,	A
			CJNE	A,		#60H,	CLKEND
			MOV		2BH,	#00
			MOV		A,		2AH
			ADD		A,		#1
			DA		A
			MOV		2AH,	A
			CJNE	A,		#24H,	CLKEND
			MOV		2AH,	#00
CLKEND:		RET
		/***************************************************************/
		/* CONVERT子程序实现时、分、秒计时值转换为BCD码并存储在以20H为 */
		/* 起始地址的显示输出数据存储单元里,即显示缓冲区20H到25H单元。*/
		/***************************************************************/
CONVERT:	MOV		R1,		#20H
			MOV		A,		2CH
			ANL		A,		#0FH
			MOV		@R1,	A
			INC		R1
			MOV		A,		2CH
			ANL		A,		#0F0H
			SWAP	A
			MOV		@R1,	A
			INC		R1
			MOV		@R1,	#0AH
			INC		R1
			MOV		A,		2BH
			ANL		A,		#0FH
			MOV		@R1,	A
			INC		R1
			MOV		A,		2BH
			ANL		A,		#0F0H
			SWAP	A
			MOV		@R1,	A
			INC		R1
			MOV		@R1,	#0AH
			INC		R1
			MOV		A,		2AH
			ANL		A,		#0FH
			MOV		@R1,	A
			INC		R1
			MOV		A,		2AH
			ANL		A,		#0F0H
			SWAP	A
			MOV		@R1,	A
			RET

		/****************************************************************/
		/* DELAY子程序。实现延时约5ms(晶振12MHz,机器周期为1us),执行一个 */
		/* 指令花2个机器周期,所以共需计数2500次。即5ms=2us*2500。       */
		/****************************************************************/
DELAY:		MOV		R6,		#10
D1:			MOV		R7,		#250
			DJNZ	R7,		$
			DJNZ	R6,		D1
			RET
			END
		/***************************程序结束****************************/





		
		



		


										   

⌨️ 快捷键说明

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