刚学 单片机,为什么不同的相位电压和电流出来的功率因数都是0.109?(测得功率因数是交流电压超前交流电流)
分为两部分 : 数码管的输出,和定时器的时间(自己写的数码管输出程序测试没有问题,就是output函数里的,用小于10的数测试)
定时器的时间
1.打开INT1中断,在下降沿的时候 打开T0定时器
2.INT0在下降沿的时候,T0定时器中断 求出中间的时间差
外接u给INT1,i给INT0
#include<reg51.h>
#include<math.h>
#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--);
}
下面的是图片
此帖出自小平头技术问答
一周热门 更多>