新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > RS485接口一體化超聲波測距模塊

        RS485接口一體化超聲波測距模塊

        作者: 時間:2016-11-25 來源:網絡 收藏
        一、模塊簡介:

        超聲波測距模塊采用STC11F04E單片機作處理器,工作電源:DC5V,工作電流20mA。測量數(shù)據(jù)輸出方式為RS485輸出,數(shù)據(jù)格式為標準的ASCII碼,數(shù)據(jù)由:空格位(起始位)+百+十位+個位。工作方式有兩種:一是連續(xù)測量方式;二是查詢測量方式。

        本文引用地址:http://www.104case.com/article/201611/321458.htm

        測量范圍:36cm~450cm(盲區(qū)36cm)。
        測量過程中,當接收不到障礙物反射的回波時,輸出“C C C”, 當測量低于下限值(在盲區(qū)內)時顯示“- - -”。測量結果由模塊上的輸出端口輸出,輸出方式為RS485輸出。測量結果可通過電腦進行顯示。模塊使用RS485接口通訊,測量結果傳送距離遠,可以通過電腦采集數(shù)據(jù),編寫通訊程序非常的便捷。
        波特率:1200
        校驗位:無
        數(shù)據(jù)位:8
        停止位:無
        ASCII碼數(shù)據(jù)格式:空格位(起始位)+百+十位+個位。
        二、模塊的使用設置
        超聲波模塊的工作方式可進行設置,設置結果可保存在模塊內部的單片機中,斷電不會丟失。設置命令格式如下:




        查詢命令格式:AT+CL=1-32(0-32為模的的地址編碼,每個模塊的地址可進行獨立設定,設定時使用AT+WD=“ ”命令,各塊模塊的編碼可獨立,由使用者自己設定,設定范圍0-32,只在查詢方式下有效),數(shù)據(jù)格式為16進制數(shù)據(jù)。
        三、模塊使用
        為減小本超聲波測距模塊外形尺寸,該超聲波測距元件采用雙面安裝,模塊長6.2cm寬2.4cm。模塊可用作應用系統(tǒng)的測距模塊。可應用在液位檢測、車位檢測、距離測量等產品中。板上留有安裝孔,有一排6腳插針。測試顯示程序范例如下:
        #include //頭文件
        #include //頭文件
        #define uchar unsigned char //定義變量類型為字符型
        #define uint unsigned int //定義變量類型為長整型
        #define LED P0 //數(shù)碼管段碼輸出端
        #define LED1 P2_6 //數(shù)碼管位1
        #define LED2 P2_4 //數(shù)碼管位2
        #define LED3 P2_5 //數(shù)碼管位3
        #define sx P2_3 //數(shù)碼管位3

        uchar s,i,pd,jsh,ml[3]={0,0,0},zj,xm0,xm1,xm2,xm3,buffer[3];//程序中用到的變量
        uchar convert[10]={0xA0,0xBD,0x64,0x34,0x39,0x32,0x22,0xBC,0x20,0x30};////0~9段碼單片機端口P0x.0-P0.7 分別接數(shù)碼管的A、B、F、D、E、H、C、G各段
        void delay(i);//延時函數(shù)
        void scanLED();//顯示函數(shù)
        void timeToBuffer();//顯示轉換函數(shù)
        void offmsd();//百位數(shù)為0判斷處理模塊

        void main()//主程序
        {
        EA=1;//開總中斷
        ES=1;//串口中斷允許
        SCON = 0x50; //串口方式1,允許接收
        TMOD = 0x21; //定時器1定時方式2
        TCON = 0x40; //定時器1開始計數(shù)
        TH1 = 0xF3;//6MHz 1200波特率
        TL1 = 0xF3;//6MHz 1200波特率
        TI = 0;//串口發(fā)送中斷標志置0
        RI =0;//串口接收中斷標志置0
        TR1=1; //啟動定時器1
        sx=0;
        while(1)
        {
        timeToBuffer();//調用轉換段碼功能模塊
        offmsd();//調用百位數(shù)為0判斷處理模塊
        scanLED();//調用顯示函數(shù)
        }
        }

        void delay(i)//延時子程序
        {
        while(--i);//延時循環(huán)
        }

        void scanLED() //顯示功能模塊
        {
        LED=buffer[0];//顯示個位數(shù)值,個數(shù)位數(shù)的段碼送顯示端口
        LED3=0;//個位數(shù)位碼,低電平有效,進行顯示
        delay(1);//顯示延時,加大該值,顯示亮度提高
        LED3=1;//關閉顯示個位數(shù)顯示
        delay(20);//關閉顯示延時,減小該值時顯示亮度提高

        LED=buffer[1];//顯示十位數(shù)值,十數(shù)位數(shù)的段碼送顯示端口
        LED2=0;//十位數(shù)位碼,低電平有效,進行顯示
        delay(1);//顯示延時,加大該值,顯示亮度提高
        LED2=1;//關閉顯示十位數(shù)顯示
        delay(20);//關閉顯示延時,減小該值時顯示亮度提高

        LED=buffer[2];//顯示百位數(shù)值,百數(shù)位數(shù)的段碼送顯示端口
        LED1=0;//百位數(shù)位碼,低電平有效,進行顯示
        delay(1);//顯示延時,加大該值,顯示亮度提高
        LED1=1;//關閉顯示百位數(shù)顯示
        delay(20); //關閉顯示延時,減小該值時顯示亮度提高
        }

        void offmsd()//百位數(shù)為0判斷處理模塊
        {
        if (buffer[2]==0xA0) //如果值為零時百位不顯示
        buffer[2] = 0xff;//數(shù)碼管百位數(shù)的段碼全部為1,即高電平,百位不顯示
        }

        void serial() interrupt 4 using 3//串口中斷接收程序
        {
        if(RI)//串口接收到數(shù)據(jù)時串口中斷標志位為1
        {
        RI=0; //串口中斷標志位置0
        pd=SBUF;//接收到的數(shù)據(jù)送中間變變量pd儲存
        if(pd==0x20)//判斷接收到的數(shù)據(jù)是否為0x20(這是ASCII碼的空格的代碼)
        {
        jsh=0;//接收位數(shù)計數(shù)器jsh置0
        pd=0;//中間變變量pd清0
        }
        if(jsh==1)//當jsh值為1時,代表串口接收到模塊發(fā)送回的百位數(shù)值
        {
        ml[0]=SBUF;//串口接收到模塊發(fā)送回的百位數(shù)值存入ml[0]單元
        }
        else if(jsh==2)//當jsh值為2時,代表串口接收到模塊發(fā)送回的十位數(shù)值
        {
        ml[1]=SBUF;//串口接收到模塊發(fā)送回的十位數(shù)值存入ml[1]單元
        }
        else if(jsh==3)//當jsh值為3時,代表串口接收到模塊發(fā)送回的個位數(shù)值
        {
        ml[2]=SBUF;//串口接收到模塊發(fā)送回的個位數(shù)值存入ml[2]單元
        s=ml[0]*100+ml[1]*10+ml[2]; //計算測量得到的距離值s,單位為厘米
        }
        jsh++; //接收位數(shù)計數(shù)器值加1
        }
        }

        void timeToBuffer() //轉換段碼功能模塊
        {
        xm0=ml[0]-48;//接到的值為標準的ASCII碼,進行十進制轉換,百位數(shù)的值
        xm1=ml[1]-48;//接到的值為標準的ASCII碼,進行十進制轉換,十位數(shù)值
        xm2=ml[2]-48;//接到的值為標準的ASCII碼,進行十進制轉換,個位數(shù)值
        buffer[0]=convert[xm2];//轉換成對應的顯示碼段
        buffer[1]=convert[xm1];//轉換成對應的顯示碼段
        buffer[2]=convert[xm0];//轉換成對應的顯示碼段
        if ((ml[0]==67)&&(ml[1]==67))//判斷接收到的ASCII碼數(shù)值為"C",表示模塊接收不到回波,這時的顯示用"C C C"表示
        {
        buffer[0]=0xE2;//顯示"C"的段碼是0xE2
        buffer[1]=0xE2;//顯示"C"的段碼是0xE2
        buffer[2]=0xE2; //顯示"C"的段碼是0xE2
        }
        else if ((ml[0]==45)&&(ml[1]==45))//判斷接收到的ASCII碼數(shù)值為"-",表示模塊的測量范圍在盲區(qū)范圍內這時的顯示用"- - -"表示
        {
        buffer[0]=0x7F;//顯示"-"的段碼是0x7F
        buffer[1]=0x7F;//顯示"-"的段碼是0x7F
        buffer[2]=0x7F; //顯示"-"的段碼是0x7F
        }
        }



        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 玛沁县| 新津县| 玉山县| 旅游| 乡城县| 惠来县| 阿城市| 博爱县| 岱山县| 德庆县| 斗六市| 乌拉特后旗| 子洲县| 梅河口市| 深圳市| 嘉鱼县| 汨罗市| 江山市| 嘉兴市| 繁峙县| 津南区| 石景山区| 于田县| 蒲江县| 抚远县| 蓬安县| 珠海市| 宣化县| 苍溪县| 乐亭县| 芦溪县| 扬中市| 阳东县| 武强县| 洛宁县| 水富县| 乌拉特后旗| 夏津县| 乌恰县| 环江| 天津市|