新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 一款串口輸出超聲波測(cè)距模塊使用范例

        一款串口輸出超聲波測(cè)距模塊使用范例

        作者: 時(shí)間:2016-11-30 來源:網(wǎng)絡(luò) 收藏

        方式2: 設(shè)置為遠(yuǎn)距離測(cè)量,這種方式,盲區(qū)值相對(duì)較大,測(cè)量相對(duì)較遠(yuǎn)一些,設(shè)置方法:將標(biāo)號(hào)為B的焊盤即單片機(jī)的P3.5 腳與地短接,這時(shí)的測(cè)量范圍為:25-350厘米。
        方式3:連續(xù)方式測(cè)量。將標(biāo)號(hào)為A的焊盤即單片機(jī)的P3.4 腳與地?cái)嚅_,這時(shí)模塊測(cè)量方式是連續(xù)的進(jìn)行測(cè)量,測(cè)量間隔為1-2次/秒,每測(cè)量一次,就將測(cè)量結(jié)果通過串口送出。
        方式4:查詢方式測(cè)量。將標(biāo)號(hào)為A的焊盤即單片機(jī)的P3.4 腳與地短接,這時(shí)的測(cè)量方式為查詢方式測(cè)量,即通過控制設(shè)備向模塊發(fā)出一個(gè)命令后,模塊才測(cè)量一次。查詢方式下,每向測(cè)距模塊發(fā)送一次查詢命令,模塊才進(jìn)行測(cè)量一次,完成測(cè)量后即將測(cè)量結(jié)果通過串口發(fā)送出來。設(shè)置成查詢方式,模塊可多塊模塊連接在一起組網(wǎng)測(cè)量。
        查詢命令格式:AT+CL=1-255(1-255為模的的地址編碼,每個(gè)模塊的地址編碼由模塊上單片機(jī)P1口與地短接的情況決定,各塊模塊的編碼可獨(dú)立,由使用者自己設(shè)定,設(shè)定范圍1-255,只在查詢方式下有效),數(shù)據(jù)格式為16進(jìn)制數(shù)據(jù)。
        三、 模塊使用
        為減小本超聲波測(cè)距模塊外形尺寸,該超聲波測(cè)距元件采用雙面安裝,全部元件安裝在一塊長(zhǎng)6cm寬2.5cm的PCB上。模塊可用作應(yīng)用系統(tǒng)的測(cè)距模塊。因?yàn)樗谴赥TL電平輸出的。可應(yīng)用在倒車?yán)走_(dá)、機(jī)器人避障、液位檢測(cè)、入侵報(bào)警、距離測(cè)量等產(chǎn)品中。板上留有安裝孔;有一排插針,以備插到應(yīng)用板上。對(duì)外接口定義:(信號(hào)輸出腳是第3腳TXD,5V左右的TTL電平,可接應(yīng)用系統(tǒng)單片機(jī)的RXD引腳)。

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

        測(cè)試顯示程序范例如下:

        #include //頭文件
        #include //頭文件
        #define uchar unsigned char //定義變量類型為字符型
        #define uint unsigned int //定義變量類型為長(zhǎng)整型
        #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段碼單片機(jī)端口P0.0-P0.7 分別接數(shù)碼管的A、B、F、D、E、H、C、G各段

        void delay(i); //延時(shí)函數(shù)
        void scanLED(); //顯示函數(shù)
        void timeToBuffer(); //顯示轉(zhuǎn)換函數(shù)
        void offmsd(); //百位數(shù)為0判斷處理模塊

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

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

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

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

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

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

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

        void timeToBuffer() //轉(zhuǎn)換段碼功能模塊
        {
        xm0=ml[0]-48; //接到的值為標(biāo)準(zhǔn)的ASCII碼,進(jìn)行十進(jìn)制轉(zhuǎn)換,百位數(shù)的值
        xm1=ml[1]-48; //接到的值為標(biāo)準(zhǔn)的ASCII碼,進(jìn)行十進(jìn)制轉(zhuǎn)換,十位數(shù)值
        xm2=ml[2]-48; //接到的值為標(biāo)準(zhǔn)的ASCII碼,進(jìn)行十進(jìn)制轉(zhuǎn)換,個(gè)位數(shù)值
        buffer[0]=convert[xm2]; //轉(zhuǎn)換成對(duì)應(yīng)的顯示碼段
        buffer[1]=convert[xm1]; //轉(zhuǎn)換成對(duì)應(yīng)的顯示碼段
        buffer[2]=convert[xm0]; //轉(zhuǎn)換成對(duì)應(yīng)的顯示碼段
        if ((ml[0]==67)&&(ml[1]==67)) //判斷接收到的ASCII碼數(shù)值為"C",表示模塊接收不到回波,這時(shí)的顯示用"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ù)值為"-",表示模塊的測(cè)量范圍在盲區(qū)范圍內(nèi)這時(shí)的顯示用"- - -"表示
        {
        buffer[0]=0x7F; //顯示"-"的段碼是0x7F
        buffer[1]=0x7F; //顯示"-"的段碼是0x7F
        buffer[2]=0x7F; //顯示"-"的段碼是0x7F
        }
        }


        上一頁 1 2 下一頁

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 甘泉县| 湖口县| 宁陵县| 富宁县| 台安县| 永登县| 乌兰浩特市| 昌平区| 尼木县| 镇安县| 藁城市| 乌拉特后旗| 库尔勒市| 定兴县| 油尖旺区| 靖安县| 伊川县| 潜江市| 西乌珠穆沁旗| 襄城县| 龙岩市| 二连浩特市| 马公市| 西充县| 抚松县| 定日县| 黄浦区| 疏勒县| 嘉善县| 贵南县| 涡阳县| 信宜市| 迁安市| 金坛市| 中江县| 德格县| 乌拉特后旗| 乳山市| 曲水县| 尼木县| 稻城县|