打印

为什么我的超声波测距误差大呢?

[复制链接]
1657|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nmgz|  楼主 | 2016-6-3 10:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 nmgz 于 2016-6-3 10:35 编辑

为什么我的超声波测距误差大呢,30CM之内比实际值要小2CM,要是100CM以上,差7CM还多呢?用的是HC-SR04,最常见的模块,STC89C52,晶振11.0592,请大神指点!
部分主程序
while (1)
    {  
            StartModule();
            while(!ECHO);  //当RX为零时等待,为1跳出开始计时
            TR0=1;       //开启计数
            while(ECHO);   //当RX为1计数并等待
            TR0=0;    //关闭计数
            S=Conut();   //计算
           
            //printf("the distance is %3f",S);
           ES=0;
           SBUF=S;
           while(!TI);
           TI=0;
    }

相关帖子

沙发
nmgz|  楼主 | 2016-6-3 10:34 | 只看该作者
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int

sbit  ECHO=P2^4; //RX
sbit  TRIG=P2^5; //TX

sbit lcden=P1^5;
sbit lcdrs=P1^0;
sbit lcdrw=P1^1;
      
uint  time=0;
unsigned long  S=0;
bit  flag =0;

uchar disdat[4]={ 0,0,0,0,};
/********************************************************/


void delay(uint z) //延时子程序
{
  uint x,y;
  for(x=z;x>0;x--)
     for(y=110;y>0;y--);
}

   void write_com(uchar com)//定义一个带参数的写命令子程序
{
lcdrs=0; //1602的rs为0时,接收命令,为1时接收数据
P0=com;//把void write_com(uchar com)中的COM中的数据给P0口
delay(5);
lcden=1;
delay(5);
lcden=0;
delay(5);
}
   void write_shu(uchar shu)//定义一个带参数的写数据子程序
{
lcdrs=1; //1602的rs为0时,接收命令,为1时接收数据
P0=shu;//把void write_shu(uchar shu)中的COM中的数据给P0口
delay(5);
lcden=1;
delay(5);
lcden=0;
delay(5);
}

  void write_1602(uchar add,uchar dat)
{
write_com(0x80+0x40+add);
write_shu(dat);
}

void zifuchuan(uchar *ch)
{
while(*ch!=0)
write_shu(*ch++);
delay(20);
}

  void init()//定义一个初始化子程序
{
lcden=0;
lcdrw=0;
write_com(0x38);//调用 write_com子程序并把0x38赋给P0口,显示模式打开
delay(2);
write_com(0x0c);//调用 write_com子程序并把“开显示,显示光标,光标不闪烁”指令码赋给P0口
write_com(0x06);//调用 write_com子程序并把“地址指针加1,整屏不移动”指令码赋给P0口
write_com(0x80);//数据指针初始化,让指针指向最左端,显示从第一行开始
write_com(0x01);//调用 write_com子程序并把"清零指"令码赋给P0口
zifuchuan("renshengpengceju ");

}


float Conut()
{
         float num;
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;
         num=time/58;     //算出来是CM
  
   disdat[0]=S%1000/100;
   disdat[1]=S%1000%100/10;
   disdat[2]=S%1000%10 %10;
   write_1602(1, disdat[0]+0x30);
   write_1602(2, disdat[1]+0x30);  
   write_1602(3, disdat[2]+0x30);
   write_1602(4,'.');
   write_1602(5, disdat[3]+0x30);  
   write_1602(6, 'C');
   write_1602(7, 'm');
   
         return num;
}

/********************************************************/
void zd0() interrupt 1  //T0中断用来计数器溢出,超过测距范围
{
  flag=1;//中断溢出标志
}
/********************************************************/
void  StartModule()   //启动模块
  {
   TRIG=1; //启动一次模块
   _nop_();  _nop_();    _nop_();    _nop_();    _nop_();
   _nop_();   _nop_();    _nop_();    _nop_();   _nop_();
   _nop_();   _nop_();    _nop_();   _nop_();   _nop_();
   _nop_();   _nop_();   _nop_();   _nop_();   _nop_();
   _nop_();
  TRIG=0;
  }
       
/* 串口配置函数,baud-通信波特率 */
void ConfigUART(unsigned int baud)
{
    SCON  = 0x50;  //配置串口为模式1
    TMOD &= 0x0F;  //清零T1的控制位
    TMOD |= 0x20;  //配置T1为模式2
    TH1 = 256 - (11059200/12/32)/baud;  //计算T1重载值
    TL1 = TH1;     //初值等于重载值
    ET1 = 0;       //禁止T1中断
    ES  = 1;       //使能串口中断
    TR1 = 1;       //启动T1
}

void main()
{
    delay(400); //启动等待,等LCD讲入工作状态
    init(); //LCD初始化
       
        EA=1;//开启总中断  
        ConfigUART(9600);  //配置波特率为9600
        TMOD &= 0xF0;  //清零T0的控制位
        TMOD |= 0x01;  //配置T0为模式1
        TH0=0;
        TL0=0;         
        ET0=1; //允许T0中断
        EA=1;//开启总中断   
    while (1)
    {  
            StartModule();
            while(!ECHO);  //当RX为零时等待,为1跳出开始计时
            TR0=1;       //开启计数
            while(ECHO);   //当RX为1计数并等待
            TR0=0;    //关闭计数
            S=Conut();   //计算
          
            //printf("the distance is %3f",S);
           ES=0;
           SBUF=S;
           while(!TI);
           TI=0;
    }
}

使用特权

评论回复
板凳
nmgz|  楼主 | 2016-6-3 15:19 | 只看该作者
我的程序中S=(time1*1.7)/100;
                S=time1/58;
是不是应该改为S=time1*1.87/100;呢

使用特权

评论回复
地板
yuan_001| | 2016-6-12 07:12 | 只看该作者
首先我认同楼上所说。如果你的晶振是12M的,应该就不会出现问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

73

帖子

0

粉丝