基于单片机的超声波控制系统硬件电路设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第四章系统硬件电路设计
4.1 系统设计框图
超声波测距是根据回波测距的原理设计的, 由超声波的发射器发射超声波, 超声波接收器接收回波。

测出从超声波发射脉冲串时刻到接收回波时的时间差, 将声速与时刻差相乘, 得出距离并显示。

其系统框图如图4-1所示,包括51单片机最小系统、超声波测距模块、数码管显示电路、蜂鸣器警报电路和按键设置电路。

图4-1 系统设计框图
4.2 系统电路设计图
系统硬件由51单片机最小系统、超声波发射与接收模块、四位七段数码管显示器、蜂鸣警报电路和按键电路等元件电路所构成,其具体的硬件电路总图见图4-2所示。

图4-2 系统电路设计图
4.3 超声波测距模块
该超声波测距电路使用HC-SR04超声波测距模块,HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm。

其实物图如图4-3所示。

HC-SR04基本工作原理:
(1) 模块自动会发送8个40khz的方波,用于自动检测反射回来的声波。

(2) 采用IO口TRIG触发测距,给最少10us的高电平信号反应。

(3)当有信号返回时,通过IO口ECHO输出一个高电平信号,高电平信号持
续的时间就是超声波从发射到与障碍物反射回来的时间。

图4-3 HC-SR04超声波测距模块实物图
由图可知,HC-SR04超声波测距模块引脚排列如图4-4所示。

(1)VCC 是5V 电源端; (2)GND 是接地端;
(3)TRIG 触发控制信号输入端; (4)ECH0回响信号输出端。

图4-4 HC-SR04引脚排列图
HC-SR04超声波测距模块的详细电气参数见下表4-1.
表4-1 HC-SR04超声波测距模块的详细电气参数 电气参数 HC-SR04超声波模块
工作电压 DC 5V 工作电流 15mA 工作频率 40KHz 最远射程 4m 最近射程 2cm 测量角度 15度
输入触发信号 10uS 的TTL 脉冲
输出回响信号 输出TTL 电平信号,与射程成正比
规格尺寸
45*20*15mm
HC-SR04超声波测距模块的时序图如图4-5所示。

HC-SR04
E C H O
T R I G
G N D
V C C
图4-5 HC-SR04超声波模块时序图
以上时序图表明你只需要提供一个10uS以上的脉冲触发信号,该模块的内部将发出8个40kHz周期电平并检测反射声波。

一旦检测到有反射声波存在则输出回响信号。

回响信号的脉冲宽度与所测的距离成正比。

由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。

设超声波脉冲由传感器发出到接收所经历的时间(高电平信号持续时间)为T,设超声波在空气中的传播速度为C(声速一般取340M/S),设从传感器到障碍物之间的距离为D,最后就可以运用公式:D=CT/2,求得超声波测距模块与障碍物之间的距离。

其系统框图如图4-6所示。

建议测量周期为60ms以上,以防止发射信号对回响信号的影响。

图4-6 超声波测距原理框图
4.4 复位电路
在单片机日常工作时,除了系统正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为解决这个问题,也需要复位致使其重新启动。

所以,系统复位电路显得尤为重要。

片机的复位电路在刚接通5V电源时,一开始电容是没有电能的,电容内的电阻值很低,接通电源后,5V的电源通过电阻给电解电容进行充电,电容两端
的电压会由0V慢慢的升到4V左右(这段充电时间持续很短,一般小于0.3秒),由于有这种充电过程,复位脚由低电位升到高电位,引起了内部电路的复位工作。

当按下复位键时,电容两端开始放电,电容两端电压又回到0V,于是又再次进行了一次复位工作。

电路图如图4-7所示。

图4-7 复位电路图
4.5 晶振电路
晶振电路是单片机系统正常工作的保证,如果振荡器不起振,系统将会不能工作。

假如振荡器的运行不规律,系统执行程序的时候就会出现时间上的误差,这在通信中会明显的体现出来:电路将无法进行通信。

晶振电路是由一个晶振和两个瓷片电容组成的,晶振和瓷片电容本身是没有正负的,两个瓷片电容相连的那端一定要接地,其电路图如图4-8所示。

两个电容的取值是一样的,或者说相差不大,如果相差太大,就会容易造成谐振的不平衡,从而形成停振或者干脆不起振。

两个瓷片电容的存在是起到一个并联协振的作用,这样可以让它的脉冲更平稳与协调。

Y1
12MHZ
C1 30p
C2
30p GND
图4-8 晶振电路图
4.6 供电模块
本设计采用DC插口,通过USB供电的方式为整个电路提供稳定的5V电源。

其电路如图4-9所示。

图4-9 电源电路图
DC电源插口:2、3脚接地,1脚实际是VCC(电源),但是电路中要接蓝色的自锁开关,然后开关的另一个脚再接电源。

6位自锁开关:自锁开关电路中起到电源的开关作用,常开的其中一脚接DC 电源插口电源脚,常开的另一脚接电路的VCC,其原理如图4-10所示。

4-10自锁开关原理图
4.7 警报模块
警报电路由蜂鸣器、三极管、电阻组成,其目的是可以在测距过程中设定一个警戒值,当测距系统与被测物的距离小于所设的警戒值时,蜂鸣器就会发出警报,此警报模块所使用的蜂鸣器是电磁式蜂鸣器。

电磁式蜂鸣器的发声原理是电流通过电磁线圈,由电磁线圈产生磁场从而驱动振动膜振动并发出声音,因此需要一定的电流才能驱动它。

单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一
个电流放大的电路,即通过一个PNP 型9012三极管来放大驱动蜂鸣器。

其电路图如图4-11所示。

R132.2k
Q5
9012
LS1
SPEAKER
GND +5
图4-11 警报模块电路图
4.8 按键模块
根据本设计的需要,按键模块由三个独立按键组成独立键盘电路,独立键盘每一个
I/O 口上只接一个按键,按键的另一端接电源或接地(一般接地),这种接法程序比较简单且系统更加稳定。

独立式键盘的实现方法是利用单片机I/O 口读取口的电平高低来判断是否有键按下。

将常开按键的一端接地,另一端接一个I/O 口,程序开始时将此I/O 口置于高电平,平时无键按下时I/O 口保护高电平。

当有键按下时,此I/O 口与地短路迫使I/O 口为低电平。

按键释放后,单片机内部的上拉电阻使I/O 口仍然保持高电平。

我们所要做的就是在程序中查寻此I/O 口的电平状态就可以了解我们是否有按键动作了。

按键模块的作用是对警报模块中的警戒值进行自主的设定,三个按键中一个按键用来进入和退出警戒值的设定功能,另外两个按键的作用是增大警戒值和减小警戒值。

按键模块的硬件电路如图4-12所示。

图4-12 按键模块电路图
4.9 数码管显示模块
本电路的显示模块主要由一个4位一体的7段共阴LED 数码管与4个PNP 型9012三极管构成。

数码管的作用是用于显示测量到的电压值,它是一个共阴极的数码管,每一位数码管的a,b,c,d,e,f,g ,dp 端都各自连接在一起,用于接收单片机的P1口产生的显示段码。

S1,S2,S3,S4引脚端是数码管的位选端,用于接收单片机的P2口产生的位选码。

本系统采用了动态扫描的方式。

其过程是用其接口电路把所有数码管的8个比划段a~g 和dp 同名端连在一起,而每一个数码管的公共极COM 各自独立地受I/O 线控制。

CUP 从字段输出口送出字型码时,所有数码管接收到相同的字型码,COM 端来控制具体是哪个数码管点亮。

COM 端与单片机的I/O 接口相连接,由单片机输出位位选码到I/O 接口,控制何时哪一位数码管被点亮。

在轮流点亮数码管的位扫描过程中,每位数码管的点亮时间极为短暂。

但是由于人的视觉暂留现象,给人的直观感觉就是一组稳定显示的数字。

动态方式有节省电能的优点,并且在动态扫描的过程中,任何时刻只有一个数码管是处于工作状态的。

其连接电路如图4-13所示。

R1
2.2K R22.2K R32.2K R42.2K
Q19012Q29012Q39012Q49012
W 1
W 2
W 3
W 4
GND
e
12d p
3c 4g 5S 4
6
b
7S 3
8S 2
9f 10a 11S 1
12U34-LED
A F B
E
D
d p C G S 1
S 2S 3S 4
图4-13 数码管显示模块电路图
三极管:本设计采用4个9012三极管,此三极管为PNP 型。

三极管是电流放大器件,有三个引脚分别对应三个极,分别是发射极e 、基极b 、集电极c 共三极。

其具体模型如图4-14所示。

图4-14 三极管引脚图
4.10 上拉电阻与锁存器
上拉电阻:103排阻是由8个10KΩ电阻组成的,其中一端全部接在一起,他们在电路中起到“上拉”的作用,又称上拉电阻。

上拉就是将不确定的信号通过一个电阻嵌位在高电平,电阻同时起限流作用,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。

其原理图如图4-15所示。

图4-15 上拉电阻原理图
上拉电阻特点:
1、当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以
提高输出高电平的值。

2、芯片管脚后面添加拉电阻以提高输出电平,因而提高芯片输入信号的噪声容限并且增强抗干扰能力。

3、提高总线的抗电磁干扰能力(管脚如果悬空的话就比较容易接受外界的电磁干扰)。

4、长线传输过程中电阻如果不匹配,容易引起反射波的干扰,而且上拉电阻是电阻匹配,所以能够有效的抑制反射波的干扰。

5、为增加输出引脚驱动的能力,某些单片机管脚上也经常使用上拉电阻。

6、在COMS芯片上,为防止静电所造成得损坏,不用的管脚也不能悬空,一般是在后面接上上拉电阻从而降低输入阻抗,提供泄荷通路。

7、OC门电路必须加上拉电阻,才可以使用。

锁存器:锁存器是一种对脉冲电平很敏感的存储单元电路,它能够在特定输入脉冲电平的作用下改变它的状态。

锁存:就是把信号暂时存储用来维持某种电平状态的功能。

锁存器最主要的作用就是缓存,其次是完成控制其高速与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个 I/O 接口既可以输出也可以输入的问题。

本次设计将74HC573锁存器使用在51单片机和数码管显示电路中间,用以增加单片机输出的驱动电流,从而更好的控制和驱动数码管。

4.11 电路元件清单
本次设计所使用的原件清单可见于下表4-2。

表4-2 基于单片机的超声波测距电路元件清单
元件名称型号规格数量
超声波模块HC-SR04 1
51单片机STC89C51 1
锁存器74HC573 1
万用版7*9 1
IC座40P 1
IC座20P 1 DC电源母座4P 1
数码管4位7段,共阴 1
三极管9012 5
电阻220Ω8
电阻 2.2KΩ 5
电阻10KΩ 1
蜂鸣器5V有源 1
排阻103 1
电解电容10uf 1
瓷片电容30pf 2
晶振12MHz 1
自锁开关6位 1
轻触按键4位 3
第五章系统软件设计
主程序为单片机程序主体,整一个单片机端的系统的软件功能的实现都在其中完成,在此过程里主程序调用子程序和中断服务程序。

主程序的主要功能是负责距离的显示、读出并处理HC-RS04的测量距离值,按键控制有效距离限制,当测量的值超过预设值时,蜂鸣器发声报警。

主程序流程图如图5-1所示。

开始
初始化
调用显示子程序
N
存在障碍物
Y
读出读数计算距离
Y
N
距离小于警报值
蜂鸣器警报
结束
图5-1 主程序流程图
结论
本论文中对超声波测距的原理和实现进行了详细论述,详细介绍了STC89C51的内部结构以及各管脚的功能。

在此理论知识基础上,利用STC89C51单片机对系统发射与接收、显示报警及复位等硬件电路进行了设计,并对设计电路作了分析,通过掌握了系统的工作流程,设计了该系统的主程序、显示子程序和蜂鸣报警程序,最终制作完成了一个基于51单片机的超声波测距系统。

在此次毕业设计的过程中遇到了诸多难题,比如在画电路原理图的过程中,许多画图软件中并没有相关的电路元件,导致画图的进程一度中断,最后在同学的帮助和指导以及网上的相关解决方案,最终完成了电路图的绘制。

再比如焊接时,虽然学校进行过相关的焊接培训,但是在实际焊接中仍然遇到了诸多问题,但是经过努力的练习和改善,终于完成了焊接任务并且测试成功。

通过这次的毕业设计,我基本掌握了51单片的使用方法,对相关软件的应用能力也得到了提升,并且加强了我的动手能力和焊接技术。

同时通过同学的帮助,更加适应了团队协作的工作方式,对我以后的工作提供了经验和基础。

虽然完成了该测距控制系统,但是仍可以对超声波模块及警报模块进行进一步改进和细化,可以使用更高精度的超声波发射和接收模块并采用一定的控制理论和算法,使测距系统测量更加精确、操作更加简便、抗干扰能力更强,更具有科学性、可靠性和可操作性。

参考文献
[1] 郭蓉.基于STC89C51单片机的超声波测距系统设计与实现[J].石油仪
器,2010(5):13-22.
[2] 杨国勇.单片机电铃系统设计浅析[J].计算机光盘软件与应用,2011
[3] 胡文昌.单片机及其在双电机定位系统中应用研究[J].中国科技博览,2010.
[4] 王维英.8位高速流水线结构MCU的设计[D].北方工业大学,2008.
[5] 胡汉才.单片机原理及系统设计[M].北京:清华大学出版社,2012.
[6] 王守中.51单片机开发入门与典型实例[M].北京:人民邮电出版社,2007.
[7] 薛均义,张彦斌.MCS-51系列单片微型计算机及其应用[M].西安:西安交通
大学出版社,2008.
[8] 唐颖,程菊花,任条娟.单片机原理与应用及C51程序设计[M].北京:北京大
学出版社,2011.
[9] 沈斌.双电源自动切换系统的设计.[D]苏州大学,2011.
[10] 张波.基于STC89C51单片机超声波测距系统的设计[J].机床与液压,2010.
[11] 陈雪丽.单片机原理及接口技术[M].北京:化学工业出版社,2005.
[12] 丁元杰.单片微机原理及应用[M].北京:机械工业出版社,2005.
[13] 郭天祥.51单片机C语言教程[M].北京:电子工业出版社,2009.
[14] 宋雪松,李冬明,崔长胜.手把手教你学51单片机[M].北京:清华大学出版
社,2014.
[15] 廖娜.单片机在超声波测距中的应用[J].科学时代,2012.
[16] Pradip Dey,Ghosh manas.Programming in C[M].Oxford University
Press,2012
附录
附录一:超声波测距系统实物图
附录二:超声波测距系统实物效果图
附录三:STC89C51单片机C语言程序
#include <reg52.H>//器件配置文件
#include <intrins.h>
//传感器接口
sbit RX = P3^2;
sbit TX = P3^3;
//按键声明
sbit S1 = P1^4;
sbit S2 = P1^5;
sbit S3 = P1^6;
//蜂鸣器
sbit Feng= P2^0;
//变量声明
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0;
unsigned long BJS=50;//报警距离80CM
//模式0正常模式1调整
char Mode=0;
bit flag=0;
unsigned char const discode[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0xff/*-*/}; //数码管显示码0123456789-和不显示
unsigned char const positon[4]={0xfd,0xfb,0xf7,0xfe}; //位选
unsigned char disbuff[4] ={0,0,0,0}; //数组用于存放距离信息
unsigned char disbuff_BJ[4] ={0,0,0,0};//报警信息
//延时100ms(不精确)
void delay(void)
{
unsigned char a,b,c;
for(c=10;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
//按键扫描
void Key_()
{
//+
if(S1==0)
{
delay(); //延时去抖
while(S1==0)
{
P1=P1|0x0f;
}
BJS++; //报警值加
if(BJS>=151) //最大151
{
BJS=0;
}
}
//-
else if(S2==0)
{
delay();
while(S2==0)
{
P1=P1|0x0f;
}
BJS--; //报警值减
if(BJS<=1) //最小1
{
BJS=150;
}
}
//功能
else if(S3==0) //设置键
{
delay();
while(S3==0)
{
P1=P1|0x0f;
}
Mode++; //模式加
if(Mode>=2) //加到2时清零
{
Mode=0;
}
}
}
/******************************************************************************
****************************/
//扫描数码管
void Display(void)
{
//正常显示
if(Mode==0)
{
P0=0x00; //关闭显示
if(posit==0)//数码管的小数点
{
P0=(discode[disbuff[posit]])|0x80;//按位或,最高位变为1,显示小数点}
else
{
P0=discode[disbuff[posit]];
}
P1=positon[posit];
if(++posit>=3) //每进一次显示函数,变量加1
posit=0; //加到3时清零
}
//报警显示
else
{
P0=0x00;
if(posit==0)//数码管的小数点
{
P0=(discode[disbuff_BJ[posit]])|0x80;
}
else if(posit==3)
{
P0=0x76; //显示字母
}
else
{
P0=discode[disbuff_BJ[posit]];
}
P1=positon[posit];
if(++posit>=4)
posit=0;
}
}
/****************************************************************************** ****************************/
//计算
void Conut(void)
{
time=TH0*256+TL0; //读出T0的计时数值
TH0=0;
TL0=0; //清空计时器
S=(time*1.7)/100; //算出来是CM
if(Mode==0) //非设置状态时
{
if((S>=700)||flag==1) //超出测量范围显示“-”
{
Feng=0; //蜂鸣器报警
flag=0;
disbuff[0]=10; //“-”
disbuff[1]=10; //“-”
disbuff[2]=10; //“-”
}
else
{
//距离小于报警距
if(S<=BJS)
{
Feng=0; //报警
}
else //大于
{
Feng=1; //关闭报警
}
disbuff[0]=S%1000/100; //将距离数据拆成单个位赋值
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
}
}
else
{
Feng=1;
disbuff_BJ[0]=BJS%1000/100;
disbuff_BJ[1]=BJS%1000%100/10;
disbuff_BJ[2]=BJS%1000%10 %10;
}
}
/****************************************************************************** ****************************/
//定时器0
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
/****************************************************************************** ****************************/
//定时器1
void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块
{
TH1=0xf8;
TL1=0x30; //定时2ms
Key_(); //扫描按键
Display(); //扫描显示
timer++; //变量加
if(timer>=400) //400次就是800ms
{
timer=0;
TX=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}
/******************************************************************************
****************************/
//主函数
void main(void)
{
TMOD=0x11; //设T0为方式1,GA TE=1;
TH0=0;
TL0=0;
TH1=0xf8; //2MS定时
TL1=0x30;
ET0=1; //允许T0中断
ET1=1; //允许T1中断
TR1=1; //开启定时器
EA=1; //开启总中断
while(1)
{
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
}
}。

相关文档
最新文档