单片机/MCU论坛
直播中

jefljel

8年用户 1121经验值
擅长:20762
私信 关注
[问答]

51单片机写超声波程序,为什么会出现测距的距离波动厉害的情况?

   #include
#include "intrins.h"
#include "codetab.h"
#include "LQ12864.h"
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

sbit led=P1^2;
sbit fmq=P1^4;  //声光报警电路
sbit Trig=P0^0;
sbit Echo=P3^2;  //超声波模块

uchar times;  //time为接收超声波的时间,s为障碍物的距离
uchar juli[3];  //超声波的距离数字储存


void delay_20us()
{  uchar bt ;
    for(bt=0;bt<100;bt++);
}

void OLED12864_IIC_(int x)  //显示模块
{
  
  juli[0]=x/100+'0';  
  juli[1]=x % 100 /10 + '0';  
  juli[2]=x%10+'0';
  OLED_P8x16Str(00"The distance is");
  OLED_P8x16Str(02juli);
  OLED_P8x16Str(242" cm");
  OLED_P8x16Str(04"Tanyu");
  }

void delay100us(void)   //蜂鸣器延时
{
    unsigned char ab;
    for(b=1;b>0;b--)
        for(a=47;a>0;a--);
}

void Beep()  
{
if(s<20||s>500)
{
led=0;
fmq=0;
delay100us();
fmq=1;
delay100us();
fmq=0;
delay100us();
fmq=1;
delay100us();
fmq=0;
delay100us();
fmq=1;
delay100us();

  }
else
{
led=1;
fmq=1;
  }
}
void Timer0Init()
{
TMOD=0x11;
ET0=1;
EA=1;
TH0=0X00;
TL0=0X00;
TR0=0;
}
void Timer1Init()
{
TH1=0x00;
TL1=0x00;
ET1=1;
TR1=0;
}
  void Int0Init()
{
EA=1;
IT0=1;
EX0=1;
}
void main()
{         
        OLED_Init();
Timer0Init();
Timer1Init();
Int0Init();
Trig=0;
while(1)
{
    EX0=1;
Trig=1;
delay_20us();
Trig=0;
while(Echo==0);
    TR0=1;
        TH1=0x00;         
        TL1=0x00;                  
        TR1=1;                                                  

  while(TH1 < 0xfa);  
  TR1=0;
  
  EX0=0;
     s=time*1.7;
time=0;
   
   
     OLED12864_IIC_(s);  //显示模块显示距离值
//                Beep();  //距离过近时产生报警
  
  }
}
  void Int0() interrupt 0
{
        TR0=0;
time =        TH0*256+TL0;
        TH0=0x00;
          TL0=0x00;
        TH1=0xff;
}


回帖(1)

李方树

2023-11-9 14:38:47

  • 首先,淘宝上的那种超声波传感器的精度本来就不高,所以不要对它抱有太多希望。其次,你注意超声波传感器的测量的范围,改传感器的实际测量范围是3M左右,过远了,测距效果就会很差。               
举报

更多回帖

发帖
×
20
完善资料,
赚取积分