关于超声波测距问题,好人好报,在线等。。

2020-01-30 13:33发布

这次做了一个用51控制的超声波测距东西,关于超声波收发模块是自己做的,不是买的。但是做出来之后测量一点都不准确,我自己找出的原因应该有两点,一是超声波收发接头在电路板上没有放平整,存在角度,所以误差大。二是程序问题。但是最终还是需要大神判定到底是啥问题,我是菜鸟,希望大神能解答,好人好报。。。附上代码。。

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit csb=P3^7  ;  //超声波发射端
sbit light=P3^5;
sbit beep=P3^6 ;
uchar t=0;        //总时间
uint s=0;          //单程距离
uchar flag=0;      //接收标志
uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//0到9的代码
sbit qian=P2^0;
sbit  bai=P2^1;
sbit  shi=P2^2;
sbit  ge=P2^3;
uint xianshi[4];                 //装千位 百位  十位 个位
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
  }

void delay(uint j)
{
  while(j--);
}

void init_timer0()
{
  TMOD=0x11;                        //方式1 16位
  TH0=0;
  TL0=0;
  ET0=1;
  TR0=0;          // 先把计时启动关掉
  }
void display(uint z)
{
xianshi[3]=z/1000;                          //千位
xianshi[2]=z/100%10;                  //百位
xianshi[1]=z/10%10;                  //十位
xianshi[0]=z%10;                          //个位

qian=0;
P0=led[xianshi[3]];
delay(100);
qian=1;
delay(100);

bai=0;
P0=led[xianshi[2]];
delay(100);
bai=1;
delay(100);

shi=0;
P0=led[xianshi[1]];
delay(100);
shi=1;
delay(100);

ge=0;
P0=led[xianshi[0]];
delay(100);
ge=1;
delay(100);
}
void int0() interrupt 0   /**外部中断0服务子程序***/
{
   EX0=0;
   TR0=0;
   EA=0;
   t=TH0*256+TL0-100;          //全程时间
   TH0=0;
   TL0=0;
   flag=1;                 //成功接收标志
  }
void overtime() interrupt 1  /*超时清零。计满65ms,46ms时已达到8超出量程*/
{
  EA=0;
  TH0=0;
  TL0=0;
  EX0=0;
  TR0=0;
  ET0=0;
  flag=2;       //接收失败 超出量程接收
}
void csb_Tx()                         /**超声波发送 42khz**/
{
  uchar i;
  for(i=8;i>0;i--)                          //发送4个方波
  {
    csb=!csb;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
   }
   csb=1; //关发送
   EA=1;
   EX0=1;
   ET0=1;
  }

void main()
{
  uchar h;
  EA=1;
  EX0=1;        //开外部中断0
  IT0=1;    //下降沿触发
  init_timer0();
  while(1)
{
  csb_Tx();          //发送超声波  
  delay_50us(2);    //延时100us 以免回收超声波
  TR0=1;            //开始计时
  while(flag==0);    //等待接收
  if(flag==1)
  {
    s=(0.17*t);          //计算是厘米
        flag=0;
        for(h=0;h<50;h++)
        {
         display(s);
         }
   }
  else if(flag==2)
  {
          s=0;
        for(h=0;h<20;h++)
         {
          display(s);
          }
        flag=0;
     }
   }
  
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
大哈欠E
1楼-- · 2020-01-30 18:38
没有人? 哎 还是自己折腾吧
zjk
2楼-- · 2020-01-30 22:38
感觉那两个中断函数有问题
大哈欠E
3楼-- · 2020-01-30 22:41
 精彩回答 2  元偷偷看……

一周热门 更多>