目标:使智能小车沿如图路线行走
一,所需零件 1,车体,车轮
2,51单片机
3,驱动模块:LM298N
该模块可以同时给单片机和电机供电 驱动各部分的简介:输出A,B分别接左右马达,放大电流使马达工作, 单片机IO控制输入(即IN1-IN4):接单片机IO口,由单片机的程序控制电机正反转,PWM控制车速。
4,稳压模块
稳定电压到8伏,防止由于电压不稳定或超高造零件损坏。 5,循迹模块 光点循迹由四对红外收发管组成,通过检测接收到的反射光强,判断黑白线。当模块检测到黑线时指示灯熄灭,同时OUT口持续输出高电平信号,未检测到黑线的检测灯正常,OUT端输出低电平。检测灵敏度可以通过电位器调节。
6,电源模块
7,核心程序
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define uchar unsigned char
#define unit unsigned int
/*********定义电机方向*********/
#define left_qian IN1=0;IN2=1 //左边电机前进
#define left_hou IN1=1;IN2=0 //左边后退
#define right_qian IN3=0;IN4=1 //右边前进
#define right_hou IN3=1;IN4=0 //右边后退
#define stop IN1=1;IN2=1;IN3=1;IN4=1
/****循迹传感器端口定义****/
/****传感器位置****/
/*左2 左1 右1 右2*/
/* P27 P25 P24 P26*/
sbit IN1=P0^0;
sbit IN2=P0^1;
sbit IN3=P0^2;
sbit IN4=P0^3;
sbit left_2=P2^4; //左大信号
sbit left_1=P2^5; //左小信号
sbit righ_1=P2^6; //右小信号
sbit righ_2=P2^7; //右大信号
/* 电机驱动模块端口定义 */
sbit ENA=P0^4; //左使能
//sbit EN1=P0^1; //左方向1
//sbit EN2=P0^2; //左方向2
sbit ENB=P0^5; //右使能
//sbit EN3=P0^7; //右方向1
//sbit EN4=P0^6; //右方向2
uchar zkb_l=0; //左电机占空比
uchar zkb_r=0; //右电机占空比
uchar t=0; //定时器中断计数器
void Timer0Init()
{
TMOD=0X05;
TH0=0;
TL0=0;
ET0=1;//打开计数器0中断
EA=1;
TR0=1;
}
void Timer0() interrupt 1
{
static u16 i;
i=0;
while(i<4)
{
if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==1)&&(i<=3))
{
i++;
}
if(i=4)
{
zkb_l=50;
zkb_r=70;
left_hou;
right_qian;
}
}
}
void init_time0()
{
TMOD=0x01;
TH1=(65536-100)/256;
TL1=(65536-100)%256;
ET1=1;
TR1=1;
}
void delay (u16 i)
{
while(i--);
}
void tim0() interrupt 3
{
TH1=0xff;
TL1=0x9c;
if(t<zkb_l)ENA=1;
else ENA=0;
if(t<zkb_r)ENB=1;
else ENB=0;
t++;
if(t>100)t=0;
}
void xunji()
{
if((left_2==1)&&(left_1==0)&&(righ_1==0)&&(righ_2==0))
{
zkb_l=80;
zkb_r=100;
left_hou;
right_qian;
}
else if((left_2==1)&&(left_1==1)&&(righ_1==0)&&(righ_2==0))
{
delay(2000);
if((left_2==1)&&(left_1==1)&&(righ_1==0)&&(righ_2==0))
zkb_l=100;
zkb_r=100;
left_hou;
right_qian;
delay(38666);
}
else if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==0))
{
delay(2000);
if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==0))
zkb_l=100;
zkb_r=100;
left_hou;
right_qian;
delay(38666);
}
else if((left_2==0)&&(left_1==1)&&(righ_1==0)&&(righ_2==0))
{
zkb_l=50;
zkb_r=30;
left_qian;
right_qian;
}
else if((left_2==0)&&(left_1==0)&&(righ_1==0)&&(righ_2==0))
{
zkb_l=40;
zkb_r=40;
left_qian;
right_qian;
}
else if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==1))
{
stop;
}
else if((left_2==0)&&(left_1==0)&&(righ_1==1)&&(righ_2==0))
{
zkb_l=50;
zkb_r=30;
left_qian;
right_qian;
}
else if((left_2==0)&&(left_1==0)&&(righ_1==1)&&(righ_2==1))
{
delay(2000);
if((left_2==0)&&(left_1==0)&&(righ_1==1)&&(righ_2==1))
zkb_l=100;
zkb_r=100;
left_qian;
right_hou;
delay(38666);
}
else if((left_2==0)&&(left_1==1)&&(righ_1==1)&&(righ_2==1))
{
delay(2000);
if((left_2==0)&&(left_1==1)&&(righ_1==1)&&(righ_2==1))
zkb_l=100;
zkb_r=100;
left_qian;
right_hou;
delay(38666);
}
else if((left_2==0)&&(left_1==0)&&(righ_1==0)&&(righ_2==1))
{
zkb_l=100;
zkb_r=80;
left_qian;
right_hou;
}
else if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==1))
{
zkb_l=50;
zkb_r=50;
left_qian;
right_qian;
}
}
void main()
{
Timer0Init();
init_time0();
EA=1;
while(1)
{
xunji();
}
}
需要注意的是,小车需要在第四个干扰处转弯需要用到计数器中断,程序为
void Timer0Init()
{
TMOD=0X05;
TH0=0;
TL0=0;
ET0=1;//打开计数器0中断
EA=1;
TR0=1;
}
void Timer0() interrupt 1
{
static u16 i;
i=0;
while(i<4)
{
if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==1)&&(i<=3))
{
i++;
}
if(i=4)
{
zkb_l=50;
zkb_r=70;
left_hou;
right_qian;
}
}
}
上桥的一段路光敏是无法检测黑白的,需要其他程序控制小车行走
else if((left_2==1)&&(left_1==1)&&(righ_1==1)&&(righ_2==1))
{
zkb_l=50;
zkb_r=50;
left_qian;
right_qian;
}