当前位置:   article > 正文

基于51单片机的循迹小车_灰度循迹代码

灰度循迹代码

材料的选择:

使用材料:stc89c52rc单片机一个

普中的板子就行
普中板子就行

 L298N电机驱动模块

四路循迹模块

 

 车架电机轮子:

杜邦线若干,电池,开关按钮:

 

 

 小车接线图:

 

 

 

 循迹模块连接单片机电源,可以将单片机5v和GND引到面包板上。

搭建好的整体结构:

 代码部分:

  1. #include<reg52.h>
  2. #include "Delay.h"
  3. #include "Timer0.h"
  4. typedef unsigned int uint;
  5. typedef unsigned char uchar;
  6. uchar left,right; //左右占空比标志,取1-100
  7. uchar i=0,j=0; //调速计时间
  8. uchar flag; //用于循迹方向的判断
  9. sbit IN1=P2^4; //右电机 //使IN1~IN4端通过杜邦线接到不同的P口,这里我接的是P2
  10. sbit IN2=P2^5; //其中IN1、IN2控制电机M1;IN3、IN4控制电机M2
  11. sbit IN3=P2^6;//左电机
  12. sbit IN4=P2^7;
  13. sbit ENA = P2^1; //用于pwm调速
  14. sbit ENB = P2^0;
  15. sbit sw1=P3^ 7;//四个灰度传感器,分别对应四个位置
  16. sbit sw2=P3^ 6;
  17. sbit sw3=P3^5;
  18. sbit sw4=P3^4;
  19. //小车直行速度赋值
  20. void forward_move()
  21. {
  22. left=17;//PWM调速,值越大,电机速度越快
  23. right=17;
  24. IN1=1; //两个电机均正转
  25. IN2=0;
  26. IN3=1;
  27. IN4=0;
  28. }
  29. //小车停止
  30. void stop()
  31. {
  32. left=0;
  33. right=0;
  34. IN1=0;
  35. IN2=0;
  36. IN3=0;
  37. IN4=0;
  38. }
  39. //小车左转速度赋值(用于左边传感器检测到黑线)
  40. void Left_turning()
  41. {
  42. left=28;
  43. right=30;
  44. IN1=1; //两个电机一个正转一个反转(或者一个正转一个不转)
  45. IN2=0;
  46. IN3=0;
  47. IN4=1;
  48. }
  49. //小车右转速度赋值(用于右边传感器检测到黑线)
  50. void Right_turning()
  51. {
  52. left=30;
  53. right=28;
  54. IN1=0; //两个电机一个正转一个反转(或者一个正转一个不转)
  55. IN2=1;
  56. IN3=1;
  57. IN4=0;
  58. }
  59. //循迹模块
  60. void xunji()
  61. {
  62. if((sw1==0)&&(sw3==0)&&(sw2==1)&&(sw4==1))
  63. {
  64. flag = 0;//直行
  65. }
  66. else if((sw1==0)&&(sw3==1)&&(sw2==1)&&(sw4==1))
  67. {
  68. flag = 1;//直行偏右,调节直行偏移
  69. }
  70. else if((sw1==1)&&(sw3==0)&&(sw2==1)&&(sw4==1))
  71. {
  72. flag = 2;//直行偏左
  73. }
  74. else if((sw3==0)&&(sw2==0)&&(sw4==1))
  75. {
  76. flag = 3;//左转
  77. }
  78. else if((sw3==1)&&(sw2==0)&&(sw4==1))
  79. {
  80. flag = 4;//左转2
  81. }
  82. else if((sw1==0)&&(sw3==0)&&(sw2==1)&&(sw4==0))
  83. {
  84. flag = 5;//右转
  85. }
  86. else if((sw1==1)&&(sw3==0)&&(sw2==1)&&(sw4==0))
  87. {
  88. flag = 6;//右转2
  89. }
  90. else if((sw1==1)&&(sw3==1)&&(sw2==1)&&(sw4==1))
  91. {
  92. flag = 7;//直行
  93. }
  94. else if((sw1==1)&&(sw3==1)&&(sw2==1)&&(sw4==0))
  95. {
  96. flag = 8;//右转3
  97. }
  98. else if((sw1==1)&&(sw3==1)&&(sw2==0)&&(sw4==1))
  99. {
  100. flag = 9;//左转3
  101. }
  102. else
  103. {
  104. flag = 10;
  105. }
  106. switch(flag)
  107. {
  108. case 0: forward_move();break;
  109. case 1: Left_turning();break;
  110. case 2: Right_turning();break;
  111. case 3: Left_turning();break;
  112. case 4: Left_turning();break;
  113. case 5: Right_turning();break;
  114. case 6: Right_turning();break;
  115. case 7: forward_move();break;
  116. case 8: Right_turning();break;
  117. case 9: Left_turning();break;
  118. case 10: forward_move();break;
  119. default: forward_move();break;
  120. }
  121. }
  122. void main()
  123. {
  124. Timer0_Init();
  125. while(1)
  126. {
  127. xunji();
  128. }
  129. }
  130. void Timer0_Rountine() interrupt 1 //定时器0中断,用于pwm调速
  131. {
  132. TL0 = 0xA4; //设置定时初值
  133. TH0 = 0xFF; //设置定时初值
  134. i++;
  135. j++;
  136. if(i<=left)//设置左轮占空比,即左轮速度
  137. ENA=1;
  138. else
  139. ENA=0;
  140. if(j<=right)
  141. ENB=1;
  142. else
  143. ENB=0;
  144. if(i==100) //设置pwm周期=0.1ms*100=10ms,这样开头定义的变量正好表示占空比数值
  145. {
  146. i=0;//加到100后变为0,重新计数
  147. }
  148. if(j==100)
  149. {
  150. j=0;
  151. }
  152. }

打开百度网盘,直接下载项目工程文件 链接:https://pan.baidu.com/s/1q7UVJ5SifeuI4uncI4bNrQ 
提取码:tzmj

效果演示:

51循迹小车

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/500026
推荐阅读
相关标签
  

闽ICP备14008679号