基于51单片机智能小车循迹功能的实现

说明:本博客来自本人CSDN博客

点击跳转本人csdn博客
点击跳转本人个人网站

一、思路(仅供参考)

本实验采用两路红外循迹模块单黑线循迹的方法。当红外循迹模块未检测到黑线,则前进;若一边检测到黑线,则实现转弯;若两边均检测到黑线,则停止。利用两路红外循迹模块接收到的信号控制电机的运动,实现小车的前进,转弯等运动。

二、部分硬件模块介绍

1、L298n电机驱动模块

图片名称

2、两路红外循迹模块

背面

图片名称

正面
--------------------(黄色的旋钮是用来调节灵敏度的)-----------------------------

图片名称

三、实现

1、代码

(1)、函数部分

#include <reg52.h>
#include "header.h"


void Left_forward()//左轮前转
{
	Left_1=0;
 	Left_2=1;

}
void Left_back()//左轮后转
{
	Left_1=1;
 	Left_2=0;
}
void Left_stop()左轮停止(刹车)
{
	Left_1=1;
	Left_2=1;
}


void Right_forward()//右轮前转
{
	Right_1=1;
	Right_2=0;

}
void Right_back()//右轮后转
{
	Right_1=0;
	Right_2=1;
}
void Right_stop()//右轮停止
{
	Right_1=1;
	Right_2=1;
}


void Forward_run()//前进
{
	Left_forward();
	Right_forward();
}

void Back_run()//后退
{
	Left_back();
	Right_back();
}

void Left_run()//边前进边左转
{
 
	Left_stop();
    Right_forward();
}

void Right_run()//边前进边右转
{
	Left_forward();
	Right_stop();
}
void Stop_run()//停止(刹车)
{
	Left_stop();
	Right_stop();
}
void Stop_Left_run()//原地左转
{
	Left_back();
	Right_forward();
}
void Stop_Right_run()//原地右转
{
	Left_forward();
	Right_back();
}
void PWM_left_motor()//左轮pwm调速
{
	if(Left_motor_var<Left_cycle)
	{
 		if(Left_motor_var<=Left_H)
			ENA=1;
		else
			ENA=0;
	}
	else
	{
		Left_motor_var=0;
	}
}

void PWM_right_motor()//右轮pwm调速
{
	if(Right_motor_var<Right_cycle)
	{
 		if(Right_motor_var<=Right_H)
			ENB=1;
		else
			ENB=0;
	}
	else//(Right_moto_var>=Right_cycle)
	{
		Right_motor_var=0;
	}
}



void Init_timer0()
{
	TMOD=0x01;			//定时器0方式1
	TH0=(65536-100)/256; //100微秒
	TL0=(65536-100)%256;
	EA=1;
	ET0=1;
	TR0=1;
}

void Follow_Function()//循迹函数
{
	if(Left_reaction==0&&Right_reaction==0)//左右均为检测到黑线(有信号返回)
		Forward_run();
	else
	{
	if(Left_reaction==1&&Right_reaction==1)//左右无信号返回,均检测到黑线
		Stop_run();
	if(Left_reaction==0&&Right_reaction==1)	//右边检测到黑线,右转
		Stop_Right_run();	
	if(Left_reaction==1&&Right_reaction==0)//左转
		 Stop_Left_run();
		 }
}
void Delay_1ms(uint k)		
{
	unsigned char i, j;
	while(k--)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		}
		while (--i);
	}
}

(2)、头文件

#ifndef __header_H
#define __header_H
#include<intrins.h>
typedef unsigned int uint;
/*L298n电机驱动模块*/
sbit Left_1=P1^2;
sbit Left_2=P1^3;
sbit Right_1=P1^4;
sbit Right_2=P1^5;
sbit ENA=P1^0;
sbit ENB=P1^1;
/*红外循迹模块R0、L0*/
sbit Left_reaction=P3^6;
sbit Right_reaction=P3^7;

extern uint Left_motor_var;//用于左电机周期计数
extern uint Left_H;		//左电机高电平,用于计算占空比
extern uint Right_motor_var;
extern uint Right_H;
extern uint Left_cycle;//左电机周期
extern uint Right_cycle;
void Left_forward();
void Left_back();
void Left_stop();
void Right_forward();
void Right_back();
void Right_stop();
void Forward_run();
void Back_run();
void Left_run();
void Right_run();
void Stop_run();
void Stop_Left_run();
void Stop_Right_run();
void PWM_left_motor();
void PWM_right_motor();
void Init_timer0();
void Follow_Function();
void Delay_1ms(uint k);
#endif

(3)、主函数

#include <reg52.h>
#include "header.h"

uint Left_motor_var=0;
uint Left_H=100;
uint Right_motor_var=0;
uint Right_H=100;
uint Left_cycle=100;
uint Right_cycle=100;

void main()
{
	Init_timer0();
	while(1)
	{
		Follow_Function();
	}
}
void timer_t0()interrupt 1
{
	TH0=(65536-100)/256;
	TL0=(65536-100)%256;
	Left_motor_var++;
	Right_motor_var++;
	PWM_left_motor();
	PWM_right_motor();
}

2、运行视频

(建议调小音量再观看)
点击前往查看视频资源

四、总结

第一次做小车,感觉只要搞懂各个模块的实现的原理,做起来就轻松了很多。
文章比较简洁,不足之处,还望指出。

posted @ 2023-04-15 18:12  KeepForwoard  阅读(226)  评论(0编辑  收藏  举报