51单片机循迹小车

一.材料

1.51单片机开发板

2.L298N电机

3.红外循迹模块

4.直流电机

5.电池(提供电源,选用的是三节18650锂电池)

6.杜邦线

7.两个主动轮,一个万向轮

8.小车底板(亚克力板)

二.实现效果

使小车在两侧黑线内沿着环形跑道自主行驶一圈,打开开关时小车前行,左侧检测到黑线时左轮前进,右侧检测到黑线时右轮前进,两侧都检测到黑线时小车停止。

三.组装接线

1.初步组装:将直流电机、 主动轮、万向轮、电池盒接在小车底板上。每个直流电机焊接两根线,后续接到L298N两端。

2.红外模块:四路红外循迹模块的VCC、GND用杜邦线接在单片机的+5V、GND端,IN1-IN4接在单片机对应引脚上。红外发射接收器接在小车前方下端,离地距离不能过远,便于检测到黑线,执行循迹功能。

3.单片机最小系统:装入芯片(选用的是STC89C52RC),执行程序代码。用杜邦线完成单片机上引脚和红外模块、L298N、电池的接线。注意连线和程序中接口的对应。

4.L298N:L298N前面蓝色的三个接口外接电源供电用,左端接电池电源正极12V输入,右端接单片机5V接口,GND连接电池电源负极和单片机的GND接口。L298N的左右两个蓝色插口输出,接左右电机,可先焊接电机的两根线,在程序中让小车前进,若车轮转向正确,则接线正确;若车轮反向转动,可通过两根接线实现小车前进。ENA、ENB、IN1、IN2、IN3、IN4定义接口后接到单片机相应引脚上。ENA和ENB通过定时器调节输出PWM波,实现小车转弯。单片机控制IN1-IN4,来控制小车轮子的正反转。

直流电机

状态

IN1(IN3)

IN2(IN4)

使能端

M

正转

1

0

1

反转

0

1

1

停止

0

0

1

5.组装接线成果图

四。工作原理

1.PWM调速

(1)PWM:脉冲宽度调制,PWM波形如下所示。

(2)占空比:指高电平在一个周期中所占比例。对于单片机小车直流电机的调速,可以通过定时器设置定时初值,在中断服务函数中对占空比进行调整,从而实现电机的转速控制。

2.红外循迹

模块正式连接后,传感器开始工作。传感器有两个检测灯,一个灯用于发射光,另一个灯用于检测反射光的强度来判断是否检测到黑线。如果检测到黑线,黑色对光线的反射较弱,红外光无法反射回来,则模块指示灯熄灭,输出高电平(1)。未检测到黑线时,传感器发射出的红外光大部分被反射回来,模块感应到传感器反射回来的红外光,指示灯亮,输出低电平(0)。

五.程序编写

1.开头头文件、位定义

#include <reg51.h>

sbit IN1=P1^2;

sbit IN2=P1^3;       

sbit IN3=P1^4;

sbit IN4=P1^5;

sbit ENA=P1^0;//左边两个电机使能

sbit ENB=P1^1;//右边两个电机使能

sbit lse1=P2^1;//左边红外传感器的数据口

sbit lse2=P2^2;//右边红外传感器的数据口

unsigned char mot1=0;//定义左轮

unsigned char mot2=0;//定义右轮

int t = 0;

2.小车状态控制函数

void run(void) //小车前进

{   

mot1=13;

mot2=13;

    IN1=1;

    IN2=0;

    IN3=1;

    IN4=0;

}

void stop(void) //小车停止

{   

mot1=0;

mot2=0;
 IN1=0;

    IN2=0;

    IN3=0;

    IN4=0;

}

void leftrun(void) //小车右转

{

mot1=15;

mot2=0;

    IN1=1;

    IN2=0;

    IN3=0;

    IN4=0;
}

void rightrun(void) //小车左转

{

mot1=0;

mot2=15;

    IN1=0;

    IN2=0;

    IN3=1;

    IN4=0;
}

3.定时器中断函数

void PIT_Init()

{

    EA=1; //打开总中断

TMOD |=0x01;

TL0=0xA4; //设置定时初值

TH0=0xFF; //设置定时初值

ET0=1; //打开定时器中断允许

TR0=1; //打开定时器

}



void timer()interrupt 1//interrrupt

{

TL0 = 0xA4; //设置定时初值
TH0 = 0xFF; //设置定时初值

  if(t<mot1)

{

   ENA = 1;

}

  else

{

  ENA = 0;

}



if(t<mot2)

{

   ENB = 1;

}
 else

{

  ENB = 0;

}

t=(t+1)%100;

}

4.延时函数

延时函数,可以用单片机辅助软件(stc-isp),设定时间直接生成。

void delay(unsigned int k)

{

unsigned int x,y;

  for(x=0;x<k;x++)

  {

   for(y=0;y<2000;y++);

  }

}

5.循迹模块

void xunji()

{   

unsigned char flag; //用于循迹方向的判断

    if((lse1==1)&&(lse2==0))

    {

    flag=0; //左边检测到黑线

    }

    else if((lse1==0)&&(lse2==1))

    {

  flag=1; //右边检测到黑线

}

    else if((lse1==1)&&(lse2==1))
{

flag=3; //两边检测到黑线

}

else

{

  flag=4;

}

switch(flag)

{

case 0:leftrun(); break;

case 1:rightrun();break;

case 3:stop();break;

case 4:run();break;

}

}

6.主函数

void main()

{

PIT_Init();

mot1=13;

mot2=13;

    IN1=1;

    IN2=0;

    IN3=1;

    IN4=0;

while(1)

{

xunji() ;

}

}

六.注意事项

  1. 小车直走时,左右两轮mot赋值不一定相同,通过赋值尝试给与不同的数值,使小车达到直走的效果。
  2. 小车左右转弯时,若转速过大,可能会使小车转弯幅度过大;同理,若转速过小,可能会使小车转弯幅度过小,不能按轨迹行驶。
  3. 小车转弯可使一轮前行,另一轮停止实现;也可通过一轮正转,一轮反转实现。
  4. 左右两个红外传感器的距离,若小于两主动轮的距离,可能会导致小车循迹时压线,可通过延长传感器伸出的长度,避免小车压线。
  5. 红外传感器的检测距离,可通过调节传感器上的旋钮,观察检测黑线时指示灯亮灭情况,实现增大或减小检测距离的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页

打赏作者

超时空的喵

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值