单片机的外部中断如何定时,比如说利用脉冲产生中断,测两次脉冲之间的时间

你能不能编个C程序举例一下啊

首先你要初始化打开定时器,可选择定时器0,方式2,然后设置你的脉冲触发方式。若是是下降沿可直接进入中断,读取当前定时器计数值,同时将两次脉冲的计数值相减即可得出脉冲时间差值。若是上升沿触发,则必须在脉冲输入端加反向器,因为51单片机只有下降沿和低电平触发方式,所以要先将其转换为下降沿方可计算。希望这些可以帮助到你!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-27
假定外部脉冲由外部中断0检测 。 (假设变量都已定义)
void init_int0) interrupt 0
{
i++; // 脉冲 计数。
if(i%2==0)
{
TR0=1; //当脉冲来了引发中断 且脉冲是第一次来时。 启动定时器。
}
else
{
TR0=0; 当下一次脉冲来时 关闭定时器。
}

上面就是大概思路 。你初始化定时器时 ,让THL=0X00;TL0=0X00; 当TR0关闭时 读取THO和TLO的数据 。根据晶振 就可以算出来了 。怎么读取TH0和TL0我还没想 。

}
计几个脉冲的时间 就改变IF判断的条件。
第2个回答  2011-07-24
请问你用的是什么型号的单片机?我用AVR进行过超声波测距。当时的思路是,定义一个定时器并赋初值(注意要用16位计数模式),当收到第一个脉冲时,打开这个定时器,收到第二个脉冲时将定时器停止,用现在的值减去原来的值得到时间。追问

我用的是51呢 你能给我写个程序举例下吗 谢谢

追答

51?我很久没用过了,语法记不太清了,给你个思路:在主程序中就
:i=0;//定时器的初始值;然后赋值。具体赋值视频上边有,你自己看看;
while(1)
{ if(P1^1==1)
{把定时器打开};
break;
}//判断第一个脉冲是否来到,来的话开启定时器开始计时。并记录定时器的初始值;
while(1)
{ if(P1^1==1)
{把定时器关闭};
break;
}//判断第二个脉冲到来;
然后把此时定时器的值保存。用此时的减去初始值,再减去定时器开、关这两条语句执行的时间,就是两个脉冲之间的时间。

追问

所有的我就不知道定时器的值怎么保存呢。。。真麻烦你了,你详细点解释下定时器的值怎么保存呢

追答

第一个脉冲来的时候你不是给THO装初值,给TL0装初值,假设都为0。然后第二个脉冲来了,你用一个unsigned int 型变量 i 保存数值( i 为16bits),先让 i = TH0,然后i = i<<8,(即把TH0保存到 i 的高8位)然后i = i + TL0,这样就把时间的高8位和低8位整合成一个字节,保存在 i 中,用 i 减去初值就是脉冲持续时间。

追问

那下一个i来了呢?这怎么弄呢?

追答

你可以用一个数组,保存前后两次的结果。事先定义一个long int temp,以防止定时器加满又从0开始计数;用result【2】存放两次脉冲来的时候定时器的数值。,然后每次来一个脉冲,做一下工作:result[0] = result[1];temp = 65536 +i(i为整合出的那个定时器的数值)-result【1】;if(temp>66636) result[1[=temp-66636; else result[1] = temp;然后就一个大while就行了。说的有点乱,你静下来慢慢想想,希望对你有帮助。

本回答被提问者采纳