当前位置:   article > 正文

51红外循迹小车3——代码部分_51单片机红外循迹小车代码

51单片机红外循迹小车代码

友情链接:

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口定义

  1. //定义小车驱动模块输入IO口
  2. //第一个L298N
  3. sbit L298N_IN1 = P1^2;
  4. sbit L298N_IN2 = P1^3;
  5. sbit L298N_IN3 = P1^4;
  6. sbit L298N_IN4 = P1^5;
  7. sbit L298N_EN1 = P1^6;
  8. sbit L298N_EN2 = P1^7;
  9. //第二个L298N
  10. sbit L298N_IN5 = P2^2;
  11. sbit L298N_IN6 = P2^3;
  12. sbit L298N_IN7 = P2^4;
  13. sbit L298N_IN8 = P2^5;
  14. sbit L298N_EN3 = P2^6;
  15. sbit L298N_EN4 = P2^7;
  16. #define Left_moto_pwm1 P1_6 //PWM信号端1
  17. #define Right_moto_pwm1 P1_7 //PWM信号端1
  18. #define Left_moto_pwm2 P2_6 //PWM信号端2
  19. #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.小车运动状态定义

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

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

二、小车运动函数

  1. //前进函数
  2. void run(void)
  3. {
  4. Left_moto_go; //左电机往前走
  5. Right_moto_go; //右电机往前走
  6. }
  7. //后退函数
  8. void backrun(void)
  9. {
  10. Left_moto_back; //左电机往后走
  11. Right_moto_back; //右电机往后走
  12. }
  13. //左转
  14. void leftrun(void)
  15. {
  16. Right_moto_go; //右电机往前走
  17. Left_moto_back; //左电机后走
  18. }
  19. //右转
  20. void rightrun(void)
  21. {
  22. Left_moto_go; //左电机往前走
  23. Right_moto_back; //右电机往后走
  24. }
  25. //停止
  26. void stop(void)
  27. {
  28. Right_moto_Stop; //右电机停止
  29. Left_moto_Stop; //左电机停止
  30. }

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

三、红外循迹模块

1、引脚定义

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

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

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

2、循迹模块

  1. while(1) //无限循环
  2. {
  3. //扫到黑线是1不亮,白线是0亮
  4. if(middle_led==1)
  5. {
  6. run(); //调用前进函数
  7. P3_4 = 1;
  8. P3_5 = 1;
  9. }
  10. else
  11. {
  12. if(Left_led==1&&Right_led==0) //左边检测到黑线
  13. {
  14. leftrun(); //调用小车左转 函数
  15. }
  16. if(Left_led==0&&Right_led==1) //右边检测到黑线
  17. {
  18. rightrun(); //调用小车右转 函数
  19. }
  20. if(Left_led==1&&Right_led==1) //终点停止
  21. {
  22. stop();
  23. }
  24. }
  25. }

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

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

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

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

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

最后附一个成品图
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/470742
推荐阅读
相关标签
  

闽ICP备14008679号