基于51单片机的循迹小车

目录

硬件部分

1、主控芯片

2、材料清单

3、设计电路

原理图

pcb设计

实物图

4、硬件器件介绍

STC89C51芯片:

 L298N电机驱动

特性:

使用方法:

软件部分

1、定时器、中断开关

2、pwm函数

3、小车行进代码

4、停车点智能检测部分

5、主函数(包含红外检测)


硬件部分

1、主控芯片

我使用的是STC89C51芯片

2、材料清单

车套(两个亚克力车板,4个直流电机,螺丝铜柱等)

L298N电机驱动

红外循迹模块

航模电池

3、设计电路

原理图

pcb设计

实物图

4、硬件器件介绍

STC89C51芯片:

STC89C51是一款基于MCS-51标准架构的单片机,由STC公司生产。它具有51单片机的所有基本特性,如8位CPU、128字节RAM、4K字节ROM、32个I/O口等,并且还具有一些特殊的功能,如定时器、串口通信等。STC89C51的主要特点如下:

  1. 采用高性能的CMOS工艺,工作电压范围广,可靠性高。
  2. 内置12MHz晶振,无需外接晶振即可工作。
  3. 具有4个定时器/计数器,可用于计时、PWM输出等。
  4. 具有2个串口,支持多种通信协议。
  5. 具有SPI总线接口,可与其他设备进行通信。
  6. 具有IAP(In-Application Programming)功能,可在线编程。
  7. 具有低功耗模式,可在待机状态下降低功耗。
  8. 具有多种封装形式,如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();
		}
	}
}

  • 21
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
循迹小车停车的代码可以分为两个部分:循迹部分和停车部分。以下是基于51单片机循迹小车停车代码示例: ```c #include <reg51.h> #define uchar unsigned char sbit IN1=P1^0; //定义IN1 sbit IN2=P1^1; //定义IN2 sbit IN3=P1^2; //定义IN3 sbit IN4=P1^3; //定义IN4 uchar i=0,flag=0; //定义计数器i和标志位flag void delay(uchar n) //延时函数 { uchar i,j; for(i=0;i<n;i++) { for(j=0;j<120;j++); } } void forward() //前进函数 { IN1=1; IN2=0; IN3=1; IN4=0; } void left() //左转函数 { IN1=0; IN2=1; IN3=1; IN4=0; } void right() //右转函数 { IN1=1; IN2=0; IN3=0; IN4=1; } void stop() //停止函数 { IN1=0; IN2=0; IN3=0; IN4=0; } void main() { while(1) { if(P2==0x0F) //循迹小车在黑线上 { forward(); //前进 } else if(P2==0x00) //循迹小车在白色地面上 { stop(); //停车 flag=1; //标志位flag置1 } else if(P2==0x0E) //循迹小车偏右 { right(); //右转 delay(10); //延时 forward(); //前进 } else if(P2==0x0D) //循迹小车偏左 { left(); //左转 delay(10); //延时 forward(); //前进 } if(flag==1) //停车后flag为1 { i++; //计数器i自增 if(i==10) //计数器i达到10 { flag=0; //标志位flag置0 i=0; //计数器i清0 } } } } ``` 以上代码中,使用了P1口控制小车电机的方向,P2口接收循迹模块的信号。循迹部分通过读取P2口的值判断循迹小车的位置,从而控制小车的运动方向;停车部分通过设置标志位flag和计数器i实现停车后的维持状态。需要注意的是,以上代码仅供参考,具体实现需要根据具体的硬件环境进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值