超声波测距报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);