鱼C论坛

 找回密码
 立即注册
查看: 429|回复: 3

循迹小车代码

[复制链接]
发表于 2024-11-29 09:25:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
根据地图修改我的代码让他可以按照图中路线跑
 
#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();
        }
    }
}
&#160;
Image_454015891520763.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

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

  1. #include <reg52.h>

  2. //...

  3. void main()
  4. {
  5.     Timer0_Init();
  6.     while(1)
  7.     {
  8.         //检测所有传感器输入
  9.         if(leftsensor == 0 && rightsensor == 0 && middlesensor1 == 0 && middlesensor2 == 0)
  10.         {
  11.             car_go();
  12.         }
  13.         else if(leftsensor == 1 && rightsensor == 0) // 检测到左转
  14.         {
  15.             left();
  16.         }
  17.         else if(rightsensor == 1 && leftsensor == 0) // 检测到右转
  18.         {
  19.             right();
  20.         }
  21.         // 增加特定路口或路段的逻辑
  22.         else if(leftsensor == 1 && middlesensor1 == 0 && middlesensor2 == 1)
  23.         {
  24.             // 例如:遇到特定路段或交叉口
  25.             // 添加特殊处理逻辑
  26.             special_turn_or_action();
  27.         }
  28.         else
  29.         {
  30.             car_back();
  31.         }
  32.     }
  33. }

  34. //...
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

能不能显示完整代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-29 09:31:51 | 显示全部楼层
dinghuang 发表于 2024-11-29 09:31
能不能显示完整代码


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

  1. #include <reg52.h>

  2. /* 定义PWM参数 */
  3. #define PWM_PERIOD 100
  4. int PWM_JISHU = 0;
  5. int PWM_ZKB1 = 25;
  6. int PWM_ZKB2 = 25;

  7. /* 定义引脚 */
  8. sbit ENA = P1^6;
  9. sbit IN1 = P1^7;
  10. sbit IN2 = P1^3;
  11. sbit IN3 = P1^4;
  12. sbit IN4 = P1^5;
  13. sbit END = P1^2;
  14. sbit leftsensor = P2^4;
  15. sbit rightsensor = P2^2;
  16. sbit middlesensor1 = P2^1;
  17. sbit middlesensor2 = P2^3;

  18. /* 定时器初始化 */
  19. void Timer0_Init()        // 100us @11.0592MHz
  20. {   
  21.     TMOD &= 0xF0;   
  22.     TMOD |= 0x01;    // 设置定时器模式
  23.     TL0 = 0xA4;                // 设置定时初值
  24.     TH0 = 0xFF;                // 设置定时初值
  25.     TF0 = 0;                // 清除TF0标志
  26.     TR0 = 1;   
  27.     ET0 = 1;
  28.     EA = 1;    // 开启定时器0中断
  29.     PT0 = 0;
  30. }

  31. /* PWM控制 */
  32. void PWM() interrupt 1
  33. {
  34.     TL0 = 0xA4;
  35.     TH0 = 0xFF;
  36.     PWM_JISHU++;
  37.     if(PWM_JISHU >= PWM_PERIOD)
  38.     {
  39.         PWM_JISHU = 0;
  40.     }
  41.     if(PWM_JISHU < PWM_ZKB1)
  42.     {
  43.         ENA = 1;
  44.     }
  45.     else
  46.     {
  47.         ENA = 0;
  48.     }
  49.     if(PWM_JISHU < PWM_ZKB2)
  50.     {
  51.         END = 1;
  52.     }
  53.     else
  54.     {
  55.         END = 0;
  56.     }
  57. }

  58. void car_go()
  59. {
  60.     PWM_ZKB1 = 23;
  61.     PWM_ZKB2 = 23;
  62.     IN1 = 0;
  63.     IN2 = 1;
  64.     IN3 = 1;
  65.     IN4 = 0;
  66. }

  67. void car_back()
  68. {
  69.     PWM_ZKB1 = 23;
  70.     PWM_ZKB2 = 23;
  71.     IN1 = 1;
  72.     IN2 = 0;
  73.     IN3 = 0;
  74.     IN4 = 1;
  75. }

  76. void car_back_left()
  77. {
  78.     PWM_ZKB1 = 10;
  79.     PWM_ZKB2 = 23;
  80.     IN1 = 1;
  81.     IN2 = 0;
  82.     IN3 = 1;
  83.     IN4 = 0;
  84. }

  85. void car_back_right()
  86. {
  87.     PWM_ZKB1 = 23;
  88.     PWM_ZKB2 = 10;
  89.     IN1 = 0;
  90.     IN2 = 1;
  91.     IN3 = 0;
  92.     IN4 = 1;
  93. }

  94. void right()
  95. {
  96.     PWM_ZKB1 = 25;
  97.     PWM_ZKB2 = 10; // 降低右侧电机的速度
  98.     IN1 = 0;
  99.     IN2 = 1;
  100.     IN3 = 0; // 右侧电机反转
  101.     IN4 = 1;
  102. }

  103. void left()
  104. {
  105.     PWM_ZKB1 = 10; // 降低左侧电机的速度
  106.     PWM_ZKB2 = 25;
  107.     IN1 = 0; // 左侧电机反转
  108.     IN2 = 1;
  109.     IN3 = 0;
  110.     IN4 = 1;
  111. }

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

  119. void delay_ms(unsigned int ms)
  120. {
  121.     unsigned int i, j;
  122.     for(i = ms; i > 0; i--)
  123.         for(j = 114; j > 0; j--);
  124. }

  125. void main()
  126. {
  127.     Timer0_Init();
  128.     while(1)
  129.     {
  130.         //检测所有传感器输入
  131.         if(leftsensor == 0 && rightsensor == 0 && middlesensor1 == 0 && middlesensor2 == 0)
  132.         {
  133.             car_go();
  134.         }
  135.         else if(leftsensor == 1 && rightsensor == 0) // 检测到左转
  136.         {
  137.             left();
  138.         }
  139.         else if(rightsensor == 1 && leftsensor == 0) // 检测到右转
  140.         {
  141.             right();
  142.         }
  143.         // 增加特定路口或路段的逻辑
  144.         else if(leftsensor == 1 && middlesensor1 == 0 && middlesensor2 == 1)
  145.         {
  146.             // 例如:遇到特定路段或交叉口
  147.             special_turn_or_action();
  148.         }
  149.         else
  150.         {
  151.             car_back();
  152.         }
  153.     }
  154. }
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-21 23:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表