单片机编程 计算外中断0输入脉冲与外中断1输入脉冲的间隔时间(求C程序)

计算外中断0输入脉冲与外中断1输入脉冲的间隔时间(求C程序)

就是外中断0先输入一个脉冲波,然后外中断1下一个脉冲波到了,然后求他们俩的时间间隔,求大侠帮帮忙
计算出来的T怎么转换成个位,十位,百位。

这个可以这么弄,
1、设置定时器0为100uS定时时间(看个人,你想要间隔时间分辨度高一点,就设置低一点),打开T0中断,暂时不计数。
2、把外部中断0和1都设置为下降沿触发,打开INT0和INT1的中断
3、允许总中断。

4、在INT0的中断服务程序里,当脉冲下降沿到来的时候,先定时器0的TH0和TL0清零,然后开始计数。
5、在INT1的中断服务程序里,当脉冲下降沿到来的时候,停止定时器0计数,把TH0和TL0保存到一个变量里。
6、对变量进行处理,使用数码管、LCD或者串口把这个变量显示出来。追问

大侠给我个程序把,我自己也不会写,但是我能看懂

追答

这个应该不难写吧,我自己上班也没时间。
你可以自己了解一下,装个protues来仿真一下。

追问

我先试试

追答

我在百度知道看到了好几个这样的问题,这个难道是课设?
你自己先写一下,有问题的话贴出来我再帮你看看。

追问

嗯嗯,好的,我现在就写

追答

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-11
中断0和中断1都设置成下降沿触发中断,当中断0输入一个脉冲下降沿时立即中断,在中断子函数中启动定时器,在中断1输入一个脉冲下降沿时也产生一个中断,中断子函数中停止定时器,然后读定器的值,再根据读出的这个值计算时间就行了。有了这个思路了,这个程序可以考虑自己来写了。
第2个回答  2013-09-11
求它们之间的时间间隔。

不难。

但是,求出来之后,不需要显示吗?

还是先设计电路吧,然后才能编写程序。追问

不需要显示,那部分程序我会编

追答

unsigned int tx;
unsigned char tx_end;
//-----------------------------
void init()
{
TMOD = 0x01; //定时方式1
TH0 = 0;
TL0 = 0;

IT0 = 1; //下降沿触发中断
IT1 = 1;
EX0 = 1;
EX1 = 1;
EA = 1;

tx_end = 0;
}
//-----------------------------
void main()
{
init();
while(1) {
if(tx_end) {
tx_end = 0;

//显示 tx
}
}
}
//-----------------------------
void X0_INT() interrupt 0
{
TR0 = 1; //启动, 从0开始定时
}
//-----------------------------
void X1_INT() interrupt 2
{
TR0 = 0; //停止
tx = TH0 * 256 + TL0;
TH0 = 0;
TL0 = 0;
tx_end = 1; //设定标志
}
//-----------------------------

本程序,当fosc=12MHz时,检测的间隔时间,应在 0~65535us 之内。

追问

我还想知道一点,怎么 tx_end = 1; //设定标志
if(tx_end) {
tx_end = 0;
这是什么意思?为什么上面是下面是 tx_end = 0?

追答

当,外中断1输入脉冲后,就停止了 T0 的计时,并且,把时间存到了 tx。

之后,应该如何处理 tx,就不是中断程序所应该干的活了。

为此,应该通知主函数,继续接手,来处理 tx。

tx_end = 1; //设定标志 --这句,就是通知主函数的。

主函数:
if(tx_end) {
tx_end = 0;
就是进行数据处理的。
处理之后,应清除这个通知。即清零。

追问

哥,你看看我上面的计算看看算的有没有错误,这个程序是动态显示吗

追答

hudu = 0.018 * tx;
glys = cos(hudu);
temp = glys * 1000; //43.2

//以上算法,不知道对不对。

//可令 temp 为某个常数,即可知道,显示是否成功。
//即:
temp = 168;

gb = temp / 100;
gs = temp % 100 / 10;
gg = temp % 100 % 10;

lcd_pos(0x05); //显示位置,设定一次即可

lcd_wdat(digit[gb]); //百位显示 1
lcd_wdat(digit[gs]); //十位显示 6
lcd_wdat(digit[gg]); //个位显示 8

//试试看,能否显示 168。

追问

哥,我不会把得到的2进制数转化为十进制,导致没法计算

追答

temp = 168;

gb = temp / 100;
gs = temp % 100 / 10;
gg = temp % 100 % 10;

lcd_pos(0x05); //显示位置,设定一次即可

lcd_wdat(digit[gb]); //百位显示 1
lcd_wdat(digit[gs]); //十位显示 6
lcd_wdat(digit[gg]); //个位显示 8

//先不要算那些东西。
//你先试试看,能否显示 168。

追问

这个可以显示168

追答

那那么,显示就可以了。

问题是,检测到时间差,你想要显示什么?

应该有个公式、算法、思路,然后,才能编写出来程序。

追问

我就是想显示那个时间差,可是得出的结果是二进制,难道单片机能显示二进制?

追答

二进制数,通过下面这三句,不就变成十进制数了吗?

gb = temp / 100;
gs = temp % 100 / 10;
gg = temp % 100 % 10;

显示十进制:
lcd_wdat(digit[gb]); //百位显示 0~9
lcd_wdat(digit[gs]); //十位显示 0~9
lcd_wdat(digit[gg]); //个位显示 0~9

本回答被提问者采纳