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

2020-02-04 09:21发布

弄了好些天了,快崩溃了!!所以求救高手。
我是看了别人的博客,稍微修改了他的程序,他的博客地址http://blog.sina.com.cn/s/blog_624a11f00100gada.html。我将程序烧进去,发现勉强可以测距,但就是不稳定,就好像刚显示30cm,马上又变回20或者10cm,而且最大能探测的距离是60cm左右因为博主没怎么上博客,没有回答我的问题,所以我想请教各位大哥。我用的电路图如下:。 收发.png (234.73 KB, 下载次数: 6) 下载附件 2012-3-30 07:51 上传
我在想是不是程序没处理好,还是电路有问题,抑或是超声波安装的不好。我看到网上一些视频,电路跟我的差不多,但测距还是挺稳定的,所以想问一下各位,怎么使数码管测距比较稳定,不会跳动很大。程序如下:
//晶振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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
似水彪心
1楼-- · 2020-02-04 12:37
 精彩回答 2  元偷偷看……
似水彪心
2楼-- · 2020-02-04 14:54
如果想增大测量距离,电路上或程序上应该改变哪些参数?
zhuangchao12
3楼-- · 2020-02-04 17:41
似水彪心 发表于 2012-3-30 09:23
如果想增大测量距离,电路上或程序上应该改变哪些参数?

电路上的改动比程序改动大得多,原理差不多,就是要增加发射功率,发射探头功率加大,我已只是知道一点皮毛,楼主成功后分享一下你的经验
似水彪心
4楼-- · 2020-02-04 19:37
zhuangchao12 发表于 2012-3-30 09:29
电路上的改动比程序改动大得多,原理差不多,就是要增加发射功率,发射探头功率加大,我已只是知道一点皮 ...

那是怎么增加发射功率呢?是要换另一种发射探头吗?
小波123
5楼-- · 2020-02-05 01:07
你好,我也正在做这个,我的还没有效果,求指导
似水彪心
6楼-- · 2020-02-05 01:26
 精彩回答 2  元偷偷看……

一周热门 更多>