|
_Justin
贴程序。。。。总感觉误差有点大,而且更让人蛋疼的是我还不知道。。哈哈
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define c2 1000
sbit bep=P3^7; //蜂鸣器
sbit rel=P3^2; //继电器
sbit chk=P3^3; //测试按钮
sbit c_l=P3^4; //c_l测试切换
sbit frq=P3^5; //T1计数输入
ulong f1=0;
ulong f2=0;
ulong cnt_t0=0;
ulong cnt_t1=0;
uint ge,shi,bai,qian,wan,shiwan;
ulong c1;
ulong l1;
code uchar table[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x3f};
//延时函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//led初始化函数
void init_led()
{
P2=0;
P0=0;
delay(5);
}
//定时器计数器初始化函数
void init_inter()
{
TMOD=0X51; //定时器0工作方式1;计时器1工作方式1
TH0=-(50000/256);
TL0=-(50000%256);
TH1=0;
TL1=0;
TR0=1;
TR1=1;
ET0=1;
ET1=1;
delay(5);
}
//数码管计算
void calc_smg(uint f)
{
shiwan=f/100000;
wan=f%100000/10000;
qian=f%100000/1000;
bai=f%1000/100;
shi=f%100/10;
ge=f%10;
}
//显示函数
void disp(uint ge,uint shi,uint bai,uint qian,uint wan,uint shiwan)
{
P0=0X01;
P2=table[shiwan];
delay(5);
P0=0X02;
P2=table[wan];
delay(5);
P0=0X04;
P2=table[qian];
delay(5);
P0=0X08;
P2=table[bai];
delay(5);
P0=0X10;
P2=table[shi];
delay(5);
P0=0X20;
P2=table[ge];
delay(5);
}
//测量电路频率(采用一秒定时法)
ulong freq()
{
ulong f;
EA=1;
while(cnt_t0<40);
cnt_t0=0;
EA=0;
f=(cnt_t1*65536+TH1*256+TL1);
TH0=-(50000/256);
TL0=-(50000%256);
TH1=0;
TL1=0;
return f;
}
//计算c1
void calc_c1()
{
double temp1;
temp1=(double)(f2*f2*c2)/(double)(f1*f1-f2*f2);
c1=(ulong)temp1;
}
void calc_l1()
{
double temp2;
temp2=((double)f1*f1*c1)*0.25*3.14*3.14;
l1=(ulong)temp2;
}
//计算cx并用数码管显示
void calc_cx()
{
ulong cx;
double temp3;
temp3=((double)f1*f1/(double)f2*f2-1)*c1;
cx=(ulong)temp3;
calc_smg(cx);
disp(ge,shi,bai,qian,wan,shiwan);
}
//计算lx并用数码管显示
void calc_lx()
{
ulong lx;
double temp4;
temp4=((double)(f1*f1)/(double)(f2*f2)-1)*l1;
lx=(ulong)temp4;
calc_smg(lx);
disp(ge,shi,bai,qian,wan,shiwan);
}
//蜂鸣器响
void bbb()
{
bep=0;
delay(1000);
bep=1;
}
//主函数
void main()
{
init_led;
init_inter;
delay(2000); //延时2s
f1=freq(); //测量l1和c1振荡器的频率f1并显示
calc_smg(f1);
disp(ge,shi,bai,qian,wan,shiwan);
delay(5);
bee();
rel=0; //闭合继电器并联c2,延时2s后测量f2
delay(2000);
f2=freq();
rel=1;
delay(5);
bee();
calc_c1();
while(1)
{
while(!chk);
bbb();
f2=freq();
if(c_l)
{
calc_cx;
}
else
{
calc_lx;
}
}
}
//定时器0
void timer0() interrupt 1
{
// TR0=0;
TH0=-(50000/256);
TL0=-(50000%256);
cnt_t0++;
// TR0=1;
}
void cnt1() interrupt 3
{
cnt_t1++;
}
![]() |
|