超声波测距报告.docx

上传人:b****5 文档编号:6810982 上传时间:2023-01-10 格式:DOCX 页数:18 大小:363.55KB
下载 相关 举报
超声波测距报告.docx_第1页
第1页 / 共18页
超声波测距报告.docx_第2页
第2页 / 共18页
超声波测距报告.docx_第3页
第3页 / 共18页
超声波测距报告.docx_第4页
第4页 / 共18页
超声波测距报告.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

超声波测距报告.docx

《超声波测距报告.docx》由会员分享,可在线阅读,更多相关《超声波测距报告.docx(18页珍藏版)》请在冰豆网上搜索。

超声波测距报告.docx

超声波测距报告

单片机原理及应用

课程设计报告

 

题目二十七:

超声波测距系统设计

 

学生姓名

专业

学号

同组同学

指导教师

学院

二〇一六年七月

 

2015-2016学年第二学期成绩:

一、设计要求

1.搭建单片机的最小系统;(基本项)

2.选用超声波模块,设计模块与单片机的接口;(基本项)

3.采用LCD显示器显示测量结果;(基本项)

4.编写相应的程序;(基本项)

5.提高测量精度的方法。

(创新项)

二、设计题目介绍及分析

使用MCS-51系列单片机作为控制器,选用超声波模块,组建测距系统并显示结果。

三、设计方案论证

 

 

通过循环来时时的对目标进行测距。

 

四、具体硬件设计说明

蜂鸣器:

通过PNP三极管驱动。

接到P3^2引脚。

按键:

有键按下时IO口变为低电平。

开始按键连接到P3^1,P3^2的按键控制中断。

超声波模块:

选用HC-SR04。

提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。

一旦检测到有回波信号则输出回响信号。

回响信号的脉冲宽度与所测的距离成正比。

由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。

超声波TRIG连接到P1^0,ECHO连接到P1^1。

LCD的E,RW,RS引脚分别接到单片机P2^7,P2^5,P2^6,P0口作为数据输出、

 

五、软件设计说明

 

 

发出超声波信号时开启定时器0,通过定时器计算回波信号持续时间进而计算出距离。

/*******************************************************************************

*单片机课程设计

*题号:

27题,超声波测距

*组员:

马铭阳,程岩,孔维士

*学号?

30222204130222206130222207

*日期:

2016年6月30日

*说明KEY_START按下,程序执行,KEY1按下显示题号,持续10秒

*******************************************************************************/

#include

#include

#include

sbitTrig=P1^0;//超声波发送

sbitEcho=P1^1;//超声波接收

sbitkey_start=P3^1;//开始按键

sbitkey1=P3^2;//中断按键

sbitbuzzer=P1^5;//蜂鸣器按键

unsignedcharcodeTABLE[]="DISTANCE:

";

unsignedcharcodeASCII[]={'0','1','2','3','4','5','6','7','8','9','.','-','C','M',''};

unsignedcharcodeCLASS[]="NO.27";

staticunsignedcharDisNum=0;//?

?

?

?

?

unsignedinttime=0;

unsignedinti=0;

unsignedintkey_flag=0;

longS=0;

bitflag=0;//成功标志位

unsignedchardisbuff[4]={0,0,0,0,};

/*******************************************************************************

*

*

*

*

*******************************************************************************/

//延时函数

voiddelayms(unsignedintms)

{

unsignedchari=100,j;

for(;ms;ms--)

{

while(--i)

{

j=10;

while(--j);

}

}

}

//计算距离

voidConut(void)

{

time=TH0*256+TL0;

TH0=0;

TL0=0;

S=(long)(time*0.17);

if((S>=700)||flag==1)

{

flag=0;

LcdWriteData(ASCII[11]);

LcdWriteData(ASCII[10]);

LcdWriteData(ASCII[11]);

LcdWriteData(ASCII[11]);

LcdWriteData(ASCII[12]);

buzzer=0;

delayms(50);

buzzer=1;

}

else

{

disbuff[3]=S%10000/1000;

disbuff[2]=S%1000/100;

disbuff[1]=S%100/10;

disbuff[0]=S%10/1;

LcdWriteData(ASCII[disbuff[3]]);

LcdWriteData(ASCII[disbuff[2]]);

LcdWriteData(ASCII[disbuff[1]]);

LcdWriteData(ASCII[10]);

LcdWriteData(ASCII[disbuff[0]]);

LcdWriteData(ASCII[12]);

LcdWriteData(ASCII[13]);

}

}

//定时器0

voidzd0()interrupt1//触发时说明超出范围

{

flag=1;//成功标志位置1

}

voidinter()interrupt0//外部中断

{

LcdWriteCom(0x01);

LcdWriteCom(0x80);

for(i=0;i<7;i++)

{

LcdWriteData(CLASS[i]);

delayms(5);

}

delayms(100);

LcdWriteCom(0x80);

for(i=0;i<11;i++)

{

LcdWriteData(TABLE[i]);

delayms(5);

}

LcdWriteCom(0x80+0x46);

}

//超声波发射

voidStartModule()

{

Trig=1;//发脉冲

_nop_();//用NOP函数时间更精准

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

Trig=0;

}

 

voidkey_board0(void)//按键扫描程序

{

while

(1)

{

if(key_start==0)

{

delayms(10);

if(key_start==0)

{

while(!

key_start);

key_flag=1;

break;

}

}

elseif(key1==0)

{

delayms(10);

if(key1==0)

{

while(!

key1);

key_flag=2;

break;

}

}

}

}

voidkey_board1(void)

{

if(key_start==0)

{

delayms(10);

if(key_start==0)

{

while(!

key_start);

key_flag=1;

}

}

if(key1==0)

{

delayms(10);

if(key1==0)

{

while(!

key1);

key_flag=2;

}

}

}

voidmain(void)

{

P1=0xF0;//低位拉低

TMOD=0x01;

TH0=0;

TL0=0;

ET0=1;//定时器0中断

IT0=1;//外部中断0

EX0=1;

EA=1;

LcdInit();

key_board0();

//key_board1();

//if(key_flag==1)

//{

LcdWriteCom(0x80);

for(i=0;i<11;i++)//显示DISTANCE

{

LcdWriteData(TABLE[i]);

delayms(5);

}

LcdWriteCom(0x80+0x46);

while

(1)

{

StartModule();

while(!

Echo);//判断是否收到回波信号

TR0=1;//收到时,开启定时器

while(Echo);//回波信号结束后关闭定时器

TR0=0;//关闭定时器

Conut();//计算距离

LcdWriteCom(0x80+0x46);//设置数据指针起点,第二排第一个

delayms(80);

}

}

以下是LCD显示程序

#include"lcd.h"

/*******************************************************************************

*函数名:

Lcd1602_Delay1ms

*函数功能:

延时函数,延时1ms

*输入:

c

*输出:

*说名:

该函数是在12MHZ晶振下,12分频单片机的延时。

*******************************************************************************/

voidLcd1602_Delay1ms(uintc)//误差0us

{

uchara,b;

for(;c>0;c--)

{

for(b=199;b>0;b--)

{

for(a=1;a>0;a--);

}

}

}

/*******************************************************************************

*函数名:

LcdWriteCom

*函数功能:

向LCD写入一个字节的命令

*输入:

*输出:

*******************************************************************************/

#ifndefLCD1602_4PINS//当没有定义这个LCD1602_4PINS时

voidLcdWriteCom(uchar)//写入命令

{

LCD1602_E=0;//使能

LCD1602_RS=0;//选择发送命令

LCD1602_RW=0;//选择写入

LCD1602_DATAPINS=;//放入命令

Lcd1602_Delay1ms

(1);//等待数据稳定

LCD1602_E=1;//写入时序

Lcd1602_Delay1ms(5);//保持时间

LCD1602_E=0;

}

#else

voidLcdWriteCom(uchar)//写入命令

{

LCD1602_E=0;//使能清零

LCD1602_RS=0;//选择写入命令

LCD1602_RW=0;//选择写入

LCD1602_DATAPINS=;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改

Lcd1602_Delay1ms

(1);

LCD1602_E=1;//写入时序

Lcd1602_Delay1ms(5);

LCD1602_E=0;

//Lcd1602_Delay1ms

(1);

LCD1602_DATAPINS=<<4;//发送低四位

Lcd1602_Delay1ms

(1);

LCD1602_E=1;//写入时序

Lcd1602_Delay1ms(5);

LCD1602_E=0;

}

#endif

/*******************************************************************************

*函数名:

LcdWriteData

*函数功能:

向LCD写入一个字节的数据

*输入:

dat

*输出:

*******************************************************************************/

#ifndefLCD1602_4PINS

voidLcdWriteData(uchardat)//写入数据

{

LCD1602_E=0;//使能清零

LCD1602_RS=1;//选择输入数据

LCD1602_RW=0;//选择写入

LCD1602_DATAPINS=dat;//写入数据

Lcd1602_Delay1ms

(1);

LCD1602_E=1;//写入时序

Lcd1602_Delay1ms(5);//保持时间

LCD1602_E=0;

}

#else

voidLcdWriteData(uchardat)//写入数据

{

LCD1602_E=0;//使能清零

LCD1602_RS=1;//选择写入数据

LCD1602_RW=0;//选择写入

LCD1602_DATAPINS=dat;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改

Lcd1602_Delay1ms

(1);

LCD1602_E=1;//写入时序

Lcd1602_Delay1ms(5);

LCD1602_E=0;

LCD1602_DATAPINS=dat<<4;//写入低四位

Lcd1602_Delay1ms

(1);

LCD1602_E=1;//写入时序

Lcd1602_Delay1ms(5);

LCD1602_E=0;

}

#endif

/*******************************************************************************

*函数名:

LcdInit()

*函数功能:

初始化LCD屏

*输入:

*输出:

*******************************************************************************/

#ifndefLCD1602_4PINS

voidLcdInit()//LCD初始化子程序

{

LcdWriteCom(0x38);//开显示

LcdWriteCom(0x0c);//开显示不显示光标

LcdWriteCom(0x06);//写一个指针加1

LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//设置数据指针起点

}

#else

voidLcdInit()//LCD初始化子程序

{

LcdWriteCom(0x32);//将8位总线转为4位总线

LcdWriteCom(0x28);//在四位线下的初始化

LcdWriteCom(0x0c);//开显示不显示光标

LcdWriteCom(0x06);//写一个指针加1

LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//设置数据指针起点

}

#endif

六、测试及调试

硬件调试:

焊接前用恒流源供电测量每个元件是否工作正常。

此时电压不应过高,1V即可。

焊接电路时每焊接一个器件后都用万用表测量一次通路,再用恒压源供电查看元件在焊接后的电路是否正常。

整个电路焊接完成后给单片机供电用示波器测量竞争工作是否正常。

软件调试:

在硬件全部工作正常后应进行软件调试。

通过程序一起测量按键和蜂鸣器,有键按下时蜂鸣器发声。

再测试LCD,用LCD学号,显示结果正常后,在将完整的程序烧入芯片。

七、总结(设计最终情况说明,着重说明完成设计要求情况)

1.搭建了单片机的最小系统并且可以正常工作。

2.完成了超声波模块的选用,设计模块与单片机的接口。

3.LCD能够显示测量结果。

距离单位在CM级。

 

八、附录

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1