51单片机蓝牙循迹小车

51单片机蓝牙循迹小车


前言

基于蓝牙串口通信遥控小车,在程序中对红外感应端口进行监测,在蓝牙的控制,并在程序的判断下执行小车的运动方式。

提示:以下是本篇文章正文内容,下面案例可供参考

一、蓝牙模块、电机驱动模块、红外驱动模块的使用

1、使用HC-06蓝牙模块与单片机进行通信,手机下载SPP蓝牙串口助手,设置好相应的传输信息即可。
在这里插入图片描述

2、对于电机驱动模块和红外驱动模块选择了比较低端的,若使用其他的驱动模块修改相应端口即可。在这里插入图片描述

二、使用步骤

1.中断方式初始化

代码如下(示例):

void init()
{	
	SCON=0X50;		
	TMOD=0X20;			
	PCON=0X00;		
	TH1=0Xfd;		    
	TL1=0Xfd; 
	TR1= 1;					
	ES = 1;        
   EA = 1;         
}

2.中断子程序

在CPU接受中断申请后进入中断子程序,根据接收到的SBUF寄存器内的数据设置运动方式标志flag。
代码如下(示例):

void run(void) interrupt 4
{
	uchar rd;	
	EA = 0;
	if(RI == 1) 
	{ 
		RI=0; 
		rd = SBUF;
		switch(rd)
		{
			case 1:
				flag=1;
			  break;
			case 2:
				flag=2;
				break;
			case 3:
				LED7 = 0;
				flag=3;
				break;
			case 4:
				LED8 = 0;
				flag=4;
				break;
			case 5:
				all_full();
				flag=5;
			break;
			case 0:
				all_full();
				flag=0;
			break;

		}			
	}		
		EA = 1;
}

2.电机驱动

根据在中断中设置的运动方式标志flag,判断小车是前进、后退、左转、右转、停止还是进行循迹;

代码如下(示例):

void xunji()
{
	if(flag==0)
	{
		stop();
	}else if(flag==1)
	{
		forward();
	}else if(flag==2)
	{
		back();
	}else if(flag==3)
	{
		left();
	}else if(flag==4)
	{
		right();
	}else if(flag==5)
	{
		if(IN1==1)
		{
			right();
		}else if(IN2==1)
					{
						left();
					}else
					{
						forward();
					}
	}
		

}

总结

蓝牙循迹小车用到的单片机资源不断,程序逻辑结构较为简单,以供大家参考。

整体代码如下:



#include<reg52.h>

#define uchar unsigned char
#define uint  unsigned int


//电机驱动端口
sbit R1=P1^0;
sbit R2=P1^1;
sbit L1=P1^2;
sbit L2=P1^3;

//接红外探测器器的端口
sbit IN1=P1^4;
sbit IN2=P1^5;

sbit LED7 = P1^6;
sbit LED8 = P1^7;

int flag;//小车运动方式标志
//信号的全灭
void all_full()
{
	LED7 = 1;
	LED8 = 1;
	}
//小车直行
void forward()
{
		R1=1;
		R2=0;
		L1=0;
		L2=1;
}
//小车左转
void right()
{
	R1=0;
	R2=1;
	L1=0;
	L2=1;
}
//小车右转
void left()
{
	R1=1;
	R2=0;
	L1=1;
	L2=0;
}
//小车后退
void back()
{
	R1=0;
	R2=1;
	L1=1;
	L2=0;
}
//小车停止
void stop()
{
	R1=0;
	R2=0;
	L1=0;
	L2=0;
}
//根据蓝牙接收的信息判断小车状态
void xunji()
{
	if(flag==0)
	{
		stop();
	}else if(flag==1)
	{
		forward();
	}else if(flag==2)
	{
		back();
	}else if(flag==3)
	{
		left();
	}else if(flag==4)
	{
		right();
	}else if(flag==5)
	{
		if(IN1==1)
		{
			right();
		}else if(IN2==1)
					{
						left();
					}else
					{
						forward();
					}
	}
		

}
//中断子程序
void run(void) interrupt 4
{
	uchar rd;	
	EA = 0;
	if(RI == 1) 
	{ 
		RI=0; 
		rd = SBUF;
		switch(rd)
		{
			case 1:
				flag=1;
			  break;
			case 2:
				flag=2;
				break;
			case 3:
				LED7 = 0;
				flag=3;
				break;
			case 4:
				LED8 = 0;
				flag=4;
				break;
			case 5:
				all_full();
				flag=5;
			break;
			case 0:
				all_full();
				flag=0;
			break;

		}			
	}		
		EA = 1;
}
//串口初始化
void init()
{	
	SCON=0X50;		
	TMOD=0X20;			
	PCON=0X00;		
	TH1=0Xfd;		    
	TL1=0Xfd; 
	TR1= 1;					
	ES = 1;        
   EA = 1;         
}


void main()
{
	init();	
	while(1)
	{
		xunji();
	}
}
  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值