ORG 0000H
AJMP MAIN
ORG 0003H
AJMP T0INT
;-------------------------------------主程序----------------------------------------
ORG 0100H
MAIN: MOV SP,#35H ;设置堆栈
MOV TMOD,#51H ;T0计数状态、方式1,T1定时状态、方式1
MOV TL0,#00H ;T0计数初值设定
MOV TH0,#00H
MOV TL1,#0B0H ;T1定时50ms初值设定
MOV TH1,#3CH ;fosc=12MHZ(最小定时时间为1μs)
MOV R3,#200 ;设置软件计数器
ORL TCON,#01010000B ;同时启动定时器T0和T1
SETB EA
SETB ET1
LOOP: LCALL MAIN
AJMP LOOP
;---------------------------T0中断服务子程序---------------------------
T0INT: DJNZ R3,EXIT ;1s时间未到则中断返回,继续定时
ANL TCON,#10001111B ;1s定时到,则同时关闭定时器1和定时器0
MOV TL1,#0B0H ;T1定时50ms初值设定
MOV TH1,#3CH ;fosc=12MHZ(最小定时时间为1μs)
MOV R3,#200 ;设置软件计数器
ORL TCON,#01010000B ;同时启动定时器T0和T1
RETI
EXIT: MOV TH1,#0B0H ;1s未到,重设T1的50ms定时初值
MOV TL1,#3CH
RETI
END
;频率测量程序
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP T0INT
;------------------------------主程序------------------------------------
ORG 0100H
MAIN: MOV SP,#35H ;设置堆栈
MOV TMOD,#51H ;T0计数状态、方式1,T1定时状态、方式1
MOV TL0,#00H ;T0计数初值设定
MOV TH0,#00H
MOV TL1,#0B0H ;T1定时50ms初值设定
MOV TH1,#3CH ;fosc=12MHZ(最小定时时间为1μs)
MOV R3,#20 ;设置软件计数器
ORL TCON,#01010000B ;同时启动定时器T0和T1
SETB EA
SETB ET1
;---------------------------T0中断服务子程序---------------------------
T0INT: DJNZ R3,EXIT ;1s时间未到则中断返回,继续定时
ANL TCON,#10001111B ;1s定时到,则同时关闭定时器1和计数器0
MOV R0,TL1 ;将计数值的低八位存入R0
MOV R1,TH1 ;将计数值的高八位存入R1
MOV TL1,#0B0H ;重装初值
MOV TH1,#3CH
MOV R3,#20 ;重新设置软件计数器
ORL TCON,#01010000B ;同时启动定时器T0和T1
AJMP LOOP
EXIT: MOV TH1,#0B0H ;1s未到,重设T1的50ms定时初值
MOV TL1,#3CH
LOOP: RETI
END