超声波测速系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:超声波测距系统
一、设计目的:
1、通过本次课程设计加深对单片机课程的全面认识和掌握,对单片机课程的应用进一步的了解。
2、掌握定时器、外部中断的设置和编程原理。
3、通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。
二、设计任务:
利用单片机及外围接口电路(显示接口电路)设计制作超声波测距仪器,用LED把测距仪距被测物的距离显示出来。
三、具体要求:
1.使用软件Proteus 7 Professional测试仿真调试,并在keil环境下编写程序并调试。
2.在面包板上进行初步仿真测试,设计好布线以及焊接排序。
3.在PCB板上焊接元器件电路,并进行测试得出实验结果。
四、设计原理
(一)硬件设计
1.超声波测距原理
超声波测距原理是通过超声波发射器向某一方向发射超声波(一般为40KHz 的超声波),在发射时刻的同时开始计时,超声波在空气中传播时碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为v ,而根据计时器记录的测出发射和接收回波的时间差△t ,就可以计算出发射点距障碍物的距离S ,即: S = v•△t /2
超声波测距仪原理框图
(1)单片机最小系统
单片机最小系统电路,由主控器STC89C52、时钟电路和复位电路三部分组成。单片机STC89C52作为核心控制器控制着整个系统的工作,而时钟电路负责产生单片机工作所必需的时钟信号,复位电路使得单片机能够正常、有序、稳定地工作。
(2)晶振电路
位单片机提供时钟频率
(3)复位电路
复位是单片机的初始化操作。其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。
总的电路图如下:
(二)软件设计
软件分为两部分,主程序和中断服务程序。主程序完成初始化工作、超声波发射和接收,距离计算、结果的输出。外部中断服务子程序主要完成时间值的读取。主程序首先是对系统环境初始化,设置定时器T1工作模式为16位定时计数器模式。置位总中断允许位EA。然后给Trig一个20us的高电平,然后在Echo 引脚等待其变为高电平,一旦输出了高电平,表明超声波已开始发射,此刻即计时,等待Echo变为低电平,即触发外部中断0的跳变沿方式中断。读取当前定时器的值,换算成时间,乘以波速,即得到测距距离。
程序如下:
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极0-9
unsigned char led[]={0x40,0x79,0x24,
0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的位码
sbit SMG_q = P2^0; //定义数码管的千位
sbit SMG_b = P2^1; //定义数码管的百位
sbit SMG_s = P2^2; //定义数码管的十位
sbit SMG_g = P2^3; //定义数码管的个位
sbit Trig = P2^7; //发送波形
sbit Echo = P3^2; //回波产生中断
sbit test = P1^0; //指示灯控制端
uint succeed_flag,time,timeH,timeL; //succeed_flag测试成功标志位void delayms(uint z) //延时毫秒
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay_20us() //延时20微秒函数
{
uchar a ;
for(a=0;a<=100;a++);
}
//*******数码管显示数据转换程序********************//
void display(uint temp)
{
uchar ge,shi,bai,qian;
qian=temp/1000;
bai=temp%1000/100;
shi=temp%1000%100/10;
ge=temp%10;
SMG_q=0;
P0=table[qian]; //查找定义好的数码管段值与P0口
delayms(2); //加入短暂延时
P0=0Xff; //清除数码管显示,因是共阳型,
SMG_q=1; //关闭千位数码管
SMG_b=0; //选择百位数码管
P0=table[bai]; //查找定义好的数码管段值与P0口
delayms(2); //加入短暂延时
P0=0Xff; //清除数码管显示,因是共阳型,
SMG_b=1; //关闭百位数码管
SMG_s=0; //选择十位数码管
P0=led[shi]; //查找定义好的数码管段值与P0口
delayms(2); //加入短暂延时
P0=0Xff; //清除数码管显示,因是共阳型,
SMG_s=1; //关闭十位数码管
SMG_g=0; //选择个位数码管
P0=table[ge]; //查找"2"定义好的数码管段值与P0
delayms(2); //加入短暂延时
P0=0Xff; //清除数码管显示,因是共阳型,
SMG_g=1; //关闭个位数码管
}