MOV A,R6 LCALL PTDS MOV A,R5 LCALL PTDS MOV A,R4
LCALL PTDS ;送显示缓冲区 LCALL SSEE ;显示 SJMP LO29 ;循环计数.显示 ZOY0: CLR A MOV R4,A MOV R5,A
MOV R6,A ;0送R4 R5 R6 MOV R7,#10H
LO30: CLR C ;R2 R3左移.移出的 MOV A,R3 ;最高位送CY RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,R6
ADDC A,R6 ;(R4 R5 R6)*2+CY送R4 R5 R6 DA A ;十进制调整 MOV R6,A MOV A,R5 ADDC A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A
DJNZ R7,LO30 ;循环16次 RET
;-----------------------------------------------
PTDS: MOV R1,A ;拆送显示缓冲区 ACALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET
;--------------------------------------------
15
SSEE: SETB RS1 ;换工作区 MOV R5,#05H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: MOV R1,#0DDH MOV A,30H
MOVX @R1,A ;字位送入 MOV R0,31H MOV A,@R0 MOV DPTR,#DDFF
MOVC A,@A+DPTR ;取字形代码 MOV R1,#0DCH
MOVX @R1,A ;字形送入 MOV A,30H ;右移 RR A MOV 30H,A DEC 31H MOV A,#0FFH
MOVX @R1,A ;关显示 DJNZ R7,SSE1 ;6位显示完了吗? DJNZ R5,SSE2 ;5次显示完了吗? CLR RS1 RET
;--------------------------------------------------------
DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH ;-------------------------------------------------------- END
实验十 电脑时钟(定时器、中断综合实验)
一、实验目的
熟悉MCS-51定时器,串行口和中断初始化编程方法,了解定时器的应用实时程序的设计与调试技巧。
二、实验内容
编写程序,从本实验系统键盘上输入时间初值,用定时器产生0.1S定时中断,对时钟计数器计数,并将数值实时地送数码管显示。
三、程序框图
16
四、实验步骤
连续运行程序,在键盘上输入时间初值,按执行键EXEC执行,数码管上实时显示时间值。
五、思考
(1)电子钟走时精度和程序中那些常数有关?
(2)修改程序使定时器工作方式改变,调节有关参数,进一步提高精度。
ORG 0000H
SJMP CHK00 ORG 000BH
LJMP CLOCK;INT_T0 ORG 0030H CHK00: MOV SP,#60H LCALL LEDP
CHK0: LCALL LCK0 ;键扫,显示子程序 LCALL PTDS0 ;显示缓冲区放数子程序 MOV TMOD,#01H ORL IE,#82H MOV TL0,#0B7H
MOV TH0,#3CH ;定时中断初始化 MOV 23H,#00H
SETB TR0 ;开定时 LOO5: LCALL DIS LCALL PTDS0 SJMP LOO5 PTDS0: MOV R0,#79H MOV A,22H ACALL PTDS MOV A,21H ACALL PTDS MOV A,20H ACALL PTDS RET
;显示
17
;---------------------------------------
PTDS: MOV R1,A ;拆送显示缓冲区 ACALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET
;--------------------------------------- CLOCK: MOV TL0,#0B7H
MOV TH0,#3CH ;恢复初值 PUSH PSW PUSH ACC
SETB 0D3H ;保护 INC 23H ;0.1秒加1 MOV A,23H
CJNE A,#0AH,DONE ;1秒到吗? MOV 23H,#00H ;清0.1秒单元 MOV A,22H
INC A ;秒加1 DA A
MOV 22H,A ;十进制调整 CJNE A,#60H,DONE ;60秒到吗? MOV 22H,#00H ;秒单元清零 MOV A,21H INC A
DA A ;分加1.十进制调整 MOV 21H,A
CJNE A,#60H,DONE ;60分到吗? MOV 21H,#00H ;分单元清零 MOV A,20H INC A
DA A ;时加1.十进制调整 MOV 20H,A
CJNE A,#24H,DONE ;24小时到吗? MOV 20H,#00H ;时单元清零 DONE: POP ACC ;退栈 POP PSW RETI
;----------------------------------------------
SSEE: SETB RS1 ;换工作区 MOV R5,#05H SSE2: MOV 30H,#20H
18
MOV 31H,#7EH MOV R7,#06H SSE1: MOV R1,#0DDH MOV A,30H
MOVX @R1,A ;字位送入 MOV R0,31H MOV A,@R0 MOV DPTR,#DDFF
MOVC A,@A+DPTR ;取字形代码 MOV R1,#0DCH
MOVX @R1,A ;字形送入 MOV A,30H ;右移 RR A MOV 30H,A DEC 31H MOV A,#0FFH
MOVX @R1,A ;关显示 DJNZ R7,SSE1 ;6位显示完了吗? DJNZ R5,SSE2 ;5次显示完了吗? CLR RS1 RET
;-------------------------------------------------------
DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH ;------------------------------------------------------- X3: MOV R4,A MOV R0,#50H MOV A,@R0 MOV R1,A MOV A,R4 MOV @R1,A CLR A POP DPH POP DPL
MOVC A,@A+DPTR INC DPTR CJNE A,01H,X30 dec r1 clr a
MOVC A,@A+DPTR X31: MOV @R0,A INC DPTR PUSH DPL PUSH DPH
19