大神们看看我这个用51控制3个超声波的程序,为什么不行啊?#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit ENA=P0^0;
sbit IN1=P0^1; //左电机
sbit IN2=P0^2;
sbit ENB=P0^3;
sbit IN3=P0^4; //右电机
sbit IN4=P0^5;
sbit Trig=P3^5; //前左右超声波发射端
sbit Echo=P3^2; //前接
sbit Echo1=P3^3; //左接
sbit Echo2=P3^4; //右接
bit flag=0;
uint time=0;
uint distance,distance1,distance2;
code uchar tab[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uchar xms)//延时大概x毫秒
{
uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar temp)
{
uchar ge,shi,bai;
bai=temp/100;
shi=(temp%100)/10;
ge=temp%10;
dula=1;
P0=tab[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);
dula=1;
P0=tab[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);
dula=1;
P0=tab[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(5);
}
void start() //给至少10us的高电平,启动模块
{
Trig=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=1;
}
uchar count() //前
{
time=TH0*256+TL0;
TH0=0;
TL0=0; //清零
distance=(time*1.7)/100;//厘米
return distance;
}
uchar count1() //左
{
time=TH0*256+TL0;
TH0=0;
TL0=0; //清零
distance1=(time*1.7)/100;//厘米
return distance1;
}
uchar count2() //右
{
time=TH0*256+TL0;
TH0=0;
TL0=0; //清零
distance2=(time*1.7)/100;//厘米
return distance2;
}
void jiance1() //前
{
start();//启动模块
while(!Echo); //当RX为零时等待
TR0=1; //启动计数
while(Echo); //当RX为1时计数并等待
TR0=0; //关闭计数器
count(); //计数
if(flag==1||distance>30||distance<1)
{
distance=0;
TH0=0;
TL0=0;
flag=0;
}
display(distance);
delay(1);
}
void jiance2() //左
{
start();//启动模块
while(!Echo1); //当RX为零时等待
TR0=1; //启动计数
while(Echo1); //当RX为1时计数并等待
TR0=0; //关闭计数器
count1(); //计数
if(flag==1||distance1>30||distance1<1)
{
distance1=0;
TH0=0;
TL0=0;
flag=0;
}
display(distance1);
delay(1);
}
void jiance3()//右
{
start();//启动模块
while(!Echo2); //当RX为零时等待
TR0=1; //启动计数
while(Echo2); //当RX为1时计数并等待
TR0=0; //关闭计数器
count2(); //计数
if(flag==1||distance2>30||distance2<1)
{
distance2=0;
TH0=0;
TL0=0;
flag=0;
}
display(distance2);
delay(1);
}
void t0() interrupt 0
{
flag=1; //溢出标志
}
void qian()
{
ENA=1;
ENB=1;
IN1=0;
IN2=1;
IN3=1;
IN4=0;
}
void hou()
{
ENA=1;
ENB=1;
delay(3);
ENA=0;
ENB=0;
delay(7);
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
void ting()
{
IN1=1;
IN2=1;
IN3=1;
IN4=1;
}
void zuozhuan()
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
}
void youzhuan()
{
ENA=1;
ENB=1;
IN1=0;
IN2=1;
IN3=1;
IN4=0;
}
//*********************************
void main()
{
TMOD=0X01; //定时器工作方式0
TH0=0;
TL0=0;
EA=1; //开总中断
ET0=1;//开定时器中断
while(1)
{
jiance1();
jiance2();
jiance3();
}
}
|