#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit senddata=P2^0;
uchar Tdata[40]={0};
uchar Vdata[40]={0};
float Adata1=0,Adata2=0,Adata3=0;
int k=0;
uint i=0,a,b,c,d,senddata1=0,senddata2=0;
uchar count=0,jiasu=0,jiansu=0,yunsu=0,time=0;
void Init_int0()
{
EX0=1;
IT0=1;
}
void Init_Time0()
{
TMOD=0X11;
TH0=0X15;
TL0=0XA0;
TH1=0X3C;
TL1=0XB0;
ET0=1;
}
void Dealdata(uchar M)//数据处理
{
uchar temp;
float Atemp;
temp=M-1;
a=Tdata[temp-3]*0.06;
b=Tdata[temp-2]*0.06;
c=Tdata[temp-1]*0.06;
d=Tdata[temp]*0.06;
if((a>b)&(a>c)&(a>d))
{
Vdata[temp-3]=25/a;
Vdata[temp-2]=2.3/b;
Vdata[temp-1]=6.4/c;
Vdata[temp]=2.3/d;
Adata1=(Vdata[temp-3]^2-Vdata[temp-2]^2)/27.3;
Adata2=(Vdata[temp-2]^2-Vdata[temp-1]^2)/8.7;
Adata3=(Vdata[temp-1]^2-Vdata[temp]^2)/8.7;
Atemp=(Adata1+Adata2+Adata3)/3;
if(Atemp>=0.1)
{jiasu++;}
if(-0.1>=Atemp)
{jiansu++;}
if(Atemp>-0.1&Atemp<0.1)
{yunsu++;}
}
if((b>a)&(b>c)&(b>d))
{
Vdata[temp-3]=2.3/a;
Vdata[temp-2]=25/b;
Vdata[temp-1]=2.3/c;
Vdata[temp]=6.4/d;
Adata1=(Vdata[temp-3]^2-Vdata[temp-2]^2)/27.3;
Adata2=(Vdata[temp-2]^2-Vdata[temp-1]^2)/27.3;
Adata3=(Vdata[temp-1]^2-Vdata[temp]^2)/8.7;
Atemp=(Adata1+Adata2+Adata3)/3;
if(Atemp>=0.1)
{jiasu++;}
if(-0.1>=Atemp)
{jiansu++;}
if(-0.1<Atemp&Atemp<0.1)
{yunsu++;}
}
if((c>a)&(c>b)&(c>d))
{
Vdata[temp-3]=6.4/a;
Vdata[temp-2]=2.3/b;
Vdata[temp-1]=25/c;
Vdata[temp]=2.3/d;
Adata1=(Vdata[temp-3]^2-Vdata[temp-2]^2)/8.7;
Adata2=(Vdata[temp-2]^2-Vdata[temp-1]^2)/27.5;
Adata3=(Vdata[temp-1]^2-Vdata[temp]^2)/27.5;
Atemp=(Adata1+Adata2+Adata3)/3;
if(Atemp>=0.1)
{jiasu++;}
if(-0.1>=Atemp)
{jiansu++;}
if(-0.1<Atemp&Atemp<0.1)
{yunsu++;}
}
if((d>a)&(d>b)&(d>c))
{
Vdata[temp-3]=2.3/a;
Vdata[temp-2]=6.4/b;
Vdata[temp-1]=2.3/c;
Vdata[temp]=25/d;
Adata1=(Vdata[temp-3]^2-Vdata[temp-2]^2)/8.7;
Adata2=(Vdata[temp-2]^2-Vdata[temp-1]^2)/8.7;
Adata3=(Vdata[temp-1]^2-Vdata[temp]^2)/27.5;
Atemp=(Adata1+Adata2+Adata3)/3;
if(Atemp>=0.1)
{jiasu++;}
if(-0.1>=Atemp)
{jiansu++;}
if(-0.1<Atemp&Atemp<0.1)
{yunsu++;}
}
}void main()
{
Init_int0();
Init_Time0();
EA=1;
while(count!=0)
{
if(count%4==0) //数据处理
{
Dealdata(count);
}
if(count<15&time>500) //车头,数据清零
{
for(k=0;k<40;k++)
{Tdata[k]=0;}
for(k=0;k<40;k++)
{Vdata[k]=0;}
time=0;
count=0;
i=0;
jiasu=0;jiansu=0;yunsu=0;
Init_int0();
Init_Time0();
}
if((jiasu>=4|jiansu>=4)&time>500)//停车,发车
{
EX0=0;
TR0=0;
ET1=1;
TR1=1;
while(senddata2==20)
{
ET1=0;
TR1=0;
for(k=0;k<40;k++)
{Tdata[k]=0;}
for(k=0;k<40;k++)
{Vdata[k]=0;}
time=0;
count=0;
i=0;
jiasu=0;jiansu=0;yunsu=0;
senddata1=0;senddata2=0;
Init_int0();
Init_Time0();
}
}
}
}
void Exte0() interrupt 0
{
count++;
if(count==1)//开启计时器
{
TR0=1;
}
else if(count==40) //记满四十个数据停止
{
TR0=0;
EA=0;
}
else //将计时器中的数据保存到缓存数组中
{
TR0=0;
Tdata[i]=time;
i++;
TH0=0X15;
TL0=0XA0;
time=0;
TR0=1;
}
}
void Time0() interrupt 1 //累加计时
{
time++;
TH0=0X15;
TL0=0XA0;
if(time>=500)
{
EX0=0;
TR0=0;
}
}
void Time1() interrupt 3 //累加计时
{
senddata1++;
if(senddata1==5)
{
senddata=~senddata;
senddata2++;
}
} |