#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define step 3.6
#define zhuan 100
#define sudu 2000
#define sudu1 1000
uchar table[]={0xf5,0x05,0xb3,0x97,0x47,0xd6,0xf6,0x85,0xf7,0xd7};
uchar table1[]={0x03,0x02,0x01,0x00};
bit presence;
bit flag=0;
sbit trig=P2^5;
sbit echo=P2^6;
sbit d1=P1^0;
sbit d3=P1^1;
sbit d4=P1^2;
sbit d5=P1^5;
sbit jg=P1^3;
sbit beep=P1^4;
sbit LE=P2^7;
sbit DQ=P2^0;//温度
uchar b=0,bz=0;//记次数
uchar c;//声速
uint jdq=0,a=0,zt,time,S,timer=0;//脉冲数 T2溢出次数 总时间
unsigned char temp_data[2] = {0x00,0x00};
unsigned int dis[3]={0,0,0};
uint jd[3]={0,0,0};
void delay(uint t)
{
while(t--);
return;
}
void bj()//蜂鸣器+激光灯
{
beep=0;jg=0;
delay(4000);
beep=1;jg=1;
return;
}
void xianshi(int a)
{
uchar cod[4],i;
cod[0]=(a/1000)%10;
cod[1]=(a/100)%10;
cod[2]=(a/10)%10;
cod[3]=a%10;
for(i=0;i<4;i++)
{
P0=table[cod[i]];
P3=table1[i];
delay(100);
}
}
void uln1()//步进电机
{ while(1)
{d1=0;d3=1;d4=1;d5=1;delay(sudu1);jdq++;
if(jdq>=zhuan)return;
d1=0;d3=1;d4=1;d5=0;delay(sudu1);jdq++;
if(jdq>=zhuan)return;
d1=1;d3=1;d4=1;d5=0;delay(sudu1);jdq++;
if(jdq>=zhuan)return;
d1=1;d3=0;d4=1;d5=0;delay(sudu1);jdq++;
if(jdq>=zhuan)return;
d1=1;d3=0;d4=1;d5=1;delay(sudu1);jdq++;
if(jdq>=zhuan)return;
d1=1;d3=0;d4=0;d5=1;delay(sudu1);jdq++;
if(jdq>=zhuan)return;
d1=1;d3=1;d4=0;d5=1;delay(sudu1);jdq++;
if(jdq>=zhuan)return;
d1=0;d3=1;d4=0;d5=1;delay(sudu1);jdq++;
if(jdq>=zhuan)return;}
}
void stop()
{
uint i=400;
TR2=0;
EA=0;
if(jdq<zhuan) uln1();
zt=(a*65536+TH2*256+TL2)/1000000;
while(1)
{
while(i--)
xianshi(4444);i=400;
while(i--)
xianshi(dis[0]);i=400;
while(i--)
xianshi(dis[1]);i=400;
while(i--)
xianshi(dis[2]);i=400;
while(i--)
xianshi(zt+1.5);i=400;
while(i--)
xianshi(jd[0]);i=400;
while(i--)
xianshi(jd[1]);i=400;
while(i--)
xianshi(jd[2]);i=400;
}
}
void Conut(void)
{
bz=0;
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time/2)*0.349; //算出来是mm
if((S>=1000)||flag==1) //超出测量范围
{
flag=0;
return;
}
else
{
dis[b]=S+35;
jd[b]=step*jdq;
bj();
b++;
if(b>=3) stop();
else return;
}
}
void uln()//步进电机
{
d1=0;d3=1;d4=1;d5=1;delay(sudu);jdq++;
if(bz==1) Conut();
d1=0;d3=1;d4=1;d5=0;delay(sudu);jdq++;
if(bz==1) Conut();
d1=1;d3=1;d4=1;d5=0;delay(sudu);jdq++;
if(bz==1) Conut();
d1=1;d3=0;d4=1;d5=0;delay(sudu);jdq++;
if(bz==1) Conut();
d1=1;d3=0;d4=1;d5=1;delay(sudu);jdq++;
if(bz==1) Conut();
d1=1;d3=0;d4=0;d5=1;delay(sudu);jdq++;
if(bz==1) Conut();
d1=1;d3=1;d4=0;d5=1;delay(sudu);jdq++;
if(bz==1) Conut();
d1=0;d3=1;d4=0;d5=1;delay(sudu);jdq++;
if(bz==1) Conut();
}
void main()//主控函数
{
TMOD=0x11; //设T0\1为方式1;
RCAP2H=0x00;
RCAP2L=0x00;
TH2=RCAP2H;
TL2=RCAP2L;
ET2=1;
TR2=1;
TH0=0x00;
TL0=0x00;
TH1=0x00; //65MS定时
TL1=0x00;
ET0=1; //允许T0中断
ET1=1; //允许T1中断
TR1=1; //开启定时器1
EA=1; //开启总中断
while(1)
uln();//步进电机转动
}
void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块
{
TH1=0x00;
TL1=0x00;
timer++;
if(timer>=5)
{
timer=0;
trig=1; //650MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
trig=0;
while(!echo); //当echo为零时等待
TR0=1; //开启计数
while(echo); //当echo为1计数并等待
TR0=0; //关闭计数
bz=1;
}
}
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
void zd5() interrupt 5
{
a++;
TF2=0;
}