基于 89C52 单片机的智能循迹测速避障小车
为了参加我校举办的电子科技竞赛,刚刚开始学习单片机的我们,经过讨论,
决定做一辆智能循迹测速小车,综合我们搜集的材料以及自己的修改,我们做出
了我们的作品。以下是我们整理的材料:
一、 原理图
1、最小系统
我们采用的是 89C52 单片机来做小车的最小系统,针对自己的需要只把
要用到的排针口接了上去,具体电路图如下:
2、电机驱动
我们采用 L293D 作为驱动芯片,L293D 是一种直流电机控制器件,具有外
围电路简单,易于集成、控制等特点,电路图如下:
其中我们用 TLP521-4 光耦器作为电机的稳定,即稳定的是电机的电压,避
免电机的电流过大烧坏单片机,起到保护单片机的作用,增加安全性,减少电路
干扰,简化电路设计。其电路图如下:
3、测速电路
我们采用 RPR220 反射式光电传感器作为测速器,反射式红外光电传感器模
块是一种利用反射式红外光电传感器制成的在传感器的有效检测距离范围内对
被测物体的存在性进行检测的电路装置,由红外光发射接收器、电压变化检测电
路、检测灵敏度调节电位器、检测状态指示 LED 灯等四个主要部分组成,额定
工作电压 DC3.3V 或 DC5.5V(兼容支持 DC3V~DC5.5V,而无需额外的硬件配置),
DC5V 工作电压条件下,约为 60mA,最大不超过 80 mA。具体电路图如下:
4、探测器
我们仍采用RPR220反射式光电传感器作为探测器,基于它受被测物体的红外
反射特性影响很大,亦能通过检测灵敏度调节电位器进行调节,我们用它来
探测黑线(即路线),实现循迹功能。事实证明它的灵敏度是很高的,具体
电路如下:
相应的放大电路我们采用 LM339 芯片作为放大器,LM339 芯片通常用作电压
比较器,该电压比较器的特点是:1)失调电压小,典型值为 2mV;2)电源电压
范围宽,单电源为 2-36V,双电源电压为±1V-±18V;3)对比较信号源的内阻
限制较宽;4)共模范围很大,为 0~(Ucc-1.5V)Vo;5)差动输入电压范围较
大,大到可以等于电源电压;6)输出端电位可灵活方便地选用。LM339 类似于
增益不可调的运算放大器,在本装置中,我们将它用来放大探测信号。电路图如
下:
5、电源
我们采用 L7805 作为电源的稳压芯片,虽然用 lm78/lm79 系列三端稳压 IC 来组
成稳压电源所需的外围元件极少,但是电路内部还有过流、过热及调整管的保护
电路,使用起来可靠、方便,而且价格便宜。电路图如下:
6、我们用 DYP-ME007 超声波作为避障部分,DYP-ME007 超声波测距模块可提供
3cm—3.5m 的肥接触式距离感测功能。下图为 DYP-ME007 外观,包括超声波发射
器、接收器与控制电路。其基本工作原理为给予此超声波测距模块一触发信号后
发射超声波,当超声波投射到物体上后反射回来时,模块输出一回响信号,以触
发信号和回响信号间的间差,来判定物体的距离。
7、程序
//包含单片机寄存器的头文件
//包含随机函数 rand()的定义文件
驱动程序如下:
#include
#include
#include //包含_nop_()函数定义的头文件
#include
#define uchar unsigned char;
#define uint unsigned int;
#define CM 3
sbit RS=P2^7;
sbit RW=P2^6;
sbit E=P2^5;
sbit BF=P0^7;
sbit S_LEFT=P1^4;//左轮测速器
sbit S_RIGHT=P1^5;//右轮测速器
sbit EN12=P3^6;//电机 1 使能端
sbit IN1=P2^1;//电机 1 前进驱动
sbit IN2=P2^2;//电机 1 后退驱动
//char 单字节整型数据或字符型数据
//寄存器选择位,将 RS 位定义为 P2.0 引脚
//读写选择位,将 RW 位定义为 P2.1 引脚
//使能信号位,将 E 位定义为 P2.2 引脚
//忙碌标志位,,将 BF 位定义为 P0.7 引脚
sbit EN34=P3^7;//电机 2 使能端
sbit IN3=P1^6; //电机 2 前进驱动
sbit IN4=P1^7; //电机 2 后退驱动
sbit D1=P1^0;//定义探测器 1
sbit D2=P1^1;//定义探测器 2
sbit D3=P1^2;//定义探测器 3
sbit D4=P1^3;//定义探测器 4
sbit SPK=P2^0;//定义蜂鸣器
sbit EX=P3^4;//超声波接收端
sbit TX=P3^5;//超声波发送端
//*****************延时函数
uint count0=0,w=0,w2=0,H,L;//定义需要用到的变量
float w0,w3,w1,w4;//
unsigned int p,j,k,s,m;//
unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字
unsigned char code string[ ]={""}; //定义字符数组显示提示信息
//unsigned char count,count2,count3;
uint PWM=20;//定义占空比
/**********************************************************/
void delay1(int ms)//延时函数
{
while(ms--)
{
for(y = 0; y<250; y++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void forward()// 前进函数
{
//定义变量统计中断累计次数
unsigned char y;
IN1=1;
IN2=0;
IN3=1;
IN4=0;
PWM=85;
TR0=1;
}
void forward2()//前进函数 2
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
PWM=90;
TR0=1;
}
void stop1()//停止函数
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
TR0=0;
}
void turnleft()//左转函数
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
PWM=50;
TR0=1;
}
void turnright()// 右转函数
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
PWM=50;
TR0=1;
}
void back()//后退函数
{
IN1=0;
IN2=0;
IN3=0;
IN4=1;
PWM=60;
TR0=1;
}
//-- 蜂鸣