一款串口輸出超聲波測距模塊使用范例
方式2: 設置為遠距離測量,這種方式,盲區值相對較大,測量相對較遠一些,設置方法:將標號為B的焊盤即單片機的P3.5 腳與地短接,這時的測量范圍為:25-350厘米。
方式3:連續方式測量。將標號為A的焊盤即單片機的P3.4 腳與地斷開,這時模塊測量方式是連續的進行測量,測量間隔為1-2次/秒,每測量一次,就將測量結果通過串口送出。
方式4:查詢方式測量。將標號為A的焊盤即單片機的P3.4 腳與地短接,這時的測量方式為查詢方式測量,即通過控制設備向模塊發出一個命令后,模塊才測量一次。查詢方式下,每向測距模塊發送一次查詢命令,模塊才進行測量一次,完成測量后即將測量結果通過串口發送出來。設置成查詢方式,模塊可多塊模塊連接在一起組網測量。
查詢命令格式:AT+CL=1-255(1-255為模的的地址編碼,每個模塊的地址編碼由模塊上單片機P1口與地短接的情況決定,各塊模塊的編碼可獨立,由使用者自己設定,設定范圍1-255,只在查詢方式下有效),數據格式為16進制數據。
三、 模塊使用
為減小本超聲波測距模塊外形尺寸,該超聲波測距元件采用雙面安裝,全部元件安裝在一塊長6cm寬2.5cm的PCB上。模塊可用作應用系統的測距模塊。因為它是串口TTL電平輸出的。可應用在倒車雷達、機器人避障、液位檢測、入侵報警、距離測量等產品中。板上留有安裝孔;有一排插針,以備插到應用板上。對外接口定義:(信號輸出腳是第3腳TXD,5V左右的TTL電平,可接應用系統單片機的RXD引腳)。本文引用地址:http://cqxgywz.com/article/201611/324022.htm
測試顯示程序范例如下:
#include
#include
#define uchar unsigned char //定義變量類型為字符型
#define uint unsigned int //定義變量類型為長整型
#define LED P0 //數碼管段碼輸出端
#define LED1 P2_6 //數碼管位1
#define LED2 P2_4 //數碼管位2
#define LED3 P2_5 //數碼管位3
#define sx P2_3 //數碼管位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段碼單片機端口P0.0-P0.7 分別接數碼管的A、B、F、D、E、H、C、G各段
void delay(i); //延時函數
void scanLED(); //顯示函數
void timeToBuffer(); //顯示轉換函數
void offmsd(); //百位數為0判斷處理模塊
void main() //主程序
{
EA=1; //開總中斷
ES=1; //串口中斷允許
SCON = 0x50; //串口方式1,允許接收
TMOD = 0x21; //定時器1定時方式2
TCON = 0x40; //定時器1開始計數
TH1 = 0xF3; //6MHz 1200波特率
TL1 = 0xF3; //6MHz 1200波特率
TI = 0; //串口發送中斷標志置0
RI =0; //串口接收中斷標志置0
TR1=1; //啟動定時器1
sx=0;
while(1)
{
timeToBuffer(); //調用轉換段碼功能模塊
offmsd(); //調用百位數為0判斷處理模塊
scanLED(); //調用顯示函數
}
}
void delay(i) //延時子程序
{
while(--i); //延時循環
}
void scanLED() //顯示功能模塊
{
LED=buffer[0]; //顯示個位數值,個數位數的段碼送顯示端口
LED3=0; //個位數位碼,低電平有效,進行顯示
delay(1); //顯示延時,加大該值,顯示亮度提高
LED3=1; //關閉顯示個位數顯示
delay(20); //關閉顯示延時,減小該值時顯示亮度提高
LED=buffer[1]; //顯示十位數值,十數位數的段碼送顯示端口
LED2=0; //十位數位碼,低電平有效,進行顯示
delay(1); //顯示延時,加大該值,顯示亮度提高
LED2=1; //關閉顯示十位數顯示
delay(20); //關閉顯示延時,減小該值時顯示亮度提高
LED=buffer[2]; //顯示百位數值,百數位數的段碼送顯示端口
LED1=0; //百位數位碼,低電平有效,進行顯示
delay(1); //顯示延時,加大該值,顯示亮度提高
LED1=1; //關閉顯示百位數顯示
delay(20); //關閉顯示延時,減小該值時顯示亮度提高
}
void offmsd() //百位數為0判斷處理模塊
{
if (buffer[2]==0xA0) //如果值為零時百位不顯示
buffer[2] = 0xff; //數碼管百位數的段碼全部為1,即高電平,百位不顯示
}
void serial() interrupt 4 using 3 //串口中斷接收程序
{
if(RI) //串口接收到數據時串口中斷標志位為1
{
RI=0; //串口中斷標志位置0
pd=SBUF; //接收到的數據送中間變變量pd儲存
if(pd==0x20) //判斷接收到的數據是否為0x20(這是ASCII碼的空格的代碼)
{
jsh=0; //接收位數計數器jsh置0
pd=0; //中間變變量pd清0
}
if(jsh==1) //當jsh值為1時,代表串口接收到模塊發送回的百位數值
{
ml[0]=SBUF; //串口接收到模塊發送回的百位數值存入ml[0]單元
}
else if(jsh==2) //當jsh值為2時,代表串口接收到模塊發送回的十位數值
{
ml[1]=SBUF; //串口接收到模塊發送回的十位數值存入ml[1]單元
}
else if(jsh==3) //當jsh值為3時,代表串口接收到模塊發送回的個位數值
{
ml[2]=SBUF; //串口接收到模塊發送回的個位數值存入ml[2]單元
s=ml[0]*100+ml[1]*10+ml[2]; //計算測量得到的距離值s,單位為厘米
}
jsh++; //接收位數計數器值加1
}
}
void timeToBuffer() //轉換段碼功能模塊
{
xm0=ml[0]-48; //接到的值為標準的ASCII碼,進行十進制轉換,百位數的值
xm1=ml[1]-48; //接到的值為標準的ASCII碼,進行十進制轉換,十位數值
xm2=ml[2]-48; //接到的值為標準的ASCII碼,進行十進制轉換,個位數值
buffer[0]=convert[xm2]; //轉換成對應的顯示碼段
buffer[1]=convert[xm1]; //轉換成對應的顯示碼段
buffer[2]=convert[xm0]; //轉換成對應的顯示碼段
if ((ml[0]==67)&&(ml[1]==67)) //判斷接收到的ASCII碼數值為"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碼數值為"-",表示模塊的測量范圍在盲區范圍內這時的顯示用"- - -"表示
{
buffer[0]=0x7F; //顯示"-"的段碼是0x7F
buffer[1]=0x7F; //顯示"-"的段碼是0x7F
buffer[2]=0x7F; //顯示"-"的段碼是0x7F
}
}


評論