超声波报警器.docx
《超声波报警器.docx》由会员分享,可在线阅读,更多相关《超声波报警器.docx(17页珍藏版)》请在冰豆网上搜索。
超声波报警器
绍兴文理学院
电子信息工程专业
传感器原理与应用课程设计报告
设计题目:
超声波报警器
专业:
电子信息工程
班级:
电信111
学号:
XXXXX
姓名:
XXXXX
同组人员:
XXXX
指导老师:
XXXXX
完成日期:
2015-1-6
目录
1设计任务和性能指标1
1.1设计任务1
1.2性能指标1
2设计方案1
2.1需求分析1
2.2方案论证1
3系统硬件设计3
3.1单片机3
3.2超声波模块4
3.3按键模块5
3.4显示模块6
3.5报警模块6
4安装、调试/仿真、调试7
4.1调试步骤7
4.2实验测试结果/仿真结果及性能分析7
5总结8
6、参考文献8
附录1系统硬件电路图/仿真电路图9
附录2元器件清单9
附录3程序清单10
1设计任务和性能指标
1.1设计任务
1.设计并制作一个超声波报警器,当距离小于设定值时,发出警报信号。
2.超声波报警器的报警距离可调。
3.超声波报警器可显示实测距离和设定距离。
1.2性能指标
1.测量最大距离达到2米。
2.测距误差小于5%。
3.反应时间小于0.5秒。
2设计方案
2.1需求分析
随着现代社会工业化程的发展,汽车这一交通工具正为越来越多的人所用,但是随之而来的问题也显而易见,那就是随着车辆的增多,交通事故的频繁发生,由此导致的人员伤亡和财产损失数目惊人。
对于公路交通事故的分析表明,80%以上的车祸事由于驾驶员反应不及所引起的,超过65%的车辆相撞属于追尾相撞,其余则属于侧面相撞。
奔驰汽车公司对各类交通事故的研究表明:
若驾驶员能够提早1s意识到有事故危险并采取相应的正确措施,则绝大多数的交通事故都可以避免。
因此,大力研究开发如汽车防撞装置等主动式汽车辅助安全装置,减少驾驶员的负担和判断错误,对于提高交通安全将起到重要的作用。
显然,此类产品的研究开发具有极大的实现意义和广阔的应用前景。
2.2方案论证
超声波的测距方案有三种,分别是相位的检测法、幅值的检测法和渡越时间法。
1.相位的检测法
相位的检测法可分2种,方法一是用发射不同频率超声波来显现的。
先发射波长为
的超声波,检测出回波相位为
。
假设所用的波周期数
则能求的目标物体的距离为:
同样道理可以算出第二束波形测距的计算公式为:
其中:
为第二束波的相位角,
是波长,
是周期数。
又由于
和
都为正数,与此同时再一次进行时间补偿算法,可准确求目标距离值。
但是因为超声波探头是有固定频率,假设改变频率,系统衰减会大,需要两套信号的检测电路,实施难度加大,不适宜采用。
方法二是使用单一超声波的探头来进行相位的检测法检测,这种方法是待测距离在一个周期内使用,若过选用40kHz超声波为传播介质,一个周期对应检测距离为
,因此这种方法的准确度很高。
2.幅值的检测法
发射固定频率的超声波,接着使用反射或对射法的检测接收得到的超声波脉冲的强度,从超声波回波衰减理论,认真对回波脉冲强度的进行分析,从而求得目标距离。
3.渡越时间法
渡越时间意思是开始从传感器发射出超声波开始计时,经气体的介质传播,达到传感器接收到回波时计时的停止。
因为在一定的环境下,温度不会变化,或变化较缓慢,可近似认为常数,这时声速是保持不变的,所以能通过检测渡越的时间,结合现场声速,从而求得传感器和目标之间的距离。
经过上述的分析可知,相位的检测法和幅值的检测法精度都比较高,但是实现难度都比较大且开销也比较大,渡越时间法手环境因素影响,因而其精度不高,但其实现难度和开销较低。
由于我们设计的超声波报警系统主要用于汽车防撞,因此对精度的要求并不是很高,因此综合考虑了价格、难度等因素后选择了渡越时间法。
3系统硬件设计
超声波报警器由超声波模块、单片机、显示模块及报警模块组成,其系统框图如下所示:
图1系统框图
下面将介绍各模块的功能并且给出各模块的硬件电路。
3.1单片机
该模块是超声波报警系统的核心,需要接收按键模块和超声波模块的信息并对获得的信息进行处理,然后将数据传送到显示模块进行显示并控制报警系统。
在该模块中选用了STC89C52单片机,其最小系统电路如下图所示:
图2STC89C52单片机最小系统电路图
3.2超声波模块
该模块实现将实现超声波的发送和接收,通过发送和接收时间差实现距离的测量。
该模块采用了HC-SR04超声波测距模块,该模块的电路图如下所示:
图3HC-SR04超声波测距模块电路图
3.3按键模块
该模块主要实现报警距离的设定,其电路图如下所示:
图4按键模块电路图
3.4显示模块
该模块主要实现测量距离的显示和测定离的显示,选用NOKIA5110液晶,其电路图如下所示:
图5NOKIA5110液晶电路图
3.5报警模块
该模块主要实现报警功能,当实测距离小于设定距离时警醒报警,该模块电路图如下所示:
图6报警模块电路图
4安装、调试/仿真、调试
4.1调试步骤
1.STC89C52单片机最小系统焊接好之后,写入程序,通过IO口输出到底电平及复位按键测试是否能正常工作。
2.利用单片机让NOKIA5110液晶显示指定内容,测试显示模块是否正常。
3.将设定距离显示在NOKIA5110液晶上,通过按键模块改变设定值,测试按键模块是否正常。
4.利用单片机驱动报警模块,测试报警模块是否正常工作。
5.将障碍物置于超声波发送接收头之前,改变其距离,测试超声波模块是否正常工作。
4.2实验测试结果/仿真结果及性能分析
经过上述调试使各模块都能正常工作之后,NOKIA5110液晶显示了测试距离和设定距离,并且设定距离课通过按键改变,改变之后的设定值也会时时显示在NOKIA5110液晶上。
当障碍物与超声波模块的距离小于设定值时,报警模块蜂鸣器会响起,当障碍物与超声波模块的距离大设定值时,报警模块蜂鸣器不会响起,其测距误差小于5%,反应时间小于0.5秒,最大的测量距可达到2米。
超声波报警系统实际工作图如下所示:
图7超声波报警系统实际工作图
5总结
6、参考文献
[1]郁有文,常健,程继红.传感器原理及工程应用(第三版).西安:
西安电子科技大学出版社.2003-07
[2]陈杰、黄鸿著.传感器与检测技术.北京:
高等教育出版社.2002-08
[3]徐科军编.传感器与检测技术.北京:
电子工业出版社.2008-02
附录1系统硬件电路图/仿真电路图
附录2元器件清单
表1元器件清单
类型
规格/型号
数量
单片机
STC89C52
1
超声波测距模块
HC-SR04
1
电阻
10K
4
电阻
2K
1
电容(无极性)
0.1uF
3
电容(有极性)
10uF
1
晶振
12M
1
按键
4
三极管
2N3906
1
蜂鸣器
5VDC
1
液晶
NOKIA5110
1
附录3程序清单
#include"reg51.h"
#include"nokia5110.h"
#defineu16unsigedint
#defineu8unsigedchar
#defineGPIO_KEYP1
#defineCHECK0
#defineMOD11
#defineMOD22
#defineMOD33
sbittrig=P3^5;
voidDisplay();
voiddeley10ms(u8c);
voiddeley10us();
voidSR40_Init();
voidTIM0_Init();
voidSR40_Start();
voidKeyValue(u8value);
u8Key_Scan();
u32DATA_Handle(u32*ptr);
u32sr_data;
u32set_number;
u8t=0,state=CHECK;
u8flash=1;
voidmain()
{
set_number=50;
buzz=1;
SR40_Init();
TIM0_Init();
LCD5110_Init();
trig=0;
buzz=1;
LCD_write_english_string(1,0,"Thedatais:
");
LCD_write_english_string(3,0,"Thesetis:
");
while
(1)
{
KeyValue(Key_Scan());
if(set_number>500)
set_number=20;
}
}
voiddeley10ms(u8c)//延迟10ms
{
u8a,b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for(;c>0;c--)
{
for(b=38;b>0;b--)
{
for(a=130;a>0;a--);
}
}
}
voiddeley10us()//延迟10us
{
u8a;
for(a=20;a>0;a--);
}
u8Key_Scan()
{
unsignedcharkeyValue=0,i;//保存键值
//--检测按键1--//
if((GPIO_KEY&0xf0)!
=0xF0)//检测按键K1是否按下
{
deley10ms
(1);//消除抖动
if((GPIO_KEY&0xf0)!
=0xF0)//再次检测按键是否按下
{
keyValue=GPIO_KEY&0xf0;
i=0;
while((i<50)&&((GPIO_KEY&0xf0)!
=0xF0))//检测按键是否松开
{
deley10ms
(1);
i++;
}
}
}
else
keyValue=0xf0;
returnkeyValue;//将读取到键值的值返回
}
voidKeyValue(u8value)
{
if(value==0xf0)return;
if(state==CHECK)
{
state=MOD1;
}
else
{
switch(state)
{
case(MOD1):
{
switch(value)
{
case(0xe0):
state=CHECK;break;
case(0xD0):
state=MOD2;break;
case(0xb0):
set_number+=100;break;
case(0x70):
set_number-=100;break;
}
}break;
case(MOD2):
{
switch(value)
{
case(0xe0):
state=CHECK;break;
case(0xD0):
state=MOD3;break;
case(0xb0):
set_number+=10;break;
case(0x70):
set_number-=10;break;
}
}break;
case(MOD3):
{
switch(value)
{
case(0xe0):
state=CHECK;break;
case(0xD0):
state=MOD1;break;
case(0xb0):
set_number+=1;break;
case(0x70):
set_number-=1;break;
}
}break;
}
}
}
voidSR40_Init()
{
TMOD|=0X90;
EA=1;
TR1=1;
//ET1=1;
IT1=1;
EX1=1;
}
voidSR40_Start()
{
TH1=0;
TL1=0;
t=0;
trig=1;
deley10us();
trig=0
}
voidTIM0_Init()
{
TMOD|=0X01;
TR0=1;
ET0=1;
}
u32DATA_Handle(u32*ptr)
{
u32val;
u8i;
for(i=0;i<4;i++)
{
if(ptr[i]{
val=ptr[i];
ptr[i]=ptr[i+1];
ptr[i+1]=val;
}
}
returnptr[2];
}
voidEXTI_ISR()interrupt2
{
staticu8i=0;
u32temp;
u32dat[5];
temp=TH1*256+TL1;
dat[i]=temp;
if(i==4)
{
sr_data=DATA_Handle(dat)*17/1000;
i=0;
}
else
i++;
if(sr_data>set_number)
buzz=1;
else
buzz=0;
TH1=0;
TL1=0;
}
voidTIM0_ISR()interrupt1
{
staticu8t1=0,t2=0;
t1++;t2++;
if(t1==5)
{
t1=0;
if(state!
=CHECK)
{
flash=!
flash;
}
Display();
}
if(t1==2)
{
t2=0;
if(state==CHECK)
SR40_Start();
}
}
voidDisplay()
{
if(state==CHECK)
{
LCD_Write_Num(2,24,sr_data,3);
LCD_Write_Num(4,24,set_number,3);
}
else
{
if(flash)
{
LCD_Write_Num(4,24,set_number,3);
}
else
{
if(state==MOD1)LCD_write_english_string(4,24,"");
elseLCD_Write_Num(4,24,set_number/100,1);
if(state==MOD2)LCD_write_english_string(4,30,"");
elseLCD_Write_Num(4,30,set_number%100/10,1);
if(state==MOD3)LCD_write_english_string(4,36,"");
elseLCD_Write_Num(4,36,set_number%10,1);
}
}
}