HN20093057 发表于 2012-3-29 13:14:54

跪求超声波测距的程序

请高手指教,以下电路图能不能实现超声波测距?我想要一个超声波测距并在数码管上稳定显示的程序,在我的51开发板上测试。数码管的位选是P2^7,段选是P2^6,6个共阴极数码管。

xsh2005105326 发表于 2012-3-29 13:20:38

汗,还跪求。我发的帖子里面就有51的程序,电路也是基本一样,搜索下吧

wenfeiexe 发表于 2012-3-29 13:25:33

问问题前 先搜索下

lisingch 发表于 2012-3-29 23:14:10

这个电路没问题的。

HN20093057 发表于 2012-3-30 09:20:21

lisingch 发表于 2012-3-29 23:14 static/image/common/back.gif
这个电路没问题的。

但是还有个问题,就是为什么数码管显示的距离不断的跳变,是两个探头相互干扰了吗?还是其他原因?

chinmel 发表于 2012-3-30 09:29:00

两个探头的距离尽量远一些 比如8cm

HN20093057 发表于 2012-3-30 09:30:48

xsh2005105326 发表于 2012-3-29 13:20 static/image/common/back.gif
汗,还跪求。我发的帖子里面就有51的程序,电路也是基本一样,搜索下吧

弄了好些天了,快崩溃了!!所以求救高手。
我是看了别人的博客,稍微修改了他的程序,我将程序烧进去,发现勉强可以测距,但就是不稳定,就好像刚显示30cm,马上又变回20或者10cm,而且最大能探测的距离是60cm左右,,所以我想请教各位大哥。

我在想是不是程序没处理好,还是电路有问题,抑或是超声波安装的不好。我看到网上一些视频,电路跟我的差不多,但测距还是挺稳定的,所以想问一下各位,怎么使数码管测距比较稳定,不会跳动很大。程序如下:
//晶振12mhz,8个共阳极数码管,74hc573控制位选和段选,P2^7是位选,P2^6是段选
#include <AT89X52.H>
#include<intrins.h>
#defineuchar unsigned   char
#defineuintunsigned   int
#defineulong unsigned   long
#definenop() _nop_()
ulong    time;                //总时间
uchar    qian,bai,shi,ge;         //千、百、十、个位
uchar    flat;                //标志位
sbit wei=P2^7;//位选
sbit duan=P2^6;段选
//sbit fashe=P1^4;
//sbit jieshou=P3^2;
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e
};//共阳极
void delay(uchar us)   //us*100 us 延时
{
   uint i,j;
    for(i=us;i>0;i--)
       for(j=11;j>0;j--);
}
void fasong(uchar gs)
{
    while(gs--)
    {
      P1_4 = 1;
      nop();nop();nop();nop();
      nop();nop();nop();nop();
      P1_4 = 0;
      nop();nop();nop();
      nop();nop();nop();nop();
    }
      P1_4=0;
}
//用于距离计算
voidjisuan()   
{
    time = TH0;
    time = (time<<8)|TL0;
    time = time-300;   //减去延时300 Us
    time = time*170;
    time = time/1000;    //单位 mm
}
//分离千位、百位、十位、个位
void zhuanhuan()
{
       qian= time/1000;
       bai = time%1000/100;
       shi = time%100/10;
       ge= time%10;
}
void xianshi()
{
                         wei=1;
                         P0=0x08;
                         wei=0;
                         duan=1;
                         P0=table;
                         duan=0;
                         delay(4);
                        
                        
                        wei=1;
                         P0=0x04;
                         wei=0;
                         duan=1;
                         P0=table;
                         duan=0;
                         delay(4);

                        wei=1;
                         P0=0x02;
                         wei=0;
                         duan=1;
                         P0=table;
                         duan=0;
                         delay(4);
                        
                        wei=1;
                         P0=0x01;
                         wei=0;
                         duan=1;
                         P0=table;
                         duan=0;
                         delay(4);      
}
void main()
{
         ucharcs;         //扫描循环次数变量
   TMOD = 0x11;         //T0工作在16位计时状态,最高计时65ms
   TH0 = 0x00;
   TL0 = 0x00;
   TR0 = 0;             //先关闭T0
   ET0 = 1;                      //开T0中断
   EX0 = 0;             //循环程序中再打开
   PX0 = 1;             //INT0中断高优先级
   EA = 1;      
   while(1)
    {
               while(!P3_2){}   //P3.2为低则等待,不发送
         delay(5);
         while(!P3_2){}   //如果P3.2仍为低,等待,直到为高,在发
         EX0 = 0;          //开始发送前保证INT0是关闭状态
         ET0 = 0;          //先关闭T0中断
         TH0 = 0x00;
         TL0 = 0x00;       //保证发射前初值为0
         flat= 0;
         ET0 = 1;          //重新打开
         //delay(1);      //稍作延时100us
         while(!P3_2){}
         TR0 = 1;          //T0 计时开始               
         fasong(3);      //发送2个40khz脉冲
         delay(3);       //300us延时,防止直波干扰
         EX0 = 1;          //开始接收信号
         while(!flat){}    //如果flat=0,等待
         if(flat == 1)         //INT0中断完成后进入
         {
               flat = 0;         //重新清0
             TR0 = 0;
             EX0 = 0;
             ET0 = 0;
             jisuan();//计算总时间和来回距离
            zhuanhuan();    //各位分离处理                  
         }
               elseif(flat == 2)       //如果超时,进入,
            {
                   flat = 0;
                   qian = 10;
                   bai= 10;
                   shi= 10;
                  ge   = 10;      //显示----
         }
                  for(cs=0;cs<180;cs++)   
                  {
                                    xianshi();
                  }
   }
}
void Int0(void) interrupt 0
{
      TR0= 0;       //停止计时
      ET0= 0;
      flat = 1;      //标志位置1
      EX0= 0;       //关闭外中端
      while(!P3_2){}    //等待P3.2变高再退出中断
}

void Time0(void) interrupt 1
{
      TR0= 0;
      EX0= 0;
   ET0= 0;
   flat = 2;
}

xsh2005105326 发表于 2012-3-30 09:35:45

不稳定先看看硬件有无问题。接收端灵敏度过高容易出现干扰。

buaawk 发表于 2012-3-30 10:30:15

汗!网上程序一堆一堆的。你的这个原理图,没问题。好多人都在用这个图。
页: [1]
查看完整版本: 跪求超声波测距的程序