微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求声波测距资料

求声波测距资料

时间:10-02 整理:3721RD 点击:

用面包版连好电路了,但是就是没有效果,不知道是给我的原理图错了,还是代码错了,各位大侠有完整的资料吗?分享我一下可以不,感激不尽啊(下面是源代码,有错吗?有没有可以用的程序借我试试)

      #include <AT89x51.H>           //器件配置文件

      #include <intrins.h>

      #define  RX  P0_0

      #define  TX  P0_1

      #define  BEEP  P0_2

      unsigned int  time=0;

      unsigned int  timer=0;

      unsigned char posit=0;

      unsigned int k;

bit flag_beep;

      unsigned long S=0;

      bit      flag =0;

unsigned char const discode[] ={0x05,0xDD,0x46,0x54,0x9C,0x34,0x24,0x5D,0x04,0x14,0xfe};                           

                     unsigned char const positon[4]={ 0x04,0x10,0x40,0x80};

                     unsigned char disbuff[4]    ={ 0,0,0,0,};

void DIDI();

    void Display(void)                       //扫描数码管

      {

       if(posit==0)

       {P2=(discode[disbuff[posit]])&0xfb;}

       else

       {P2=discode[disbuff[posit]];}

        P1=~positon[posit];

        if(++posit>=4)

        posit=0;

      }

    void Conut(void)

      {

       time=TH0*256+TL0;

       TH0=0;

       TL0=0;

       //time=23529;

       S=(time*0.17);     //算出来是CM

       if((S>=7000)||flag==1) //超出测量范围显示“-”

       {   

        flag=0;

             flag_beep=0;

        disbuff[0]=10;    //“-”

        disbuff[1]=10;    //“-”

        disbuff[2]=10;    //“-”

             disbuff[3]=10;        //“-”

             BEEP=1;

       }

       else

       {

             disbuff[0]=S/1000;

        disbuff[1]=S/100%10;

        disbuff[2]=S/10%10;

        disbuff[3]=S%10;

       }

      }

     void zd0() interrupt 1            //T0中断用来计数器溢出,超过测距范围

  {

    flag=1;                                                 //中断溢出标志

  }

   void  zd3()  interrupt 3               //T1中断用来扫描数码管和计800 ms启动模块

  {

       TH1=0xf8;

       TL1=0x30;

       Display();

       DIDI();

       timer++;

       if(timer>=400)

       {

        timer=0;

        TX=1;                                     //800 ms  启动一次模块

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        TX=0;

       }

  }

      void  main(  void  )

  {  

  TMOD=0x11;                 //设T0为方式1,GATE=1;

      TH0=0;

      TL0=0;         

      TH1=0xf8;             //2 MS定时

      TL1=0x30;

      ET0=1;             //允许T0中断

      ET1=1;                   //允许T1中断

      TR1=1;                   //开启定时器

      EA=1;                    //开启总中断

      while(1)

      {

       while(!RX);              //当RX为零时等待

       TR0=1;                         //开启计数

       while(RX);               //当RX为1计数并等待

       TR0=0;                            //关闭计数

   Conut();                     //计算                                                            

      }            

  }

      void DIDI()

{

      if(S<1000)

       {

       BEEP=0;

       }

       else

       {

        k++;

             //     if(k>=500)

             // {  

             //  k=0;

             //  flag_beep=!flag_beep;

              //}

             if((S>=1000)&&(S<2000))//1 m~2 m

             {

              if(k>=500)

              {   

               k=0;

               flag_beep=!flag_beep;

              }

             }

             if((S>=2000)&&(S<3000))//2 m~3 m

             {

              if(k>=300)

              {   

               k=0;

               flag_beep=!flag_beep;

              }

             }

             if((S>=3000)&&(S<4000))//3 m~4 m

             {

              if(k>=200)

              {   

               k=0;

               flag_beep=!flag_beep;

              }

             }

             if((S>=4000)&&(S<=5000))//4 m~5 m

             {

              if(k>=100)

              {   

               k=0;

               flag_beep=!flag_beep;

              }

             }

      if(flag_beep)

            BEEP=0;

             else

        BEEP=1;

       }

      }

你用面包板啊!你最好看看你的连线有没有 断路的。

没有断路,验证好几遍了,什么问题呢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top