标题:
单片机测功率因数
[打印本页]
作者:
Boyme小孔
时间:
2014-8-7 22:15
标题:
单片机测功率因数
我利用外部中断测单片机功率因数,分别检测上升沿,第一个中断打开时,打开定时器,第二中断触发时,关闭定时器。计算出定时器的时间差,利用余弦求出来,LCD显示就可以了。但是数值显示的根本不对啊,我有分开侧,就相当于只用一个中断,测一路方波的频率,也不对。请大家指导一下
谢谢,下面是我程序
#include<reg51.h>
#include<math.h>
#include"lcd.h"
#define uint unsigned int
#define uchar unsigned char
#define ucharc unsigned char code
int c=0;
uint flag1=0,flag2=0;
long int t;
float g;
bit text1=1,text2=1;
sbit Vin=P3^2;
sbit Iin=P3^3;
uchar ENCHAR_PuZh[16]=" pinlv Factor ";
void Disp(long int a);
void Interconfiguration();
void Timerconfiguration();
void Delay(unsigned int b);
void main()
{
uchar j=0;
LCD1602_Init();
Interconfiguration();
Timerconfiguration();
for(;j<16;j++)
{
LCD1602_WriteCom(0x80+j);
LCD1602_WriteData(ENCHAR_PuZh[j]);
}
while(1)
{
// while(Vin);
// while(!Vin);
// ET0=1;//开启定时器中断(设置ET0或ET1)
// while(Iin);
// while(!Iin);
// ET0=0;
// t=c*65536+TH0*256+TL0;//有问题,不太懂咋么
// g=cos(t);
// TR0=0;
// TH0=0;
// TL0=0;
// TR0=1;
// ;;;;;;;;;;;;;;
// TR0=0;
if(flag2==0)
{
// t=(1000/(c*65536+TH0*256+TL0));
// EX1=0;
// ET1=0;
// ET0=0;
TR0=0;
Disp((c*65536+TH0*256+TL0));
TH0=0;
TL0=0;
c=0;
// flag1=0;
// flag2=0;
Delay(5000);
TR0=1;
// ET0=1;
// EX1=1;
}
}
}
void Timerconfiguration()
{
TMOD=0x01;
EA=1;
// TH0=0x3c;
// TL0=0xb0;
TR0=1;//启动定时器0
// ET0=1;//启动定时器0中断
}
void Timer0() interrupt 1
{
// TH0=0x3c;
// TL0=0xb0;
c++;
}
void Interconfiguration()
{
EA=1;
// IT0=1;
// EX0=1;
IT1=1;
EX1=1;
}
void Inter0() interrupt 0
{
// flag1=1;
// ET0=text1;
// text1=~text1;
// flag1=~flag1;
}
void Inter1() interrupt 2
{
ET0=text2;
text2=~text2;
flag2=~flag2;
// flag2=1;
}
void Disp(long int a)
{
//a=TH0*1000+TL0;
LCD1602_WriteCom(0xc0);
LCD1602_WriteData(a/1000000000%10+'0');
LCD1602_WriteData(a/100000000%10+'0');
LCD1602_WriteData(a/10000000%10+'0');
LCD1602_WriteData(a/1000000%10+'0');
LCD1602_WriteData(a/100000%10+'0');
LCD1602_WriteData(a/10000%10+'0');
LCD1602_WriteData(a/1000%10+'0');
LCD1602_WriteData(a/100%10+'0');
LCD1602_WriteData(a/10%10+'0');
LCD1602_WriteData(a%10+'0');
//// LCD1602_WriteData('0');
//// LCD1602_WriteData('.');
// LCD1602_WriteData((a*1000)/100+'0');
// LCD1602_WriteData(((a*1000)%100)/10+'0'); //需要显示的小数
// LCD1602_WriteData((a*1000)%10+'0');
}
//void Inter1() interrupt 2
//{
// Delay(5000);
// if(k2==0)
// c=1;
//}
void Delay(unsigned int b)
{
unsigned char d;
for(;b>0;b--)
{
for(d=110;d>0;d--);
}
}
大家可以只看中断和主函数里面的,东西,请大家多多批评,谢谢。
作者:
admin
时间:
2014-8-8 01:21
现在显示的什么
作者:
Boyme小孔
时间:
2014-8-8 09:49
显示的是周期,只是用的一路中断来进行测试,就是P3^3接收上升沿,接收第一个上升沿打开定时器,当接受到第二个中断时关闭中断,这时候就开始显示,只是显示周期,显示的数值一定都不准确
void Inter1() interrupt 2
{
ET0=text2;
text2=~text2;
flag2=~flag2;
// flag2=1;
}
这个地方时定时器的开,开了之后有一个控制变量,当另一个上升沿到来时,关闭定时器,同时flag2也变换两次,作为标志位惊醒显示。
if(flag2==0)
{
TR0=0;
Disp((c*65536+TH0*256+TL0));
TH0=0;
TL0=0;
c=0;
Delay(5000);
TR0=1;
}
就是不知道为什么不能准确的显示,请您帮忙看看,问题出在那里,谢谢。非常感谢
作者:
Boyme小孔
时间:
2014-8-8 14:14
是不是我的c 和显示函数的类型定义错了,
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1