基于单片机的汽车倒车雷达系统设计含程序Word格式.docx
《基于单片机的汽车倒车雷达系统设计含程序Word格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的汽车倒车雷达系统设计含程序Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
![基于单片机的汽车倒车雷达系统设计含程序Word格式.docx](https://file1.bdocx.com/fileroot1/2022-11/25/c88bf791-428b-4e18-901e-6fad949ee699/c88bf791-428b-4e18-901e-6fad949ee6991.gif)
根据设计要求并综合各方面因素,本文采用STC89C52单片机作为控制器,超声波驱动信号用单片机的定时器。
2.3系统整体方案的论证
超声波测距的原理是利用超声波的发射和接受,根据超声波传播的时间来计算出传播距离。
实用的测距方法有两种,一种是在被测距离的两端,一端发射,另一端接收的直接波方式,适用于身高计;
一种是发射波被物体反射回来后接收的反射波方式,适用于测距仪。
此次设计采用反射波方式。
测距仪的分辨率取决于对超声波传感器的选择。
超声波传感器是一种采用压电效应的传感器,常用的材料是压电陶瓷。
由于超声波在空气中传播时会有相当的衰减,衰减的程度与频率的高低成正比;
而频率高分辨率也高,故短距离测量时应选择频率高的传感器,而长距离的测量时应用低频率的传感器。
第三章 系统的硬件设计
2.1 系统的总体框图
照系统设计的功能的要求,初步确定设计系统由单片机主控模块、显示模块、超声波收发模块、声光报警模块共四个模块组成。
单片机主控芯片使用51系列STC89C52单片机,该单片机工作性能稳定,同时也是在单片机课程设计中经常使用到的控制芯片。
发射电路由单片机输出端直接驱动超声波发送。
接收电路使用三极管组成的放大电路,该电路简单,调试工作小较小。
图3-1:
系统设计框图
硬件电路的设计主要包括单片机系统及显示电路、超声波发射电路和超声波接收电路、报警输出电路、供电电路等几部分。
单片机采用STC89C52,系统晶振采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差。
2.2US-100超声波收发模块
该超声波收发模块可自己产生40kHz的方波,并经放大电路驱动超声波发射探头发射超声波,发射出去的超声波经障碍物反射后由超声波接收探头接收。
经接收电路的检波放大,积分整形,在ECHO引脚上产生方波脉冲,该脉冲宽度与被测距离成线性关系。
具体过程如图2所示。
图2US-100超声波收发模块工作时序图
上图表明:
只需要在Trig/TX管脚输入一个10us以上的高电平,系统便可发出8个40KHZ的超声波脉冲,然后检测回波信号,当检测到回波信号后,模块还要进行温度值的测量,然后根据当前温度对测距结果进行校正,将校正后的结果通过Echo/RX管脚输出。
在此模式下,模块将距离值转化为340m/s时的时间值的2倍,通过Echo端输出一个高电平,可以根据此高电平的持续时间来计算距离值。
即距离值为:
(高电平时间*340m/s)/2
设l为测量距离,t为往返时间差,超声波的传播速度为c
则有
(2-1)
而声波在空气中的传播速度为:
(2-2)
式中T为环境温度;
c
为绝对温度时的速度,是常数。
从上述两式可以推出:
(2-3)
注:
因为距离值已经经过温度校正,所以在此不需考虑温度补偿问题,声速选择340m/s即可。
使用US-100超声波收发模块进行距离测量测量时,单片机只需要输出触发信号,并监视回响引脚,通过定时器计算回响信号宽度,并换算成距离即可。
该模块简化了发送和接收的模拟电路,工作稳定可靠,其参数指标如表1所示。
电气参数
US-100超声波测距模块
工 作电压
DC2.4V~5.5V
静 态 电流
2mA
工 作温度
-20~+70度
输出方式
电平或UART(跳线帽选择)
感 应角度
小于15度
探 测距 离
2cm-450cm
探测 精 度
0.3cm+1%
UART模式下串口配置
波特率9600,起始位1位,停止位1位,数据位8位,无奇偶校验,无流控制。
应注意测量周期必须在60毫秒以上,防止发射信号对回响信号的影响。
模块共有两个接口,即模式选择跳线和5pin接口。
模式选择跳线接口设置为当安装上短路帽时为UART(串口)模式,拔掉时为电平触发模式。
2.3单片机电路
单片机选用高性能的STC89C52,其管角如图3所示:
图3STC89C52单片机管脚图
该芯片为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液晶屏进行数据显示,其主要技术参数为:
显示容量
16*2个字符
芯片工作电压
4.5~5.5V
工作电流
2.0mA(5.0V)
模块最佳工作电压
5.0V
字符尺寸
2.95*4.35(WXH)mm
接口信号说明表如表3
表3液晶屏借口信号说明
编号
符号
引脚说明
符合
1
VSS
电源地
9
D2
DataI/0
2
VDD
电源正极
10
D3
DataI/0
3
VL
液晶显示偏压信号
11
D4
DataI/0
4
RS
数据/命令选择端(H/L)
12
D5
DataI/0
5
R/W
读/写选择端(H/L)
13
D6
DataI/0
6
E
使能信号
14
D7
DataI/0
7
D0
15
BLA
背光源正极
8
D1
16
BLA
背光源负极
与单片机的接口电路如图6所示
图6LCD与单片机的接口电路
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<reg52.h>
#include"
1602.h"
typedefunsignedchar U8;
/*defined forunsigned8-bits integer variable无符号8位整型*/
typedefsignedcharS8;
/* definedfor signed8-bits integervariable有符号8位整型*/
typedefunsigned intU16;
/* definedforunsigned16-bitsintegervariable无符号16位整型*/
typedefsigned intS16;
/*definedforsigned 16-bits integervariable有符号16位整型*/
typedefunsigned longU32;
/*definedforunsigned32-bits integer variable无符号32位整型*/
typedefsigned longS32;
/*definedforsigned 32-bitsintegervariable有符号32位整型*/
typedef floatF32;
/*single precisionfloatingpointvariable(32bits)单精度浮点数32位长度*/
typedef doubleF64;
/*double precisionfloatingpoint variable(64bits)双精度浮点数64位*/
//定时器0的定时值为1mS,即11059/12=922个时钟脉冲,其补为65536-922=64614
#defineSYSTEMCLK 921600 //11059200/12
#defineT0CLK 921600 //11059200/12
#defineT1CLK 921600//11059200/12
#defineT1PERIOD 1000000/921600 //T1周期时间,以微秒为单位,约为1.085uS
#define TIMER0H 0xFC//64614/256=252
#defineTIMER0L 0x66 //54447%256=102
(2)管脚、常量、变量定义和函数声明
//管脚定义
sbitTrig =P1^3;
sbit Echo=P3^2;
//回波必须接在外部中断引脚上
sbit LedAlarm=P3^6;
//报警灯,低电平亮
sbitBeep=P3^7;
//报警蜂鸣器
//定义标志
volatilebitFlagSucceed =0;
//测量成功标志
volatilebit FlagDisplay= 0;
//显示标志
//定义全局变量
U16DisplayCount=0;
U16time=0;
U32 distance=0;
//函数声明
void delay_20us();
voidStart_Module();
voidINT0_Init(void);
voidData_Init();
void Timer0_Init();
voidTimer1_Init();
(3)各子程序
//20us延时程序,不一定很准
void delay_20us()
{
U16bt;
for(bt=0;
bt<
100;
bt++);
ﻩ//8M晶振是100
}
//数据初始化
voidData_Init()
{
Trig =0;
ﻩdistance=0;
ﻩDisplayCount= 0;
}
//外部中断初始化函数
voidINT0_Init(void)
IT0=0;
//负边沿触发中断
EX0=0;
//关闭外部中断
//外部中断处理用做判断回波电平
voidINT0_ISR(void)interrupt0
{
time=TH1*256+TL1;
//取出定时器的值
FlagSucceed=1;
//置成功测量的标志
EX0=0;
//关闭外部中断
//定时器0初始化,16位定时模式,初始化为1ms中断一次。
voidTimer0_Init()
TMOD=0x11;
//定时器0和1工作在16位方式
ﻩTH0=TIMER0H;
TL0 =TIMER0L;
ﻩTR0 =1;
//启动定时器
ﻩET0=1;
//允许定时器0中断
//定时器0中断,用做显示计时
void Timer0_ISR(void)interrupt1 //定时器0中断是1号
TH0=TIMER0H;
ﻩ TL0=TIMER0L;
ﻩDisplayCount++;
ﻩ if(DisplayCount>=1000)ﻩ//1秒钟显示一次
{
ﻩFlagDisplay= 1;
ﻩDisplayCount= 0;
}
//定时器1初始化,16位计数模式,时钟为11059200/12=921600Hz
//60ms计数为55296,即0xD800
voidTimer1_Init()
ﻩTMOD=0x11;
//定时器0和1工作在16位方式
ﻩTH1=0;
TL1=0;
ﻩET1=1;
//启动模块,Trig管脚20us正脉冲
voidStart_Module()ﻩﻩ //启动模块
Trig=1;
ﻩ //启动一次模块
delay_20us();
Trig=0;
/********************************************************************
* 名称 :
Main()
*功能:
主函数
***********************************************************************/
voidmain()
U16i,j;
EA =0;
INT0_Init();
Timer0_Init();
//定时器0初始化
Timer1_Init();
//定时器1初始化
Data_Init();
ﻩEA =1;
ﻩL1602_init();
ﻩL1602_string(1,1,"
Welcometo my "
);
ﻩL1602_string(2,1,"
distancemeter!
"
ﻩ//延时
ﻩfor (i=0;
i<
1000;
i++)
for(j=0;
j<
1000;
j++)
{;
while
(1)
{
ﻩ EA=0;
//以下为一次检测过程:
先发出Trig电平,打开外部中断,清零T1,
//最后在外部中断下降沿触发时取出T1当前值,计算出Trig脉冲宽度。
Start_Module();
while(Echo==0);
//等待Echo回波引脚变高电平
ﻩFlagSucceed = 0;
ﻩﻩEX0=1;
ﻩTH1=0;
ﻩTL1= 0;
ﻩﻩTF1=0;
TR1=1;
//启动定时器1开始计数
ﻩﻩEA =1;
ﻩwhile(TH1<80);
//盲区
ﻩTR1 =0;
//关闭定时器1
ﻩEX0= 0;
//关闭外部中断
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 <
20))
ﻩ {
ﻩﻩ LedAlarm=0;
ﻩ 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。
*输入:
无
* 输出:
*********