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

📄 all.asm

📁 数字时钟C51程序
💻 ASM
字号:
;********************************
;端口定义和MAIN 函数
;*******************************

;***********BIT*********************
DISPCON		BIT		P3.2
S1			BIT		P1.3   ;设置键
S2			BIT		P1.2   ;数字+1
S3			BIT		P1.5
BEEP		BIT		P3.7
L1			BIT		P1.7
L2			BIT		P1.6

SETFLAG		EQU		20H		;标志字节
;位控制在20H位寻址单元
HH			BIT		00H		;当前设置位标志
HL			BIT		01H
MH			BIT		02H
ML			BIT		03H

bb			bit		04h

;位控制在21H位寻址单元
SS			BIT		08H
FRESH		BIT		09H		;通用控制位标志
S1PREESSED	BIT		0AH
SEC			BIT		0BH

WARNING		BIT		0CH		;闹铃标志位
WARNSETTED	BIT		0DH

TFIX		BIT		0EH		;修正标志

falg		bit		0fh		;settime子程序的闪烁修正
N			EQU		60		;误差值,单位:1/10,默认为0


;****************BYTE*******************
;各种数据缓冲区定义
SECOND		EQU		23H
BUF			EQU		24H
HOUR		EQU		24H
MINUTE		EQU		25H
HOURH		EQU		26H
HOURL		EQU		27H
MINUH		EQU		28H
MINUL		EQU		29H
	

COUNT		EQU		2AH

HHBACK		EQU		2BH
HLBACK		EQU		2CH
MHBACK		EQU		2DH
MLBACK		EQU		2EH


WARNHH		EQU		2FH
WARNHL		EQU		30H
WARNMH		EQU		31H
WARNML		EQU		32H
WARNCNT		EQU		33H		;已设闹铃时间标志

;*************************************************
;中断向量
;***********************************************

		ORG		0000H
		LJMP	MAIN
		ORG		000BH
		LJMP	TIMER0

		ORG		001BH
		LJMP	TIMER1

;		ORG		0013H
;		LJMP	INT_1
		ORG		0030H
MAIN:	
		MOV		SP,		#60H
		LCALL	SYS_INIT
		LCALL	T0_INIT

		LCALL	T1_INIT
		
		LCALL	UART_INIT
		LCALL	DISPLAYP
		LCALL	SETTIME
		JB		S3,	MAIN_00
  		LCALL	SETWARN
		
		SETB	WARNSETTED
		MOV		WARNCNT	,#0
		CLR		TFIX
		MOV		COUNT,	#0
MAIN_00:
		LCALL	DISPLAY1
MAIN_0:
		SETB	TR0
		SETB	ET0
MAIN_1:
		JB		FRESH,	MAIN_2
		SJMP	MAIN_3
MAIN_2:	
		LCALL	DISPLAY1



;********************************************************
		CLR		FRESH	  ;
;********************************************************


		SJMP	MAIN_3
MAIN_3:
		JBC		SEC,	MAIN_4
		SJMP	MAIN_1
MAIN_4:
		CPL		L1
		CPL		L2
		JNB		WARNING,MAIN_5
		CPL		BEEP
		INC		WARNCNT
		MOV		A,	WARNCNT
		XRL		A,#16
		JNZ		MAIN_5
		CLR		WARNING
		MOV		WARNCNT,	#0


MAIN_6:
		SETB	BEEP
MAIN_5:
		MOV		R6,	#60
		LCALL	DEL20_0
		SJMP	MAIN_1


 ;************************************************
;十六进制转化为BCD码
;入口:在BUF中
;出口:分别放在HOURH,HOURL,MINUH,MINUL
;************************************************
HEX2BCD	:
		MOV		R0,	#BUF
		MOV		A,	@R0
		MOV		B,	#10
		CLR		C
		DIV		AB
		MOV		HOURH,	A
		MOV		HOURL,	B
		INC		R0
		MOV		A,		@R0
		MOV		B,		#10
		CLR		C
		DIV		AB
		MOV		MINUH,	A
		MOV		MINUL,	B
		RET

;*************************************************
;显示子程序:DISPLAY  DISPLAY1,	DISPLAYNEW
;入口:  HOURH,HOURL,MINUH,MINUL,(BCD)形式

DISPLAY:
		LCALL	HEX2BCD
DISPLAY1:
		SETB	DISPCON
		MOV		A,	HOURH
		ADD		A,	#30H
		MOVC	A,	@A+PC
		MOV		SBUF,A
DL1:	JNB		TI,	DL1
		CLR		TI
		MOV		A,	HOURL
		ADD		A,	#24H
		MOVC	A,	@A+PC
		ANL		A,	#0FEH
		MOV		SBUF,A
DL2:	JNB		TI,	DL2
		CLR		TI
		MOV		A,	MINUH
		ADD		A,	#16H
		MOVC	A,	@A+PC
		MOV		SBUF,A
DL3:	JNB		TI,	DL3
		CLR		TI
		MOV		A,	MINUL
		ADD		A,	#0AH
		MOVC	A,	@A+PC
		MOV		SBUF,A
DL4:	JNB		TI,	DL4
		CLR		TI
		CLR		DISPCON
		RET

;*******************************************
;0~9的段码(共阳极)
;*******************************************
SEGTAB:	DB	03H,9FH,25H,0DH,99H
		DB	49H,41H,1FH,01H,09H,0FFH
		

;*****************************************
;DISPLAYNEM的子程序,入口:待显示 的数据在R0所指向的缓冲区(BCD )
DISPLAYNEW:
		SETB	DISPCON
		MOV		A,	@R0
		MOV		DPTR, #SEGTABN
		MOVC	A,	@A+DPTR
		MOV		SBUF,A
DNL1:	JNB		TI,	DNL1
		CLR		TI
		INC		R0
		MOV		A,	@R0
		MOVC	A,	@A+DPTR
		ANL		A,	#0FEH
		MOV		SBUF,A
DNL2:	JNB		TI,	DNL2
		CLR		TI
		INC		R0
		MOV		A,	@R0
		MOVC	A,	@A+DPTR
		MOV		SBUF,A
DNL3:	JNB		TI,	DNL3
		CLR		TI
		INC		R0
		MOV		A,	@R0
		MOVC	A,	@A+DPTR
		MOV		SBUF,A
DNL4:	JNB		TI,	DNL4
		CLR		TI
		CLR		DISPCON
		RET
;*******************************************
;0~9的段码(共阳极)
;*******************************************
SEGTABN:	DB	03H,9FH,25H,0DH,99H
		DB	49H,41H,1FH,01H,09H,0FFH

;******************************************
;显示P。
;*****************************************
DISPLAYP:
		SETB	DISPCON
		MOV		DPTR,	#PSEG

		CLR		A
		MOVC	A,	@A+DPTR
		MOV		SBUF,	A
DPL1:	JNB		TI,	DPL1
		CLR		TI
		MOV		A,	#0FFH
		MOV		SBUF,	A
DPL2:	JNB		TI,		DPL2
		CLR		TI
		MOV		A,	#0FFH
		MOV		SBUF,	A
DPL3:	JNB		TI,		DPL3
		CLR		TI
		MOV		A,	#0FFH
		MOV		SBUF,	A
DPL4:	JNB		TI,		DPL4
		CLR		TI
		CLR		DISPCON
		RET
;*****************************************
;P.的段码
;*****************************************
PSEG:	DB		30H


;*********************************************
;12小时制的T0定时中断子程序:TIMER0
;定时时间为100MS,方式1的时间常数为3CB0H
;每次中断,计数单元加一,10次为一秒,带闹铃,误差纠正
;*********************************************
TIMER0:
		PUSH	ACC
		MOV		TL0,	#0B0H
		MOV		TH0,	#3CH
		CLR		FRESH
		CLR		SEC
		INC		COUNT
		MOV		A,	COUNT

		JB		TFIX,	T0_00
		XRL		A,		#10
		SJMP	T0_01
T0_00:	XRL		A,		#N
T0_01:	JZ		T0_1
		POP		ACC
		RETI
T0_1:
		CLR		TFIX
		SETB	SEC
		MOV		COUNT,	#00H
		INC		SECOND
		MOV		A,		SECOND
		XRL		A,		#60
		JZ		T0_2
		POP		ACC
		RETI
T0_2:
		SETB	FRESH
		MOV		SECOND,	#00H
		INC		MINUL
		MOV		A,		MINUL
		XRL		A,		#0AH
		JZ		T0_3
		LJMP	ADJUST
T0_3:
		MOV		MINUL,	#00H
		INC		MINUH
		MOV		A,		MINUH
		XRL		A,		#06
		JZ		T0_30
		LJMP	ADJUST
T0_30:
		MOV		MINUH,	#00H
		INC		HOURL
		MOV		A,		HOURH
		JZ		T0_300
		MOV		A,		HOURL
		XRL		A,#03H
		JZ		T0_4
		LJMP	ADJUST
T0_300:
		MOV		A,		HOURL
		XRL		A,		#0AH
		JZ		T0_4
		LJMP	ADJUST
T0_4:	MOV		HOURL,	#00
		INC		HOURH	
		MOV		A,		HOURH
		XRL		A,		#02
		JZ		T0_40	
		LJMP	ADJUST
T0_40:	MOV		HOURH,	#00
		MOV		HOURL,	#01
		
		;--------------------
		SETB	TFIX
		;--------------------
;时分发生变化时,进行闹铃的判断
ADJUST:
		JB		WARNSETTED,		ADJUST_1
		POP		ACC
		RETI
ADJUST_1:
		MOV		A,		HOURH
		XRL		A,		WARNHH
		JNZ		ADJUST_2
		MOV		A,		HOURL
		XRL		A,		WARNHL
		JNZ		ADJUST_2
		MOV		A,		MINUH
		XRL		A,		WARNMH
		JNZ		ADJUST_2
		MOV		A,		MINUL
		XRL		A,		WARNML
		JNZ		ADJUST_2
		SETB	WARNING
		POP		ACC
		RETI
ADJUST_2:
		CLR		WARNING
		POP		ACC
		RETI	
	
;******************************************
;系统初始华变量清零
SYS_INIT:
	MOV	IE,		#00H;	关中断
	MOV	R0,	#20H;	清变量
	MOV	R1,	#10H;
	MOV	A,		#00H;
SYS_0:	MOV	@R0,	A
	INC	R0
	DJNZ	R1,	SYS_0
	SETB	EA
	RET
	
;*******************************************
;定时器T0的初始化,定时常数为3CB0H,100ms
T0_INIT:
	MOV	TMOD,	#11H;	T0,T1方式1
	MOV	TH0,	#3CH;
	MOV	TL0,	#0B0H
	RET
	
;*******************************************
;定时器T1的初始化,定时常数为3CB0H
T1_INIT:
	MOV	TH1,	#3CH
	MOV	TL1,	#0B0H
	RET
	
;*********************************************
;UART初始化
;串口工作方式0
;TXD输出时钟,RXD数据输出
UART_INIT:
	MOV	SCON,	#00H
	RET
	





;
;***********************************
;当前时间设置子程序:SETTIME
;按S1进入设置状态,按S2进行+1
;************************************
SETTIME:
		LCALL	S1KEY
		MOV		SECOND,	#00H
		MOV		MINUTE,	#00H
		MOV		HOUR,	#00H
		MOV		HOURH,	#0
		MOV		HOURL,	#0
		MOV		MINUH,	#0
		MOV		MINUL,	#0
		MOV		SETFLAG,#0
		SETB	HH

		clr		bb
		setb	falg

		CLR		SS
		SETB	TR1	   
		SETB	ET1
		MOV		COUNT,	#0

SET_0:	
	
		JNB		SS,		SET_06
		JNB		HH,		SET_02
		MOV		HHBACK,	#0AH
		MOV		HLBACK,	HOURL
		MOV		MHBACK,	MINUH
		MOV		MLBACK,	MINUL
		SJMP	SET_01
SET_02:
		JNB		HL,		SET_03
		MOV		HHBACK,	HOURH
		MOV		HLBACK,	#0AH
		MOV		MHBACK,	MINUH
		MOV		MLBACK,	MINUL
		SJMP	SET_01
SET_03:
		JNB		MH,		SET_04
		MOV		HHBACK,	HOURH
		MOV		HLBACK,	HOURL
		MOV		MHBACK,	#0AH
		MOV		MLBACK,	MINUL
		SJMP	SET_01
SET_04:
		MOV		HHBACK,	HOURH
		MOV		HLBACK,	HOURL
		MOV		MHBACK,	MINUH
		MOV		MLBACK,	#0AH
SET_01:
		jb		bb	,set_05
		MOV		R0,		#HHBACK
		lcall	displaynew
		cpl		bb
		SJMP	SET_05
SET_06:
		MOV		R0,		#HOURH
SET_05:
		jnb		falg,	set_07

		LCALL	DISPLAYNEW	;---------------------
		clr		falg
set_07:		

		JB		S1,		SET_1
		LCALL	DELAY20MS
		JB		S1,		SET_1
		setb	falg
		JB		ML,		SET_00
		MOV		A,		SETFLAG
		RL		A
		MOV		SETFLAG,A
		SJMP	SET_0
SET_00:
		CLR		TR1
		CLR		ET1

		LCALL	SETVALUE
		RET
SET_1:
		JB		S2,		SET_0
		LCALL	DELAY20MS
		JB		S2,		SET_0
		setb	falg
		JNB		HH,		SET_2
		INC		HOURH
		MOV		A,		HOURH
		XRL		A,		#2
		JZ		SET_10
		LJMP	SET_0
SET_10:
		MOV		HOURH,	#0
		LJMP	SET_0
SET_2:
		JNB		HL,		SET_3
		INC		HOURL
		MOV		A,		HOURH
		JNZ		SET_20
		MOV		A,		HOURL
		XRL		A,		#0AH
		JZ		SET_21
		LJMP	SET_0
SET_21:
		MOV		HOURL,	#0
		LJMP	SET_0
SET_20:
		MOV		A,	HOURL
		XRL		A,	#03H
		JZ		SET_22
		LJMP		SET_0
SET_22:
		MOV		HOURL,	#0
		LJMP	SET_0

SET_3:
		JNB		MH,		SET_4
		INC		MINUH
		MOV		A,		MINUH
		XRL		A,		#6
		JZ		SET_30
		LJMP	SET_0
SET_30:
		MOV		MINUH,#0
		LJMP	SET_0

SET_4:	
		INC		MINUL
		MOV		A,		MINUL
		XRL		A,		#0AH
		JZ		SET_40
		LJMP	SET_0
SET_40:
		MOV		MINUL,#0
		LJMP	SET_0



;************************************
;闹零设置
;************************************
SETWARN:
		JB		S1,		$
		LCALL	DELAY20MS
		LCALL	DELAY20MS
		JB		S1,		SETWARN

		MOV		WARNHH,	#0
		MOV		WARNHL,	#0
		MOV		WARNMH,	#0
		MOV		WARNML,	#0

		MOV		SETFLAG,#0

		setb		falg
		clr		bb
	
		SETB	HH
		CLR		SS
		SETB	TR1
		SETB	ET1
		MOV		COUNT,	#0
SEW_0:
		JNB		SS,		SEW_06
		JNB		HH,		SEW_02 
		MOV		HHBACK,	#0AH
		MOV		HLBACK,	WARNHL
		MOV		MHBACK,	WARNMH
		MOV		MLBACK,	WARNML
		SJMP	SEW_01
SEW_02:
		JNB		HL,		SEW_03
		MOV		HHBACK,	WARNHH
		MOV		HLBACK,	#0AH
		MOV		MHBACK,	WARNMH
		MOV		MLBACK,	WARNML
		SJMP	SEW_01
SEW_03:
		JNB		MH,		SEW_04
		MOV		HHBACK,	WARNHH
		MOV		HLBACK,	WARNHL
		MOV		MHBACK,	#0AH
		MOV		MLBACK,	WARNML
		SJMP	SEW_01
SEW_04:
		MOV		HHBACK,	WARNHH
		MOV		HLBACK,	WARNHL
		MOV		MHBACK,	WARNMH
		MOV		MLBACK,	#0AH
		
SEW_01:
		jb		bb	,sew_05
		MOV		R0,		#HHBACK
		lcall	displaynew
		cpl		bb
		SJMP	SEW_05
SEW_06:
		MOV		R0,		#WARNHH
SEW_05:
		jnb		falg,	seW_07

		LCALL	DISPLAYNEW
		clr		falg

sew_07:		
		JB		S1,		SEW_1
		LCALL	DELAY20MS
		JB		S1,		SEW_1
		setb	falg
		JB		ML,		SEW_00

		MOV		A,		SETFLAG
		RL		A
		MOV		SETFLAG,A
		SJMP	SEW_0
SEW_00:
		CLR		TR1
		CLR		ET1

		LCALL	SETVALUE
		RET
SEW_1:
		JB		S2,		SEW_0
		LCALL	DELAY20MS
		JB		S2,		SEW_0
		setb	falg
		JNB		HH,		SEW_2
		INC		WARNHH
		MOV		A,		WARNHH
		XRL		A,		#2
		JZ		SEW_10
		LJMP	SEW_0
SEW_10:
		MOV		WARNHH,	#0
		LJMP	SEW_0
SEW_2:
		JNB		HL,		SEW_3
		INC		WARNHL
		MOV		A,		WARNHH
		JNZ		SEW_20
		MOV		A,	WARNHL
		XRL		A,		#0AH
		JZ		SEW_21
		LJMP	SEW_0
		
SEW_21:
		MOV		WARNHL,	#0
		LJMP	SEW_0
SEW_20:
		MOV		A,		WARNHL
		XRL		A,		#03H
		JZ		SEW_22
		LJMP	SEW_0
SEW_22:
		MOV		WARNHL,	#0
		LJMP	SEW_0
SEW_3:
		JNB		MH,SEW_4
		INC		WARNMH
		MOV		A,		WARNMH
		XRL		A,		#6
		JZ		SEW_30
		LJMP	SEW_0
SEW_30:
		MOV		WARNMH,#0
		LJMP	SEW_0

SEW_4:
		INC		WARNML	
		MOV		A,		WARNML
		XRL		A,		#0AH
		JZ		SEW_40
		LJMP		SEW_0
SEW_40:
		MOV		WARNML,	#0
		LJMP	SEW_0	


;************************************************
;数据拼装子程序:SETVALUE
;将HOURH,HOURL,MINUH,MIMUL平装成HOUR,MINUTE
;************************************************
SETVALUE:
		MOV		HOUR,	#00
		MOV		MINUTE,#00
		MOV		SECOND,	#00
		MOV		A,		HOURH
		SWAP	A
		ORL		A,		HOURL
		MOV		HOUR,	A
		MOV		A,		MINUH
		SWAP	A
		ORL		A,		MINUL	
		MOV		MINUTE,	A
		RET


;*********************************************
;启动走时子程序:RUN
;*********************************************

;********************************************
;S2键等待判断子程序:S2KEY
;*********************************************


;***********************************************
;S1键等待判断子程序:S1KEY
;***********************************************
S1KEY:
		JB		S1,	$
		LCALL	DELAY20MS
		JB		S1,	S1KEY
		RET

;*********************************************
;延时20ms
;*********************************************
DELAY20MS:
		MOV		R6,		#100
DEL20_0:
		MOV		R7,		#0FFH
		DJNZ	R7,		$
		DJNZ	R6,		DEL20_0
		RET






;*******************************************
;每中断一次,计数单元加一。5次进行相应的处理
;*******************************************
TIMER1:
		PUSH	ACC	
		MOV		TH1,	#3CH
		MOV		TL1,	#0BH
		INC		COUNT
		MOV		A,		COUNT
		XRL		A,		#5
		JZ		TIMER1_0
		POP		ACC
		RETI
TIMER1_0:
		CPL		SS
		setb	bb
		MOV		COUNT,	#0
		POP		ACC
		RETI

		END				

⌨️ 快捷键说明

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