新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 一款超聲波測距模塊運用程序

        一款超聲波測距模塊運用程序

        作者: 時間:2016-11-30 來源:網絡 收藏
        本模塊性能穩定,使用方便,測度距離精確。能和國外的SRF05,SRF02等超聲波測距模塊相媲美,且價格實惠,是你采購超聲波器件的理想選擇。模塊高精度,盲區(2cm)超近,穩定的測距是此產品成功走向市場的有力根據!測量范圍在2cm~500cm,測量精度3mm,測量時與被測物體無直接接觸,能夠清晰穩定地顯示測量結果。由于超聲波指向性強,能量消耗緩慢,在介質中傳播的距離較遠,因而超聲波經常用于距離的測量,如測距儀和物位測量儀等都可以通過超聲波來實現。
        超聲波測距器,可以應用于汽車倒車、建筑施工工地以及一些工業現場的位置監控,也可用于液位、井深、管道長度的測量,用于機器人控制、小車躲避障礙等場合中。小車上安裝此模塊配合舵機使用能控制得更方便。利用超聲波檢測往往比較迅速、方便、計算簡單、易于做到實時控制,并且在測量精度方面能達到工業實用的要求。因此在移動機器人的研制上也得到了廣泛的應用。
        模塊性能
        1:使用電壓:DC5V;
        2:靜態電流:小于2mA;
        3:輸出信號:電平信號,高電平5V,低電平為0V;
        4:感應角度:不大于15度;
        5:探測距離:2cm-500cm
        6: 高精度:可達0.3cm
        超聲波測距模塊工作原理:
        (1)采用單片機IO觸發測距,給至少10us的高電平信號;
        (2)模塊自動發送8個40khz的方波,自動檢測是否有信號返回;
          (3)有信號返回,通過echo輸出一高電平,高電平持續的時間就是超聲波從發射到返回的時間。
        用戶通過從trig腳輸入40kHz的方波信號,即用戶從單片機的IO口連續發出高低電平,產生方波,方波的個數一般為10個左右;然后就可以在接收端等待高電平輸出,一有輸出就可以開定時器計時,當此口變為低電平時就可以讀定時器的值,高電平的時間就是此次測距的時間,根據以下公式計算測量距離:
        測試距離=(高電平時間*聲速(340m/s))/2;
        注意事項
        1、超聲波發射頭向外發射60度角的超聲束,因此,在探頭與被測物體之間不能有其他障礙物。
        2、超聲波模塊測得的是被測物體與探頭之間的垂直距離,測量時要保持探頭正對被測物體。
        3、超聲波測量會受環境風速、溫度等的影響。
        4、模塊應先插好在電路板上再通電,避免產生高電平的誤動作,如果產生了,重新通電方可解決。
        可能出現的問題
        1、由于超聲波會受到被測物體不平整、反射角度、環境風速溫度以及多次反射的影響,可能會帶來測量數據誤差增大。
        2、由于超聲波有測量盲區的固有特性,因此,如果近距離測量時,當測量位置發生變化而接收到的數據不變時,說明進入了測量盲區。
        3、模塊在測量遠處物體時,如果沒有測量數據返回,可能是超出測量范圍,或是測量角度不對。可以適當調整測量角度。
        ***********************************************************************************/
        /*模塊高精度,盲區2cm,測量范圍在2cm~500cm,測量精度3mm*/
        #include
        #include
        #define uint unsigned int
        #define uchar unsigned char
        unsigned char code WE0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};//0x40-不帶點
        //unsigned char code WE1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xf0,0xef,0x80}; //0-9 帶點
        unsigned char temp[3];
        sbit RX=P3^4; //接受端,ECHO
        sbit TX=P3^5; //控制端,TRIG
        sbit LSA=P2^2;
        sbit LSB=P2^3;
        sbit LSC=P2^4;
        bit flag=0;
        uint time=0;
        uint s=0;
        void delay(int xms)//延時大概x毫秒
        {
        int i,j;
        for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
        }
        void start() //給至少10us的高電平,啟動模塊
        {
        TX=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        TX=0;
        }
        uchar count()
        {
        time=TH0*256+TL0;
        TH0=0;
        TL0=0; //清零
        s=(time*1.7)/100;//厘米
        return s;
        }
        void dispros()//數據分割
        {
        temp[0]=s%1000/100;//百位
        temp[1]=s%1000%100/10; //十位
        temp[2]=s%100%100%10; //個位
        }
        void display() //顯示函數
        {
        uchar i;
        if(s>=500||s<=2||flag==1) //進入盲區,溢出
        {
        flag=0;
        s=0;
        TH0=0;
        TL0=0; //清零
        for(i=0;i<3;i++) //顯示-
        {
        P0=0x40;
        switch(i)
        {
        case 0:LSA=0; LSB=0; LSC=0; break;
        case 1:LSA=1; LSB=0; LSC=0; break;
        case 2:LSA=0; LSB=1; LSC=0; break;
        }
        delay(2);
        }
        }
        else //正常顯示
        {
        LSA=0;LSB=0;LSC=0;
        P0= WE0[temp[0]]; delay(3);
        LSA=1;LSB=0; LSC=0;
        P0= WE0[temp[1]]; delay(2);
        LSA=0;LSB=1;LSC=0;
        P0= WE0[temp[2]]; delay(1);
        }
        }
        void main()
        {
        TMOD=0X01; //定時器工作方式0
        TH0=0;
        TL0=0;
        EA=1; //開總中斷
        ET0=1;//開定時器中斷
        while(1)
        {
        start();//啟動模塊
        while(!RX); //當RX為零時等待
        TR0=1; //啟動計數
        while(RX); //當RX為1時計數并等待
        TR0=0; //關閉計數器
        count(); //計數
        dispros(); //處理,分割數據
        display(); //顯示
        delay(1);
        }
        }
        void t0() interrupt 0
        {

        flag=1; //溢出標志
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 云和县| 松原市| 天祝| 稷山县| 黄龙县| 哈尔滨市| 威信县| 通辽市| 建平县| 田东县| 东山县| 东方市| 农安县| 南汇区| 枞阳县| 珠海市| 夏河县| 吉木萨尔县| 辛集市| 大洼县| 宜兴市| 措美县| 玉溪市| 临朐县| 东丰县| 长宁县| 贡嘎县| 绥化市| 霍邱县| 叶城县| 乐业县| 连城县| 高台县| 萍乡市| 红原县| 瑞丽市| 黑河市| 松溪县| 上虞市| 双桥区| 达拉特旗|