课程设计任务书超声波测距.docx
《课程设计任务书超声波测距.docx》由会员分享,可在线阅读,更多相关《课程设计任务书超声波测距.docx(22页珍藏版)》请在冰点文库上搜索。
课程设计任务书超声波测距
上海电机学院课程设计任务书
课程名称
传感器原理及应用
课程代码
013096B1
课程设计
课题
基于AT89C51单片机的超声波测距系统设计
设计时间
2014年12月8日——2014年12月12日
一、课程设计任务
1.了解超声波测距原理,查寻相关资料。
2.根据超声波测距原理,基于AT89C51单片机设计超声波测距仪的硬件结构电路。
功能要求:
(1)设计的电路能够实现超声波的发送与接收,并进行分析,从而实现利用超声波方法测量物体间的距离。
(2)测量距离的范围是2cm—400cm精度为±1cm。
(3)能够通过数码管显示所测的距离。
3.基于AT89C51单片机进行软件编程,用PROTUES进行仿真。
二、对实训/课程设计成果的要求
课程设计成果及报告要求:
1、题目;
2、设计要求;
3、控制系统的总体设计方案(分析及原理阐述);
4、控制系统的硬件系统设计(图应包括硬件系统原理框图、硬件系统原理接线图);绘图用protel软件;
5、控制系统的软件设计(图应包括软件设计主程序流程图、子程序流程序、中断程序流程图等,包括程序清单);
6、调试,完成硬件接线调试及软件程序调试,可以用实验箱、电路板搭建硬件电路,仿真用proteus;
7、小结(对本课题进行总结,比如特点、优缺点等);
8、心得体会
9、参考文献
三、实训/课程设计工作进度计划:
第一第一天:
安排课题,查找资料,确定控制要求和控制方案;
第二第二天:
硬件电路设计、软件程序设计;
第三第三天:
检查硬件电路设计、软件程序设计;调试情况
第四天:
检查系统设计及完成情况;撰写课程设计报告;验收调试结果;
第五天:
答辩;交课程设计报告。
四、主要参考资料:
[1].刘凤然.基于单片机的超声波测距系统[J].传感器世界.2001.5
[2].葛健强.基于CPLD的超声波测距仪研制[N].无锡商业职业技术学院学报.2004.4
[3].何希才,薛永毅.传感器及其应用实例[M].机械工业出版社.2004
[4]李光弟,朱月华,冷祖祁.单片机基础(第三版)[M].北京:
北京航空航天大学出版社.2007.6
[5].吴斌方,刘民,熊海斌.超声波测距传感器的研制[M.湖北工学院学报.2004
[6].谭洪涛,张学平.单片机设计测距仪原理及其简单应用[J].现代电子技术.2004
[7].苏炜,龚壁建,潘笑.超声波测距误差分析[J].传感器技术.2004
[8].罗忠辉,黄世庆.提高超声测距精度的方法[J].机械设计与制造.2005
[9].秦旭.用LM92温度传感器补偿的高精度超声波测距仪[J].电子产品世界.2003
1.题目:
基于AT89C51单片机的超声波测距系统设计
2.设计要求
根据超声波测距原理,基于AT89C51单片机设计超声波测距仪的硬件结构电路。
功能要求:
(1)设计的电路能够实现超声波的发送与接收,并进行分析,从而实现利用超声波方法测量物体间的距离。
(2)测量距离的范围是2cm—400cm精度为±1cm。
(3)能够通过数码管显示所测的距离。
3.控制系统的总体设计方案
1.功能模块图
2.测距原理
单片机发出超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波,从而测出发射和接收回波的时间差t,然后求出距离
式中的c为超声波在空气中传播的速度。
3.测距设计
基于单片机的超声波测距设计,是利用单片机发出一个20um周期为65.536ms的方波,经过发射驱动电路放大,使超声波传感器发射端震荡,发射超声波。
超声波波经反射物反射回来后,由传感器接收端接收,再经接收电路放大、整形,控制单片机中断口。
其系统框图如图3-1所示。
图3-1基于单片机的超声波测距系统框图
4.总体设计方案
图3-2时序图
以上时序图表明你只需提供一个10us以上的脉冲触发信号,该模块内部将产生出8个40KHz周期电平并检测回波。
一但检测大有回波信号则输出回响信号。
回响信号的脉冲宽度与所测的距离成正比。
有此种方式通过发射喜好到收到信号的时间间隔通过计算公式可以计算出距离。
5.超声波模块的选用
根据测距需求,选用HR-SR04超声波测距模块。
HR-SR04可提供2cm-400cm的非接触式距离感测功能,测距精度可高达3mm,模块包括超声波发射器、接收器与控制电路。
电气图:
4.控制系统的硬件系统设计
4.1AT89C51单片机简介
AT89C51是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,AT89C51可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
其管脚图如图4-1所示。
4.2复位电路
单片机AT89S51作为主控芯片,控制整个电路的运行。
单片机外围需要一个复位电路,复位电路的功能是:
系统上电时提供复位信号,直至系统电源稳定后,撤消复位信号。
复位电路的设计图如图4-2示:
图4-2复位电路
4.3发射电路的设计
由单片机产生的40kHz的方波需要进行放大,才能驱动超声波传感器发射超声波,发射驱动电路其实就是一个信号放大电路,本课题所选用的是74HC04集成芯片,图4-3为发射电路图.
图4-3发射电路
74HC04内部集成了六个反向器(输入与输出相位相反的电子电路),即1A输入高电平,1Y输出高电平同时具有放大的功能。
74HC04管脚图
4.4接收电路的设计
使用CX20106A集成电路对接收探头受到的信号进行放大、滤波。
其总放大增益80db。
电路如下图4-4所示。
图4-4接收电路
4.5显示模块的设计
显示模块采用四位八段数码管
图4-5四位八段共阴LED数码显示管原理和结构
5.控制系统的软件设计
单片机编程产生一个触发信号,使超声波发射模块工作,的同时利用定时器的计数功能开始计时,当超声波接收模块接收到回波后,接收电路输出端产生的负跳变在单片机的外部中断源输入口产生一个中断请求信号,响应外部中断请求,执行外部中断服务子程序,停止计时,读取时间差,计算距离,然后通过软件译码,将数据输出P0口显示。
程序流程图如图5-1,(a)为主程序流程图,(b)为定时中断子程序流程图,(c)为外部中断子程序流程图。
5.1信号的发生和接收
超声波信号的发生需要一个20us的触发信号,接收信号需要通过外部中断来实现,同时用定时器进行定时计数,这个过程需要循环,以下为循环程序部分。
while
(1)//程序循环
{
Trig=1;
delay_20us();
Trig=0;//产生一个20us的脉冲,在Trig引脚
while(Echo==0);//等待Echo回波引脚变高电平
succeed_flag=0;//清测量成功标志
EX0=1;//打开外部中断
TH1=0;//定时器1清零
TL1=0;//定时器1清零
TF1=0;//
TR1=1;//启动定时器1
EA=1;
while(TH1<30);//等待测量的结果,周期65.535毫秒(可用中断实现)
TR1=0;//关闭定时器1
EX0=0;//关闭外部中断
5.2计算
voidconversion(uinttemp_data)
{
ucharge_data,shi_data,bai_data,qian_data;
qian_data=temp_data/1000;
bai_data=temp_data/100;
temp_data=temp_data%100;//取余运算
shi_data=temp_data/10;
temp_data=temp_data%10;//取余运算
ge_data=temp_data;
qian_data=SEG7[qian_data];
bai_data=SEG7[bai_data];
shi_data=SEG7[shi_data];
ge_data=SEG7[ge_data];
EA=0;
qian=qian_data;
bai=bai_data;
shi=shi_data;
ge=ge_data;
EA=1;
}
6.调试仿真
软件程序编写完成后,用Protues软件绘制电路图,写入程序进行调试。
1.放射方波前,处于静止状态
2.放射方波后,动态显示
7.小结
本课题介绍了一种基于单片机的超声波测距设计的原理和设计。
给出了硬件和软件的设计方案。
超声波传感器是本设计的核心器件,本论文详细地介绍了超声波传感器的原理、结构、检测方式以及它的一些特性。
本设计的发射电路采用74HC04六反向器,通过它对单片机产生的方波信号进行放大,以驱动传感器工作。
接收电路采用的是LM741,通过接收电路对接收到的信号进行放大和整形,最终再输出负脉冲给单片机响应中断程序。
本系统的LED显示部分采用的是静态扫描方式,并用单片机软件译码。
单片机内部采用C语言编程,方波信号的产生、时间差的读取、距离的计算以及显示输出的译码都由单片机编程完成。
本课题所设计的超声波测距系统具有测量精度较高、速度快、控制简单方便等优点。
测距范围从2cm到400cm,测量精度在±1cm内。
8.心得体会
自己写自己的+
测距设计在许多工业现场和自动控制场合,都有很重要的作用。
但由于经验不足,电路硬件、软件部分都有不够完善的地方,在今后的学习中会进一步改进。
9.参考文献
[1].刘凤然.基于单片机的超声波测距系统[J].传感器世界.2001
[2].葛健强.基于CPLD的超声波测距仪研制[N].无锡商业职业技术学院学报.2004
[3].何希才,薛永毅.传感器及其应用实例[M].机械工业出版社.2004
[4]李光弟,朱月华,冷祖祁.单片机基础(第三版)[M].北京:
北京航空航天大学出版社.2007
[5].吴斌方,刘民,熊海斌.超声波测距传感器的研制[M.湖北工学院学报.2004
[6].谭洪涛,张学平.单片机设计测距仪原理及其简单应用[J].现代电子技术.2004
[7].苏炜,龚壁建,潘笑.超声波测距误差分析[J].传感器技术.2004
[8].罗忠辉,黄世庆.提高超声测距精度的方法[J].机械设计与制造.2005
[9].秦旭.用LM92温度传感器补偿的高精度超声波测距仪[J].电子产品世界.2003
程序不手写等改正确直接打印!
!
!
先把前边写好!
!
!
附录
源程序:
#include
sbitk1=P3^4;
sbitcsbout=P1^0;//超声波发送
sbitcsbint=P3^2;//超声波接收
sbitbg=P3^3;
#defineLEDP0
sbitLED1=P2^4;//LED控制
sbitLED2=P2^5;//LED控制
sbitLED3=P2^6;//LED控制
sbitbj=P2^0;//报警
#definecsbc0.0347
unsignedcharcl,mqzd,csbs,csbds,buffer[3],xm1,xm2,xm0,jpjs;//显示标识
unsignedcharconvert[10]={0x18,0x7b,0x2c,0x29,0x4b,0x89,0x88,0x3b,0x08,0x09};//0~9段码
unsignedints,t,i,xx,j,sj1,sj2,sj3,mqs,sx1;
voidcsbcj();
voiddelay(j);//延时函数
voidscanLED();//显示函数
voidtimeToBuffer();//显示转换函数
voidkeyscan();
voidk1cl();
voidk2cl();
voidk3cl();
voidk4cl();
voidoffmsd();
voidmain()//主函数
{
EA=1;//开中断
TMOD=0x11;//设定时器0为计数,设定时器1定时
ET0=1;//定时器0中断允许
ET1=1;//定时器1中断允许
TH0=0x00;
TL0=0x00;
TH1=0x9E;
TL1=0x57;
csbds=0;
csbout=1;
cl=0;
csbs=8;
jpjs=0;
sj1=50;/////////测试报警距离
sj2=200;
sj3=580;
k4cl();
TR1=1;
while
(1)
{
keyscan();
if(jpjs<1)
{
csbcj();//调用超声波测距程序
if(s>sj3)//大于时显示“CCC”
{
buffer[2]=0xC6;
buffer[1]=0xC6;
buffer[0]=0xC6;
}
elseif(s{
buffer[2]=0xBF;
buffer[1]=0xBF;
buffer[0]=0xBF;
}
elsetimeToBuffer();
}
elsetimeToBuffer();//将值转换成LED段码
offmsd();
scanLED();//显示函数
if(sbg=0;
bg=1;
}
}
voidscanLED()//显示功能模块
{
LED=buffer[0];
LED3=0;
delay(200);
LED3=1;
LED=buffer[1];
LED2=0;
delay(200);
LED2=1;
LED=buffer[2];
LED1=0;
delay(200);
LED1=1;
}
voidtimeToBuffer()//转换段码功能模块
{
xm0=s/100;
xm1=(s-100*xm0)/10;
xm2=s-100*xm0-10*xm1;
buffer[2]=convert[xm2];
buffer[1]=convert[xm1];
buffer[0]=convert[xm0];
}
voiddelay(i)
{
while(--i);
}
voidtimer1int(void)interrupt3using2
{
TH1=0x9E;
TL1=0x57;
csbds++;
if(csbds>=40)
{
csbds=0;
cl=1;
}
}
voidcsbcj()
{
if(cl==1)
{
TR1=0;
TH0=0x00;
TL0=0x00;
i=csbs;
while(i--)
{
csbout=!
csbout;
}
TR0=1;
i=mqs;//盲区
while(i--)
{
}
i=0;
while(csbint)
{
i++;
if(i>=4000)//上限值
csbint=0;
}
TR0=0;
TH1=0x9E;
TL1=0x57;
t=TH0;
t=t*256+TL0;
t=t-29;
s=t*csbc/2;
TR1=1;
cl=0;
csbint=1;
//////////////////////////////////////////////////////////////////
if(s<=80)bj=0;
if(s>80)bj=1;
/////////////////////////////////////////////////////////////////
if(s{
if(csbs>6)
{
csbs=csbs-2;
sj1=40;
}
sj1=sj1+2;
k4cl();
}
elseif(s>=sj3)
{
if(csbs<32)
{
csbs=csbs+2;
sj1=sj1+10;
k4cl();
}
}
}
}
voidkeyscan()//健盘处理函数
{
xx=0;
if(k1!
=1)//判断开关是否按下
{
delay(100);//延时去抖动
if(k1!
=1)//判断开关是否按下
{
while(!
k1)
{
delay(25);
xx++;
}
if(xx>1000)
{
jpjs++;
if(jpjs>3)
{
k4cl();
jpjs=0;
}
}
xx=0;
switch(jpjs)
{
case1:
k1cl();break;
case2:
k2cl();break;
case3:
k3cl();break;
}
}
}
}
voidk1cl()
{
sj1=sj1+1;
if(sj1>100)
sj1=50;
s=sj1;
}
voidk2cl()
{
sj2=sj2+5;
if(sj2>500)
sj2=40;
s=sj2;
}
voidk3cl()
{
sj3=sj3+10;
if(sj3>600)
sj3=600;
s=sj3;
}
voidk4cl()
{
sx1=sj1-1;
sx1=sx1/csbc;
mqs=sx1/4.5;
}
voidoffmsd()//小时数十位为0判断模块
{
if(buffer[0]==0xC0)//如果值为零时小数十位不显示
buffer[0]=0xFF;
}
原理图: