• 51单片机循迹小车原理介绍和代码示例


     目录

    循迹小车 

    1. 循迹模块使用

    2. 循迹小车原理

    3. 循迹小车开发和调试代码


    循迹小车 

    1. 循迹模块使用
    • TCRT5000传感器的红外发射二极管不断发射红外线
    • 当发射出的红外线没有被反射回来或被反射回来但强度不够大时
    • 红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态
    • 被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和
    • 此时模块的输出端为低电平,指示二极管被点亮
    • 总结就是一句话,没反射回来,D0输出高电平,灭灯

    接线方式

    • VCC:接电源正极(3-5V)
    • GND:接电源负极 DO:TTL开关信号输出0、1
    • AO:模拟信号输出(不同距离输出不同的电压,此脚一般可以不接)
    2. 循迹小车原理

    由于黑色具有较强的吸收能力,当循迹模块发射的红外线照射到黑线时,红外线将会被黑线吸收,导致 循迹模块上光敏三极管处于关闭状态,此时模块上一个LED熄灭。在没有检测到黑线时,模块上两个LED常亮

    总结就是一句话,有感应到黑线,D0输出高电平 ,灭灯

    3. 循迹小车开发和调试代码
    1. //main.c
    2. #include "motor.h"
    3. #include "delay.h"
    4. #include "uart.h"
    5. #include "time.h"
    6. #include "reg52.h"
    7. extern char speedLeft;
    8. extern char speedRight;
    9. sbit leftSensor = P2^7;
    10. sbit rightSensor = P2^6;
    11. void main()
    12. {
    13. Time0Init();
    14. Time1Init();
    15. //UartInit();
    16. while(1){
    17. if(leftSensor == 0 && rightSensor == 0){
    18. speedLeft = 32;
    19. speedRight = 40;
    20. }
    21. if(leftSensor == 1 && rightSensor == 0){
    22. speedLeft = 12;//10份单位时间全速运行,30份停止,所以慢,20ms是40份的500us
    23. speedRight = 40;
    24. }
    25. if(leftSensor == 0 && rightSensor == 1){
    26. speedLeft = 32;
    27. speedRight = 20;
    28. }
    29. if(leftSensor == 1 && rightSensor == 1){
    30. //停
    31. speedLeft = 0;
    32. speedRight = 0;
    33. }
    34. }
    35. }
    36. //motor.c
    37. #include "reg52.h"
    38. sbit RightCon1A = P3^2;
    39. sbit RightCon1B = P3^3;
    40. sbit LeftCon1A = P3^4;
    41. sbit LeftCon1B = P3^5;
    42. void goForwardLeft()
    43. {
    44. LeftCon1A = 0;
    45. LeftCon1B = 1;
    46. }
    47. void stopLeft()
    48. {
    49. LeftCon1A = 0;
    50. LeftCon1B = 0;
    51. }
    52. void goForwardRight()
    53. {
    54. RightCon1A = 0;
    55. RightCon1B = 1;
    56. }
    57. void stopRight()
    58. {
    59. RightCon1A = 0;
    60. RightCon1B = 0;
    61. }
    62. void goForward()
    63. {
    64. LeftCon1A = 0;
    65. LeftCon1B = 1;
    66. RightCon1A = 0;
    67. RightCon1B = 1;
    68. }
    69. void goRight()
    70. {
    71. LeftCon1A = 0;
    72. LeftCon1B = 1;
    73. RightCon1A = 0;
    74. RightCon1B = 0;
    75. }
    76. void goLeft()
    77. {
    78. LeftCon1A = 0;
    79. LeftCon1B = 0;
    80. RightCon1A = 0;
    81. RightCon1B = 1;
    82. }
    83. void goBack()
    84. {
    85. LeftCon1A = 1;
    86. LeftCon1B = 0;
    87. RightCon1A = 1;
    88. RightCon1B = 0;
    89. }
    90. void stop()
    91. {
    92. LeftCon1A = 0;
    93. LeftCon1B = 0;
    94. RightCon1A = 0;
    95. RightCon1B = 0;
    96. }
    97. //delay.c
    98. #include "intrins.h"
    99. void Delay1000ms() //@11.0592MHz
    100. {
    101. unsigned char i, j, k;
    102. _nop_();
    103. i = 8;
    104. j = 1;
    105. k = 243;
    106. do
    107. {
    108. do
    109. {
    110. while (--k);
    111. } while (--j);
    112. } while (--i);
    113. }
    114. //time.c
    115. #include "motor.h"
    116. #include "reg52.h"
    117. char speedLeft;
    118. char cntLeft = 0;
    119. char speedRight;
    120. char cntRight = 0;
    121. void Time1Init()
    122. {
    123. //1. 配置定时器1工作模式位16位计时
    124. TMOD &= 0x0F;
    125. TMOD |= 0x1 << 4;
    126. //2. 给初值,定一个0.5出来
    127. TL1=0x33;
    128. TH1=0xFE;
    129. //3. 开始计时
    130. TR1 = 1;
    131. TF1 = 0;
    132. //4. 打开定时器1中断
    133. ET1 = 1;
    134. //5. 打开总中断EA
    135. EA = 1;
    136. }
    137. void Time0Init()
    138. {
    139. //1. 配置定时器0工作模式位16位计时
    140. TMOD = 0x01;
    141. //2. 给初值,定一个0.5出来
    142. TL0=0x33;
    143. TH0=0xFE;
    144. //3. 开始计时
    145. TR0 = 1;
    146. TF0 = 0;
    147. //4. 打开定时器0中断
    148. ET0 = 1;
    149. //5. 打开总中断EA
    150. EA = 1;
    151. }
    152. void Time1Handler() interrupt 3
    153. {
    154. cntRight++; //统计爆表的次数. cnt=1的时候,报表了1
    155. //重新给初值
    156. TL1=0x33;
    157. TH1=0xFE;
    158. //控制PWM波
    159. if(cntRight < speedRight){
    160. //右前进
    161. goForwardRight();
    162. }else{
    163. //停止
    164. stopRight();
    165. }
    166. if(cntRight == 40){//爆表40次,经过了20ms
    167. cntRight = 0; //当100次表示1s,重新让cnt从0开始,计算下一次的1s
    168. }
    169. }
    170. void Time0Handler() interrupt 1
    171. {
    172. cntLeft++; //统计爆表的次数. cnt=1的时候,报表了1
    173. //重新给初值
    174. TL0=0x33;
    175. TH0=0xFE;
    176. //控制PWM波
    177. if(cntLeft < speedLeft){
    178. //左前进
    179. goForwardLeft();
    180. }else{
    181. //停止
    182. stopLeft();
    183. }
    184. if(cntLeft == 40){//爆表40次,经过了20ms
    185. cntLeft = 0; //当100次表示1s,重新让cnt从0开始,计算下一次的1s
    186. }
    187. }

  • 相关阅读:
    学习java的第二十天。。。(多态)
    PostgreSQL的约束
    多线程拷贝文件
    EntityManagerFactory和EntityManager的一个用法探究
    09 C++设计模式之装饰(Decorator)模式
    HTML5+CSS3+JavaScript 实现按键令小女孩移动,改变动画效果
    清洁机器人--沿边测距传感器 sharp psd红外传感器的FOV角度分析
    【JUC源码专题】AQS 源码分析(JDK8)
    FAST-LIO2代码解析(四)
    基于QT的指挥猫猫打架玩耍的小游戏设计
  • 原文地址:https://blog.csdn.net/m0_74712453/article/details/132717022