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

#include<reg52.h>sbittrig=P2^0;sbitecho=P2^1;sbitLED0=P1^0;sbitLED1=P1^1;voidDelay(un... #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却不亮,而且距离不同闪的频率不同,好像延时不管用,怎么回事啊
展开
 我来答
清铃烨华
推荐于2016-10-02 · 超过28用户采纳过TA的回答
知道答主
回答量:36
采纳率:0%
帮助的人:42.2万
展开全部
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删掉,下载一下看看还行不行
福州大禹电子科技
2024-12-16 广告
超声波接近开关是福州大禹电子科技有限公司生产的一种高精度传感器,它利用超声波进行非接触式测距,检测范围广,误差小,精度高,可检测到2.5cm至10m内的任何物体。其结构坚固,对脏物、环境光线或噪声不敏感,广泛应用于工业自动化控制领域,如自动... 点击进入详情页
本回答由福州大禹电子科技提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式