鱼C论坛

 找回密码
 立即注册
查看: 86|回复: 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

能不能显示完整代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-7 04:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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