超声波测距仪设计说明书.docx
《超声波测距仪设计说明书.docx》由会员分享,可在线阅读,更多相关《超声波测距仪设计说明书.docx(11页珍藏版)》请在冰豆网上搜索。

超声波测距仪设计说明书
1.1设计内容
随着科学技术的快速发展,超声波将在传感器中的应用越来越广。
超声波测距与其它非接触式的检测方式方法相比,如电磁的或光学的方法它不受光线,被测对象颜色,电磁干扰等影响。
超声波对于被测物体处于黑暗,有灰尘,烟雾,电磁干扰,有毒等恶劣的环境有一定的适应能力[2]。
因此在液位测量,机械手控制,车辆自动导航,物体识别等方面有广泛应用。
特别是应用于空气测距,由于空气中波速较慢,其回波信号中包含的沿传播方向上的结构信息很容易检测出来,具有很高的分辩力,因而其准确度也较其它方法高,而且超声波传感器具有结构简单,体积小,信号处理可靠等特点[3]。
本次设计主要是利用STC12LE5406AD单片机、超声波传感器完成测距报警系统的制作,以STC12LE5406AD为主控芯片,利用超声波对距离的检测,将前方物体的距离探测出来,然后单片机处理运算,与设定的报警距离值进行比较判断,当测得距离小于设定值时,STC12LE5406AD发出指令控制蜂鸣器报警。
1.2设计要求
随着科学技术的快速发展,超声波将在测距仪中应用越来越广泛。
其原理是:
以STC12LE5406AD为主控芯片,实现发射电路的控制和接收数据的处理,并用数码管显示测量的数据。
具体指标要求是:
指标1:
测量精度-1~+1cm
指标2:
显示四位
本系统在“报警”方面进行创新,其功能是:
创新1:
设定报警距离值,当测得距离小于设定值时,蜂鸣器报警
1.3系统总体结构
本设计包括硬件和软件设计两个部分。
模块划分为数据采集、按键控制、四位数码管显示、报警等子模块。
电路结构可划分为:
超声波传感器、蜂鸣器、单片机控制电路。
就此设计的核心模块来说,单片机就是设计的中心单元,所以此系统也是单片机应用系统的一种应用。
单片机应用系统也是有硬件和软件组成。
硬件包括单片机、输入/输出设备、以及外围应用电路等组成的系统,软件是各种工作程序的总称。
单片机应用系统的研制过程包括总体设计、硬件设计、软件设计等几个阶段。
系统采用STC12LE5406AD单片机作为核心控制单元,当测得的距离小于设定距离时,主控芯片将测得的数值与设定值进行比较处理。
然后控制蜂鸣器报警。
系统总体的设计方框图如图1所示。
图1系统方框图
附录1元器件清单
Comment
Description
Designator
Quantity
10UF电容
C1
1
22P电容
C2,C3
2
蜂鸣器
ElectricalBell
LS1
1
超声波模块
Header,4-Pin
P1
1
PNP8550三极管
Q2
1
10K上拉电阻
R1
1
10k可调电阻
R4
1
1K电阻
R6
1
10K电阻
R7
1
AJ按键
SW1,SW2,SW3
3
单片机
U2
1
1602液晶
U4
1
12M
晶振
1
附录2超声波测距电路原理图
附录3程序清单
#include
unsignedcharcodedispcode[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0xa3,0x8c,0xc8};//0-9,a-f共阳数码管段码
unsignedchardispbuf[4]={0,0,0,0};//0x76,0x3f,0x3f,0x4f
unsignedchartemp[4];
unsignedchardispcount;
unsignedchari;
unsignedintx;
unsignedlongl,time;
//-----------------------定义管脚
unsignedchartimecount;
unsignedchartestok;
/*数码管控制*/
sbitW0=P2^0;//数码管第一位位选对应P20
sbitW1=P2^1;//数码管第二位位选对应P21
sbitW2=P2^2;//数码滚第三位位选对应P22
sbitW3=P2^3;//数码管第四位位选对应P23
/*超声波定义*/
sbitFS=P3^5;//定义发射的IO口
sbitLS=P3^7;//蜂鸣器控制
/*开关定义*/
sbitK1=P1^0;//开始测距键
bitk1;//按键标志位
//bitflag;
/*延时函数*/
voiddelay100us(void)//延时子函数
{
unsignedchari,j;
for(i=40;i>0;i--)
for(j=248;j>0;j--);
}
voidcsfs(void)//超声波发射程序//
{
unsignedchartimes=0;
while(TF1==0)//TF1定时器1溢出标志位使用查询法
{
unsignedcharj;
for(j=12;j>0;j--);//延时
FS=~FS;
times++;//翻转20次,发送10个脉冲信号的超声波//
TF1=0;
if(times==10)
break;
}
times=0;
TH1=0x00;//(65536-4000)/256;
TL1=0x00;//(65536-4000)%256;
EX0=1;//外部中断0允许中断位
TR1=1;//开定时器1
ET1=1;//定时器T1中断允许位
delay100us();
}
voidmain(void)
{
testok=0;
TMOD=0x10;/*定时器1为工作模式1*/
T2MOD=0x00;/*定时器2为工作模式)*/
T2CON=0x04;/*定时器2为自动重装定时工作模式)TR2=1*/
RCAP2L=(65536-4000)%256;//给定时器T2装初值
RCAP2H=(65536-4000)/256;
TH1=0x00;//(65536-4000)/256;
TL1=0x00;//(65536-4000)%256;
IT1=1;//边沿触发方式
EX0=1;
TR2=1;//打开定时器中断1,2
TR1=1;
ET1=1;
ET2=1;
EA=1;//开总中断
while
(1)
{
if(k1==1)//开始开始测距
{csfs();
}
if(testok==1)//
{
if(1==testok)//如果1=teskok
{
testok=0;//tesk清0
x=l;//距离
if(x!
=0)
{for(i=0;i<4;i++)
{temp[i]=0;
}
}
i=0;
while(x/10)
{
temp[i]=x%10;
x=x/10;
i++;
}
temp[i]=x;
dispbuf[3]=temp[0];//显示千位
dispbuf[2]=temp[1];//显示百位
dispbuf[1]=temp[2];//显示十位
dispbuf[0]=temp[3];//显示个位
timecount=0;
if(l<100)//当距离等于100cm时,蜂鸣器报警
{
LS=0;//蜂鸣器打开
delay100us();
LS=1;//蜂鸣器关闭
delay100us();
}
}
}
testok=0;
if(K1==0&&k1==0)//如果第一次按下开关K1,开始测距
{delay100us();//按键延时消抖
if(K1==0&&k1==0)
{
{
k1=1;//按键标识位清1
testok=1;
}
while(K1==0);//等待按键释放
}
}
elseif(K1==0&&k1==1)//如果第二次按下开关K1,停止测距
{
{
k1=0;
testok=0;
}
while(K1==0);//等待按键释放
}
}
voidint0(void)interrupt0using0//接收中断程序//
{
EX0=0;//关闭
TR1=0;//关定时器//
ET1=0;//中断关闭
time=TH1*256+TL1;//算出t的值,t的单位为us//RCAP2H
l=time*180;//
l=l/10000;
TH1=0x00;//(65536-4000)/256;
TL1=0x00;//(65536-4000)%256;
testok=1;
}
voidint2(void)interrupt3using0//超时中断程序//
{
EX0=0;
TR1=0;//关定时器//
ET1=0;//中断关闭
TH1=0x00;//(65536-4000)/256;
TL1=0x00;//(65536-4000)%256;
testok=2;
}
voidt1(void)interrupt5using0
{
TF2=0;//T2定时器必须用软件清0
timecount++;
P0=dispcode[dispbuf[dispcount]];//控制数码管显示
if(dispcount==0)//打开第一位数码管的位选
{
W0=0;
W1=1;
W2=1;
W3=1;
}
if(dispcount==1)//打开第二位数码管的位选
{
W0=1;
W1=0;
W2=1;
W3=1;
}
if(dispcount==2)//打开第三位数码管的位选
{
W0=1;
W1=1;
W2=0;
W3=1;}
if(dispcount==3)//打开第四位数码管的位选
{
W0=1;
W1=1;
W2=1;
W3=0;
}
dispcount++;
if(dispcount==4)//当dispcount等于4时,清0
dispcount=0;
}