基于STC89c52rc单片机的红外循迹小车

基于STC89c52rc单片机的红外循迹小车循迹小车由于要准备明年的恩智浦飞思卡尔智能车比赛,因为飞思卡尔智能车用的是K60系列的单片机以我目前的阶段来说还处于学习阶段,所以先用51单片机做一个智能循迹小车。学习一下小车硬件以及软件,也是对我半年来51单片机和C语言的学习的总结。前面还有一个超声波传感器和一个金属齿轮的舵机,因为想再加一个避障,但在本程序中我只实现了一个红外循迹加调速的功能,没有使用超声波传感器和舵机。硬件部分**1…

循迹小车

由于要准备明年的恩智浦飞思卡尔智能车比赛,飞思卡尔智能车用的是K60系列的单片机,以我目前的阶段来说还处于学习阶段,所以先试着用51单片机做一个智能循迹小车。学习一下小车硬件以及软件程序,这也是对我前一段时间来51单片机和C语言学习的总结。
在小车的前面有一个超声波传感器和一个金属齿轮的舵机,因为想再加一个避障,但在本程序中我只实现了一个红外循迹加调速的功能,没有使用超声波传感器和舵机。
视频

循迹小车

硬件部分

**1、**车模底板我是用以前学长做过的废车模,我用热熔胶粘上去两个直流减速电机和一个万向轮。
在这里插入图片描述

在这里插入图片描述
**2、**使用的芯片是stc89c52rc,控制系统用的是51最小系统,本来想用自己焊接的最小系统,因为考虑到车模搭建好后写程序时需要多次调试就使用了现成的51最小系统,避免了stc89c52rc芯片引脚的折损。
在这里插入图片描述
**3、**选用的电机驱动是L298N
L298N可以控制两个电机,而且还具有降压的功能,可以将12V的电降成5V来给最小系统供电。如果使用tb6612电机驱动或没有降压功能的电机驱动,则需要接稳压模块。
L298N上有6个信号端口,其中有两个是控制两个电机的使能端,在本程序中没有使用使能端。类外还有四个信号端是是用来驱动两个电机正转、反转、停止的。
在这里插入图片描述
**4、**考虑到电机驱动在运行的时候会发热,我在电机驱动后面装了一个小风扇主要起散热的作用。
在这里插入图片描述
**5、**使用了4个红外传感器,两边的用来控制方向,中间放了两个主要用来上坡,上坡时用于前头会抬起来导致最前面两边的得传感器检测不到白色,这时候中间的两个传感器还会检测到白色,使小车继续前进。

右边的传感器
左边的传感器
中间的传感器
**6、**电池用的是11.1v3000ma的锂电池。
在这里插入图片描述
**7、**因为感觉车有点丑,我在后面装了两块电路板在上面焊接了一些LED灯,最开始的构想是当小车左转时左边的灯亮,右转时右边的灯亮,前进时两边的灯亮,结果在调试程序的时候发现和电机调速的定时器有冲突,只好选择了在运行程序时所有的LED灯都给低电平,让LED灯常亮。
在这里插入图片描述

软件部分

转弯采用的是差速转弯,通过控制左右电机的速度来实现转弯。
**1、**左轮调速

void motor_left(bit left_core,uchar ENA)	//左电机正反转 占空比
{ 
   
 if(left_core==1)	//left_core==1 左电机正转 小车直走
 { 
   
  in1=1;            
  if(cut<=ENA)
  { 
   
   in2=0;
  }
  else
  { 
   
   in2=1;
  }
 }
 else 		//left_core==0 左电机反转转 小车倒退 
 { 
   
  in2=1;
  if(cut<=ENA)
  { 
   
   in1=0;
  }
  else
  { 
   
   in1=1;
  }
 }
} 

**2、**右轮调速

void motor_right(bit right_core,uchar ENB)	//右电机正反转 占空比
{ 
   
 if(right_core==1)       //right_core==1 右电机正转 小车直走
 { 
   
  in3=1;
  if(cut<=ENB)
  { 
   
   in4=0;
  }
  else
  { 
   
   in4=1;
  }
 }
 else          //right_core==0 右电机反转 小车倒退
 { 
   
  in4=1;
  if(cut<=ENB)
  { 
   
   in3=0;
  }
  else
  { 
   
   in3=1;
  }
 }
}         

**3、**前进

void run()            //前进 普通速度
{ 
   
 motor_left(1,4);     //左电机正转 速度为4 全速为9 此时速度为全速的4/9
 motor_right(1,4);    //右电机正转 速度为4 全速为9 此时速度为全速的4/9
} 
void run_go()         //前进 快速前进 用于上坡
{ 
   
 motor_left(1,5);     //左电机正转 速度为5 全速为9 此时速度为全速的5/9
 motor_right(1,5);    //右电机正转 速度为5 全速为9 此时速度为全速的5/9
}

左右转弯通过控制两边的转速来达到转弯的目的
**4、**左转

void turn_left()      //前左转函数 左右电机都正转 但各自的转速不同实现转弯
{ 
   
 motor_left(1,9);     //左电机正转 速度为9 全速为9 此时速度为全速的9/9
 motor_right(1,2);    //右电机正转 速度为2 全速为9 此时速度为全速的2/9
}               

**5、**右转

void turn_right()     //前右转函数 左右电机都正转 但各自的转速不同实现转弯
{ 
   
 motor_left(1,2);     //左电机正转 速度为2 全速为9 此时速度为全速的2/9
 motor_right(1,9);    //右电机正转 速度为9 全速为9 此时速度为全速的9/9
}                

**6、**停止 电机驱动上控制两个电机的I/O口都置高电平

void stop()         //停止函数 全部置高电平急停
{ 
   
 in1=1;
  in2=1;
  in3=1;
  in4=1;
}                   

好了话不多说我们来看看所有的程序吧

#include<reg52.h> //头文件 
#define uint unsigned int //宏定义无符号整型变量 uint
#define uchar unsigned char //宏定义无符号字符型变量 uchar

//电机驱动引脚定义
sbit in1=P3^2;   //右电机in1引脚定义
sbit in2=P3^3;   //右电机in2引脚定义
sbit in3=P3^4;   //左电机in3引脚定义
sbit in4=P3^5;   //左电机in4引脚定义
uint cut=0;     //定义整型变量cut 在定时器中装数

sbit red_left=P0^0;     //左边红外传感器 检测到黑线高电平 小车向右转
sbit red_right=P2^1;    //右边红外传感器 检测到黑线高电平 小车向左转
sbit red_goA=P0^1; //中间共有两个红外传感器 主要用于上坡(由于该车是三轮,前边有个万向轮, 
sbit red_goB=P0^2; //上陡坡时头会翘起来,导致最前面左右两边的红外传感器检测不到白色,此时使用中间两个传感器
sbit led1=P2^0;   //LED灯装饰
sbit led2=P2^2;   //LED灯装饰

void motor_left(bit left_core,uchar ENA)      //左电机正反转 占空比
{ 
   
 if(left_core==1)      //left_core==1 左电机正转 小车直走
 { 
   
  in1=1;            
  if(cut<=ENA)
  { 
   
   in2=0;
  }
  else
  { 
   
   in2=1;
  }
 }
 else          //left_core==0 左电机反转 小车倒退 
 { 
   
  in2=1;
  if(cut<=ENA)
  { 
   
   in1=0;
  }
  else
  { 
   
   in1=1;
  }
 }
} 

void motor_right(bit right_core,uchar ENB)        //右电机正反转 占空比
{ 
   
 if(right_core==1)       //right_core==1 右电机正转 小车直走
 { 
   
  in3=1;
  if(cut<=ENB)
  { 
   
   in4=0;
  }
  else
  { 
   
   in4=1;
  }
 }
 else         //right_core==0 右电机反转 小车倒退
 { 
   
  in4=1;
  if(cut<=ENB)
  { 
   
   in3=0;
  }
  else
  { 
   
   in3=1;
  }
 }
}            
void run()             //前进 普通速度
{ 
   
 motor_left(1,4);      //左电机正转 速度为4 全速为9 此时速度为全速的4/9
 motor_right(1,4);     //右电机正转 速度为4 全速为9 此时速度为全速的4/9
} 
void run_go()          //前进 快速前进 用于上坡
{ 
   
 motor_left(1,5);      //左电机正转 速度为5 全速为9 此时速度为全速的5/9
 motor_right(1,5);     //右电机正转 速度为5 全速为9 此时速度为全速的5/9
}
void stop()            //停止函数 全部置高电平急停
{ 
   
 in1=1;
  in2=1;
  in3=1;
  in4=1;
}    
void turn_left()       //前左转函数 左右电机都正转 但各自的转速不同实现转弯
{ 
   
 motor_left(1,9);      //左电机正转 速度为9 全速为9 此时速度为全速的9/9
 motor_right(1,2);     //右电机正转 速度为2 全速为9 此时速度为全速的2/9
}               
void turn_right()      //前右转函数 左右电机都正转 但各自的转速不同实现转弯
{ 
   
 motor_left(1,2);      //左电机正转 速度为2 全速为9 此时速度为全速的2/9
 motor_right(1,9);     //右电机正转 速度为9 全速为9 此时速度为全速的9/9
}         

void Init()          //定时器1工作方式1
{ 
   
 TMOD=0x10;          //定时器1选择工作方式1 
 TH1=0xff;           //计数器初始值设置 
 TL1=0x9c;             
 EA=1;               //打开总中断
 ET1=1;              //定时器1的中断允许位
 TR1=1;              //打开定时器1
}

void main()
{ 
   
 led1=0;       //led1低电平亮
 led2=0;       //led2低电平亮
 Init();       //中断初始化
 while(1)
 { 
     
  if(!red_left&&!red_right&&!red_goA&&!red_goB)   //判断四个传感器都检测到白色 前进
  { 
   
   run();       //前进普通速度 为全速的4/9
  }
  else          //否则 四个传感器中有检测到黑色
  { 
      
    if(red_left)    //左边传感器检测到黑色
    { 
   
     turn_right();  //右转
    }
     else           //否则 右边传感器检测到黑色
    { 
   
     turn_left();   //左转
    }
  }
  if(red_left&&red_right&&!red_goA&&!red_goB)   //左右两边的传感器检测到黑色(识别不到白色)中间为白
  { 
   
   run_go();     //快速前进 速度为全速的5/9 用于上坡
  }
  if(red_left&&red_right&&red_goA&&red_goB)    //如果所有的传感器都识别到黑色(识别不到白色)
  { 
   
   stop();       //停止
  }
 }
}
void InterruptTime1() interrupt 3       //中断服务函数 
{ 
   
 TH1=0xff;       //设置初始值
 TL1=0x9c;
 cut++;
 if(cut>=10)     //当cut的值大于等于10时
 { 
   
  cut=0;         //cut清零
 }
}

总结

在这次做51小车时最重要的是调试程序,因为对于不同的弯道,小车行驶的速度会在转弯时影响红外传感器能不能检测到黑色,速度过快会使是小车冲出赛道,所以需要不停的修改参数进行调速。
再就是对于红外传感器的灵敏度的调试,不同的高度灵敏度不同需要进行不断地调试找最合适的灵敏度,使小车灵敏的检测到黑色。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38636.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注