友情链接:
目录
一、引脚及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,则调用右转函数;如果两边都扫到黑线,则是到达终点线,调用停止函数。
注意:这样写代码要求中间的红外要比左右两个红外靠前,否则在到达终点时无法停车。可以根据自己的需要进行适当更改。
这就是一个红外循迹小车的全部内容。
![](https://img-blog.csdnimg.cn/8c71f71255a34da6b12596e7fa098c36.png)