51红外循迹小车3——代码部分

友情链接:

51红外循迹小车1——材料清单及前期准备-CSDN博客

51红外循迹小车2——接线及硬件部分讲解-CSDN博客

目录

一、引脚及I/O口定义

1、L298N的I/O口定义及小车运动状态定义

1.I/O口定义

2.小车运动状态定义

二、小车运动函数

三、红外循迹模块

1、引脚定义

2、循迹模块


一、引脚及I/O口定义

1、L298N的I/O口定义及小车运动状态定义

1.I/O口定义

//定义小车驱动模块输入IO口 
//第一个L298N
sbit L298N_IN1 = P1^2; 
sbit L298N_IN2 = P1^3;
sbit L298N_IN3 = P1^4;
sbit L298N_IN4 = P1^5;
sbit L298N_EN1 = P1^6;
sbit L298N_EN2 = P1^7;
   
//第二个L298N
sbit L298N_IN5 = P2^2; 
sbit L298N_IN6 = P2^3;
sbit L298N_IN7 = P2^4;
sbit L298N_IN8 = P2^5;
sbit L298N_EN3 = P2^6;
sbit L298N_EN4 = P2^7;

#define Left_moto_pwm1 P1_6	 //PWM信号端1

#define Right_moto_pwm1 P1_7	 //PWM信号端1
	
#define Left_moto_pwm2 P2_6	 //PWM信号端2
	
#define Right_moto_pwm1 P2_7	 //PWM信号端2

sbit是C51扩展的变量类型,是定义特殊功能寄存器的位变量。这里我们将IN1~IN4所接到单片机上的位置写在变量名之后。

PWM信号端是用来给电机调速的,这个要和ENA、ENB的引脚一致,也就是代码上EN1和EN2后面的PXX要与PWM的PXX一致。

注意:1)如果ENA和ENB的跳线帽没有拔掉,那么代码中EN1和EN2两行,以及PWM可以省略!

           2)等于号后面的数字一定要和自己接线处相等,这个可以根据个人情况进行调整。

2.小车运动状态定义

#define Left_moto_go      {P1_2=1,P1_3=0,P2_2=1,P2_3=0;}	//左电机向前走
#define Left_moto_back    {P1_2=0,P1_3=1,P2_2=0,P2_3=1;}	//左边电机向后转
#define Left_moto_Stop    {P1_2=0,P1_3=0,P2_2=0,P2_3=0;}    //左边电机停转                     
#define Right_moto_go     {P1_4=1,P1_5=0,P2_4=1,P2_5=0;}	//右边电机向前走
#define Right_moto_back   {P1_4=0,P1_5=1,P2_4=0,P2_5=1;}	//右边电机向后走
#define Right_moto_Stop   {P1_4=0,P1_5=0,P2_4=0,P2_5=0;}    //右边电机停转

这里,我们用C语言的宏定义来定义电机的运动状态。由于上一部分我们已经定义了L298N上的输入控制端,所以在这里我们只需将对应的引脚置高低电平,即可控制电机的正反转和停止。

二、小车运动函数

//前进函数
void  run(void)
{
	 Left_moto_go;   //左电机往前走
	 Right_moto_go;  //右电机往前走
}

//后退函数 
void  backrun(void)
{
	 Left_moto_back;   //左电机往后走
	 Right_moto_back;  //右电机往后走
}
 
//左转
void  leftrun(void)
{	 
	 Right_moto_go;  //右电机往前走
     Left_moto_back;  //左电机后走
}

//右转
void  rightrun(void)
{ 
     Left_moto_go;   //左电机往前走
	 Right_moto_back;  //右电机往后走	
}

//停止
void  stop(void)
{	 
	 Right_moto_Stop;  //右电机停止
     Left_moto_Stop;  //左电机停止
}

 这里没什么好说的,就是定义了四个小车的运动函数。

三、红外循迹模块

1、引脚定义

#define middle_led P3_6	 //中间传感器    
   
#define Left_led P2_0   //左传感器
	
#define Right_led P2_1   //右传感器

由于我的车使用的是三路循迹,所以这里只定义了三个,可以根据自己的情况加或者减。

在上一节中我们有介绍,红外扫到黑线亮一个灯,输出1;扫到白线亮两个灯,输出0。根据这个编写下面的代码。

2、循迹模块

while(1)	//无限循环
{ 
	 
    //扫到黑线是1不亮,白线是0亮
    if(middle_led==1)
	{
		run();   //调用前进函数
	}
		
	else
	{			  
		if(Left_led==1&&Right_led==0)    //左边检测到黑线
		{
			leftrun();		  //调用小车左转  函数
		}
			   
		if(Left_led==0&&Right_led==1)		//右边检测到黑线
		{	  
			rightrun();					  //调用小车右转	函数
		}

		if(Left_led==1&&Right_led==1)   //终点停止
		{    
				stop();
		}
	}
}

这里我们先将所有红外判断写进一个无线循环里,使红外一直保持运行状态。

第一个if的意思是让小车能避开干扰,只有当中间的红外扫不到黑线时再执行左右转函数,避免被交叉的黑线干扰。

如果中间的红外扫到白线时,判断左右两个红外的状态。如果左边是1即扫到黑线,则调用左转函数;如果右边是1,则调用右转函数;如果两边都扫到黑线,则是到达终点线,调用停止函数。

注意:这样写代码要求中间的红外要比左右两个红外靠前,否则在到达终点时无法停车。可以根据自己的需要进行适当更改。

这就是一个红外循迹小车的全部内容。

最后附一个成品图
  • 18
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

风痕天际

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

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

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

打赏作者

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

抵扣说明:

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

余额充值