目 录
1 绪论 1
1.1 背景 1
1.2 国外研究情况 1
1.3 超声波测距的优势 2
2 基本原理 3
2.1 超声波简介 3
2.2 超声波基本特性 4
2.3 超声波模块简介 5
2.4 超声波传感器原理 6
2.5 超声波的测距原理 6
3 总体方案 8
4 硬件实现 9
4.1 电路 9
4.1.1 主控制最小系统电路 10
4.1.2 时钟电路 11
4.1.3 蜂鸣报警电路 11
4.1.4 复位电路 12
4.1.5 显示模块电路 13
4.2 硬件焊接与安设 13
5 软件实现 14
5.1 主程序工作流程图 14
5.2 超声波探测程序流程图 15
6 检验与总结 16
6.1 检验 16
6.2 总结 17
参考文献 18
致谢 19
附录 程序 20
3 总体方案
为了实现汽车倒车防碰撞报警系统的设计,本装置分别从硬件设计和软件设计两部分着手,其中报警又分为蜂鸣报警和指示灯报警两部分。硬件部分首先包括设计电路以及焊接电路,其中电路的结构组成主要涵盖以下部分:蜂鸣器电路、超声波传感器电路和单片机控制电路。软件部分主要是设计主程序工作流程和编写单片机程序等,使其能实现规定要求的控制功能。要求在接通电源后,超声波传感器等各模块都能有效落实各自的预定功用,这些模块也都归属于硬件部分。在实际设计过程中,主要是按照硬、软件设计和功能调试的先后步骤来进行的,最终目的是能在车辆同障碍物过近时控制蜂鸣器和指示灯能够发出报警,对驾驶人起到提示作用。
在实际测量中,当装置靠近障碍物的一端和障碍物之间的距离小于五十厘米且大于二十五厘米时,蜂鸣器会发出不连续的蜂鸣报警,倘若距离减小,达到二十五厘米时,蜂鸣器就会发出频率更高的蜂鸣报警声,以防止“车辆”与障碍物过近以致发生碰撞,同时,报警指示灯也会跟随蜂鸣报警的频率进行闪烁。本设计中,测量误差应保持在两厘米以内,由于实际测量环境中存在影响因素,而且超声波在空气中的传播速度受温度变化的影响较大,以致声速会偏离标准状态下的340米/秒,所以在本设计的实现中,为保证功能可以较妥善地展示出来,会选定在室内进行。此外,由于本装置的应用场景是设定在低速倒车状况下,所以在测距的时候,要求“车辆”对于障碍物的相对速度要比较小。
功能实现方面,总体设计大意如下:本装置实际测距区间为1厘米至380厘米,超出该区间则无法进行测距。本装置使用3节1.5V干电池进行供电,由主控制器对超声波模块进行控制,超声波模块负责发射并侦测接收超声波,并将所得的数据传入主控制器进行运算,得出“车辆”与障碍物间的距离并实时显示在显示模块上,与此同时,若所得距离小于50厘米且大于25厘米,则蜂鸣器发出不连续报警声,如果两者间距小于25厘米,蜂鸣器所发出的报警频率就会立即升高,相邻两次蜂鸣声的间隔时间会更短,同时,由于距离的变化,二极管发光报警灯也会以此时的蜂鸣频率作为自身的闪烁频率开始更快地不连续闪光。其中,系统的核心就是主控器制器模块,它要处理来自超声波传感器、按键等的信号,并对信息进行处理[8],再将控制信号传递给蜂鸣器报警模块和数码管显示模块,总设计方框图如图7所示。
图7 系统总设计方框图
#include //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
#include
uchar a_a;
//数码管段选定义 0 1 2 3 4 5 6 7 8 9
uchar code smg_du[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,
0x60,0x25,0x39,0x26,0x31,0x71,0xff}; //断码
uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
//数码管位选定义
sbit smg_we1 = P3^4; //数码管位选定义
sbit smg_we2 = P3^5;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;
sbit c_send = P3^2; //超声波发射
sbit c_recive = P3^3; //超声波接收
sbit beep = P2^3; //蜂鸣器IO口定义
uchar smg_i = 3; //显示数码管的个位数
bit flag_300ms ;
long distance; //距离
uint set_d; //距离
uchar flag_csb_juli; //超声波超出量程
uint flag_time0; //用来保存定时器0的时候的
uchar menu_1; //菜单设计的变量
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/***********************处理距离函数****************************/
void smg_display()
{
dis_smg[0] = smg_du[distance % 10];
dis_smg[1] = smg_du[distance / 10 % 10];
dis_smg[2] = smg_du[distance / 100 % 10] & 0xdf; ;
}
/**************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
set_d = byte_read(0x2001);
set_d <<= 8;
set_d |= byte_read(0x2000);
a_a = byte_read(0x2058);
}
/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先读
if(a_a != 1) //新的单片机初始单片机内问eeprom
{
set_d = 50;
a_a = 1;
write_eeprom(); //保存数据
}
}