dinghuang 发表于 2024-11-29 09:25:06

循迹小车代码

根据地图修改我的代码让他可以按照图中路线跑
 
#include <STC89C5xRC.H>
#include <intrins.h>

#define PWM_PERIOD 100
int PWM_JISHU = 0;
int PWM_ZKB1 = 25;
int PWM_ZKB2 = 25;

/* 定义引脚 */
sbit ENA = P1^6;
sbit IN1 = P1^7;
sbit IN2 = P1^3;
sbit IN3 = P1^4;
sbit IN4 = P1^5;
sbit END = P1^2;
sbit leftsensor = P2^4;
sbit rightsensor = P2^2;
sbit middlesensor1 = P2^1;
sbit middlesensor2 = P2^3;

/* 定时器初始化 */
void Timer0_Init()      // 100us @11.0592MHz
{   
    TMOD &= 0xF0;   
    TMOD |= 0x01;    // 设置定时器模式
    TL0 = 0xA4;                // 设置定时初值
    TH0 = 0xFF;                // 设置定时初值
    TF0 = 0;                // 清除TF0标志
    TR0 = 1;   
    ET0 = 1;
    EA = 1;    // 开启定时器0中断
    PT0 = 0;
}

/* PWM控制 */
void PWM() interrupt 1
{
    TL0 = 0xA4;
    TH0 = 0xFF;
    PWM_JISHU++;
    if(PWM_JISHU >= PWM_PERIOD)
    {
      PWM_JISHU = 0;
    }
    if(PWM_JISHU < PWM_ZKB1)
    {
      ENA = 1;
    }
    else
    {
      ENA = 0;
    }
    if(PWM_JISHU < PWM_ZKB2)
    {
      END = 1;
    }
    else
    {
      END = 0;
    }
}

void car_go()
{
    PWM_ZKB1 = 23;
    PWM_ZKB2 = 23;
    IN1 = 0;
    IN2 = 1;
    IN3 = 1;
    IN4 = 0;
}

void car_back()
{
    PWM_ZKB1 = 23;
    PWM_ZKB2 = 23;
    IN1 = 1;
    IN2 = 0;
    IN3 = 0;
    IN4 = 1;
}

void car_back_left()
{
    PWM_ZKB1 = 10;
    PWM_ZKB2 = 23;
    IN1 = 1;
    IN2 = 0;
    IN3 = 1;
    IN4 = 0;
}

void car_back_right()
{
    PWM_ZKB1 = 23;
    PWM_ZKB2 = 10;
    IN1 = 0;
    IN2 = 1;
    IN3 = 0;
    IN4 = 1;
}

void right()
{
    PWM_ZKB1 = 25;
    PWM_ZKB2 = 10; // 降低右侧电机的速度
    IN1 = 0;
    IN2 = 1;
    IN3 = 0; // 右侧电机反转
    IN4 = 1;
}

void left()
{
    PWM_ZKB1 = 10; // 降低左侧电机的速度
    PWM_ZKB2 = 25;
    IN1 = 0; // 左侧电机反转
    IN2 = 1;
    IN3 = 0;
    IN4 = 1;
}

void main()
{
    Timer0_Init();
    while(1)
    {
      if(leftsensor == 0 && rightsensor == 0 && middlesensor1 == 0 && middlesensor2 == 0)
      {
            car_go();
      }
      else if(leftsensor == 1 || (middlesensor1 == 1 && rightsensor == 0 && middlesensor2 == 0))
      {
            left();
      }
      else if(rightsensor == 1 || (middlesensor2 == 1 && leftsensor == 0 && middlesensor1 == 0))
      {
            right();
      }
      else if(leftsensor == 1 && middlesensor1 == 1 && rightsensor == 0 && middlesensor2 == 0)
      {
            car_back_left();
      }
      else if(rightsensor == 1 && middlesensor2 == 1 && leftsensor == 0 && middlesensor1 == 0)
      {
            car_back_right();
      }
      else
      {
            car_back();
      }
    }
}
 

FishC 发表于 2024-11-29 09:25:23

看起来您希望根据地图调整循迹小车的代码。首先,请确保小车的传感器能够正确检测到地图上的路线(通常为黑色线条)。代码的逻辑主要依赖于左右传感器以及中间两个传感器的输入。以下是常见的修改建议,以确保能更好地适应特定的路线:

1. **调整速度和转向**:根据实际地图上的曲线和平直段,可能需要调整电机的PWM参数,确保转弯时速度适应特点的路段。

2. **改善传感器条件**:可以根据实际情况对传感器输入做更细的分类。例如,某些复杂的路段可能需要更多传感器状态来区分和处理。例如,每个转弯可能要求不同的动力或者控制时间。

以下是参考代码示例,可在特定的路口增加条件处理:

#include <reg52.h>

//...

void main()
{
    Timer0_Init();
    while(1)
    {
      //检测所有传感器输入
      if(leftsensor == 0 && rightsensor == 0 && middlesensor1 == 0 && middlesensor2 == 0)
      {
            car_go();
      }
      else if(leftsensor == 1 && rightsensor == 0) // 检测到左转
      {
            left();
      }
      else if(rightsensor == 1 && leftsensor == 0) // 检测到右转
      {
            right();
      }
      // 增加特定路口或路段的逻辑
      else if(leftsensor == 1 && middlesensor1 == 0 && middlesensor2 == 1)
      {
            // 例如:遇到特定路段或交叉口
            // 添加特殊处理逻辑
            special_turn_or_action();
      }
      else
      {
            car_back();
      }
    }
}

//...

请根据地图的具体情况调整不同的传感器逻辑组合,并在需要的地方添加对应的转向或者特殊行为函数。记得反复进行测试以适应不同的道路状况。希望能够帮助到您!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

dinghuang 发表于 2024-11-29 09:31:31

FishC 发表于 2024-11-29 09:25
看起来您希望根据地图调整循迹小车的代码。首先,请确保小车的传感器能够正确检测到地图上的路线(通常为黑 ...

能不能显示完整代码

FishC 发表于 2024-11-29 09:31:51

dinghuang 发表于 2024-11-29 09:31
能不能显示完整代码

当然可以!这是根据你的需求调整后的完整代码示例:

#include <reg52.h>

/* 定义PWM参数 */
#define PWM_PERIOD 100
int PWM_JISHU = 0;
int PWM_ZKB1 = 25;
int PWM_ZKB2 = 25;

/* 定义引脚 */
sbit ENA = P1^6;
sbit IN1 = P1^7;
sbit IN2 = P1^3;
sbit IN3 = P1^4;
sbit IN4 = P1^5;
sbit END = P1^2;
sbit leftsensor = P2^4;
sbit rightsensor = P2^2;
sbit middlesensor1 = P2^1;
sbit middlesensor2 = P2^3;

/* 定时器初始化 */
void Timer0_Init()      // 100us @11.0592MHz
{   
    TMOD &= 0xF0;   
    TMOD |= 0x01;    // 设置定时器模式
    TL0 = 0xA4;                // 设置定时初值
    TH0 = 0xFF;                // 设置定时初值
    TF0 = 0;                // 清除TF0标志
    TR0 = 1;   
    ET0 = 1;
    EA = 1;    // 开启定时器0中断
    PT0 = 0;
}

/* PWM控制 */
void PWM() interrupt 1
{
    TL0 = 0xA4;
    TH0 = 0xFF;
    PWM_JISHU++;
    if(PWM_JISHU >= PWM_PERIOD)
    {
      PWM_JISHU = 0;
    }
    if(PWM_JISHU < PWM_ZKB1)
    {
      ENA = 1;
    }
    else
    {
      ENA = 0;
    }
    if(PWM_JISHU < PWM_ZKB2)
    {
      END = 1;
    }
    else
    {
      END = 0;
    }
}

void car_go()
{
    PWM_ZKB1 = 23;
    PWM_ZKB2 = 23;
    IN1 = 0;
    IN2 = 1;
    IN3 = 1;
    IN4 = 0;
}

void car_back()
{
    PWM_ZKB1 = 23;
    PWM_ZKB2 = 23;
    IN1 = 1;
    IN2 = 0;
    IN3 = 0;
    IN4 = 1;
}

void car_back_left()
{
    PWM_ZKB1 = 10;
    PWM_ZKB2 = 23;
    IN1 = 1;
    IN2 = 0;
    IN3 = 1;
    IN4 = 0;
}

void car_back_right()
{
    PWM_ZKB1 = 23;
    PWM_ZKB2 = 10;
    IN1 = 0;
    IN2 = 1;
    IN3 = 0;
    IN4 = 1;
}

void right()
{
    PWM_ZKB1 = 25;
    PWM_ZKB2 = 10; // 降低右侧电机的速度
    IN1 = 0;
    IN2 = 1;
    IN3 = 0; // 右侧电机反转
    IN4 = 1;
}

void left()
{
    PWM_ZKB1 = 10; // 降低左侧电机的速度
    PWM_ZKB2 = 25;
    IN1 = 0; // 左侧电机反转
    IN2 = 1;
    IN3 = 0;
    IN4 = 1;
}

/* 新增特殊动作函数可选 */
void special_turn_or_action()
{
    // 为特定场景或交叉口情况实现定制动作
    car_back_left();// 例如,可以让车做左拐
    delay_ms(500);   // 增加适当的延时确保动作完成
}

void delay_ms(unsigned int ms)
{
    unsigned int i, j;
    for(i = ms; i > 0; i--)
      for(j = 114; j > 0; j--);
}

void main()
{
    Timer0_Init();
    while(1)
    {
      //检测所有传感器输入
      if(leftsensor == 0 && rightsensor == 0 && middlesensor1 == 0 && middlesensor2 == 0)
      {
            car_go();
      }
      else if(leftsensor == 1 && rightsensor == 0) // 检测到左转
      {
            left();
      }
      else if(rightsensor == 1 && leftsensor == 0) // 检测到右转
      {
            right();
      }
      // 增加特定路口或路段的逻辑
      else if(leftsensor == 1 && middlesensor1 == 0 && middlesensor2 == 1)
      {
            // 例如:遇到特定路段或交叉口
            special_turn_or_action();
      }
      else
      {
            car_back();
      }
    }
}

请根据地图具体情况调整不同传感器逻辑组合,并在需要的地方添加或修改对应的转向函数或特殊行为函数。记得进行实际测试以确保路线效果符合预期。希望这能帮助到您!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 循迹小车代码