51单片机智能小车——红外避障

材料:

(1)51单片机开发板

(2)l298n电机驱动模块1个

(3)四个电机

(4)红外模块1个

一、组装

(1)L298N电机驱动模块与stm32开发板接线如下图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_17,color_FFFFFF,t_70,g_se,x_16

 

(2)红外接线

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_15,color_FFFFFF,t_70,g_se,x_16

VCC接开发板的3.3v~5v,GND接开发板的GND, OUT接单片机p3.1.

 main.c

#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 Forward_In=P3^1;	

//ms延时函数ms
void delay_ms(u16 ms)
{
	u16 i,j;
	for(i=ms;i>0;i--)
		for(j=120;j>0;j--);
}

//延时函数10*us(us)
void delay_10us(u16 us)
{
	while(us--);
}

void Car_ForwardRun(void)//前进
{
	MOTOA=1;
	MOTOB=0;
	MOTOC=1;
	MOTOD=0;	
}
void Car_BackwardRun(void)//后退
{
	MOTOA=0;
	MOTOB=1;
	MOTOC=0;
	MOTOD=1;	
}
void Car_LeftRun(void)//左转
{
	MOTOA=1;
	MOTOB=0;
	MOTOC=0;
	MOTOD=1;	
}
void Car_RightRun(void)//右转
{
	MOTOA=0;
	MOTOB=1;
	MOTOC=1;
	MOTOD=0;	
}
void Car_StopRun(void)//停止
{
	MOTOA=0;
	MOTOB=0;
	MOTOC=0;
	MOTOD=0;	
}

//定时器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)
	{
	
	}	
}
u16 bktime=0;
//定时器0中断函数
void Time0_Isr() interrupt 1
{
	TR0 = 0;	//关闭定时器0
	TH0 = 0XFF;
	TL0 = 0X9C;	//定时0.1ms
	time_cnt++;	
	if(time_cnt>=freq)		
		time_cnt=0;
	else if(time_cnt<=duty_cycle)
	{
		if(Forward_In==1)	//壁障红外传感器未检测到障碍物
		{
			Car_ForwardRun();//前进
			
		}
		else			  //壁障红外传感器检测到障碍物
		{
			bktime=700;
			while(bktime--)
			{
				Car_BackwardRun();//后退
				delay_10us(30);
				Car_StopRun();
				delay_10us(30);	
			}
			bktime=20;
			while(bktime--)
			{
				Car_LeftRun();/右转
				delay_ms(15);
				Car_StopRun();
				delay_ms(15);	
			}	
		}
		
	}		
	else
	{
		Car_StopRun();		
	}
	TR0 = 1;	//开启定时器0		
}

 

 

 

 

 

 

  • 6
    点赞
  • 132
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
51红外避障小车是一种基于51单片机智能小车,通过红外传感器实现避障功能。以下是一个简单的51红外避障小车的代码示例: ```c #include <reg51.h> sbit IN1 = P1^0; // 左电机正转 sbit IN2 = P1^1; // 左电机反转 sbit IN3 = P1^2; // 右电机正转 sbit IN4 = P1^3; // 右电机反转 sbit IR1 = P2^0; // 左侧红外传感器 sbit IR2 = P2^1; // 右侧红外传感器 void delay(unsigned int t) { unsigned int i, j; for(i = 0; i < t; i++) for(j = 0; j < 120; j++); } void main() { while(1) { if(IR1 == 0 && IR2 == 0) { // 左右都检测到障碍物 IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 0; } else if(IR1 == 0 && IR2 == 1) { // 左侧检测到障碍物 IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0; } else if(IR1 == 1 && IR2 == 0) { // 右侧检测到障碍物 IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0; } else { // 没有检测到障碍物 IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 0; } delay(10); // 延时一段时间后再次检测 } } ``` 这段代码使用了51单片机的GPIO口控制电机的正反转,通过红外传感器检测障碍物的存在与否,并根据检测结果控制小车的运动方向。具体逻辑如下: - 如果左右两侧的红外传感器都检测到障碍物,则停止电机运动; - 如果只有左侧的红外传感器检测到障碍物,则右电机正转,左电机停止; - 如果只有右侧的红外传感器检测到障碍物,则左电机正转,右电机停止; - 如果两侧的红外传感器都没有检测到障碍物,则左右电机都正转。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值