基于单片机的汽车倒车雷达系统设计(含程序)

基于单片机的汽车倒车雷达系统设计

摘 要

随着社会经济的发展交通运输业日益兴旺,汽车的数量在大副攀升。交通拥挤状况也日趋严重,撞车事件屡屡发生,造成了不可避免的人身伤亡和经济损失,针对这种情况,设计一种响应快,可靠性高且较为经济的汽车倒车防撞预警系统势在必行。本设计是利用最常见的超声波测距法来设计的一种基于单片机的汽车倒车雷达系统。

本设计的主要是基于STC89C52单片机利用超声波的特点和优势,将超声波测距系统和STC89C52单片机结合于一体,设计出一种基于STC89C52单片机的汽车倒车雷达系统。该系统采用软、硬件结合的方法,实现了汽车与障碍物之间距离的显示以及危险距离的声光报警等功能。

本设计论文概述了超声波检测的发展及基本原理,阐述了超声波传感器的原理及特性。在超声波测距系统功能和STC89C52单片运用的基础上,提出了系统的总体构成,对系统各个设计单元的原理进行了介绍,并且对组成各单元硬件电路的主要器件做了详细说明和选择。本设计论文还介绍了系统的软件结构,并通过编程来实现系统功能和要求。

关键词:汽车倒车雷达、STC89C52、超声波、测量距离、显示距离、

声光报警

第一章 绪论

1.1 课题设计的目的和意义

随着汽车的普及,越来越多的家庭拥有了汽车。交通拥挤状况也随之出现,撞车事件也是经常发生,人们在享受汽车带来的乐趣和方便的同时,更加注重的是汽车的安全性,许多“追尾”事故都与车距有着密切的关系。为了解决这个安全问题,设计一种汽车测距防撞报警系统势在必行。

由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单。所以超声波测距法是一种非常简单常见的方法,应用在汽车停车的前后左右防撞的近距离测量,以及在汽车倒车防撞报警系统中,超声波作为一种特殊的声波,具有声波传输的基本物理特性—折射,反射,干涉,衍射,散射。超声波测距是利用其反射特性,当车辆后退时,超声波测距传感器利用超声波检测车辆后方的障碍物位置,并利用LED 显示出来,当到达一定距离时,系统能发出报警声,进而提醒驾驶人员,起到安全的左右。

通过本课题的研究,将所学到的知识用在实践中并有所创新和进步。该设计可广泛应用在生活、军事、工业等各个领域,它需要设计者有较好的数电、模电知识,并且有一定的编程能力,综合运用所学的知识实现对超声波发射与接收信号进行控制,通过单片机程序对超声波信号进行相应的分析、计算、处理最后显示在液晶显示屏上。

第二章 设计原理及总体方案

2.1 本设计的研究方法

本设计选用US-100超声波传感器。了解超声波测距的原理的,只有对理论知识有一定的学习才能运用到实际操作中。根据原理设计超声波测距仪的硬件结构电路。对设计的电路进行分析能够产生超声波,实现超声波的发送和接收,从而实现利用超声波测距的方法测量物体之间的距离。具体设计一个基于单片机的超声波测距器,包括单片机控制电路,发射电路,接收电路,液晶显示电路,声光报警电路。

2.2系统整体方案的设计

由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。利用超声波检测距离,设计比较方便,计算处理也较简单,并且在测量精度方面也能达到农业生产等自动化的使用要求。

超声波发生器可以分为两大类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。电气方式包括压电型、电动型等;机械方式有加尔统笛、液哨和气流旋笛等。它们所产生的超声波的频率、功率、和声波特性各不相同,因而用途也各不相同。目前在近距离测量方面常用的是压电式超声波换能器。根据设计要求并综合各方面因素,本文采用STC89C52单片机作为控制器,超声波驱动信号用单片机的定时器。

2.3 系统整体方案的论证

超声波测距的原理是利用超声波的发射和接受,根据超声波传播的时间来计算出传播距离。实用的测距方法有两种,一种是在被测距离的两端,一端发射,另一端接收的直接波方式,适用于身高计;一种是发射波被物体反射回来后接收的反射波方式,适用于测距仪。此次设计采用反射波方式。

测距仪的分辨率取决于对超声波传感器的选择。超声波传感器是一种采用压电效应的传感器,常用的材料是压电陶瓷。由于超声波在空气中传播时会有相当的衰减,衰减的程度与频率的高低成正比;而频率高分辨率也高,故短距离测量时应选择频率高的传感器,而长距离的测量时应用低频率的传感器。

第三章 系统的硬件设计

2.1 系统的总体框图

照系统设计的功能的要求,初步确定设计系统由单片机主控模块、显示模块、超声波收发模块、声光报警模块共四个模块组成。

单片机主控芯片使用51系列STC89C52单片机,该单片机工作性能稳定,同时也是在单片机课程设计中经常使用到的控制芯片。

发射电路由单片机输出端直接驱动超声波发送。

接收电路使用三极管组成的放大电路,该电路简单,调试工作小

较小。

图3-1:系统设计框图

硬件电路的设计主要包括单片机系统及显示电路、超声波发射电路和超声波接收电路、报警输出电路、供电电路等几部分。单片机采用STC89C52,系统晶振采用12MHz 高精度的晶振,以获得较稳定时钟频率,减小测量误差。

2.2 US-100超声波收发模块

该超声波收发模块可自己产生40kHz 的方波,并经放大电路驱动超声波发射探头发射超声波,发射出去的超声波经障碍物反射后由超声波接收探头接收。经接收电路的检波放大,积分整形,在ECHO 引脚上产生方波脉冲,该脉冲宽度与被测距离成线性关系。具体过程如图2所示。

图2 US-100超声波收发模块工作时序图

上图表明:只需要在Trig/TX管脚输入一个10us 以上的高电平,系统便可发出8个40KHZ 的超声波脉冲,然后检测回波信号,当检测到回波信号后,模块还要进行温度值的测量,然后根据当前温度对测距结果进行校正,将校正后的结果通过Echo/RX管脚输出。

在此模式下,模块将距离值转化为340m/s时的时间值的2倍,通过Echo 端输出一个高电平,可以根据此高电平的持续时间来计算距离值。即距离值为:(高电平时间*340m/s)/2

设l 为测量距离,t 为往返时间差,超声波的传播速度为c

则有 t 2l /c

(2-1)

而声波在空气中的传播速度为:

(2-2)

式中T 为环境温度;c 0为绝对温度时的速度,是常数。从上述两式可

以推出:

tc 0+T /273(2-3)

2 l =

注:因为距离值已经经过温度校正,所以在此不需考虑温度补偿问题,声速选择340m/s即可。使用US-100超声波收发模块进行距离测量测量时,单片机只需要输出触发信号,并监视回响引脚,通过定时器计算回响信号宽度,并换算成距离即可。该模块简化了发送和接收的模拟电路,工作稳定可靠,其参数指标如表1所示。

表1 US-100模块参数

应注意测量周期必须在60毫秒以上,防止发射信号对回响信号的影响。模块共有两个接口,即模式选择跳线和5pin 接口。模式选择跳线接口设置为当安装上短路帽时为UART (串口)模式,拔掉时为电平触发模式。

c =c 0+T /273(m /s )

2.3 单片机电路

单片机选用高性能的STC89C52,其管角如图3所示:

图3 STC89C52单片机管脚图

该芯片为52内核8位单片机,兼容Intel 等52内核单片机,支持ISP 下载,适用于常用检测控制电路。由STC89C52组成的单片机系统原理图如图4所示。图中TRIG 引脚为单片机发送触发信号的引脚,ECHO 引脚为US-100模块送回回响信号的引脚,接至单片机外部中断P3.2脚上,可以利用外部中断测量回响信号宽度。当测量距离小于20cm 时,单片机通过管脚P3.6发出灯光报警信号,触发LED 报警灯亮,同时通过管脚P3.7发出声音报警信号,该信号用以触发蜂

鸣器鸣响报警。

图4 单片机系统及超声波模块接口原理图

2.4 蜂鸣器报警电路

图5所示为蜂鸣器报警电路。由于单片机管脚的输入比输出电流大,因此电路设计为低电平输出时蜂鸣器响,高电平关闭。当P3.7脚输出低电平时,PNP 型三极管8550导通,有集电极电流通过,蜂鸣器鸣响。当P3.7脚输出高电平时,三极管截止,蜂鸣器关闭。

图5 蜂鸣报警电路

2.5显示电路

显示部分采用SMC 1602液晶屏进行数据显示,其主要技术参数为:

接口信号说明表 如表3

与单片机的接口电路如图6所示

图6 LCD 与单片机的接口电路

2.6 系统总电路图

通过对单片机主控模块、显示模块、超声波收发模块、声光报警模块共四个模块进行结合,可以绘出系统总的电路图如图7:

图7 系统总电路图

第四章 系统的软件设计

3.1软件流程图

本设计软件主程序流程图如图8所示, (a)为主程序流程图,(b)为外部中断子程序流程图。

(a) 主程序流程图 (b) 外部中断流程图

图8 程序流程图

3.2 主程序 详见附录

3.3 程序说明

系统加载5V 电压后启动,数据、定时器、LCD1602进行初始化,程序进入while 循环,超声波测距模块触发,发射超声波并检测有无回波,如果有回波,则超声波模块发射电平信号,驱使单片机进行计

算,将数据显示在LCD1602上,如果无回波则跳过判断。程序在计算完距离后与20cm 进行比较,如果小于20cm ,则驱动蜂鸣器和LED 报警灯进行报警,如果大于20cm ,则进入一个60ms 的延时,继续while 循环进行测量。 3.4 硬件设计图

结论

本文主要讲述了倒车雷达,即超声波测距仪的原理和设计方法,设计的最终结果是使超声波测距仪能够产生超声波,实现超声波的发送与接收,从而实现利用超声波方法测量物体间的距离,并以数字的形式显示测量距离,在距离小于50cm 时发出报警。超声波测距的原理是利用超声波的发射和接收,根据超声波传播的时间来计算出传播距离。超声波测距仪硬件电路的设计主要包括单片机系统及显示电

路、超声波发射电路和超声波接收电路三部分。单片机采用STC89C51,采用12M 高精度的晶振,以获得较稳定时钟频率,减小测量误差。单片机控制超声波发射与接收模块进行信号的发射与接收。显示电路采用LCD 显示屏进行显示。

附录:

(1) 头文件和一些宏定义

/*******************************************************************/ /*******************超声波测距仪************************************/ /*******************(液晶屏显示)************************************/ /*******************晶振 11.0592MHz********************************/ #include #include "1602.h"

typedef unsigned char U8; /* defined for unsigned 8-bits integer variable无符号8位整型*/ typedef signed char S8; /* defined for signed 8-bits integer variable有符号8位整型*/

typedef unsigned int U16; /* defined for unsigned 16-bits integer variable无符号16位整型*/ typedef signed int S16; /* defined for signed 16-bits integer variable有符号16位整型*/ typedef unsigned long U32; /* defined for unsigned 32-bits integer variable无符号32位整型*/ typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型*/ typedef float F32; /* single precision floating point variable (32bits)单精度浮点数32位长度*/ typedef double F64; /* double precision floating point variable (64bits)双精度浮点数64位*/

//定时器0的定时值为1mS ,即11059/12=922个时钟脉冲,其补为65536-922=64614 #define SYSTEMCLK 921600 //11059200/12 #define T0CLK 921600 //11059200/12 #define T1CLK 921600 //11059200/12

#define T1PERIOD 1000000/921600 //T1周期时间,以微秒为单位,约为1.085uS #define TIMER0H 0xFC //64614/256=252 #define TIMER0L 0x66 //54447%256=102

(2) 管脚、常量、变量定义和函数声明 //管脚定义

sbit Trig = P1^3;

sbit Echo = P3^2; //回波必须接在外部中断引脚上 sbit LedAlarm = P3^6; //报警灯,低电平亮 sbit Beep = P3^7; //报警蜂鸣器

//定义标志

volatile bit FlagSucceed = 0; //测量成功标志 volatile bit FlagDisplay = 0; //显示标志

//定义全局变量

U16 DisplayCount=0; U16 time=0; U32 distance=0;

//函数声明

void delay_20us(); void Start_Module(); void INT0_Init(void); void Data_Init(); void Timer0_Init(); void Timer1_Init();

(3) 各子程序

//20us延时程序,不一定很准 void delay_20us() {

U16 bt ;

for(bt=0;bt

//数据初始化 void Data_Init() { Trig = 0; distance = 0; DisplayCount = 0; }

//外部中断初始化函数 void INT0_Init(void) {

IT0 = 0; //负边沿触发中断 EX0=0; //关闭外部中断 }

//外部中断处理用做判断回波电平 void INT0_ISR (void) interrupt 0 {

time =TH1*256+TL1; //取出定时器的值 FlagSucceed = 1; //置成功测量的标志 EX0=0; //关闭外部中断 }

//定时器0初始化,16位定时模式,初始化为1ms 中断一次。 void Timer0_Init() { TMOD = 0x11; //定时器0和1工作在16位方式 TH0 = TIMER0H;

TL0 = TIMER0L; TR0 = 1; //启动定时器 ET0 = 1; //允许定时器0中断 }

//定时器0中断, 用做显示计时

void Timer0_ISR(void) interrupt 1 // 定时器0中断是1号 { TH0 = TIMER0H; TL0 = TIMER0L; DisplayCount ++; if (DisplayCount >= 1000) //1秒钟显示一次 { FlagDisplay = 1; DisplayCount = 0; } }

//定时器1初始化,16位计数模式,时钟为11059200/12=921600Hz //60ms计数为55296,即0xD800 void Timer1_Init() { TMOD = 0x11; //定时器0和1工作在16位方式 TH1 =0; TL1= 0; ET1 = 1; }

//启动模块,Trig 管脚20us 正脉冲 void Start_Module() //启动模块 {

Trig=1; //启动一次模块 delay_20us(); Trig=0; }

/******************************************************************** * 名称 : Main() * 功能 : 主函数

***********************************************************************/ void main() {

U16 i, j;

EA = 0; INT0_Init(); Timer0_Init(); //定时器0初始化 Timer1_Init(); //定时器1初始化 Data_Init(); EA = 1; L1602_init(); L1602_string(1,1,"Welcome to my "); L1602_string(2,1,"distance meter! "); //延时 for (i=0;i

while(Echo==0); //等待Echo 回波引脚变高电平 FlagSucceed = 0; EX0=1; TH1= 0; TL1= 0; TF1= 0;

TR1=1; //启动定时器1开始计数 EA = 1; while (TH1

if(FlagSucceed==1) //一次测试成功,则计算距离,单位为厘米 {

distance = time * 1.085 ; //计算得到脉冲时间(以微秒为单位) //将微秒时间转变成厘米距离的算法: Y 米=(X 秒*344)/2 // X秒=( 2*Y米)/344 ==》X 秒=0.0058*Y米 ==》厘米=微秒/58 distance /=58; //如果距离小于20cm ,则声光报警 if ((FlagSucceed == 1) && (distance

Beep = 0; } else { LedAlarm = 1; Beep = 1; } } if (FlagDisplay == 1) //1秒显示时间到 { if(FlagSucceed==0) {

//LCD提示无回波 L1602_string(1,1,"OutOfRange(0-4m)"); L1602_string(2,1," ------ "); } else {

//LCD显示数据

L1602_string(1,1,"Distance Result:"); L1602_string(2,1," cm "); L1602_int(2, 5, distance ); } FlagDisplay = 0; } } }

3、显示程序

/******************************************************************** * 文件名 : 液晶1602显示.c

* 描述 : 该程序实现了对液晶1602的控制。

***********************************************************************/ #include "1602.h" #include "math.h"

/******************************************************************** * 名称 : delay()

* 功能 : 延时, 延时时间大概为140US 。 * 输入 : 无 * 输出 : 无

***********************************************************************/

{

int i,j; for(i=0; i

for(j=0; j

;

}

/********************************************************************

* 名称 : Convert(uchar In_Date) * 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。 * 输入 : 1602资料上的值

* 输出 : 送到1602的值

***********************************************************************/ uchar Convert(uchar In_Date)

{

/*

uchar i, Out_Date = 0, temp = 0;

for(i=0; i

{

temp = (In_Date >> i) & 0x01;

Out_Date |= (temp

}

return Out_Date;

*/

return In_Date;

} /********************************************************************

* 名称 : enable(uchar del) * 功能 : 1602命令函数

* 输入 : 输入的命令值

* 输出 : 无

***********************************************************************/

void enable(uchar del)

{

P0 = Convert(del);

RS = 0;

RW = 0;

E = 0;

delay();

E = 1;

}

/********************************************************************

* 名称 : write(uchar del)

* 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无

***********************************************************************/

void write(uchar del)

{

P0 = Convert(del);

RS = 1;

RW = 0;

E = 0;

delay();

E = 1;

delay();

}

/********************************************************************

* 名称 : L1602_init() * 功能 : 1602初始化,请参考1602的资料 * 输入 : 无

* 输出 : 无

***********************************************************************/ void L1602_init(void)

{

enable(0x01);

enable(0x38);

enable(0x0c);

enable(0x06);

enable(0xd0);

}

/********************************************************************

* 名称 : L1602_char(uchar hang,uchar lie,char sign)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下 L1602_char(1,5,'b')

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/ void L1602_char(uchar hang,uchar lie,char sign)

{

uchar a;

if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0;

a = a + lie - 1; enable(a); write(sign);

}

/********************************************************************

* 名称 : L1602_string(uchar hang,uchar lie,uchar *p) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下

L1602_string(1,5,"ab cd ef;")

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无 ***********************************************************************/ void L1602_string(uchar hang,uchar lie,uchar *p)

{

uchar a;

if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0;

a = a + lie - 1;

enable(a); while(1)

{

if(*p == '\0') break; write(*p);

p++;

}

}

//显示整型的温湿度数据用,共占用4位,其中一位符号位

void L1602_int(uchar hang, uchar lie, int num)

{

uint temp;

uint gewei,shiwei,baiwei,sign;

if (num >= 0)

{

sign = 0;

}

else

{

sign = 1;

} temp = abs(num);

baiwei = temp / 100; temp = temp - baiwei*100;

shiwei = temp / 10; gewei = temp - shiwei*10; num = abs(num);

if (num>=100) {

if (sign == 1) //负数

{

L1602_char(hang, lie, '-'); }

L1602_char(hang, lie+1, baiwei+48); L1602_char(hang, lie+2, shiwei+48); L1602_char(hang, lie+3, gewei+48); }

else if (num>=10)

{

if (sign == 1)

{ L1602_char(hang, lie+1, '-'); } L1602_char(hang, lie+2, shiwei+48); L1602_char(hang, lie+3, gewei+48); }

else

{

if (sign == 1)

{

L1602_char(hang, lie+2, '-'); }

L1602_char(hang, lie+3, gewei+48); }

}


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn