找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1386|回复: 2
收起左侧

为啥我的单片机循迹小车程序烧录进去之后不能循迹啊 就一直按着直线走?

[复制链接]
ID:1029445 发表于 2022-5-24 23:37 | 显示全部楼层 |阅读模式
帮忙看看谢谢大家
单片机源程序如下:
#include <reg52.h>#define uint unsigned int
#define uchar unsigned char
sbit IN11=P1^6;    //左前轮
sbit IN12=P1^7;
sbit IN13=P1^4;     //右前轮
sbit IN14=P1^5;
sbit IN21=P1^0;     // 左后轮
sbit IN22=P1^1;
sbit IN23=P1^2;     //右后轮
sbit IN24=P1^3;
sbit S1=P0^3;       //速度
sbit S2=P0^2;
sbit S3=P0^1;
sbit S4=P0^0;
sbit D1=P2^3;       //循迹
sbit D2=P2^2;
sbit D3=P2^1;
sbit D4=P2^0;
uchar counter,compare;
void a ()          //左轮前进
{
  IN11=1;      
  IN12=0;
        IN21=1;
        IN22=0;
}
void aa ()          //左轮后退
{
  IN11=0;      
  IN12=1;
        IN21=0;
        IN22=1;
}
void b ()
{
        IN13=0;     //右轮前进
  IN14=1;
        IN23=0;
        IN24=1;
}
void bb ()
{
        IN13=1;     //右轮后退
  IN14=0;
        IN23=1;
        IN24=0;
}
void car_stop ()     //停止
{
        IN11=1;
        IN12=1;
        IN13=1;
        IN14=1;
        IN21=1;   
  IN22=1;
        IN23=1;
        IN24=1;
}

void Timer0_Init()                //100微秒@11.0592MHz
{

        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x01;                //设置定时器模式
        TL0 = 0xA4;                //设置定时初始值
        TH0 = 0xFF;                //设置定时初始值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        ET0=1;      //定时器0中断允许开关
        EA=1;      //定时器总开关
        PT0=0;    //定时器0中断优先级
}
void Timer0_Routine() interrupt 1 //中断函数
{
        TL0 = 0xA4;               
        TH0 = 0xFF;               
  compare=6;
        counter++;
        if(counter>=20)
  {
                counter=0;
  }
  if(counter<compare)
  {
          S1=1;
          S2=1;
          S3=1;
          S4=1;
  }
  else
  {
          S1=0;
          S2=0;
          S3=0;
          S4=0;
  }
}
void car_go()   //小车向前
{
        compare=5;
        a();
        b();
}
void car_back()//小车向后
{
  compare=5;
        aa();
  bb();
}
void car_leftgo()//左拐
{                        
        compare=5;
        aa();
        b();
}
void car_rightgo()  //右拐
{
        compare=5;
  a();
  bb();        
}
void delayms (uint x)
{
        int i,j;
        for(i=x;i>0;i--)
  for(j=110;j>0;j--);
}
void xunji ()
{
if(D1==1&&D2==1&&D3==1&&D4==1)  //全检测到黑线
{
   car_go ();
}
if(D1==0&&D2==1&&D3==0&&D4==0)  //中间右侧检测到黑线,小车偏左,小车向右移动
{
  car_rightgo ();
  if(D1==0&&D2==0&&D3==0&&D4==0)
  {
          car_go ();
        }
}
if(D1==0&&D2==0&&D3==1&&D4==0)  //中间左侧检测到黑线,小车偏右,小车向左移动
{
  car_leftgo ();
  if(D1==0&&D2==0&&D3==0&&D4==0)
  {
          car_go ();
        }
}
if(D1==0&&D2==0&&D3==1&&D4==1)  //直角左拐
{
  car_go ();
  delayms(500);
  if(D1==0&&D2==0&&D3==0&&D4==0)
  {
   car_stop();
   delayms(500);
   car_leftgo ();
  }
}
if(D1==1&&D2==1&&D3==0&&D4==0)  //直角右拐
{
  car_go ();
  delayms(500);
  if(D1==0&&D2==0&&D3==0&&D4==0)
  {
   car_stop();
   delayms(500);
   car_rightgo ();
  }
}
if((D1==0&&D2==0&&D3==0&&D4==1)||(D1==0&&D2==1&&D3==0&&D4==1)||(D1==0&&D2==1&&D3==1&&D4==1))  //锐角左拐
{
  car_go ();
  delayms(500);
  delayms(500);
  if(D1==0&&D2==0&&D3==0&&D4==0)
  {
   car_stop();
   delayms(500);
   car_leftgo();
  }
}
if((D1==1&&D2==0&&D3==0&&D4==0)||(D1==1&&D2==0&&D3==1&&D4==0)||(D1==1&&D2==1&&D3==1&&D4==0))  //锐角右拐
{
  car_go ();
  delayms(500);
  delayms(500);
  if(D1==0&&D2==0&&D3==0&&D4==0)
  {
   car_stop();
   delayms(500);
   car_rightgo();
  }
}
if(D1==0&&D2==1&&D3==1&&D4==0)
{
   car_go();
}

}
void main ()
{
Timer0_Init();
car_go ();
while (1)
{
   xunji ();
}
}
回复

使用道具 举报

ID:844772 发表于 2022-5-25 09:39 | 显示全部楼层
1.调整好红外模块,基本每次上场都要调的。
2.确认你模块逻辑,你程序认为在黑线上是1,平时是0,确认一下是不是真这样?
3.循迹程序有问题,发现黑线后,车转向需要时间,可能会有一个过线的情况,你马上跟了判断全白的程序,来不及执行转向就收到直行命令了。建议你先做简单判断寻线程序,成功后再逐步增加特殊情况。
回复

使用道具 举报

ID:979299 发表于 2022-5-25 11:48 | 显示全部楼层
程序看上去没什么问题,只有倒车函数未调用,检查硬件正常工作了没有,有没有插错,接反和损坏之类的
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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