我利用外部中斷測單片機(jī)功率因數(shù),分別檢測上升沿,第一個中斷打開時,打開定時器,第二中斷觸發(fā)時,關(guān)閉定時器。計(jì)算出定時器的時間差,利用余弦求出來,LCD顯示就可以了。但是數(shù)值顯示的根本不對啊,我有分開側(cè),就相當(dāng)于只用一個中斷,測一路方波的頻率,也不對。請大家指導(dǎo)一下
謝謝,下面是我程序
#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;//開啟定時器中斷(設(shè)置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'); //需要顯示的小數(shù)
// 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--);
}
}
大家可以只看中斷和主函數(shù)里面的,東西,請大家多多批評,謝謝。
|