我利用外部中断测单片机功率因数,分别检测上升沿,第一个中断打开时,打开定时器,第二中断触发时,关闭定时器。计算出定时器的时间差,利用余弦求出来,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--);
}
}
大家可以只看中断和主函数里面的,东西,请大家多多批评,谢谢。
|