材料:
(1)51单片机开发板
(2)l298n电机驱动模块1个
(3)四个电机
(4)寻迹红外2个
一、组装
(1)L298N电机驱动模块与开发板接线如下图:
寻迹红外接线:
说明:
红外一OUT接 单片机P1.5
红外二OUT接 单片机P1.4
代码:
如果速度过大,小车可能会甩出轨道,速度可调占空比降速度。
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
//电机控制管脚
sbit MOTOA=P1^0;
sbit MOTOB=P1^1;
sbit MOTOC=P1^2;
sbit MOTOD=P1^3;
//红外感应控制管脚
sbit Left_In=P1^4;
sbit Right_In=P1^5;
u16 time_cnt=0; //定时器中断计数次数
u16 freq=100; //频率
u8 duty_cycle=50; //占空比
//延时函数10*us(us)
void delay_10us(u16 us)
{
while(us--);
}
//ms延时函数ms
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
//定时器0初始化函数
//定时时间:0.1ms
void Time0_Init(void)
{
TMOD|=0x01;
TH0 = 0XFF;
TL0 = 0X9C; //定时0.1ms
TR0 = 1;
ET0 = 1;
EA = 1;
}
//主函数
void main()
{
Time0_Init();
while(1)
{
}
}
void Time0_Isr()
{
TR0 = 0; //关闭定时器
TH0 = 0XFF;
TL0 = 0X9C;
time_cnt++;
if(time_cnt>=freq)
time_cnt=0;
else if(time_cnt<=duty_cycle)
{
if((Left_In==0)&&(Right_In==0)) //左右红外没有检测到黑线--前进
{
MOTOA=1;
MOTOB=0;
MOTOC=1;
MOTOD=0;
}
else if((Left_In==1)&&(Right_In==0)) //左红外检测到黑线--左转
{
MOTOA=1;
MOTOB=0;
MOTOC=0;
MOTOD=1;
}
else if((Left_In==0)&&(Right_In==1)) //右红外检测到黑线--右转
{
MOTOA=0;
MOTOB=1;
MOTOC=1;
MOTOD=0;
}
else if((Left_In==1)&&(Right_In==1)) //左右红外检测到黑线--停止
{
MOTOA=0;
MOTOC=0;
MOTOB=0;
MOTOD=0;
}
}
else
{
if((Left_In==0)&&(Right_In==0)) //左右红外没有检测到黑线--前进
{
MOTOA=1;
MOTOB=0;
MOTOC=1;
MOTOD=0;
}
}
TR0 = 1; //开启定时器0
}