一、模块简介:
该超声波测距模块采用STC11F04E单片机作处理器,工作电源:DC5V,工作电流20mA。测量数据输出方式为RS485输出,数据格式为标准的ASCII码,数据由:空格位(起始位)+百+十位+个位。工作方式有两种:一是连续测量方式;二是查询测量方式。
测量范围:36cm~450cm(盲区36cm)。
测量过程中,当接收不到障碍物反射的回波时,输出“C C C”, 当测量低于下限值(在盲区内)时显示“- - -”。测量结果由模块上的输出端口输出,输出方式为RS485输出。测量结果可通过电脑进行显示。模块使用RS485接口通讯,测量结果传送距离远,可以通过电脑采集数据,编写通讯程序非常的便捷。
波特率:1200
校验位:无
数据位:8
停止位:无
ASCII码数据格式:空格位(起始位)+百+十位+个位。
二、 模块的使用设置
超声波模块的工作方式可进行设置,设置结果可保存在模块内部的单片机中,断电不会丢失。设置命令格式如下:
查询命令格式:AT+CL=1-32(0-32为模的的地址编码,每个模块的地址可进行独立设定,设定时使用AT+WD=“ ”命令,各块模块的编码可独立,由使用者自己设定,设定范围0-32,只在查询方式下有效),数据格式为16进制数据。
三、 模块使用
为减小本超声波测距模块外形尺寸,该超声波测距元件采用双面安装,模块长6.2cm宽2.4cm。模块可用作应用系统的测距模块。可应用在液位检测、车位检测、距离测量等产品中。板上留有安装孔,有一排6脚插针。测试显示程序范例如下:
#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段码单片机端口P0x.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
}
}