似水彪心 发表于 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>
#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;
}

似水彪心 发表于 2012-3-30 09:23:11

其实整个程序我也不是全部都弄懂的,还请各位指点迷津。

似水彪心 发表于 2012-3-30 09:23:12

如果想增大测量距离,电路上或程序上应该改变哪些参数?

zhuangchao12 发表于 2012-3-30 09:29:31

似水彪心 发表于 2012-3-30 09:23 static/image/common/back.gif
如果想增大测量距离,电路上或程序上应该改变哪些参数?

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

似水彪心 发表于 2012-3-30 09:43:12

zhuangchao12 发表于 2012-3-30 09:29 static/image/common/back.gif
电路上的改动比程序改动大得多,原理差不多,就是要增加发射功率,发射探头功率加大,我已只是知道一点皮 ...

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

小波123 发表于 2012-3-30 10:37:33

你好,我也正在做这个,我的还没有效果,求指导

似水彪心 发表于 2012-3-30 11:03:08

本帖最后由 似水彪心 于 2012-3-30 11:03 编辑

小波123 发表于 2012-3-30 10:37 static/image/common/back.gif
你好,我也正在做这个,我的还没有效果,求指导

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

zhuangchao12 发表于 2012-4-1 11:50:52

发射探头肯定要加大功率,驱动电路的难点是驱动变压器的设计,这方面我已是知道的不多。

zhuangchao12 发表于 2012-4-1 11:54:30

楼主看看这个帖子,会有一点感性认识吧http://www.ourdev.cn/thread-4950811-1-1.html
页: [1]
查看完整版本: 求救!!我改的超声波测距程序,有哪些错