当前位置:   article > 正文

基于STM32F103的红外循迹 超声波避障小车_超声波避障小车代码

超声波避障小车代码

单片机:stm32f103

传感器:普通红外(我用了4个)

超声波:HC-SR04

舵机:SG90

目标:可以循黑线(十字直行)、并避障

如果硬件配置和我一样以下代码可直接使用,用我配置的引脚即可。

亲测好用。

复制代码的同时请点个赞,多谢!

一、超声波代码

.c

  1. #include "Ultrasonic.h"
  2. #include "stm32f10x.h"
  3. #include "delay.h"
  4. #include "usart.h"
  5. /*记录定时器溢出次数*/
  6. uint overcount=0;
  7. /*设置中断优先级*/
  8. void NVIC_Config(void)
  9. {
  10. NVIC_InitTypeDef NVIC_InitStructure;//定义中断初始化结构体
  11. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择中断分组
  12. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//设置 抢占优先级
  13. NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//设置子优先级
  14. NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//设置子优先级
  15. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  16. NVIC_Init(&NVIC_InitStructure);//中断初始化
  17. }
  18. /*初始化模块的GPIO以及初始化定时器TIM2*/
  19. void Ultrasonic_Init(void)
  20. {
  21. GPIO_InitTypeDef GPIO_InitStructure;//中断初始化
  22. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定义定时器初始化结构体
  23. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);//开GPIO 外设时钟
  24. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开Timer外设时钟
  25. /*TRIG触发信号*/
  26. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置输出口速率
  27. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//配置输出模式为推挽
  28. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;//设置为引脚PA.4
  29. GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA.4
  30. /*ECOH回响信号*/
  31. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//配置输入模式
  32. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//设置引脚号PA.3
  33. GPIO_Init(GPIOA, & GPIO_InitStructure);//初始化PA.3
  34. /*定时器TIM2初始化*/
  35. TIM_DeInit(TIM2);
  36. TIM_TimeBaseInitStructure.TIM_Period=999;//定时周期为1000
  37. TIM_TimeBaseInitStructure.TIM_Prescaler=71; //分频系数72
  38. TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
  39. TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计 数器向上计数模式
  40. TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//初始化Timer2
  41. TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启更新中断
  42. NVIC_Config();//初始化中断分组配置
  43. TIM_Cmd(TIM2,DISABLE);//关闭定时器使能
  44. }
  45. float Senor_Using(void)
  46. {
  47. float length=0,sum=0;
  48. u16 tim;
  49. uint i=0;
  50. /*测5次数据计算一次平均值*/
  51. while(i!=3)
  52. {
  53. PAout(4)=1; //拉高信号,作为触发信号
  54. delay_us(20); //高电平信号超过10us
  55. PAout(4)=0;
  56. /*等待回响信号*/
  57. while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==RESET);
  58. TIM_Cmd(TIM2,ENABLE);//回响信号到来,开启定时器计数
  59. i+=1; //每收到一次回响信号+1,收到5次就计算均值
  60. while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==SET);//回响信号消失
  61. TIM_Cmd(TIM2,DISABLE);//关闭定时器
  62. tim=TIM_GetCounter(TIM2);//获取计TIM2数寄存器中的计数值,一边计算回响信号时间
  63. length=(tim+overcount*1000)/58.0;//通过回响信号计算距离
  64. sum=length+sum;
  65. TIM2->CNT=0; //将TIM2计数寄存器的计数值清零
  66. overcount=0; //中断溢出次数清零
  67. delay_ms(10);
  68. }
  69. length=sum/3;
  70. return length;//距离作为函数返回值
  71. }
  72. void TIM2_IRQHandler(void) //中断,当回响信号很长是,计数值溢出后重复计数,用中断来保存溢出次数
  73. {
  74. if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
  75. {
  76. TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志
  77. overcount++;
  78. }
  79. }

.h

  1. #ifndef __Ultrasonic_H
  2. #define __Ultrasonic_H
  3. #include "stm32f10x.h"
  4. #include "delay.h"
  5. #include "sys.h"
  6. #define uint unsigned int
  7. #define TRIG_Send PAout(4)//定义触发信号TRIG引脚
  8. #define ECHO_Receive PAin(3) //定义回响信号ECHO引脚
  9. void Ultrasonic_Init(void); //超声波模块相关配置初始化
  10. float Senor_Using(void); //测距函数,返回值即为距离
  11. void NVIC_Config(void); //中断配置
  12. #endif

二、舵机控制

.c

  1. #include "SteeringMotor.h"
  2. #include "delay.h"
  3. //初始化PA2引脚
  4. void Steer_pwm_init(void)
  5. {
  6. GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO
  7. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器
  8. TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  9. /* 开启时钟 */
  10. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  11. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  12. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  13. /* 配置GPIO的模式和IO口 */
  14. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;// PB0
  15. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  16. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
  17. GPIO_Init(GPIOB,&GPIO_InitStructure);
  18. /*TIM2定时器初始化*/
  19. TIM_TimeBaseInitStructure.TIM_Period = 199; //PWM 频率=72000/(199+1)=36Khz//设置自动重装载寄存器周期的值
  20. TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//设置用来作为TIMx时钟频率预分频值
  21. TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS= Tck_tim
  22. TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  23. //TIM向上计数模式
  24. TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure);
  25. /*PWM初始化*/ //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  26. TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
  27. TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能
  28. TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
  29. TIM_OC3Init(TIM3,&TIM_OCInitStructure);//Timer2 CH3
  30. //注意此处初始化时TIM_OC1Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。
  31. TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR3上的预装载寄存器
  32. TIM_Cmd(TIM3,ENABLE);//使能或者失能TIMx外设
  33. }
  34. int steeringmotor(void)
  35. {
  36. delay_init();
  37. // TIM2_PWM_Init(199,7199);//初始化PWM的周期
  38. // while(1)
  39. // {
  40. // delay_ms(10);
  41. // TIM_SetCompare3(TIM3,5);//设定占空比,舵机角度为0°中
  42. // delay_ms(1000);
  43. // TIM_SetCompare3(TIM3,15);//设定占空比,舵机角度为90°右
  44. // delay_ms(1000);
  45. // TIM_SetCompare3(TIM3,25); //设定占空比,舵机角度为180°左
  46. // }
  47. }

.h

  1. #ifndef __SteeringMotor_H
  2. #define __SteeringMotor_H
  3. #include "sys.h"
  4. #include "stm32f10x.h"
  5. void Steer_pwm_init(void); //舵机pwm初始化
  6. #define Steer_Right_90 TIM_SetCompare3(TIM3, 9) //右转90度
  7. #define Steer_Right_45 TIM_SetCompare3(TIM3, 7) //右转45度
  8. #define Steer_Front TIM_SetCompare3(TIM3, 17) //舵机摆正
  9. #define Steer_Left_45 TIM_SetCompare3(TIM3, 23) //左转45度
  10. #define Steer_Left_90 TIM_SetCompare3(TIM3, 26 ) //左转90度
  11. #endif

三、红外循迹代码

.c

  1. #include "sensor.h"
  2. void xunji_config(void)
  3. {
  4. GPIO_InitTypeDef GPIO_InitStructure;
  5. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); // 使能PC端口时钟
  6. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE); // 使能PC端口时钟
  7. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //选择对应的引脚
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置GPIO模式,输入上拉
  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10. GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB端口
  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置GPIO模式,输入上拉
  13. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14. GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PC端口
  15. }
  16. void Read_xunji_Date(void)
  17. {
  18. xunji_1;
  19. xunji_2;
  20. xunji_3;
  21. xunji_4;
  22. xunji_5;
  23. }

.h

  1. #ifndef __sensor_H
  2. #define __sensor_H
  3. #include "stm32f10x.h"
  4. #define xunji_1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)
  5. #define xunji_2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)
  6. #define xunji_3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)
  7. #define xunji_4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)
  8. #define xunji_5 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)
  9. void xunji_config(void);
  10. void Read_xunji_Date(void); //读循迹模块返回的值
  11. #endif

四、PWM控制小黄电机

.c

  1. #include "motor.h"//1右前 2右后 3左前 4左后
  2. #include "delay.h"
  3. void CarGo(void)
  4. {
  5. TIM_SetCompare1(TIM4 , 975); //数值越大速度越慢
  6. TIM_SetCompare2(TIM4 , 1199);//后
  7. TIM_SetCompare3(TIM4 , 975);
  8. TIM_SetCompare4(TIM4 , 1199); //后
  9. }
  10. void CarGo2(void)
  11. {
  12. TIM_SetCompare1(TIM4 , 920); //数值越大速度越慢
  13. TIM_SetCompare2(TIM4 , 1199);//后
  14. TIM_SetCompare3(TIM4 , 920);
  15. TIM_SetCompare4(TIM4 , 1199); //后
  16. }
  17. void CarStop(void)
  18. {
  19. TIM_SetCompare1(TIM4 , 1199);
  20. TIM_SetCompare2(TIM4 , 1199);
  21. TIM_SetCompare3(TIM4 , 1199);
  22. TIM_SetCompare4(TIM4 , 1199);
  23. }
  24. void CarBack(void)
  25. {
  26. TIM_SetCompare1(TIM4 , 1199);
  27. TIM_SetCompare2(TIM4 , 900);
  28. TIM_SetCompare3(TIM4 , 1199);
  29. TIM_SetCompare4(TIM4 , 900);
  30. }
  31. void CarRight(void)
  32. {
  33. TIM_SetCompare1(TIM4 , 900);
  34. TIM_SetCompare2(TIM4 , 1199);//右后
  35. TIM_SetCompare3(TIM4 , 790);//前左
  36. TIM_SetCompare4(TIM4 , 1199);//后
  37. }
  38. void CarBigRight(void)
  39. {
  40. TIM_SetCompare1(TIM4 , 1199);
  41. TIM_SetCompare2(TIM4 , 975);//450
  42. TIM_SetCompare3(TIM4 , 740);
  43. TIM_SetCompare4(TIM4 , 1199);
  44. }
  45. void CarBigRight2(void)
  46. {
  47. TIM_SetCompare1(TIM4 , 1199);
  48. TIM_SetCompare2(TIM4 , 850);//450
  49. TIM_SetCompare3(TIM4 , 740);
  50. TIM_SetCompare4(TIM4 , 1199);
  51. }
  52. void CaryuandiRight(void)
  53. {
  54. TIM_SetCompare1(TIM4 , 1199);
  55. TIM_SetCompare2(TIM4 , 1199);
  56. TIM_SetCompare3(TIM4 , 450);
  57. TIM_SetCompare4(TIM4 , 1199);
  58. }
  59. void CarLeft(void)
  60. {
  61. TIM_SetCompare1(TIM4 , 790);//右前
  62. TIM_SetCompare2(TIM4 , 1199);
  63. TIM_SetCompare3(TIM4 , 900);
  64. TIM_SetCompare4(TIM4 , 1199);//左 后
  65. }
  66. void CarBigLeft(void)
  67. {
  68. TIM_SetCompare1(TIM4 , 715);
  69. TIM_SetCompare2(TIM4 , 1199);
  70. TIM_SetCompare3(TIM4 , 1199);
  71. TIM_SetCompare4(TIM4 , 890);
  72. }
  73. void CarBigLeft2(void)
  74. {
  75. TIM_SetCompare1(TIM4 , 590);
  76. TIM_SetCompare2(TIM4 , 1199);
  77. TIM_SetCompare3(TIM4 , 1199);
  78. TIM_SetCompare4(TIM4 , 620);
  79. }
  80. void CarSpecialGo(void)
  81. {
  82. TIM_SetCompare1(TIM4 , 900); //数值越大速度越慢
  83. TIM_SetCompare2(TIM4 , 1199);//后
  84. TIM_SetCompare3(TIM4 , 1000);
  85. TIM_SetCompare4(TIM4 , 1199); //后
  86. }
  87. void CarSpecialPlusGo(void)
  88. {
  89. TIM_SetCompare1(TIM4 , 880); //数值越大速度越慢
  90. TIM_SetCompare2(TIM4 , 1199);//后
  91. TIM_SetCompare3(TIM4 , 1000);
  92. TIM_SetCompare4(TIM4 , 1199); //后
  93. }
  94. void CarSpecialLeft(void)
  95. {
  96. TIM_SetCompare1(TIM4 , 700);//右前
  97. TIM_SetCompare2(TIM4 , 1199);//右后
  98. TIM_SetCompare3(TIM4 , 1199);//左前
  99. TIM_SetCompare4(TIM4 , 900);//左后
  100. }
  101. void CarSpecialRight(void)
  102. {
  103. TIM_SetCompare1(TIM4 , 1199);//右前
  104. TIM_SetCompare2(TIM4 , 900);//右后
  105. TIM_SetCompare3(TIM4 , 750);//左前
  106. TIM_SetCompare4(TIM4 , 1199);//左后
  107. }
  108. void TIM4_PWM_Init(void) //TIM4的pwm设置和相应的引脚设置
  109. {
  110. GPIO_InitTypeDef GPIO_InitStructure;
  111. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  112. TIM_OCInitTypeDef TIM_OCInitStructure;
  113. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE);
  114. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  115. TIM_TimeBaseStructure.TIM_Period = 1199;
  116. TIM_TimeBaseStructure.TIM_Prescaler = 1999;
  117. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  118. TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  119. TIM_TimeBaseInit(TIM4 , &TIM_TimeBaseStructure);
  120. //端口复用
  121. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //初始化要用的B6/B7口
  122. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  123. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  124. GPIO_Init(GPIOB, &GPIO_InitStructure);
  125. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; //初始化要用的口
  126. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  127. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  128. GPIO_Init(GPIOB, &GPIO_InitStructure);
  129. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ; //PB.10端口配置
  130. GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.10
  131. GPIO_ResetBits(GPIOB,GPIO_Pin_10);
  132. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PB.11端口配置
  133. GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.11
  134. GPIO_ResetBits(GPIOB,GPIO_Pin_11);
  135. //PWM通道1
  136. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  137. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  138. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  139. TIM_OCInitStructure.TIM_Pulse = 0;
  140. TIM_OC1Init(TIM4 , &TIM_OCInitStructure);
  141. TIM_OC1PreloadConfig(TIM4 , TIM_OCPreload_Enable);
  142. //PWM通道2
  143. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  144. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  145. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  146. TIM_OCInitStructure.TIM_Pulse =0;
  147. TIM_OC2Init(TIM4 , &TIM_OCInitStructure);
  148. TIM_OC2PreloadConfig(TIM4 , TIM_OCPreload_Enable);
  149. //PWM通道3
  150. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  151. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  152. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  153. TIM_OCInitStructure.TIM_Pulse = 0;
  154. TIM_OC3Init(TIM4 , &TIM_OCInitStructure);
  155. TIM_OC3PreloadConfig(TIM4 , TIM_OCPreload_Enable);
  156. //PWM通道4
  157. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  158. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  159. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  160. TIM_OCInitStructure.TIM_Pulse = 0;
  161. TIM_OC4Init(TIM4 , &TIM_OCInitStructure);
  162. TIM_OC4PreloadConfig(TIM4 , TIM_OCPreload_Enable);
  163. TIM_Cmd(TIM4 , ENABLE);
  164. }

.h

  1. #ifndef __MOTER_H
  2. #define __MOTER_H
  3. #include "stm32f10x.h"
  4. #define ENA PBout(11)
  5. #define ENB PBout(10)
  6. void TIM4_PWM_Init(void);
  7. void CarGo(void);
  8. void CarGo2(void);
  9. void CarStop(void);
  10. void CarBack(void);
  11. void CarLeft(void);
  12. void CaryuandiRight(void);
  13. void CarBigLeft(void); //大左转
  14. void CarBigLeft2(void);
  15. void CarRight(void);
  16. void CarBigRight(void); //大右转
  17. void CarBigRight2(void);
  18. void CarSpecialLeft(void);
  19. void CarSpecialGo(void);
  20. void CarSpecialPlusGo(void);
  21. void CarSpecialRight(void);
  22. #endif

五、main函数

1、解释

我的主函数有些啰嗦,以前写的,懒得改了。

大意就是:

分为两部分

第一部分代码表示循迹的时候可以避障

第一部分代码表示仅仅循迹

逻辑部分仅供参考!建议按自己的逻辑改改!!

已知:仅仅在直行的时候遇到一次障碍物

所以:我的避障在直行判断里面

if(b==0)(此为第一部分代码。b是标志位,目的是只执行一次避障)

{

if(直行判断)

{

直行

if(距离<30)(请按照实际情况修改参数)

{

避障逻辑(请按照实际情况修改逻辑)

b++;

}

}

if(其他判断)

{左、右转弯等等

}

}

if(b==1)(此为第二部分代码。b是标志位,目的是只执行一次避障)

{

正常循迹判断

}

2、代码

  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "Ultrasonic.h"
  5. #include "motor.h"
  6. #include "sensor.h"
  7. #include "SteeringMotor.h"
  8. int main(void)
  9. {
  10. // float length_res[5]={0}; //用来存放测距结果
  11. int a=0,b=0,c=0,d=0;
  12. char str[20];//用来存放浮点数字符
  13. SystemInit(); // 配置系统时钟为72M
  14. delay_init(); //延时初始化
  15. xunji_config(); //循迹初始化
  16. Ultrasonic_Init();
  17. TIM4_PWM_Init();
  18. Steer_pwm_init();
  19. while(1)
  20. {
  21. Read_xunji_Date(); //读循迹线值
  22. //车前4个循迹模块从右到左分别是xunji_4,xunji_3,xunji_2,xunji_1
  23. //xunji_x=1白亮 x 2 3 x
  24. if(b==0)
  25. {
  26. if(xunji_1==1&&xunji_2==0&&xunji_3==1&&xunji_4==1)//0100
  27. {
  28. CarRight(); //如果第二个读取到黑线,右转
  29. continue;
  30. }
  31. if(xunji_1==0&&xunji_2==1&&xunji_3==1&&xunji_4==1)//1000
  32. {
  33. CarBigRight(); //如果第一个读取到黑线,大右转
  34. continue;
  35. }
  36. if(xunji_1==1&&xunji_2==1&&xunji_3==0&&xunji_4==1)//0010
  37. {
  38. CarLeft();//如果第三个读取到黑线,左转
  39. continue;
  40. }
  41. if(xunji_1==1&&xunji_2==1&&xunji_3==1&&xunji_4==0)//0001
  42. {
  43. CarBigLeft(); //如果第四个读取到黑线,大左转
  44. continue;
  45. }
  46. if(xunji_1==1&&xunji_2==1&&xunji_3==1&&xunji_4==1)//0001
  47. {
  48. CarGo(); //如果都读取到白线,直走
  49. if(Senor_Using()<30.00)//大 不撞
  50. {
  51. a++;
  52. if(a==1)
  53. {
  54. Steer_Front;
  55. delay_ms(700);
  56. CarStop();
  57. delay_ms(700);
  58. Steer_Right_90 ;
  59. delay_ms(700);
  60. CarSpecialLeft();
  61. delay_ms(530);
  62. do
  63. {
  64. CarSpecialPlusGo();
  65. delay_ms(700);
  66. }while(Senor_Using()<50.00);
  67. CarStop();
  68. delay_ms(700);
  69. CarSpecialRight();
  70. delay_ms(670);
  71. do
  72. {
  73. CarSpecialPlusGo();
  74. delay_ms(1000);
  75. }while(Senor_Using()<50.00);
  76. CarStop();
  77. delay_ms(700);
  78. CarSpecialRight();
  79. delay_ms(650);
  80. do
  81. {
  82. CarSpecialGo();
  83. delay_ms(100);
  84. }while(xunji_1== 1&&xunji_2==1&&xunji_3==1&&xunji_4==1&&xunji_5==0);
  85. CarStop();
  86. delay_ms(1000);
  87. Steer_Front;
  88. delay_ms(700);
  89. CarSpecialLeft();
  90. delay_ms(500);
  91. b++;
  92. }
  93. }
  94. }
  95. if(xunji_1==0&&xunji_2==0&&xunji_3==1&&xunji_4==1)
  96. {
  97. CarBigRight(); //如果右侧都黑且左侧都白,大右
  98. continue;
  99. }
  100. if(xunji_3==0&&xunji_4==0&&xunji_1==1&&xunji_2==1)
  101. {
  102. CarBigLeft();//如果左侧都黑且右侧都白,大左
  103. continue;
  104. }
  105. if(xunji_3==0&&xunji_4==0&&xunji_1==1&&xunji_2==0)
  106. {
  107. CarBigLeft();//如果左侧都黑且右侧都白,大左
  108. continue;
  109. }
  110. if(xunji_1==0&&xunji_2==0&&xunji_3==0&&xunji_4==1)
  111. {
  112. CarBigRight(); //如果右侧都黑且左侧都白,大右
  113. continue;
  114. }
  115. if(xunji_1==0&&xunji_4==0&&xunji_3==1&&xunji_2==1)
  116. {
  117. CarGo();
  118. }
  119. if(xunji_1==1&&xunji_4==1&&xunji_3==0&&xunji_2==0)
  120. {
  121. CarGo();
  122. }
  123. }
  124. if(b==1)
  125. {
  126. if(xunji_1==1&&xunji_2==0&&xunji_3==1&&xunji_4==1)//0100
  127. {
  128. CarRight(); //如果第二个读取到黑线,右转
  129. continue;
  130. }
  131. if(xunji_1==0&&xunji_2==1&&xunji_3==1&&xunji_4==1)//1000
  132. {
  133. CarBigRight2(); //如果第一个读取到黑线,大右转
  134. delay_ms(10);
  135. }
  136. if(xunji_1==1&&xunji_2==1&&xunji_3==0&&xunji_4==1)//0010
  137. {
  138. CarLeft();//如果第三个读取到黑线,左转
  139. continue;
  140. }
  141. if(xunji_1==1&&xunji_2==1&&xunji_3==1&&xunji_4==0)//0001
  142. {
  143. CarBigLeft2(); //如果第四个读取到黑线,大左转
  144. delay_ms(10);
  145. }
  146. if(xunji_1==1&&xunji_2==1&&xunji_3==1&&xunji_4==1)//0001
  147. {
  148. CarGo2(); //如果都读取到白线,直走
  149. }
  150. if(xunji_1==0&&xunji_2==0&&xunji_3==1&&xunji_4==1)
  151. {
  152. CarBigRight2(); //如果右侧都黑且左侧都白,大右
  153. delay_ms(10);
  154. }
  155. if(xunji_3==0&&xunji_4==0&&xunji_1==1&&xunji_2==1)
  156. {
  157. CarBigLeft2();//如果左侧都黑且右侧都白,大左
  158. delay_ms(10);
  159. }
  160. if(xunji_3==0&&xunji_4==0&&xunji_1==1&&xunji_2==0)
  161. {
  162. CarBigLeft2();//如果左侧都黑且右侧都白,大左
  163. delay_ms(10);
  164. }
  165. if(xunji_1==0&&xunji_2==0&&xunji_3==0&&xunji_4==1)
  166. {
  167. CarBigRight2(); //如果右侧都黑且左侧都白,大右
  168. delay_ms(10);
  169. }
  170. if(xunji_1==0&&xunji_4==0&&xunji_3==1&&xunji_2==1)
  171. {
  172. CarGo2();
  173. }
  174. if(xunji_1==1&&xunji_4==1&&xunji_3==0&&xunji_2==0)
  175. {
  176. CarGo2();
  177. }
  178. }
  179. }
  180. }

.

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

闽ICP备14008679号