循迹小车具体做法与经验分享

简单介绍

大一时做了一辆循迹小车,第一次做小项目,没有经验,走了很多弯路,前前后后花费了大概一个月的时间。被小车折磨了一个月后,我学到了很多东西,体会很深,很想写下来与大家分享。主要献给和我一样第一次做项目的朋友们,希望对你们有用。

接下来我分享一下我这个小车的做法和经验。整个过程主要分为查资料、购买原件、组装、编程序、调试小车五步。在这篇博客中我将具体介绍这五步,让你看完后对循迹小车有大体了解,可以独立做出循迹小车,避免走很多弯路。
展示循迹小车具体做法与经验分享_第1张图片

前提:

  1. 具备一点C语言知识(学完三种基本结构就可以)
  2. 具备一点51单片机知识(会用定时器和中断就可以)
  3. 一台电脑(用来写程序和烧录程序)
  4. 150元左右(用来买原件)

正文:

一、关于查资料
需要C语言、51单片机和高中物理电学基本知识。C语言推荐观看浙江大学翁凯老师的C语言课程,51单片机推荐郭天祥老师的书籍。
二、购买原件

循迹小车具体做法与经验分享_第2张图片
必要的模块
1、 小车底盘
建议买 直接购买4 轮两层的, 厚一些的亚克力板, 板子颜色随便, 也 可以买铝合金的, 更坚实
2、 电机驱动(型号: L289N)
3、避障循迹模块
可以购买四路集成在一块板子上的,也可以买单独的。
4、降压稳压模块
5、单片机最小系统
6、电池(18650 电池组, 或者 3 节 18650 单电池使用电池盒)
非必要的模块
1、 超声波测距模块
2、蜂鸣器(有源蜂鸣器)
3、光敏开关或声音开关
4、声控开关
5、杜邦线(母对母建议多买一份、 公对母、 公对公, 长度建议 20cm, 可以买点长的)
6、开关
7、螺丝及铜柱,
8、1602 显示模块
9、显示电池电压模块
三、组装
1、注意电池最好放上面,便于充电。
2、布线要整洁
四、程序(供参考)

#include
#define uint unsigned int
#define uchar unsigned char

sbit Kaiguan=P1^4; //声控开关
sbit Fengming=P0^0; //蜂鸣器
sbit left1=P1^1;
sbit left2=P0^2;    //红外传感器 
sbit left3=P1^0;
sbit right1=P1^2;
sbit right2=P1^3;
sbit right3=P0^1;
sbit ENA=P3^2;   //电机驱动使能A端
sbit in1=P3^3;
sbit in2=P3^4;
sbit in3=P3^5;
sbit in4=P3^6;
sbit ENB=P3^7;   //电机驱动使能B端

uchar t, zkba, zkbb;

void delay(uint xms)  //延时函数
{
 uint a,b;
 for(a=xms;a>0;a--)
  for(b=110;b>0;b--);
}

void Timer0Init()    //定时器0初始化
{
  TMOD=0X01;
 TH0=(65532-100)/256;
 TL0=(65532-100)%256;
 EA=1;
 ET0=1;
 TR0=1;
}

void Timer0() interrupt 1  //定时器0    pwm调速
{
 TH0=(65536-100)/256;
 TL0=(65536-100)%256;
 ++t;
 if(t<zkba)
 {
  ENA=1; 
 }
 else
 {
  ENA=0;
 }
 if(t<zkbb)
 {
  ENB=1;
 }
 else
 {
  ENB=0;
 }
 if(t>=100)
 {
  t=0;
 }
}
void zhizou()   // 直走
{
 in1=0;
 in2=1;
 in3=1;
 in4=0;
 zkba=85;
 zkbb=85; 
}

void turn_left()  //   左拐
{
 in1=1;
 in2=0;
 in3=1;
 in4=0;
 zkba=10;
 zkbb=70; 
}

void turn_right1()   //   右拐
{
 in1=0;
 in2=1;
 in3=0;
 in4=1;
 zkba=65;
 zkbb=15; 
}

void turn_right2()   //   右拐
{
 in1=0;
 in2=1;
 in3=0;
 in4=1;
 zkba=70;
 zkbb=40; 
}

void stop()   //   停止
{
 in1=1;
 in2=1;
 in3=1;
 in4=1;
 zkba=0;
 zkbb=0; 
}

void fasheng()  //    发声
{
 Fengming=1;
 delay(30);
 Fengming=0; 
} 

void xunji()   //循迹
{ 
   uchar flag ;
  if((left3 == 0)&&(left1 == 0)&&(right1 == 0)&&(right2 == 1)&&(right3==1))  //  直走
  {  
   flag=0;
  }
  if((left3 == 0)&&(left1 == 0)&&(right1 == 0)&&(right2 == 0)&&(right3==1))  //   右拐
  { 
   delay(5);
   if((left3 == 0)&&(left1 == 0)&&(right1 == 0)&&(right2 == 0)&&(right3==1))
   flag=1;
  }
    if((left3 == 0)&&(left1 == 0)&&(right1 == 0)&&(right2 == 0)&&(right3==0))  //   右拐
  { 

   flag=5;
  } 
   if((left3 == 0)&&(left1 == 0)&&(right1 ==1)&&(right2 == 1)&&(right3==1))   //  左拐
   { 
      delay(15);
      if((left3 == 0)&&(left1 == 0)&&(right1 ==1)&&(right2 == 1)&&(right3==1))
     flag = 2;
   }
   if((left3 == 0)&&(left1 == 0)&&(right1 ==1)&&(right2 == 0)&&(right3==1))   //  左拐
   {
    delay(15);
     if((left3 == 0)&&(left1 == 0)&&(right1 ==1)&&(right2 == 0)&&(right3==1))
    flag = 2;
   }
   if((left1==1)||(left2==1))
   { 
    delay(4);
    if((left1==1)||(left2==1))             //  发声
    flag = 3;
   }
   if((left1==1)||(left2==1))
   { 
    delay(8);
    if((left1==1)||(left2==1))             //  发声
    flag = 3;
   }
  if((left3 == 1)||(left1==1))              //   停
  {
   delay(5); 
   if((left3 == 1)&&(left1==1))
   flag = 4;  
  }
  if((left3 == 1)||(left2==1))              //   停
  {
   delay(10); 
   if((left3 == 1)&&(left2==1))
   flag = 4;  
  }
  switch(flag)
  {
  case 0:zhizou();     break;            
  case 1:turn_right1(); break; 
  case 2:turn_left();  break;
  case 3:fasheng();    break; 
  case 5:turn_right2();    break;
  case 4:turn_left(); 
    delay(100);
    zhizou(); 
    delay(60);
      stop();
      while(1);   break;   
  default:zhizou();    break;
  }
}

void main()
{ 
 Fengming=0;
 Timer0Init();
 delay(30);
 while(1)
 {
 if(Kaiguan==0)
 {
  while(1)
  {
   xunji();
  }
 }
 }
  
}

五、调试
1、主要是修改pwm的占空比调速和红外检测黑白线,修改xunji()函数

你可能感兴趣的:(单片机)