当前位置: 代码迷 >> 单片机 >> 利用单片机的2个外部中断测量两个方波信号的时间差,该怎么解决
  详细解决方案

利用单片机的2个外部中断测量两个方波信号的时间差,该怎么解决

热度:202   发布时间:2016-04-28 16:34:17.0
利用单片机的2个外部中断测量两个方波信号的时间差
我利用2个外部中断,测量2个方波的时间差,通过时间-相位转换,求出余弦,这就是测功率因数的方法。但是我不知道我写的代码有什么错误:


#include <reg51.h>
#include <stdio.h>
#include<math.h>
#define uint unsigned int 
#define uchar unsigned char 
#define PI 3.14
uint num=0,t2;
float t,t1;
uchar shu1,shu2,shu3,shu4;
uchar code table[]={//码表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);//这个是数码管要用的
void display(uchar shu2,uchar shu3,uchar shu4);
void
main()
{
TMOD=0x01;//工作方式1
EA=1;
IT0=1;
IT1=1;//下降沿有效
EX0=1;
EX1=1;
TH0=0x00;
TL0=0x00;
while(1);
}

/*外部中断1*/
void
exter1() interrupt 2
{
TR0=1;

}

/*外部中断0*/
void 
exter0() interrupt 0
{
TR0=0;
num++;
if(num==1)
{

EX0=0;
EX1=0; //下面是对时间处理
t=(TH0*256+TL0)*0.001;//读出定时器已经放得值
if(t>=5.0&&t<=10.0)
t=10-t;
else if(t>=10.0&&t<=15.0)
t=t-10;
else if(t>=15.0&&t<=20.0)
t=20.0-t;

t1=(float)t*2*3.14159/20;
t1=cos(t1);
t2=t1*10000;
shu2=t2/1000;
shu3=t2%1000/100;
shu4=t2/10%10;
display(shu2,shu3,shu4);//数码管显示
}

}

void 
display(uchar shu2,uchar shu3,uchar shu4)
{

while(1)
{
P2=0xfe;//选中第一个数码管
P0=0xbf;
delay(1);


P2=0xfd;//选中第二个数码管
P0=table[shu2];
delay(1);

P2=0xfb;//选中第三个数码管
P0=table[shu3];
delay(1);

P2=0xf7;//选中第四个数码管
P0=table[shu4];
delay(1);
}

}

/*延时函数,1ms*/
void 
delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

我从外部中断INT0、INT1同时输入各一个相同频率的有相位差的方波,通过外部中断得出时间差,对时间处理,得出功率因数。
但是数码管什么都不显示,位选全部是高电平。
求高手解答!!!!!!!!!!!!!

------解决方案--------------------
1.你没用到定时器,这两句什么用?
TH0=0x00;
TL0=0x00;
2.你的display()函数里面用的while(1)循环,你又在外部中断0中调用它,死了。
------解决方案--------------------
程序整体逻辑性不好;既然是初学者,先简化程序,能够正确读到T0的值再说其它,逐步将程序复杂起来;
波形的测量不能够仅做1次,开机时,因为外接电路或干扰,管脚的状态还不稳定,此时测量结果很难预料。连续循环测,看是什么结果。
显示程序是否正确,需要先保证,不输入脉冲时,显示一个初始值看看,是不是正确?如果不正确,读到正确的T0值,也无法显示。
中断中调用大程序是不应该的。调用死循环程序更是不应该。学习编程,需要从规范和细微处开始。
------解决方案--------------------
知识点1:
display里是一个死循环,永远不会退出

知识点2:
shu2,shu3,shu4都是局部变量,只有调用display的时候才会被赋值。而display本身是个死循环,永远不退出,因此不存在第二次调用,所以压根就没有什么所谓的"实现动态扫描"

知识点3:
外部中断0里面调用一个永远不退出的函数display,所以这个中断函数也无法结束。导致第一次中断触发后,就不再触发中断。 cpu必须处理完一个中断才能响应下一个


总的来说,我觉得楼主还是先去补习补习编程基础吧,好歹最基本的知识点要掌握,不然你很难理解程序的
------解决方案--------------------
有编程思想是很重要的,先调一下显示程序,再调中断程序,最后联调,很容易定位的···
  相关解决方案