超声波测距报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机原理及应用

课程设计报告

题目二十七:超声波测距系统设计

学生姓名

专业

学号

同组同学

指导教师

学院

二〇一六年七月

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题,超声波测距

* 组员:马铭阳,程岩,孔维士

* 学号?30222204 130222206 130222207

* 日期:2016年6月30日

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

**********************************************************************

*********/

#include

#include

#include

sbit Trig = P1^0; //超声波发送

sbit Echo = P1^1; //超声波接收

sbit key_start=P3^1; //开始按键

sbit key1=P3^2; //中断按键

sbit buzzer=P1^5; //蜂鸣器按键

unsigned char code TABLE[] = " DISTANCE: ";

unsigned char code ASCII[] =

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

unsigned char code CLASS[] = " NO.27 ";

static unsigned char DisNum = 0; // unsigned int time=0;

unsigned int i=0;

unsigned int key_flag=0;

long S=0;

bit flag =0; //成功标志位

unsigned char disbuff[4] ={ 0,0,0,0,};

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

*

*

*

*

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

//延时函数

void delayms(unsigned int ms)

{

unsigned char i=100,j;

for(;ms;ms--)

{

while(--i)

{

j=10;

while(--j);

}

}

}

//计算距离

void Conut(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

void zd0() interrupt 1 //触发时说明超出范围 {

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

}

void inter() interrupt 0 //外部中断

{

LcdWriteCom(0x01);

相关文档
最新文档