基于51单片机的循迹模块和避障模块同时实现

        一开始我对于循迹和避障两个模块同时实现,想采用的办法是,利用中断的方法,将循迹模块作为主函数进行循环,然后将避障模块放进去中断里面,当判断到前方有障碍时,进行避障,无障碍时依旧进行循迹模块的进行。

        但是在测试中发现,这样尝试,只有避障模块可以正常使用,不知道是我们中断配置的问题还是本身会存在矛盾问题。于是我们采用了另外的一种想法,利用逻辑分析进行判断(如果和我一样是新手可以采用这种方法,会比较简单)。

以下是我的示例代码,如果是和我一样是新手的话,可以尝试一下像这样使用逻辑判断,进行实现两个模块同时实现,但是采用这种方法有缺点,在对于循迹和避障的识别和配合上可能不是运行起来,像使用操作系统那些那么丝滑,小车的行走可能不会像那样那么流畅。

void APP_Loop2(void)
{
	static unsigned char State = 0;//0-直行  1-刹车  2-后退  3-左拐
	static unsigned int Time=0;

	
	
	if(((Left_Flow==1) & (Right_Flow==1)) && ((Left_Flow1==1) | (Right_Flow1==1)))//没有检测到黑线同时没用检测到障碍物
	{
		Motor_Stop();
		Left_LED = 1;
		Right_LED = 1;
		return;
	}
	if((Left_Flow==1)&&((Left_Flow1==1) | (Right_Flow1==1)))//左边循迹检测到黑线,同时没有检测到障碍物
	{
		Motor_Right();
		Left_LED = 0;
		Right_LED = 1;
		return;
	}
	if((Right_Flow==1)&&((Left_Flow1==1) | (Right_Flow1==1)))//右边循迹检测到障碍物,同时没有检测到障碍物
	{
		Motor_Left();
		Left_LED = 1;
		Right_LED = 0;
		return;
	}
	
	if(((Left_Flow1==0) | (Right_Flow1==0)) & (State == 0))//遇到障碍物
	{
		State = 1;
		Time = 0;
	}
	
	Time++;
	
	switch(State)
	{
		case 1 :
			{
				Motor_Stop();
				if(Time > 50)
				{
					Time = 0;
					State = 2;
				}
				break;
			}
		case 2 :
			{
				Motor_Back();
				if(Time > 100)
				{
					Time = 0;
					State = 3;
				}
				break;
			}
		case 3 :
			{
				Motor_Left();
				if(Time > 200)
				{
					Time = 0;
					State = 0;
				}
				break;
			}		
		case 0 :
			{
				Motor_Forward();
				break;
			}		
		default:
			{
				;
			}		
	}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值