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

📄 可编程加、减计时器的设计与实现.txt

📁 加减时间计数器设计
💻 TXT
字号:
SECOND 	EQU 	30H 
	MINITE 	EQU 	31H 
	HOUR 	EQU 	32H
	SECONDK BIT 	P1.0 
	MINITEK BIT 	P1.1 
	HOURK 	BIT 	P1.2
	SW1 	BIT 	P1.3		;加减计数
	SW2 	BIT 	P1.4 		;暂停
	DISPBUF EQU 	40H 		;时、分、秒存储的起始位置
	DISPBIT EQU 	48H 		;DISPBIT用于判断数码管个数
	T2SCNTA EQU 	49H 		;定时初值循环次数
	T2SCNTB EQU 	4AH 
	TEMP 	EQU 	4BH 		;TEMP位选的起始值
	
ORG 	0000H 
			LJMP 	START 
			;
ORG 	000BH 
			LJMP 	INT_T0 		;INT_T0用于送数码管显示
			;
ORG 	001BH
			LJMP 	INT_T1		;INT_T1用于暂停和整点时闹铃
			;
			ORG 	0030H
START: 	MOV 	SECOND,#00H ;初始化
			MOV 	MINITE,#00H 
			MOV 	HOUR,#00H
			MOV 	DISPBIT,#00H 
			MOV 	T2SCNTA,#00H 
			MOV 	T2SCNTB,#00H
			MOV 	TEMP,#0FDH
			MOV 	TMOD,#11H
			MOV 	TH0,#(65536-2000) / 256 ;定时初值为2ms
			MOV 	TL0,#(65536-2000) MOD 256 
			MOV 	TH1,#3CH			;闹钟响铃1分钟定时初值
			MOV 	TL1,#0B0H
			SETB 	TR0					;启动加、减计时
			SETB 	TR1					;启动闹铃响铃时长计时
			MOV 	IE,#8AH				;允许定时中断
			MOV 	IP,#02H				;使T0优先级高于T1,保证时间准确
			MOV 	21H,#00H
			MOV 	20H,#14H
			SETB 	P1.6				;使闹铃输出口为高电平,不响闹铃
			LCALL 	DISP

NK1:	JB 		SECONDK,NK2 	;判断S键按下否,按下则调秒,否则判断调分键
			LCALL 	DELY10MS 		;调用10MS延时去抖
			JB 		SECONDK,NK2 
			INC 	SECOND 
			MOV 	A,SECOND 
			CJNE 	A,#60,NS60 
			MOV 	SECOND,#00H 
NS60: 	LCALL 	DISP 
			JNB 	SECONDK,$ 
NK2: 	JB 		MINITEK,NK3 		;判断M键按下否,按下则调分,否则判断调时键
			LCALL 	DELY10MS 
			JB 		MINITEK,NK3 
			INC 	MINITE 
			MOV 	A,MINITE 
			CJNE 	A,#60,NM60 
			MOV 	MINITE,#00H 
NM60: 	LCALL 	DISP 
	JNB MINITEK,$ 
NK3: JB HOURK,NK4 ;判断H键按下否,按下则调时,否则判断调秒键
	LCALL DELY10MS 
	JB HOURK,NK4 
	INC HOUR 
	MOV A,HOUR 
	CJNE A,#24,NH24 
	MOV HOUR,#00H 
NH24: LCALL DISP 
	JNB HOURK,$ 
NK4: LJMP NK1 

DELY10MS: MOV R6,#10 ;10ms延时
	D1: MOV R7,#248 
	DJNZ R7,$ 
	DJNZ R6,D1 
	RET 

DISP:               ;DISP用于取出HOUR、MINITE、SECOND的BCD码
	MOV A,#40H    ;DISPBUF=40H
	ADD A,#6       ;(A)=46H
	DEC A 
	MOV R1,A       ;R1=(45H)
	MOV A,HOUR
	MOV B,#10 
	DIV AB 
	MOV @R1,A  ;(45H)=HOUR高位
	DEC R1 
	MOV A,B 
	MOV @R1,A ;(44H)=HOUR低位
	DEC R1 
	MOV A,MINITE
	MOV B,#10 
	DIV AB 
	MOV @R1,A ;(43H)=MINITE高
	DEC R1 
	MOV A,B 
	MOV @R1,A ;(42h)=MINITE低
	DEC R1 
	MOV A,SECOND
	MOV B,#10 
	DIV AB 
	MOV @R1,A ;(41H)=SECOND高
	DEC R1 
	MOV A,B 
	MOV @R1,A ;(40H)=SECOND低
	RET
DISP1:LJMP DISP

	INT_T0: 
	MOV TH0,#(65536-2000) / 256 
	MOV TL0,#(65536-2000) MOD 256 
	MOV A,#DISPBUF ;(A)=#40h
	ADD A,DISPBIT ;(A)=(40h)
	MOV R0,A   ;送SECOND高到R0
	MOV A,@R0 
	MOV DPTR,#TABLE 
	MOVC A,@A+DPTR ;取SECOND高的字符
	MOV P0,A ;送出显示
	MOV A,DISPBIT ;取第一个数码管位选
	MOV DPTR,#TAB 
	MOVC A,@A+DPTR 
	MOV P2,A ;送出位选
	INC DISPBIT ;位选加1
	MOV A,DISPBIT 
	CJNE A,#06,KNA ;判断是否为最后个数码管的位选
	MOV DISPBIT,#00H ;是最后个数码管就清0
KNA: JNB SW1,JIANJISHU;判断减计时键按下否,按下就减计时
	JNB SW2,DONE;否则判断暂停键按下否,按下就退出
	INC T2SCNTA ;(49h)=#01;否则开始加计时
	MOV A,T2SCNTA 
	CJNE A,#100,DONE ;判断是否为100?
	MOV T2SCNTA,#00H 
	INC T2SCNTB
	MOV A,T2SCNTB 
	CJNE A,#05,DONE ;判断是否为5,不是则返回
	MOV T2SCNTB,#00H ;是(4AH)=#00
	INC SECOND ;SECOND加1
	MOV A,SECOND 
	CJNE A,#60,NEXTT ;是否为60S
	MOV SECOND,#00H ;是则清0 SECOND
	INC MINITE ;60S 则MINITE加1
	MOV A,MINITE 
	CJNE A,#60,NEXTT ;是否为60M
	MOV MINITE,#00H ;是则清0 MINITE
	INC HOUR;60M则HOUR加1
	MOV A,HOUR
	CJNE A,#24,NEXTT
	MOV HOUR,#00H
NEXTT: LCALL DISP ;否则显示
	DONE:RETI

JIANJISHU:JNB SW2,DONE;开始减计时,判断暂停键按下否,按下就退出
	INC T2SCNTA ;(49h)=#01;否则开始减计时
	MOV A,T2SCNTA ;不是(a)=#01h
	CJNE A,#100,DONE ;判断是否为100?
	MOV T2SCNTA,#00H ;是(49H)=#00
	INC T2SCNTB ;(4ah)=#01h
	MOV A,T2SCNTB ;(A)=#01H
	CJNE A,#05H,DONE ;判断是否为5,不是则返回
	MOV T2SCNTB,#00H ;是(4AH)=#00
	MOV A,SECOND
	CJNE A,#00H,JIANMIAO;判断秒是否为0,不为0就秒减1
	MOV SECOND,#59
	MOV A,MINITE
	CJNE A,#00H,JIANFEN;判断分是否为0,不为0则分减1
	MOV MINITE,#59
	MOV A,HOUR
	CJNE A,#00H,JIANSHI;判断时是否为0,不为0则时减1
	MOV HOUR,#00H
	MOV MINITE,#00H
	MOV SECOND,#00H
	LCALL NEXTT
	SJMP DONE
JIANMIAO:DEC SECOND ;SECOND减1
	LCALL NEXTT
	LJMP JIANJISHU
JIANFEN:DEC MINITE
	LCALL NEXTT
	LJMP JIANJISHU
JIANSHI:DEC HOUR;HOUR减1
	LCALL NEXTT
	LJMP JIANJISHU
	
INT_T1:
	PUSH ACC
	PUSH PSW
	MOV TH1,#3CH
	MOV TL1,#0B0H
	MOV 21H,#00H
	MOV 20H,#14H
	MOV A,SECOND
	CJNE A,#00H,NT;判断是否为整点
	MOV A,MINITE
	CJNE A,#00H,NT
	LJMP LOOP1;是整点则响闹铃
NT:JNB SW2,LOOP1;判断暂停键按下否,按下则响铃
	LJMP OUTT
LOOP1:CLR P1.6
	DJNZ 20H,$
	INC 21H
	MOV A,21H
	CJNE A,#60,LOOP1
	SETB P1.6
	POP PSW
	POP ACC
	RETI
OUTT:POP PSW
	POP ACC
	RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
TAB: DB 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH
END 

⌨️ 快捷键说明

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