手机蓝牙遥控智能小车Word格式.docx
《手机蓝牙遥控智能小车Word格式.docx》由会员分享,可在线阅读,更多相关《手机蓝牙遥控智能小车Word格式.docx(18页珍藏版)》请在冰点文库上搜索。
三﹑功能说明
1超声波避障:
利用单片机从控制口发一个10US以上的高电平,就可以在接收口等待高电平输出,一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此
次测距的时间,方可算出距离,如果距离小于设定的值小车采取转弯避障。
2蓝牙遥控:
手机连接小车,通过上位机发送命令控制小车。
四﹑操作说明
1接通电源,打开单片机系统板开关,程序初始化开始。
2打开手机蓝牙,打开遥控软件界面如图1-1,等待和小车连接成功(蓝牙红色指示灯不再闪烁)。
3等待LCD1602界面显示selectafunction字样,第一次按键
小车开启手机蓝牙遥控功能,按下操作界面(图1-1)对应按键小车即执行相应动作。
第一次按键
小车开启超声波避障功能此时小车自动前进,并遇到障碍物自动躲开,在执行避障过程中按键
小车停止避障停在原地,再一次按键
小车继续执行避障功能。
图1-1
五﹑注意事项
1电池正负极严禁接反。
2严禁乱改动线路。
3严禁卡死轮胎以免烧毁电机。
4严禁小车从高处掉下。
5两个功能之间切换需要复位单片机。
6小车严禁沾到水。
7手机软件在附带U盘中。
附源程序一份:
#include<
REGX51.H>
#defineucharunsignedchar
#defineuintunsignedint
#defineGPIOP2//液晶数据输入口
uchara,bai,shi,ge,int0,int1;
uinttime,dist;
sbitLCDE=P3^5;
//液晶使能端
sbitRW=P3^6;
//写入数据与命令选择端
sbitRS=P3^7;
//读写选择端
sbitFLMA=P0^0;
//电机逻辑电压接口
sbitFLMB=P0^1;
sbitFRMA=P0^2;
sbitFRMB=P0^3;
sbitBLMA=P0^4;
sbitBLMB=P0^5;
sbitBRMA=P0^6;
sbitBRMB=P0^7;
sbittrig=P1^0;
//触发控制信号输入
sbitecho=P1^1;
//回响信号输出
ucharcodewel[]="
Welcomeyouto"
;
//14欢迎
ucharcodeexp[]="
experience!
!
"
//13体验
ucharcodeini[]="
Initialize..."
//16初始化
ucharcodexup[]="
XuPengMade"
//16徐鹏制作
ucharcodesel[]="
Selectfunction"
//15选择功能
ucharcodebul[]="
BluetoothControl"
//16蓝牙控制
ucharcodeavo[]="
Avoidobstacle"
//16避障
ucharcodedis[]="
Dist:
//6距离
ucharcodefow[]="
Forward"
//14前进
ucharcodebac[]="
Back"
//14后退
ucharcodetul[]="
Turnleft"
//14左转
ucharcodetur[]="
Turnright"
//14右转
ucharcodesto[]="
Stop"
//14停止
voiddelay_20us()//延时20us
{
uchara;
for(a=0;
a<
20;
a++);
}
voidforward()//前进
FLMA=1;
FLMB=0;
FRMA=1;
FRMB=0;
BLMA=1;
BLMB=0;
BRMA=1;
BRMB=0;
voidback()//后退
FLMA=0;
FLMB=1;
FRMA=0;
FRMB=1;
BLMA=0;
BLMB=1;
BRMA=0;
BRMB=1;
voidturnleft()//左转
voidturnright()//右转
voidstop()//停止
voidcl()interrupt4//串口中断函数
RI=0;
a=SBUF;
//上位机为16进制
}
voidtimer0(void)interrupt1//定时器0中断函数
TH0=0;
TL0=0;
voidinit_wai0()interrupt0//外部中断0函数
int0=1;
voidinit_wai1()interrupt2//外部中断1函数
int1=1;
voidcheck()//超声波检测函数
trig=1;
delay_20us();
trig=0;
while(echo==0);
TR0=1;
ET0=1;
while(echo==1);
TR0=0;
ET0=0;
time=TH0*256+TL0;
//计算时间
TF0=0;
dist=(time*1.7)/100;
//计算距离
voidDelay1ms(unsignedinta)//延时1ms函数
unsignedinti,j;
for(i=a;
i>
0;
i--)
for(j=110;
j>
j--);
voidLCDCom(unsignedcharcom)//LCD写入命令函数
RW=0;
RS=0;
GPIO=com;
Delay1ms(10);
LCDE=1;
LCDE=0;
voidLCDwriteDate(unsignedchardat)//LCD写入数据函数
RS=1;
GPIO=dat;
voidLCDInit()//LCD初始化函数
LCDCom(0x38);
LCDCom(0x0c);
LCDCom(0x06);
LCDCom(0x01);
voidmain()//主函数
uchari;
PCON=0x00;
//波特率不加倍
SCON=0x50;
//设置串口工作方式为1
TMOD=0x21;
//定时器T1工作方式2,定时器T0工作方式1
TH1=0xfd;
//定时器初值:
9600波特率
TL1=0xfd;
//付初值
TR1=1;
//启动定时器1
IT0=1;
//外部中断0下降沿触发
IT1=1;
//外部中断1下降沿触发
EX0=1;
//开外部中断0
EX1=1;
//开外部中断1
EA=1;
//开中断
ES=1;
//允许串口中断
PT0=1;
//定时器0中断优先级最高
LCDInit();
LCDCom(0x80);
for(i=0;
i<
14;
i++)
{
LCDwriteDate(wel[i]);
}
LCDCom(0x80+0x40);
13;
LCDwriteDate(exp[i]);
Delay1ms(2000);
16;
LCDwriteDate(ini[i]);
LCDwriteDate(xup[i]);
15;
LCDwriteDate(sel[i]);
while
(1)
if(a==0x0e)
{
LCDCom(0x80);
for(i=0;
{
LCDwriteDate(bul[i]);
}
while
(1)
{
switch(a)
case0x0e:
{forward();
Delay1ms(70);
LCDCom(0x80+0x40);
for(i=0;
{
LCDwriteDate(fow[i]);
}
}break;
//前
case0x0c:
{back();
LCDwriteDate(bac[i]);
}
}break;
//后
case0x0b:
{turnleft();
LCDwriteDate(tul[i]);
//左
case0x09:
{turnright();
LCDwriteDate(tur[i]);
//右
case0x04:
{stop();
LCDwriteDate(sto[i]);
//停
default:
break;
if((int0==1)||(int1==1)||((int0==1)&
&
(int1==0))||((int0==0)&
(int1==1)))
int0=0;
int1=0;
LCDCom(0x80+0x40+0x0E);
LCDwriteDate('
N'
);
LCDCom(0x80+0x40+0x0F);
P'
elseif((int0==0)&
(int1==0))
H'
}
}
elseif(a==0x0c)
LCDwriteDate(avo[i]);
LCDCom(0x80+0x40);
6;
LCDwriteDate(dis[i]);
check();
if(dist<
=40)
{
stop();
Delay1ms(400);
back();
Delay1ms(600);
turnright();
forward();
}
if(a==0x04)
stop();
else{forward();
bai=dist/100;
shi=dist%100/10;
ge=dist%10;
LCDCom(0x80+0x46);
LCDwriteDate('
0'
+bai);
Delay1ms(10);
LCDCom(0x80+0x47);
+shi);
LCDCom(0x80+0x48);
+ge);
LCDCom(0x80+0x49);
c'
LCDCom(0x80+0x4A);
m'
LCDCom(0x80+0x4B);
'
LCDCom(0x80+0x4C);
LCDCom(0x80+0x4D);
LCDCom(0x80+0x4E);
LCDCom(0x80+0x4F);
}