目录
硬件部分
1、主控芯片
我使用的是STC89C51芯片
2、材料清单
车套(两个亚克力车板,4个直流电机,螺丝铜柱等)
L298N电机驱动
红外循迹模块
航模电池
3、设计电路
原理图
pcb设计
实物图
4、硬件器件介绍
STC89C51芯片:
STC89C51是一款基于MCS-51标准架构的单片机,由STC公司生产。它具有51单片机的所有基本特性,如8位CPU、128字节RAM、4K字节ROM、32个I/O口等,并且还具有一些特殊的功能,如定时器、串口通信等。STC89C51的主要特点如下:
- 采用高性能的CMOS工艺,工作电压范围广,可靠性高。
- 内置12MHz晶振,无需外接晶振即可工作。
- 具有4个定时器/计数器,可用于计时、PWM输出等。
- 具有2个串口,支持多种通信协议。
- 具有SPI总线接口,可与其他设备进行通信。
- 具有IAP(In-Application Programming)功能,可在线编程。
- 具有低功耗模式,可在待机状态下降低功耗。
- 具有多种封装形式,如DIP、PLCC、QFP等。
L298N电机驱动
L298N是一种高电压、大电流的电机驱动集成电路。
特性:
- L298N是H桥驱动电路的一种实现。
- 它具有四个通道,每个通道都可以提供高达2A的连续电流或3A的峰值电流。
- 工作电压范围宽,最高可达50V。
- 集成了保护功能,包括过热保护和欠压锁定。
- 芯片采用15脚封装。
使用方法:
- 控制电机正转、反转和停止通常通过连接到主控板(如STM32微控制器)上的I/O引脚来完成。
- 两个输入端口控制一个电机的方向,当一个输入为高电平,另一个为低电平时,电机正转;反之则反转。
- 当两个输入都为低电平时,电机停止转动。
- 输出电流可以通过外接电阻进行调节。
制作51循迹小车时,L298N常常被用来驱动小车的两个轮子,通过对电机的不同转向控制,使得小车能够前进、后退以及转弯。
更多的详细说明可以专门去查查。
软件部分
为了方便我对代码的修改以及代码的整洁性,我采用了模块化编程。(以下代码具体学习自行查找)
在进行小车代码的编写前,需要学习51单片机的中断,定时器以及PWM调速。
接线及I/O口部分大家自行去定义就行。
1、定时器、中断开关
void time0init()
{
EA = 1;
ET0 = 1;
TR0 = 1;
TMOD = 0X01;
TH0 = (65535-1000)/256;//1ms
TL0 = (65535-1000)%256;//1ms
}
2、pwm函数
PWM在循迹小车很重要,具体怎么学我不过多去说明,直接上代码了。(想具体了解可以看看这篇博客http://t.csdnimg.cn/3417E,里面讲解了51单片机的PWM)
uint Num1 = 0;
uint Num2 = 0;
uint JIE1 = 80;
uint JIE2 = 80;
void timer0() interrupt 1
{
TH0 = (65535-100)/256;
TL0 = (65535-100)/256;
Num1++;
Num2++;
if(Num1==100)
{
Num1=0;
}
if(Num2==100)
{
Num2=0;
}
if(Num1<=JIE1)
{
FZ = 1;
}
else
{
FZ = 0;
}
if(Num2<=JIE2)
{
FR = 1;
}
else
{
FR = 0;
}
}
3、小车行进代码
小车前进,后退,转向以及停车。
有兴趣可以参考自行去编写掉头等其他行进代码。
void go()//直行
{
Z1 = 1;
Z2 = 0;
R3 = 1;
R4 = 0;
}
void left()//左转
{
Z1 = 1;
Z2 = 0;
R3 = 0;
R4 = 1;
}
void right()//右转
{
Z1 = 0;
Z2 = 1;
R3 = 1;
R4 = 0;
}
void stop()//停
{
JIE1=0;
JIE2=0;
Z1 = 0;
Z2 = 0;
R3 = 0;
R4 = 0;
}
4、停车点智能检测部分
可以检测类似于A4白纸等其他停车点并精准停车,由于场地等不同,会影响精准度,可以参考代码自行修改。
void ttt()//终点
{
while(Hl==0&&H0==0&&Hr==0)
{
stop();
delay(200);
JIE1=20;
JIE2=20;
go();
if(Hl==1||Hr==1||Ho==1)
{
break;
}
delay(400);
if(Hl==1||Hr==1||Ho==1)
{
break;
}
while(Hl==0&&Ho==0&&Hr==0)
{
stop();
}
}
}
5、主函数(包含红外检测)
我用了3个红外检测模块,主函数里包含左,中,右三个的检测。
void main()
{
timer0Init();//启动定时器
while(1)
{
if(Hl==1&&Ho==0&&Hr==1)
{
JIE1=90;
JIE2=90;
go();
}
if(Hl==1&&Hr==0)//左
{
JIE1=90;
JIE2=70;
left();
if(Hl==0&&Ho==0&&Hr==0)
{
ttt();
}
if(Hl==1&&Ho==0&&Hr==1)
{
break;
}
}
if(Hl==0&&Hr==1)//右
{
JIE2=90;
JIE1=70;
right();
if(Hl==0&&Ho==0&&Hr==0)
{
ttt();
}
if(Hl==1&&Ho==0&&Hr==1)
{
break;
}
}
while(Hl==0&&Ho==0&&Hr==0)
{
ttt();
}
}
}