超声波测距单片机课程设计报告书.docx
- 文档编号:11408562
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:24
- 大小:578.91KB
超声波测距单片机课程设计报告书.docx
《超声波测距单片机课程设计报告书.docx》由会员分享,可在线阅读,更多相关《超声波测距单片机课程设计报告书.docx(24页珍藏版)》请在冰点文库上搜索。
超声波测距单片机课程设计报告书
西南科技大学
2012级微机原理与接口技术
课程设计报告
课题名称
微机原理与接口技术
姓名
学号
院、系、部
制造科学与工程学院
专业
机械设计制造及其自动化
指导教师
2015年7月15日
一、设计任务及要求:
设计任务:
1、利用AT89S51单片机和超声波测距模块HC-SR04设计一超声波测距器;
2、能用LCD1602正常显示;
3、具有警报系统;
4、做出成功的仿真和实物。
要求:
首先进行预设计,根据设计的任务要求,先确定设计的硬件电路方案,然后进行硬件电路的初步设计,在计算机上画出硬件电路图,在老师的指导下进行修正硬件电路图,并对所涉及的参数进行计算。
在确定硬件的基础上,要进行软件的总体设计,包括软件主流程的设计以及各子程序的设计,同时,要写出详细的操作说明。
然后进入硬件的调试及编程工作,设计组内的同学可根据任务分工,有调试硬件各功能模块的,如键盘子程序、显示子程序等,有进行整体程序的编制的,各模块的编制过程中要注意资源的衔接。
最后进入联机调试,联机调试的原则也要采用分步走的原则,各个功能模块要逐步套入,通过一个再增加一项功能,从而达到设计的总体要求,不要上来编制个最大的程序,最后无法查找错误。
最后写出设计报告。
指导教师签名:
2015年月日
三、成绩
指导教师签名:
年月日
一、绪言…………………………………………………………………………………………4
二、系统设计………………………………………………………………………………………4
2.1设计任务…………………………………………………………………………4
2.2方案论证与比较…………………………………………………………………………4
2.2.1测距原理…………………………………………………………………………4
2.2.2系统整体流程图…………………………………………………………………5
2.2.3单片机选择方案论证……………………………………………………………5
2.2.4显示模块方案论证………………………………………………………………5
三、超声波测距模块HC-SR04介绍……………………………………………………………6
3.1主要参数…………………………………………………………………………………6
3.2超声波测距模块时序图…………………………………………………………………6
四、硬件电路设计………………………………………………………………………………7
4.1超声波测距器电路设计…………………………………………………………………7
4.2最小系统设计电路设计…………………………………………………………………7
4.3LCD1602显示电路的设计………………………………………………………………7
4.4警报系统电路的设计…………………………………………………………………8
4.5主要元器件的选择…………………………………………………………………9
五、程序流程图…………………………………………………………………………………10
六、c语言程序设计……………………………………………………………………………11
6.1LCD1602.h头文件……………………………………………………………………11
6.2主程序文件…………………………………………………………………………15
七、超声波测距器仿真……………………………………………………………………19
7.1Keil调试………………………………………………………………………………19
7.2Proteus调试……………………………………………………………………………19
八、结束语………………………………………………………………………………………20
九、参考文献……………………………………………………………………………………20
1、绪言
超声测距是一种非接触检测技术,不受光线、被测对象颜色等的影响;较其它仪器更卫生,更耐潮湿、粉尘、高温、腐蚀气体等;对于被测物处于黑暗、有灰尘、烟雾、电磁干扰等恶劣环境有一定的适应能力;超声波检测往往比较迅速、方便、计算简单、易于实现实时控制,并且在测量精度方面能达到工业实用的指标要求。
它广泛应用于矿业、化工业、污水处理厂、食品等各行业。
例如,食品业中用于水、酒、糖、饮料等液位控制往往也是用超声波检测的。
2、系统设计
2.1设计任务
1、利用AT89S51单片机和超声波测距模块HC-SR04设计一超声波测距器;
2、能用LCD1602正常显示;
3、具有警报系统;
4、做出成功的仿真和实物
2.2方案比较与论证
2.1测距原理
超声波测距的原理是通过测量超声波在发射后遇到障碍物反射回来的时间并根据发射和接受的时间差及超声波在空气中的传播速度,计算出发射点到障碍物的实际距离。
发射器发出的超声波以速度υ在空气中传播,在到达被测物体时被反射返回,由接收器接收,其往返时间为t,由s=0.5*v*t即可算出被测物体的距离。
所以我们的测距的实质是测出超声波往返时间t。
2.2.2系统整体流程图
2.2.3单片机的选择方案论证
方案一:
采用可编程逻辑期间CPLD作为控制器。
CPLD可以实现各种复杂的逻辑功能、规模大、密度高、体积小、稳定性高、IO资源丰富、易于进行功能扩展。
采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模控制系统的控制核心。
但本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高,且从使用及经济的角度考虑我们放弃了此方案
方案二:
采用STC公司的STC89C52RC单片机作为控制器。
STC89C52RC是一个低功耗,高性能的51内核的CMOS8位单片机,片内含8k空间的可反复擦些1000次的Flash只读存储器,具有256bytes的随机存取数据存储器(RAM),32个IO口,2个16位可编程定时计数器。
综合考虑,选择方案二,采用STC公司的STC89C52RC单片机作为控制器。
2.2.4显示模块的选择方案论证
方案一:
采用带字库LCD模块显示。
能显示复杂的信息,具有质量轻,体积小,功耗低,指令功能强,接口简单,可靠性强等优点,显示内容丰富,图形美观,易于人机交流。
但是价格昂贵。
方案二:
采用LED数码管显示。
数码管能显示数字和符号,但是占用IO口资源较多,对于简单的电路可以选用此方案。
超声波测距,需显示单位、解释等信息的字体,所以选用方案一,显示所需信息。
3.超声波测距模块(HC-SR04)介绍
3.1主要参数
超声波测距模块包含超声波发射器和接收器
其主要技术参数:
1:
使用电压:
直流5V
2:
静态电流:
小于2mA
3:
电平输出:
高+5V、低0V
4:
感应角度:
不大于15度
6:
探测距离:
3cm-450cm
7:
精度:
0.3cm
8:
接线方式:
VCC(+5V)、trig(控制端)、
echo(接收端)、GND(接地)
3.2超声波测距模块时序图
(1)采用IO触发测距,给控制端trig至少10us的高电平信号;
(2)模块自动发送8个40kHz的方波,自动检测是否有信号返回;
(3)有信号返回,接收端(echo)输出一高电平,高电平持续的时间就是超声波从发射到返回的时间。
4硬件电路设计
4.1超声波测距器电路图
注:
由于距离不好模拟,Proteus没有超声波测距模块,我们用另一单片机代替超声波测距模块,通过改变其程序来改变距离,图中左下角为代替超声波测距模块的单片机。
4.2最小系统电路的设计
为保证单片机系统能正常工作。
STC89C52RC单片机最小系统主要由单片机、外部振荡电路、复位电路和+5V电源组成。
时钟电路:
在外部振荡电路中,单片机的XTAL1和XTAL2管脚分别接至由11.0592MHz晶振和两个30pF电容构成的振荡电路两侧,为电路提供正常的时钟脉冲。
复位电路:
单片机RST管脚一方面经10uF的电容接至电源正极,实现上电自动复位,另一方面经开关S接电源,实现按键复位。
图3键盘电路
4.3LCD1602显示电路的设计
数码管驱动采用8个共阴极数码管显示,由于单片机的驱动能力有限,采用74LC245作为数码管的驱动,在7段码输出线上串联100欧姆电阻起限流作用。
其电路如图3所示。
图4数码管显示电路
4.4警报电路的设计
警报电路设计
图5警报电路图
4.5主要元器件选择
主要元器件选用型号和数量如表1所示:
表1主要元器件清单
序号
材料名称
规格型号
数量
元件代号
1
单片机
STC89C52RC
1
单片机
2
晶振
11.0592MHz
1
X1
3
电容
30PF
2
C1、C2
4
自锁开关
7*7
1
5
LCD1062
双行显示
1
LCD1
6
轻触开关
6*6
1
S
7
绿色发光二级管
3mm
1
续表1主要元器件清单
8
红色发光二级管
3mm
1
D1
9
电阻
470Ω
2
R1
10
电阻
2KΩ
2
R2
11
电位器
10k
1
R
5程序流程图
主程序流程图
中断服务程序入口
6C语言程序设计
6.1LCD1602.h头文件
#defineucharunsignedchar
#defineuintunsignedint
sbitEN=P3^4;//定义P3.4为使能端
sbitRS=P3^5;//定义P3.5为数据/命令寄存器选择端
sbitRW=P3^6;//定义P3.6为读/写操作选择端
#defineDataPortP2//P2口作为数据端口与LCD数据总线DB相连
intS=0;//定义距离变量
/*********************************************************
延时函数
*********************************************************/
voiddelayms(uinti)
{
unsignedintj;
for(;i>0;i--)
for(j=100;j>0;j--);
}
/*********************************************************
写入命令函数
*********************************************************/
voidLCD_Write_Com(ucharcom)
{
delayms(5);
RS=0;//选择命令寄存器
RW=0;//选择写操作
EN=1;//使能LCD
DataPort=com;//写入命令
_nop_();
EN=0;//禁止LCD
}
/*********************************************************
写入数据函数
*********************************************************/
voidLCD_Write_Data(ucharData)
{
delayms(5);
RS=1;//选择数据寄存器
RW=0;//选择写操作
EN=1;//使能LCD
DataPort=Data;//写入数据
_nop_();
EN=0;//禁止LCD
}
/*********************************************************
清屏函数
*********************************************************/
voidLCD_Clear(void)
{
LCD_Write_Com(0x01);//清楚屏幕显示
delayms(5);
}
/*********************************************************
写入字符串函数
*********************************************************/
voidLCD_Write_String(ucharx,uchary,uchar*s)
{
if(y==0)
{
LCD_Write_Com(0x80+x);//数据显示存储地址在第一行第x+1列
}
else
{
LCD_Write_Com(0xC0+x);//数据显示存储地址在第二行第x+1列
}
while(*s)//当指定字符*s的ascii码值不为0时(字符串结束符号的ascii值是0)执行以下循环
{
LCD_Write_Data(*s);//显示指定的字符
s++;//指针指向的地址加1即在字符串中指针指向下一个字符的地址
}
}
/*********************************************************
写入字符函数
*********************************************************/
voidLCD_Write_Char(ucharx,uchary,ucharData)
{
if(y==0)
{
LCD_Write_Com(0x80+x);//数据显示存储地址在第一行第x+1列
}
else
{
LCD_Write_Com(0xC0+x);//数据显示存储地址在第二行第x+1列
}
LCD_Write_Data(Data);
}
/*********************************************************
初始化函数
*********************************************************/
voidLCD_Init(void)
{
P2=0X1F;
delayms(15);
LCD_Write_Com(0x38);//功能设置(8位数据口,双行显示,5×7点阵)
delayms(5);
LCD_Write_Com(0x08);//显示开关控制(显示关闭,光标关闭,字符不闪烁)
LCD_Write_Com(0x01);//显示清屏
LCD_Write_Com(0x06);//输入方式设置(增量方式,不移位)
delayms(5);
LCD_Write_Com(0x0C);//显示开关控制(显示开,光标关闭,字符不闪烁)
LCD_Write_Com(0x01);//显示清屏
}
/********************************************************
主函数
********************************************************/
voiddisp(void)
{
LCD_Write_String(0,0,"Distance-");//显示距离标志
LCD_Write_Char(11,0,'0'+S/100);//显示距离的百位
LCD_Write_Char(12,0,'0'+S%100/10);//显示十位
LCD_Write_Char(13,0,'0'+S%100%10);//显示个位
LCD_Write_String(14,0,"cm");//显示单位
}
6.2主程序文件
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbittrig=P1^0;//定义P1.0为超声波测距模块输入引脚
sbitecho=P1^1;//定义P1.1为超声波测距模块输出引脚
sbitJBD=P1^2;//P1.2口接警报灯
bitflag=0;//成功标志位0表示成功,1表示失败
uinttime=0;//定义时间变量
/*********************************************************
延时20us多的函数
*********************************************************/
yanshi_20us()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************
延时函数10ms左右
*********************************************************/
yanshi_10ms()
{
uintj=500;
while(j)
{j--;
yanshi_20us();
}
}
/*********************************************************
延时函数1s左右
*********************************************************/
yanshi_1s()
{
uintk=100;
for(;k>0;k--)
yanshi_10ms();
}
/*********************************************************
主函数
*********************************************************/
main()
{
trig=0;//拉低脉冲输入引脚;
TMOD=0x01;//设置定时器T0为工作方式1
EA=1;//总中断允许
ET0=1;//T0中断允许
LCD_Init();//初始化(见LCD1602.h头文件)
LCD_Clear();//清屏(见LCD1602.h头文件)
delayms(20);//延时函数(见LCD1602.h头文件)
LCD_Write_String(4,0,"Welcome!
");//进入欢迎界面(见LCD1602.h头文件)
yanshi_1s();
while
(1)
{
TH0=0;
TL0=0;//定时器0清0
trig=1;
yanshi_20us();//给一个20us的脉冲
trig=0;
while(echo==0);//等待econ产生高电平,变高后T0开始计时
TR0=1;//打开定时器T0
while(echo==1);//等待econ产生低电平,变低后T0停止计数
TR0=0;//关闭定时器T0
if(flag)//如果失败
{
flag=0;
LCD_Write_String(0,0,"Out!
");//第一行显示"out"(见LCD1602头文件)
JBD=0;//开启警报灯
}
else//如果成功
{
time=TH0*256+TL0;//读取定时器T0的计数时间
S=time*1.88/100;//计算距离(cm),变量S见LCD1602.h头文件
disp();//显示(见LCD1602.h头文件)
if(S<=5||S>=450)//如果距离超出范围打开警报灯
JBD=0;
else
JBD=1;
}
yanshi_10ms();//延时100毫秒,进行下一次测量
}
}
/*********************************************************
中断函数
*********************************************************/
voidzd0()interrupt1//T0中断用来定时器溢出,超过测距范围
{
flag=1;//成功标志置1--失败
}
7超声波测距器仿真
在完成了电子密码锁硬件设计和软件设计以后,便进入系统的调试阶段。
系统的调试步骤和方法基本上是相同的,但具体细节和所采用的开发系统以及用户系统选用的单片机型号有关,如可选用Keil软件进行软件调试,用Proteus软件完成硬件调试。
7.1Keil调试
7.2Proteus调试
8结束语
通过这次课程设计,一方面使得我们学会的单片机基本原理以及C语言程序设计的方法;另一方面,通过做课程设计,使我们学会利用单片机控制一些简单的电子器件,以及运用软件仿真和实际电路板的焊接。
9参考文献
[1]张毅刚.单片机原理与接口技术[M].北京:
人民邮电出版社,2011:
204-210.
[2]王毅.单片机器件应用手册[M].北京:
人民邮电出版社,1995:
30-53.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 超声波 测距 单片机 课程设计 报告书