搜索
bottom↓
回复: 8

求救!!我改的超声波测距程序,有哪些错

[复制链接]

出0入0汤圆

发表于 2012-3-30 09:23:10 | 显示全部楼层 |阅读模式
弄了好些天了,快崩溃了!!所以求救高手。
我是看了别人的博客,稍微修改了他的程序,他的博客地址http://blog.sina.com.cn/s/blog_624a11f00100gada.html。我将程序烧进去,发现勉强可以测距,但就是不稳定,就好像刚显示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;
}

本帖子中包含更多资源

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

x

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-3-30 09:23:11 | 显示全部楼层
其实整个程序我也不是全部都弄懂的,还请各位指点迷津。

出0入0汤圆

 楼主| 发表于 2012-3-30 09:23:12 | 显示全部楼层
如果想增大测量距离,电路上或程序上应该改变哪些参数?

出0入0汤圆

发表于 2012-3-30 09:29:31 | 显示全部楼层
似水彪心 发表于 2012-3-30 09:23
如果想增大测量距离,电路上或程序上应该改变哪些参数?

电路上的改动比程序改动大得多,原理差不多,就是要增加发射功率,发射探头功率加大,我已只是知道一点皮毛,楼主成功后分享一下你的经验

出0入0汤圆

 楼主| 发表于 2012-3-30 09:43:12 | 显示全部楼层
zhuangchao12 发表于 2012-3-30 09:29
电路上的改动比程序改动大得多,原理差不多,就是要增加发射功率,发射探头功率加大,我已只是知道一点皮 ...

那是怎么增加发射功率呢?是要换另一种发射探头吗?

出0入0汤圆

发表于 2012-3-30 10:37:33 | 显示全部楼层
你好,我也正在做这个,我的还没有效果,求指导

出0入0汤圆

 楼主| 发表于 2012-3-30 11:03:08 | 显示全部楼层
本帖最后由 似水彪心 于 2012-3-30 11:03 编辑
小波123 发表于 2012-3-30 10:37
你好,我也正在做这个,我的还没有效果,求指导


我觉得问这个贴的楼主会有帮助,我正在看他的贴http://www.ourdev.cn/thread-5251750-1-2.html

出0入0汤圆

发表于 2012-4-1 11:50:52 | 显示全部楼层
发射探头肯定要加大功率,驱动电路的难点是驱动变压器的设计,这方面我已是知道的不多。

出0入0汤圆

发表于 2012-4-1 11:54:30 | 显示全部楼层
楼主看看这个帖子,会有一点感性认识吧http://www.ourdev.cn/thread-4950811-1-1.html
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 02:17

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

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