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();
}
}