大哈欠E 发表于 2013-5-19 14:41:32

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

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

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uintunsigned 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;
sbitbai=P2^1;
sbitshi=P2^2;
sbitge=P2^3;
uint xianshi;               //装千位 百位十位 个位
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=z/1000;                          //千位
xianshi=z/100%10;                  //百位
xianshi=z/10%10;                  //十位
xianshi=z%10;                          //个位

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

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

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

ge=0;
P0=led];
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;
   }
   }

}

大哈欠E 发表于 2013-5-19 17:29:23

没有人? 哎 还是自己折腾吧

zjk 发表于 2013-5-20 10:09:42

感觉那两个中断函数有问题

大哈欠E 发表于 2013-5-20 10:30:53

zjk 发表于 2013-5-20 10:09 static/image/common/back.gif
感觉那两个中断函数有问题

哪里有问题 我实在找不出问题所在。。
页: [1]
查看完整版本: 关于超声波测距问题,好人好报,在线等。。