[求助] 51单片机求功率因数疑问

想变胖   2017-3-28 20:55 楼主
刚学 单片机,为什么不同的相位电压和电流出来的功率因数都是0.109?(测得功率因数是交流电压超前交流电流)


分为两部分 : 数码管的输出,和定时器的时间(自己写的数码管输出程序测试没有问题,就是output函数里的,用小于10的数测试)


定时器的时间
1.打开INT1中断,在下降沿的时候 打开T0定时器
2.INT0在下降沿的时候,T0定时器中断 求出中间的时间差
外接u给INT1,i给INT0

#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit W=P2^7;
sbit D=P2^6;
sbit D1=P1^0;
sbit D2=P1^1;
sbit D3=P1^2;
uchar code table1[]=//数码管显示字符
{0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef};
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar i,b,c1,d1,e1;
uchar tt;
uint tx;
int  tl,th;
void delay(int);//延时函数
void output(float);//输出功率因数函数
void main()
{
float f,number;
double ty;
TMOD=0x01;
TH0=255;
TL0=255;
EX1=1;// Int1 中断
IT1=1;

ET0=0;//打开定时器0
TR0=0;
TF0=0;
EX0=1;
IT0=1;

EA=1;//int0中断
D1=1;
D3=1;
while(1){
if(tt==1)//如果定时器未溢出,计算时间
{
tx=th*256+tl;
ty=tx*0.01;//微妙换成毫秒应该*0.001的 但是数码管就第一个一直闪0 疑问,*0.01是可以出现正常数字的
}
D1=1;
D3=1;
f=50;
f=(1/f)*1000;//输入电压和电流频率转换为周期
number=(2*3.1415926*ty)/f;
number=cos(number);//求出功率因数
output(number);//输出功率因数
}
}
void timer2() interrupt 2
{
D1=0;
TH0=255;
TL0=255;
th=TH0;
tl=TL0;

tt=1;
}
void timer1() interrupt 1//T0定时器
{

D2=0;
TH0=255;
TL0=255;
tt=0;
}


void timer0() interrupt 0//INT0中断求间隔时间
{


th=th-TH0;
tl=tl-TL0;
ET0=0;
TR0=0;
tt=1;
D3=0;
}//我总觉得是这上面有问题

void output(float num)//输出函数
{
float a=num,c,d,e;//定义浮点型变量
W=1;//开启数码管位选择器
P0=0xfe;
W=0;
D=1;//分别在数码管上显示功率因数的每个位数
b=a/1;
for(i=0;i<10;i++)//通过相除与i比较,相同的将个位数从数组中选择表达出来
{
  if(b==i)
  {
   P0=table1;
   delay(200);
  }
}
D=0;
//以下小数点后三位数显示同理,先乘以10在减去原来的个位数,除以一分别显示
W=1;
P0=0xfd;
W=0;
D=1;
c=a-b;
c=c*10;
c1=c/1;
for(i=0;i<10;i++)
{
  if(c1==i)
  {
   P0=table;
   delay(200);
  }
}
D=0;
W=1;
P0=0xfb;
W=0;
D=1;
d=c-c1;
d=d*10;
d1=d/1;
for(i=0;i<10;i++)
{
  if(d1==i)
  {
   P0=table;
   delay(200);
  }
}
D=0;
W=1;
P0=0xf7;
W=0;

  D=1;
e=d-d1;
e=e*10;
e1=e/1;
for(i=0;i<10;i++)
{
  if(e1==i)
  {P0=table;
   delay(200);}
}
D=0;
}
void delay(uint detime)//延时函数
{
uint x,y;
for(x=detime;x>0;x--)
  for(y=detime;y>0;y--);
}

下面的是图片
  • P70328-203946.jpg
  • P70328-204020.jpg
  • P70328-204119.jpg

回复评论 (7)

求帮忙
点赞  2017-3-28 20:56
功率因数一直都是常数的话 代码有问题
具体的一个节点一个节点的打断点仿真
然后根据公式计算 看哪里出了问题。
一下这么大一段代码贴出来别人很难帮你找问题所在
物致DIY 欢迎你的加入~ QQ群:646461928 公众号:智物知心致成 小店
点赞  2017-3-29 16:47
引用: 皈依 发表于 2017-3-29 16:47
功率因数一直都是常数的话 代码有问题
具体的一个节点一个节点的打断点仿真
然后根据公式计算 看哪里出了 ...

好的
点赞  2017-3-30 19:35
试问楼主程序调试好了吗,求指导
点赞  2017-6-12 20:40
顶一下
点赞  2017-6-12 20:47
楼主程序 周期为什么乘1000 呢  不解
中断求时间间隔那边有问题
点赞  2017-6-12 21:15
点赞  2017-6-12 21:52
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复