麻烦大虾们给个单片机测周期的程序,用定时中断

麻烦大虾们给个单片机测周期的程序,用定时中断,第1张

假设脉冲的周期在99S-0.1ms之间

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

注意:如果中断程序要到其它寄存器,注意保护。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/yw/12344120.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存