赞
踩
单片机:stm32f103
传感器:普通红外(我用了4个)
超声波:HC-SR04
舵机:SG90
目标:可以循黑线(十字直行)、并避障
如果硬件配置和我一样以下代码可直接使用,用我配置的引脚即可。
亲测好用。
复制代码的同时请点个赞,多谢!
.c
- #include "Ultrasonic.h"
- #include "stm32f10x.h"
- #include "delay.h"
- #include "usart.h"
- /*记录定时器溢出次数*/
- uint overcount=0;
-
- /*设置中断优先级*/
- void NVIC_Config(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;//定义中断初始化结构体
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择中断分组
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//设置 抢占优先级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//设置子优先级
- NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//设置子优先级
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Init(&NVIC_InitStructure);//中断初始化
- }
- /*初始化模块的GPIO以及初始化定时器TIM2*/
- void Ultrasonic_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;//中断初始化
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定义定时器初始化结构体
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);//开GPIO 外设时钟
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开Timer外设时钟
- /*TRIG触发信号*/
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置输出口速率
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//配置输出模式为推挽
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;//设置为引脚PA.4
- GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA.4
-
- /*ECOH回响信号*/
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//配置输入模式
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//设置引脚号PA.3
- GPIO_Init(GPIOA, & GPIO_InitStructure);//初始化PA.3
-
- /*定时器TIM2初始化*/
- TIM_DeInit(TIM2);
- TIM_TimeBaseInitStructure.TIM_Period=999;//定时周期为1000
- TIM_TimeBaseInitStructure.TIM_Prescaler=71; //分频系数72
- TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
- TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计 数器向上计数模式
- TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//初始化Timer2
- TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启更新中断
-
- NVIC_Config();//初始化中断分组配置
- TIM_Cmd(TIM2,DISABLE);//关闭定时器使能
-
- }
- float Senor_Using(void)
- {
- float length=0,sum=0;
- u16 tim;
- uint i=0;
- /*测5次数据计算一次平均值*/
- while(i!=3)
- {
- PAout(4)=1; //拉高信号,作为触发信号
- delay_us(20); //高电平信号超过10us
- PAout(4)=0;
- /*等待回响信号*/
- while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==RESET);
- TIM_Cmd(TIM2,ENABLE);//回响信号到来,开启定时器计数
-
- i+=1; //每收到一次回响信号+1,收到5次就计算均值
- while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==SET);//回响信号消失
- TIM_Cmd(TIM2,DISABLE);//关闭定时器
-
- tim=TIM_GetCounter(TIM2);//获取计TIM2数寄存器中的计数值,一边计算回响信号时间
-
- length=(tim+overcount*1000)/58.0;//通过回响信号计算距离
-
- sum=length+sum;
- TIM2->CNT=0; //将TIM2计数寄存器的计数值清零
- overcount=0; //中断溢出次数清零
- delay_ms(10);
- }
- length=sum/3;
- return length;//距离作为函数返回值
- }
- void TIM2_IRQHandler(void) //中断,当回响信号很长是,计数值溢出后重复计数,用中断来保存溢出次数
- {
- if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
- {
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志
- overcount++;
-
- }
- }

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

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

.h
- #ifndef __SteeringMotor_H
- #define __SteeringMotor_H
- #include "sys.h"
- #include "stm32f10x.h"
- void Steer_pwm_init(void); //舵机pwm初始化
- #define Steer_Right_90 TIM_SetCompare3(TIM3, 9) //右转90度
- #define Steer_Right_45 TIM_SetCompare3(TIM3, 7) //右转45度
- #define Steer_Front TIM_SetCompare3(TIM3, 17) //舵机摆正
- #define Steer_Left_45 TIM_SetCompare3(TIM3, 23) //左转45度
- #define Steer_Left_90 TIM_SetCompare3(TIM3, 26 ) //左转90度
- #endif
.c
- #include "sensor.h"
- void xunji_config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); // 使能PC端口时钟
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE); // 使能PC端口时钟
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //选择对应的引脚
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置GPIO模式,输入上拉
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB端口
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置GPIO模式,输入上拉
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PC端口
- }
- void Read_xunji_Date(void)
- {
- xunji_1;
- xunji_2;
- xunji_3;
- xunji_4;
- xunji_5;
- }

.h
- #ifndef __sensor_H
- #define __sensor_H
- #include "stm32f10x.h"
- #define xunji_1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)
- #define xunji_2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)
- #define xunji_3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)
- #define xunji_4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)
- #define xunji_5 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)
- void xunji_config(void);
- void Read_xunji_Date(void); //读循迹模块返回的值
- #endif
.c
- #include "motor.h"//1右前 2右后 3左前 4左后
- #include "delay.h"
- void CarGo(void)
- {
- TIM_SetCompare1(TIM4 , 975); //数值越大速度越慢
- TIM_SetCompare2(TIM4 , 1199);//后
- TIM_SetCompare3(TIM4 , 975);
- TIM_SetCompare4(TIM4 , 1199); //后
- }
- void CarGo2(void)
- {
- TIM_SetCompare1(TIM4 , 920); //数值越大速度越慢
- TIM_SetCompare2(TIM4 , 1199);//后
- TIM_SetCompare3(TIM4 , 920);
- TIM_SetCompare4(TIM4 , 1199); //后
- }
-
- void CarStop(void)
- {
- TIM_SetCompare1(TIM4 , 1199);
- TIM_SetCompare2(TIM4 , 1199);
- TIM_SetCompare3(TIM4 , 1199);
- TIM_SetCompare4(TIM4 , 1199);
- }
-
- void CarBack(void)
- {
- TIM_SetCompare1(TIM4 , 1199);
- TIM_SetCompare2(TIM4 , 900);
- TIM_SetCompare3(TIM4 , 1199);
- TIM_SetCompare4(TIM4 , 900);
- }
-
- void CarRight(void)
- {
- TIM_SetCompare1(TIM4 , 900);
- TIM_SetCompare2(TIM4 , 1199);//右后
- TIM_SetCompare3(TIM4 , 790);//前左
- TIM_SetCompare4(TIM4 , 1199);//后
- }
-
- void CarBigRight(void)
- {
- TIM_SetCompare1(TIM4 , 1199);
- TIM_SetCompare2(TIM4 , 975);//450
- TIM_SetCompare3(TIM4 , 740);
- TIM_SetCompare4(TIM4 , 1199);
- }
- void CarBigRight2(void)
- {
- TIM_SetCompare1(TIM4 , 1199);
- TIM_SetCompare2(TIM4 , 850);//450
- TIM_SetCompare3(TIM4 , 740);
- TIM_SetCompare4(TIM4 , 1199);
- }
- void CaryuandiRight(void)
- {
- TIM_SetCompare1(TIM4 , 1199);
- TIM_SetCompare2(TIM4 , 1199);
- TIM_SetCompare3(TIM4 , 450);
- TIM_SetCompare4(TIM4 , 1199);
- }
-
- void CarLeft(void)
- {
- TIM_SetCompare1(TIM4 , 790);//右前
- TIM_SetCompare2(TIM4 , 1199);
- TIM_SetCompare3(TIM4 , 900);
- TIM_SetCompare4(TIM4 , 1199);//左 后
- }
-
- void CarBigLeft(void)
- {
- TIM_SetCompare1(TIM4 , 715);
- TIM_SetCompare2(TIM4 , 1199);
- TIM_SetCompare3(TIM4 , 1199);
- TIM_SetCompare4(TIM4 , 890);
- }
- void CarBigLeft2(void)
- {
- TIM_SetCompare1(TIM4 , 590);
- TIM_SetCompare2(TIM4 , 1199);
- TIM_SetCompare3(TIM4 , 1199);
- TIM_SetCompare4(TIM4 , 620);
- }
- void CarSpecialGo(void)
- {
- TIM_SetCompare1(TIM4 , 900); //数值越大速度越慢
- TIM_SetCompare2(TIM4 , 1199);//后
- TIM_SetCompare3(TIM4 , 1000);
- TIM_SetCompare4(TIM4 , 1199); //后
- }
- void CarSpecialPlusGo(void)
- {
- TIM_SetCompare1(TIM4 , 880); //数值越大速度越慢
- TIM_SetCompare2(TIM4 , 1199);//后
- TIM_SetCompare3(TIM4 , 1000);
- TIM_SetCompare4(TIM4 , 1199); //后
- }
- void CarSpecialLeft(void)
- {
- TIM_SetCompare1(TIM4 , 700);//右前
- TIM_SetCompare2(TIM4 , 1199);//右后
- TIM_SetCompare3(TIM4 , 1199);//左前
- TIM_SetCompare4(TIM4 , 900);//左后
- }
- void CarSpecialRight(void)
- {
- TIM_SetCompare1(TIM4 , 1199);//右前
- TIM_SetCompare2(TIM4 , 900);//右后
- TIM_SetCompare3(TIM4 , 750);//左前
- TIM_SetCompare4(TIM4 , 1199);//左后
- }
-
- void TIM4_PWM_Init(void) //TIM4的pwm设置和相应的引脚设置
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE);
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
-
-
- TIM_TimeBaseStructure.TIM_Period = 1199;
- TIM_TimeBaseStructure.TIM_Prescaler = 1999;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseStructure.TIM_ClockDivision = 0;
- TIM_TimeBaseInit(TIM4 , &TIM_TimeBaseStructure);
-
- //端口复用
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //初始化要用的B6/B7口
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; //初始化要用的口
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ; //PB.10端口配置
- GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.10
- GPIO_ResetBits(GPIOB,GPIO_Pin_10);
-
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PB.11端口配置
- GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.11
- GPIO_ResetBits(GPIOB,GPIO_Pin_11);
-
-
- //PWM通道1
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- TIM_OCInitStructure.TIM_Pulse = 0;
- TIM_OC1Init(TIM4 , &TIM_OCInitStructure);
- TIM_OC1PreloadConfig(TIM4 , TIM_OCPreload_Enable);
-
- //PWM通道2
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- TIM_OCInitStructure.TIM_Pulse =0;
- TIM_OC2Init(TIM4 , &TIM_OCInitStructure);
- TIM_OC2PreloadConfig(TIM4 , TIM_OCPreload_Enable);
-
- //PWM通道3
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- TIM_OCInitStructure.TIM_Pulse = 0;
- TIM_OC3Init(TIM4 , &TIM_OCInitStructure);
- TIM_OC3PreloadConfig(TIM4 , TIM_OCPreload_Enable);
-
- //PWM通道4
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- TIM_OCInitStructure.TIM_Pulse = 0;
- TIM_OC4Init(TIM4 , &TIM_OCInitStructure);
- TIM_OC4PreloadConfig(TIM4 , TIM_OCPreload_Enable);
- TIM_Cmd(TIM4 , ENABLE);
- }

.h
- #ifndef __MOTER_H
- #define __MOTER_H
-
-
- #include "stm32f10x.h"
- #define ENA PBout(11)
- #define ENB PBout(10)
-
- void TIM4_PWM_Init(void);
- void CarGo(void);
- void CarGo2(void);
- void CarStop(void);
- void CarBack(void);
- void CarLeft(void);
- void CaryuandiRight(void);
- void CarBigLeft(void); //大左转
- void CarBigLeft2(void);
- void CarRight(void);
- void CarBigRight(void); //大右转
- void CarBigRight2(void);
- void CarSpecialLeft(void);
- void CarSpecialGo(void);
- void CarSpecialPlusGo(void);
- void CarSpecialRight(void);
- #endif
-
-
-

我的主函数有些啰嗦,以前写的,懒得改了。
大意就是:
分为两部分
第一部分代码表示循迹的时候可以避障
第一部分代码表示仅仅循迹
逻辑部分仅供参考!建议按自己的逻辑改改!!
已知:仅仅在直行的时候遇到一次障碍物
所以:我的避障在直行判断里面
if(b==0)(此为第一部分代码。b是标志位,目的是只执行一次避障)
{
if(直行判断)
{
直行
if(距离<30)(请按照实际情况修改参数)
{
避障逻辑(请按照实际情况修改逻辑)
b++;
}
}
if(其他判断)
{左、右转弯等等
}
}
if(b==1)(此为第二部分代码。b是标志位,目的是只执行一次避障)
{
正常循迹判断
}
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "Ultrasonic.h"
- #include "motor.h"
- #include "sensor.h"
- #include "SteeringMotor.h"
-
-
- int main(void)
- {
- // float length_res[5]={0}; //用来存放测距结果
- int a=0,b=0,c=0,d=0;
- char str[20];//用来存放浮点数字符
- SystemInit(); // 配置系统时钟为72M
- delay_init(); //延时初始化
- xunji_config(); //循迹初始化
- Ultrasonic_Init();
- TIM4_PWM_Init();
- Steer_pwm_init();
- while(1)
- {
- Read_xunji_Date(); //读循迹线值
- //车前4个循迹模块从右到左分别是xunji_4,xunji_3,xunji_2,xunji_1
- //xunji_x=1白亮 x 2 3 x
- if(b==0)
- {
- if(xunji_1==1&&xunji_2==0&&xunji_3==1&&xunji_4==1)//0100
- {
- CarRight(); //如果第二个读取到黑线,右转
- continue;
- }
- if(xunji_1==0&&xunji_2==1&&xunji_3==1&&xunji_4==1)//1000
- {
- CarBigRight(); //如果第一个读取到黑线,大右转
- continue;
- }
- if(xunji_1==1&&xunji_2==1&&xunji_3==0&&xunji_4==1)//0010
- {
- CarLeft();//如果第三个读取到黑线,左转
- continue;
- }
-
- if(xunji_1==1&&xunji_2==1&&xunji_3==1&&xunji_4==0)//0001
- {
- CarBigLeft(); //如果第四个读取到黑线,大左转
- continue;
- }
-
- if(xunji_1==1&&xunji_2==1&&xunji_3==1&&xunji_4==1)//0001
- {
- CarGo(); //如果都读取到白线,直走
- if(Senor_Using()<30.00)//大 不撞
- {
- a++;
- if(a==1)
- {
- Steer_Front;
- delay_ms(700);
- CarStop();
- delay_ms(700);
- Steer_Right_90 ;
- delay_ms(700);
- CarSpecialLeft();
- delay_ms(530);
- do
- {
- CarSpecialPlusGo();
- delay_ms(700);
- }while(Senor_Using()<50.00);
- CarStop();
- delay_ms(700);
- CarSpecialRight();
- delay_ms(670);
- do
- {
- CarSpecialPlusGo();
- delay_ms(1000);
- }while(Senor_Using()<50.00);
- CarStop();
- delay_ms(700);
- CarSpecialRight();
- delay_ms(650);
- do
- {
- CarSpecialGo();
- delay_ms(100);
- }while(xunji_1== 1&&xunji_2==1&&xunji_3==1&&xunji_4==1&&xunji_5==0);
- CarStop();
- delay_ms(1000);
- Steer_Front;
- delay_ms(700);
- CarSpecialLeft();
- delay_ms(500);
- b++;
- }
- }
- }
- if(xunji_1==0&&xunji_2==0&&xunji_3==1&&xunji_4==1)
- {
- CarBigRight(); //如果右侧都黑且左侧都白,大右
- continue;
- }
- if(xunji_3==0&&xunji_4==0&&xunji_1==1&&xunji_2==1)
- {
- CarBigLeft();//如果左侧都黑且右侧都白,大左
- continue;
- }
- if(xunji_3==0&&xunji_4==0&&xunji_1==1&&xunji_2==0)
- {
- CarBigLeft();//如果左侧都黑且右侧都白,大左
- continue;
- }
- if(xunji_1==0&&xunji_2==0&&xunji_3==0&&xunji_4==1)
- {
- CarBigRight(); //如果右侧都黑且左侧都白,大右
- continue;
- }
-
- if(xunji_1==0&&xunji_4==0&&xunji_3==1&&xunji_2==1)
- {
- CarGo();
- }
- if(xunji_1==1&&xunji_4==1&&xunji_3==0&&xunji_2==0)
- {
- CarGo();
- }
- }
- if(b==1)
- {
- if(xunji_1==1&&xunji_2==0&&xunji_3==1&&xunji_4==1)//0100
- {
- CarRight(); //如果第二个读取到黑线,右转
- continue;
- }
- if(xunji_1==0&&xunji_2==1&&xunji_3==1&&xunji_4==1)//1000
- {
- CarBigRight2(); //如果第一个读取到黑线,大右转
- delay_ms(10);
- }
- if(xunji_1==1&&xunji_2==1&&xunji_3==0&&xunji_4==1)//0010
- {
- CarLeft();//如果第三个读取到黑线,左转
- continue;
- }
-
- if(xunji_1==1&&xunji_2==1&&xunji_3==1&&xunji_4==0)//0001
- {
- CarBigLeft2(); //如果第四个读取到黑线,大左转
- delay_ms(10);
- }
-
- if(xunji_1==1&&xunji_2==1&&xunji_3==1&&xunji_4==1)//0001
- {
- CarGo2(); //如果都读取到白线,直走
- }
- if(xunji_1==0&&xunji_2==0&&xunji_3==1&&xunji_4==1)
- {
- CarBigRight2(); //如果右侧都黑且左侧都白,大右
- delay_ms(10);
- }
- if(xunji_3==0&&xunji_4==0&&xunji_1==1&&xunji_2==1)
- {
- CarBigLeft2();//如果左侧都黑且右侧都白,大左
- delay_ms(10);
- }
- if(xunji_3==0&&xunji_4==0&&xunji_1==1&&xunji_2==0)
- {
- CarBigLeft2();//如果左侧都黑且右侧都白,大左
- delay_ms(10);
- }
- if(xunji_1==0&&xunji_2==0&&xunji_3==0&&xunji_4==1)
- {
- CarBigRight2(); //如果右侧都黑且左侧都白,大右
- delay_ms(10);
- }
-
- if(xunji_1==0&&xunji_4==0&&xunji_3==1&&xunji_2==1)
- {
- CarGo2();
- }
- if(xunji_1==1&&xunji_4==1&&xunji_3==0&&xunji_2==0)
- {
- CarGo2();
- }
- }
- }
-
- }
-
-

.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。