搜索
bottom↓
回复: 8

跪求超声波测距的程序

[复制链接]

出0入0汤圆

发表于 2012-3-29 13:14:54 | 显示全部楼层 |阅读模式
请高手指教,以下电路图能不能实现超声波测距?我想要一个超声波测距并在数码管上稳定显示的程序,在我的51开发板上测试。数码管的位选是P2^7,段选是P2^6,6个共阴极数码管。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-3-29 13:20:38 | 显示全部楼层
汗,还跪求。我发的帖子里面就有51的程序,电路也是基本一样,搜索下吧

出0入0汤圆

发表于 2012-3-29 13:25:33 | 显示全部楼层
问问题前 先搜索下

出0入0汤圆

发表于 2012-3-29 23:14:10 | 显示全部楼层
这个电路没问题的。

出0入0汤圆

 楼主| 发表于 2012-3-30 09:20:21 | 显示全部楼层
lisingch 发表于 2012-3-29 23:14
这个电路没问题的。

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

出0入0汤圆

发表于 2012-3-30 09:29:00 | 显示全部楼层
两个探头的距离尽量远一些 比如8cm

出0入0汤圆

 楼主| 发表于 2012-3-30 09:30:48 | 显示全部楼层
xsh2005105326 发表于 2012-3-29 13:20
汗,还跪求。我发的帖子里面就有51的程序,电路也是基本一样,搜索下吧

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

我在想是不是程序没处理好,还是电路有问题,抑或是超声波安装的不好。我看到网上一些视频,电路跟我的差不多,但测距还是挺稳定的,所以想问一下各位,怎么使数码管测距比较稳定,不会跳动很大。程序如下:
//晶振12mhz,8个共阳极数码管,74hc573控制位选和段选,P2^7是位选,P2^6是段选
#include <AT89X52.H>
#include<intrins.h>
#define  uchar unsigned   char
#define  uint  unsigned   int
#define  ulong unsigned   long
#define  nop() _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;
}
//用于距离计算
void  jisuan()   
{
    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[qian];
                         duan=0;
                         delay(4);
                        
                        
                        wei=1;
                         P0=0x04;
                         wei=0;
                         duan=1;
                         P0=table[bai];
                         duan=0;
                         delay(4);

                        wei=1;
                         P0=0x02;
                         wei=0;
                         duan=1;
                         P0=table[shi];
                         duan=0;
                         delay(4);
                        
                        wei=1;
                         P0=0x01;
                         wei=0;
                         duan=1;
                         P0=table[ge];
                         duan=0;
                         delay(4);        
}
void main()
{
         uchar  cs;           //扫描循环次数变量
     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();    //各位分离处理                  
         }
               else  if(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;
}

出0入0汤圆

发表于 2012-3-30 09:35:45 | 显示全部楼层
不稳定先看看硬件有无问题。接收端灵敏度过高容易出现干扰。

出0入0汤圆

发表于 2012-3-30 10:30:15 | 显示全部楼层
汗!网上程序一堆一堆的。你的这个原理图,没问题。好多人都在用这个图。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-26 21:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表