我在计数开始前置TL0=0FFH,TH0=0FFH
中断里是这样处理的:
INT_T0: PUSH ACC
PUSH PSW
MOV TL0,#06H ;(4*3)uS/2
MOV TH0,#0H
SETB OTHERFLAG.4
POP PSW
POP ACC
RETI
TL0,TH0中累加的值就是脉冲的宽度。各位达人,这样用T0计数可以吗?
然后在频率模块里检查TL0,TH0里累计的值得到脉冲宽度。
FREQUENCY_CHK: JB OTHERFLAG.2,F_CHK
JB OTHERFLAG.3,F_GET
JB OTHERFLAG.5,F_WAIT
CLR TIMEFLAG.0
MOV T14MS,#07H
SETB OTHERFLAG.5
F_WAIT: JB TIMEFLAG.0,F_EXIT1
JB P3.2,F_EXIT_1
MOV TL0,#0FFH
MOV TH0,#0FFH
CLR OTHERFLAG.4
SETB TR0
SETB OTHERFLAG.3
CLR TIMEFLAG.0
MOV T14MS,#07H
RET
F_EXIT1: ANL OTHERFLAG,#11000011B
CLR SYSSTATE.1
F_EXIT_1: RET
F_GET: JB TIMEFLAG.0,F_EXIT1
JNB OTHERFLAG.4,F_EXIT_1
JB P3.2,F_EXIT_1
CLR TR0
SETB OTHERFLAG.2
ANL OTHERFLAG,#11000111B
RET
F_CHK: MOV A,IMPULSELBAK
CLR C
SUBB A,TL0
MOV R6,A
MOV A,IMPULSEHBAK
SUBB A,TH0
JC F_CHK_HIGH
MOV IMPULSELBAK,TL0
MOV IMPULSEHBAK,TH0
JNZ F_CHK_ERROR
ADD A,#0FAH
JZ F_CHK_ERROR
SUBB A,R6
JC F_CHK_ERROR
SETB SYSSTATE.1
SETB OTHERFLAG.1
ANL OTHERFLAG,#11000011B
INC CUMULATE
RET
F_CHK_HIGH: MOV A,TL0
CLR C
SUBB A,IMPULSELBAK
MOV R6,A
MOV A,TH0
SUBB A,IMPULSEHBAK
MOV IMPULSELBAK,TL0
MOV IMPULSEHBAK,TH0
JNZ F_CHK_ERROR
MOV A,R6
SUBB A,ALLOW_RANGE
JNC F_CHK_ERROR
SETB SYSSTATE.1
SETB OTHERFLAG.1
ANL OTHERFLAG,#11000011B
MOV CUMULATE,#0
RET
F_CHK_ERROR: CLR SYSSTATE.1
ANL OTHERFLAG,#11000011B
MOV CUMULATE,#0
RET
实际得到的结果不正常,好象是采集的数据不对,如何解决?