51单片机,用超声波测距,怎么又调不好,大神给看看吧

#include<reg52.h>
sbit trig = P2^0;
sbit echo = P2^1;
sbit LED0 = P1^0;
sbit LED1 = P1^1;
void Delay(unsigned int n)
{
unsigned char y;
unsigned int x;
for(x=0;x<n;x++)
{
for(y=0;y<100;y++)
{}
}
}
main()
{
unsigned long load;
TMOD = 0x01; //定时器0 工作方式1 16位
TH0 = 0x0;
TL0 = 0x0;
TR0 = 0;
trig = 0;

while(1)
{
echo = 1;
Delay(1);
trig = 1;
Delay(20);
trig = 0;
while(!echo)
TR0 = 1;
while(echo)
TR0 = 0;
load = TH0 * 256 + TL0;
if(load >500)
{
LED0 = 0; //时间大于500 * 12 /(11059200 * 2)LED0亮
Delay(2000);
LED0 = 1;
}
else
{
LED1 = 0; //时间小于,LED1亮
Delay(2000);
LED1 = 1;
}
if(TF0 == 1)
{
TF0 = 0;
TH0 = 0;
TL0 = 0;
}
TH0 = 0;
TL0 = 0;

}
想实现的功能写出来了,烧好后,LED1一直亮,LED2却不亮,而且距离不同闪的频率不同,好像延时不管用,怎么回事啊

while(1)
{
echo = 1; 改为(echo=0)
Delay(1);
trig = 1;
Delay(20); 这为发射端发射个脉冲信号
trig = 0;
while(!echo) 接受端echo不为0时,表示接收到高电平信号,然后就是计算这个高电平的时间了
TR0 = 1; 开定时器
while(echo) 直到echo变为0说明接收的高电平结束了
TR0 = 0; 关定时器
load = TH0 * 256 + TL0; 计算计数器记了多少,就可以用时钟周期计算出这个高电平的时间了
把while(1)下面的echo=1;改成echo=0;追问

51的IO口做输入口不是应该要保证为1才能读数?

追答

要不你试试把echo=1删掉,下载一下看看还行不行

追问

不行啊,原来说错了,不是LED2是LED0,。还和原来现象一样

温馨提示:答案为网友推荐,仅供参考