
12M晶振
测出的周期精确到0.1ms
被测脉冲由外部中断0口笑指输入
所以,结果为小数点前两位,小数点后四位
如果说周期不在此范围的话,通过修改定时器内程序就行
ORG 0000H
LJMP 0080H
ORG 0003H
VAR7: DS 1
ORG 0080H
MOV SP, #60H
MOV VAR1, #00H
MOV VAR2, #00H
MOV VAR3, #00H
MOV VAR4, #00H
MOV VAR5, #00H
MOV VAR6, #00H
ACALL SETTIME 配置定时器常数
LJMP $ 死循环,等待捕捉脉冲的第一个下降沿并起动定时器0
ORG 0030H
VAR1: DS 1
VAR2: DS 1
VAR3: DS 1
VAR4: DS 1 所测周期 小数点前两位
VAR5: DS 1 所测周期 小数点后两位
VAR6: DS 1 所测周期 小数点第三四位
LJMP CESHI
ORG 000BH
LJMP ZD10MS
CESHI:
MOV A, VAR1
MOV VAR4, A
MOV A, VAR2
MOV VAR5, A
MOV A, VAR3
MOV VAR6, A
由于外部中断有可能是打断定时器0后执行的,所以需要把所有的数据清零,这样,外部中断返回后,团高定时器无论执行到什么地方,第一次执行完后,VAR1-3的参数仍不变
MOV VAR1, #00H
MOV VAR2, #00H
MOV VAR3, #00H
MOV A, #00H
CLR C
RETI
ZD10MS: 0.1ms中断程序
MOV TH0, #0FFH
MOV TL0, #9BH
===================
每中断一次,依VAR3为最低位,VAR1为最高位,进行10进制带进位加1.
MOV A, VAR3
SETB C
ADDC A, #00H
DA A
MOV VAR3, A
MOV A,VAR2
ADDC A, #00H
DA A
MOV VAR2, A
MOV A, VAR1
ADDC A, #00H
DA A
MOV VAR1, A
RETI
时间短,写的可能有些地方不完善
主要有三点:1 每次的数据肯定都不一样,所以,数据在输出时,最好能进行简单的滤波,每次数据的输出间隔时间放长,这样输出的数据不会乱闪
2 外部中断源虽然对定时器0的碰或配参数进行了清零,但如果刚好在SETB C前中断,那么本次计的时间会多出0.1ms
3 如果要精确定时,那么在给定时器0的计数器填写初始数据时,亦要减掉它消耗的时间。如果它们的计算不准确,数据就会错2%,因为中断的时间太短了,
这里仅仅提供了一个大概的思路,如果要真正做项目,还有好多细节和数据补偿需要考虑。
希望你能满意!
启动入口ORG 0000H 复位启动
LJMP START
ORG 000BH T0中断
LJMP T0INT
ORG 0100H
LJMP START
主控程序
START: MOV SP,#80H 初始堆栈值
MOV TMOD,#02H 定时器0工作于方式2
MOV TH0,#0CEH 定时器0定时时间重早迅装值
MOV TL0,#0CEH 定时器0定时时间0.1mS
MOV YSJS1,#10
MOV YSJS2,#50
SETB TR0 定时器0启动,开始定时
SETB ET0 定时器0中断允许
SETB EA 中断开放
JMP $ 死循环
定时器0中断服务团尺程序
T0INT: NOP 这是0.1mS定时时间,按需要加代塌睁高码
DJNZ YSJS1,P50MS
MOV YSJS1,#10
NOP 这是1mS定时时间,按需要加代码
P50MS: DJNZ YSJS2,QT0
MOV YSJS1,#50
NOP 这是50mS定时时间,按需要加代码
QT0: RETI
YSJS1 EQU 30H
YSJS2 EQU 31H
END
注意:如果中断程序要到其它寄存器,注意保护。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)