赞
踩
友情链接:
目录
- //定义小车驱动模块输入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)等于号后面的数字一定要和自己接线处相等,这个可以根据个人情况进行调整。
- #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; //左电机停止
- }
这里没什么好说的,就是定义了四个小车的运动函数。
- #define middle_led P3_6 //中间传感器
-
- #define Left_led P2_0 //左传感器
-
- #define Right_led P2_1 //右传感器
由于我的车使用的是三路循迹,所以这里只定义了三个,可以根据自己的情况加或者减。
在上一节中我们有介绍,红外扫到黑线亮一个灯,输出1;扫到白线亮两个灯,输出0。根据这个编写下面的代码。
- while(1) //无限循环
- {
-
- //扫到黑线是1不亮,白线是0亮
- if(middle_led==1)
- {
- run(); //调用前进函数
- P3_4 = 1;
- P3_5 = 1;
- }
-
- 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,则调用右转函数;如果两边都扫到黑线,则是到达终点线,调用停止函数。
注意:这样写代码要求中间的红外要比左右两个红外靠前,否则在到达终点时无法停车。可以根据自己的需要进行适当更改。
这就是一个红外循迹小车的全部内容。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。