基于51单片机智能超声波跟随距离显示小车

1、前言

 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉小洪学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,小洪学长分享优质毕业设计项目,今天要分享的是基于51单片机智能超声波跟随距离显示小车

2、简介

基于51单片机智能超声波跟随距离显示小车

1、1602液晶显示电路实时显示当前超声波测量的实际距离值;
2、当人与小车的距离小于30cm时小车停止跟随。
3、当人与小车的距离大于30cm时小车自动跟随。
4、当人与小车的距离大于50cm时小车停止声光报警,提示距离过远已经跟丢。
5、当小车左边检测到人时向左跟随,当小车右边检测到人时向右跟随

3、组成

本设计由STC89C52单片机电路+1602液晶显示电路+超声波电路+L298N驱动电路+远距离红外电路+蜂鸣器声光报警电路+按键电路+稳压电路+小车底盘+电源电路组成

4、实现效果

整体展示

红外辅助跟随

5、设计原理

5.1 STC89C52RC简介

STC89C52RC单片机使用范围十分广泛,而且是每个电子设备设计者的首选芯片,此款芯片深得广大用户的喜爱。这款单片机是基于8051单片机进行加强改造的,在对于指令代码的编写时能完全兼容传统8051单片机,所以在程序的编写方面更加便捷。其优点就是有很高的可靠性、价格实惠、功耗比较低,STC89C52RC单片机芯片在技术方面最主要的优点就是采用了Flash存贮器技术,这种技术的使用不仅降低了制造的成本,并且在软件和硬件方面都能与8051单片机完全兼容,还采用了高密度非易失存储制造技术制造,将多功能8位CPU和闪烁存储器组合在单个芯片中,所以可以被中国的大多数用户接受。其程序的电可擦写特性,使得开发与试验更加容易,也为了很多嵌入式控制系统提供了一种灵活性高且价廉的方案选择。

在芯片内部有12时钟/机器周期和6时钟/机器周期,我们可以进行随意的选择。它的工作电压为:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)。其工作频率在0~40MHz之间,和普通的8051单片机相比更加方便,在实际使用中它的工作频率可达48MHz。我们能使用的应用程序空间为8K字节,在片上集成512字节RAM。芯片上有32个通用的I/O口,就是4组分别是P1、P2、P3、P4,每组各有8个I/O口。复位后的4组接口是准双向口/弱上拉,当被作为总线扩展使用时,就不用加上拉电阻,而作为I/O口使用时,就需加上拉电阻。在芯片内部内置的ISP(在系统可编程)和IAP(在应用可编程)技术,让其编程和仿真都变得十分简便,省去使用专用编程器和专用仿真器的麻烦,并且还可以直接通过串口(RxD/P3.0,TxD/P3.1)下载用户程序,下载速度很快,这使得程序的烧写更加容易。还有看门狗的功能。外部中断4路,下降沿中断或低电平触发电路,Power Down模式可由外部中断低电平触发中断方式唤醒。共有3个16位定时器/计数器,即定时器T0、T1、T2。通用异步串行口(UART),还可用定时器软件实现多个UART。

STC89C52RC引脚功能说明:

VCC(40引脚):电源电压

VSS(20引脚):接地

P0端口(P0.0~P0.7,39~32引脚):P0口是一个漏极开路的8位双向I/O口。作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。此时,P0口内部上拉电阻有效。在Flash ROM编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。验证时,要求外接上拉电阻。

P1端口(P1.0~P1.7,1~8引脚):P1口是一个带内部上拉电阻的8位双向I/O口。P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流。

P2端口(P2.0~P2.7,21~28引脚):P2口是一个带内部上拉电阻的8位双向I/O端口。P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。

在访问外部程序存储器和16位地址的外部数据存储器(如执行“MOVX @DPTR”指令)时,P2送出高8位地址。在访问8位地址的外部数据存储器(如执行“MOVX @R1”指令)时,P2口引脚上的内容(就是专用寄存器(SFR)区中的P2寄存器的内容),在整个访问期间不会改变。在对Flash ROM编程和程序校验期间,P2也接收高位地址和一些控制信号。

P3端口(P3.0~P3.7,10~17引脚):P3是一个带内部上拉电阻的8位双向I/O端口。P3的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。P3做输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输入一个电流。

STC89C52RC单片机的芯片引脚图,如图所示。

图 STC89C52RC单片机引脚图

晶振电路

对于每个单片机系统中都会有晶振电路,晶振在整个单片机系统中起到举足轻重的作用。它结合单片机内部电路,产生时钟频率,有了这个基础单片机才能执行全部的指令,完成所需的功能。同时,时钟频率产生的快慢直接影响单片机运行速度的快慢,时钟频率越高,相对的单片机运行的速度也是越快的。晶振其实就是电能与机械能相互转化的晶体共振技术,为其单片机提供稳定、精确的单频振荡。

晶振电路一般会有两个电容组成,也叫做负载电容。其单片机的工作状态一般会处于并联谐振状态。而其中负载电容的大小会根据晶振的要求来选取确定值。晶振的频率就是在它提供的负载电容下完成的测试,使其减小误差的产生。同时也能保证温漂产生的误差,选取相同的电容值,是为了保证晶振电路的正常运行,如果两个电容的取值不同,甚至相差过大的话,都会容易造成谐振的不平衡,导致停振或干脆振不起来。

在此次的设计中XTAL1和XTAL2端外接石英晶体作为定时元件,在STC89C52RC芯片内部有用于构成振荡器的高增益反向放大器,从而实现自激振荡,产生时钟。晶体振荡器的工作频率一般在1.2~12MHZ之间选择,电容C1、C2一般在10PF~40PF之间取值都是可以的。在这里我选用了12MHZ的工作频率和两个22PF的电容构成晶振电路,STC89C52RC单片机的晶振电路如图3.2所示。

 晶振电路

复位电路

复位电路也是单片机中重要的一部分,在单片机启动运行时,首先要进行复位操作,而单片机自己又不能独自完成,所以要结合外部电路进行复位操作。如图3.3为复位电路图。RST引脚是复位信号的输入端。当输入连续两个机器周期以上高电平时为有效,当晶振频率为12MHZ时,复位信号持续的时间应超过2us才能完成复位操作。当我们加上复位电路,单片机上电以后,RST引脚会先保持一小段时间的高电平而后变为低电平,这就是单片机复位的过程。

 复位电路

6、部分核心代码

#include <reg52.h>
#include <intrins.h>
#include<stdio.h>
#include"1602.h"   //LCD1602液晶头文件
#include "delay.h"

#define uchar unsigned char//宏定义 
#define uint unsigned int  //宏定义
uchar tmp;
unsigned char zkb1=0 ;    //**左边电机的占空比**//
unsigned char zkb2=0 ;    //**右边电机的占空比**//
unsigned long time_20ms=0;	//定时变量
unsigned char read_dht21=0;	//读取标志
char dis0[16];			   //打印数组初始化
char dis1[16];			   //打印数组初始化
float JuLi;			//距离
long JlCoun=0;		//定时器计数 
unsigned int idata Alarm_JuLi=3000;   //超声波报警值 
unsigned int idata Alarm_JuLi2=5000;   //超声波报警值 
unsigned int idata Alarm_JuLi3=8000;   //超声波报警值 
sbit Echo=P1^7;		//超声波引脚定义
sbit Trip=P1^6;
sbit buzzer=P3^5;
sbit hwl=P3^6;//左红外
sbit hwr=P3^7;//右红外
sbit IN1=P1^1;//定义L298N电机驱动控制引脚
sbit IN2=P1^2;//定义L298N电机驱动控制引脚
sbit IN3=P1^3;//定义L298N电机驱动控制引脚
sbit IN4=P1^4;//定义L298N电机驱动控制引脚
sbit ENA=P1^0;//定义L298N电机驱动控制引脚
sbit ENB=P1^5;//定义L298N电机驱动控制引脚
uchar SJ_buf[4]; //数据值显示缓存
int t=0;
void dely(int a) //延时函数
 {int i,j;
 for(i=0;i<a;i++)
 for(j=0;j<110;j++);
 }
 void Delay1ms(uint t)    //1ms延时程序 
{
	uchar j;
	while(t--)
	{
		for(j=0;j<125;j++)
		{ ; }
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值