基于51单片机的循迹小车

基于51单片机的循迹小车

一.电机驱动,要想循迹,得先把它驱动起来。
1.电机模块原理图:前轮是驱动轮,所以两个电机接两个驱动轮,采用的是YL-86电机。在这里插入图片描述
2.电机接线图:用杜邦线接好线,接通VCC,GND模块电源指示灯亮
IA1输入高电平,IB1输入低电平,【0A1 0B1】电机正转;IA1输入低电平,IB1输入高电平,【OA1 0B1】电机反转;IA2输入高电平,IB2输入低电平,【OA20B2】电机正转;IA2输入低电平,IB2输入高电平,【0A2 0B2】电机反转;

在这里插入图片描述这里看起来是不是巨复杂的样子,其实不是,简而言之,就是电机的驱动由两个引脚控制,一正一反就能让它动起来。
3.驱动代码,话不多说,咱们还是来看代码叭
主要是写了几个函数封装起来,实现正转和反转用来测试的。

#include<reg52.h>
sbit r1=P1^0;
sbit r2=P1^1;
sbit l1=P1^2;
sbit l2=P1^3;
sbit in_1=P1^4;
sbit in_2=P1^5;

void left();
void right();
void go();
void stop();


void left()				//右轮不动,驱动左轮
{
	l1=0;
	l2=0;
	r1=0;
	r2=1;
}
void right()		//左轮不动,驱动右轮
{
	l1=0;
	l2=1;
	r1=0;
	r2=0;
}
void go()//两个轮顺时针转动,往前走
{
	l1=0;
	l2=1;
	r1=0;
	r2=1;
}
void stop()
{
	l1=0;
	l2=0;
	r1=0;
	r2=0;
}


void main()
{
	while(1)
	{
		go();
	}

}

二.实现循迹,主要是用的YL-70避障模块
1.此模块是为智能小车、机器人等自动化机械装置提供一种多用途的红外线探测系统的解决方案:该传感器模块对环境光线适应能力强,其具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,同时信号输出接口输出数字信号(一个低电平信号),可通过电位器旋钮调节检测距离,有效距离范围2~60cm,工作电压为3.3V-5V。该传感器的探测距离可以通过电位器调节、具有干扰小、便于装配、使用方便等特点,可以广泛应用于机器人避障、避障小车、流水线计数及黑白线循迹等众多场合。
在这里插入图片描述在这里插入图片描述2.接线方式
红外探头VCC GND OUT对应接入中控板VCC GND INx。
中控板供电:模块6p排针接口处VCC外接3.3V-5V电压(可以直接与5v单片机和3.3v单片机相连); GND外接GND ; OUT1-OUT4接单片机I0口。
3.测试方式
可以用白纸挡着,这个时候,主控板的led灯会亮起,而移开之后,led灯会熄灭,然后通过检测单片机引脚的高低电平就好了。
4.代码

#include<reg52.h>
sbit r1=P1^0;
sbit r2=P1^1;
sbit l1=P1^2;
sbit l2=P1^3;
sbit in_1=P1^4;
sbit in_2=P1^5;

void left();
void right();
void go();
void stop();


void left()
{
	l1=0;
	l2=0;
	r1=0;
	r2=1;
}
void right()
{
	l1=0;
	l2=1;
	r1=0;
	r2=0;
}
void go()
{
	l1=0;
	l2=1;
	r1=0;
	r2=1;
}
void stop()
{
	l1=0;
	l2=0;
	r1=0;
	r2=0;
}


void main()
{
	while(1)
	{
		if(in_1==0&&in_2==0)
			go();
		else if(in_1==1&&in_2==0)
			right();
		else if(in_1==0&&in_2==1)
			left();
		else
			stop();
		
	}

}
  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
循迹小车停车的代码可以分为两个部分:循迹部分和停车部分。以下是基于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实现停车后的维持状态。需要注意的是,以上代码仅供参考,具体实现需要根据具体的硬件环境进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王不会写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值