超声波测距报告.docx
《超声波测距报告.docx》由会员分享,可在线阅读,更多相关《超声波测距报告.docx(18页珍藏版)》请在冰豆网上搜索。
超声波测距报告
单片机原理及应用
课程设计报告
题目二十七:
超声波测距系统设计
学生姓名
专业
学号
同组同学
指导教师
学院
二〇一六年七月
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级。
八、附录