手机蓝牙遥控智能小车docx.docx
《手机蓝牙遥控智能小车docx.docx》由会员分享,可在线阅读,更多相关《手机蓝牙遥控智能小车docx.docx(17页珍藏版)》请在冰点文库上搜索。
手机蓝牙遥控智能小车docx
模块化手机蓝牙遥
控、超声波避障及人体
检测智能小车
说
明
书
实用发明协会:
徐鹏王鹏
一、小车说明
1小车采用传统51单片机控制,能实现手机蓝牙遥控、超声波避障及人体检测功能,各种状态能在LCD1602液晶屏上直观的显示出来。
2小车地盘采用四个直流电机驱动,装有蓝牙模块一个、超声波模块一个、单片机系统板一块、STC89C52RC单片机一块
电池一块、LCD1602液晶屏一块、L9110电机驱动模块两块、稳压模块一块、人体红外传感器模块两块及装饰LED。
二、模块说明
1蓝牙模块:
核心模块使用HC-06从模块,接口电平3.3V,可以直接连接各种单片机,配对以后当全双工串口使用,仅支持8位数据位、1位停止位、无奇偶校验的通信格式,自身的TXD直接连接到单片机RXD,RXD接单片机TXD。
2超声波模块:
使用电压5V,静态电流小于2mA,电平输出高5V低0V,感应角度不大于15度,探测距离2cm-450cm。
3STC89C52RC:
STC89C52RC是STC公司生产的一种低功耗、高性能CM0S8位微控制器,具有以下标准功能:
8k字节
Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
另外STC89X52可降至OHz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选。
4L9110电机驱动模块:
模块供电电压2.5-12V,电机工作电压2.5V-12V之间,最大工作电流0.8A,可以同时驱动2个直流电机,或者1个4线2相式步进电机。
通过单片机给逻辑电压从而控制直流电机的正反转。
5LM2596S稳压模块:
输入直流电压3V至40V,输出直流电压1.5V至35V电压连续可调,高效率最大输出电流为3A。
使用SANY(固态电容,高Q值大功率电感。
6单片机系统板:
全部引出PO、P1、P2及P3接口,P0带上拉电阻,有5V电源接口,12MHz晶振,有RXDTXDGN取口方便STC单片机的串口下载,有ATMEHSP下载端口,方便AT89S系列单片机下载,单片机紧锁座方便更换单片机。
7人体红外传感器模块:
HC-SR50热释电红外传感器是一种能
检测人或动物发射的红外线而输出电信号的传感器,工作电压
5v-20v之间,它由陶瓷氧化物或压电晶体元件组成在元件两个表面做成电极,在传感器监测范围内温度有AT的变化时,热释
电效应会在两个电极上会产生电荷AQ,即在两电极之间产生一
微弱的电压AVo
三、功能说明
1超声波避障:
利用单片机从控制口发一个10US以上的高电
平,就可以在接收口等待高电平输出,一有输出就可以开定时器
计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离,如果距离小于设定的值小车采取转弯避障。
2蓝牙遥控:
手机连接小车,通过上位机发送命令控制小车。
四、操作说明
1接通电源,打开单片机系统板开关,程序初始化开始。
2打开手机蓝牙,打开遥控软件界面如图1-1,等待和小车连
接成功(蓝牙红色指示灯不再闪烁)。
3等待LCD1602界面显示selectafunction字样,第一次按键
小车开启手机蓝牙遥控功能,按下操作界面(图1-1)对
后退
应按键小车即执行相应动作。
第一次按键小车开启超声波
避障功能此时小车自动前进,并遇到障碍物自动躲开,在执行避
障过程中按键二二小车停止避障停在原地,再一次按键一上一小车继续执行避障功能。
图1-1
五、注意事项
1电池正负极严禁接反。
2严禁乱改动线路。
3严禁卡死轮胎以免烧毁电机。
4严禁小车从高处掉下。
5两个功能之间切换需要复位单片机。
6小车严禁沾到水。
7手机软件在附带U盘中。
附源程序一份:
#include
#defineucharunsignedchar
#defineuintunsignedint#defineGPIOP2
uchara,bai,shi,ge,int0,int1;uinttime,dist;
sbitLCDE=P3八5;
sbitRW=P3A6;
sbitRS=P3A7;
sbitFLMA=P0A0;
sbitFLMB=P0A1;
sbitFRMA=P0A2;
sbitFRMB=P0A3;
sbitBLMA=P0A4;
sbitBLMB=P0A5;
sbitBRMA=P0A6;
sbitBRMB=P0A7;
sbittrig=P1A0;
sbitecho=P1A1;
ucharcodeavoucharcodedis[ucharcodefowucharcodebacucharcodetul[]="Turnleftucharcodetur[]="Turnrightucharcodesto[]="Stopvoiddelay_20us()
{
uchara;
for(a=0;a<20;a++);}
voidforward()
{
FLMA=1;
FLMB=0;
//液晶数据输入口
//液晶使能端
//写入数据与命令选择端
//读写选择端
//电机逻辑电压接口
//触发控制信号输入//回响信号输出
//14欢迎
//13体验
//16初始化
//16徐鹏制作
//15选择功能//16蓝牙控制//16避障//6距离//14前进//14后退//14左转//14右转//14停止
//延时20us
//前进
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(){
FLMA=0;
FLMB=1;
FRMA=1;
FRMB=0;
BLMA=0;
BLMB=1;
BRMA=1;
BRMB=0;}voidturnright(){
FLMA=1;
FLMB=0;
FRMA=0;
FRMB=1;
BLMA=1;
BLMB=0;
BRMA=0;
BRMB=1;}voidstop(){
FLMA=0;
FLMB=0;
FRMA=0;
FRMB=0;
BLMA=0;
BLMB=0;
//后退
//左转
//右转
//停止
//串口中断函数
//上位机为16进制
//定时器0中断函数
//外部中断0函数
//外部中断1函数
//超声波检测函数
//计算时间
//计算距离
//延时1ms函数
BRMA=0;
BRMB=0;
voidcl()interrupt4
{
RI=0;
a=SBUF;
}
voidtimer0(void)interrupt1
{
TH0=0;
TL0=0;
}
voidinit_wai0()interrupt0
{
int0=1;
}
voidinit_wai1()interrupt2
{
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;
TH0=0;
TL0=0;
TF0=0;
dist=(time*1.7)/100;
}
voidDelay1ms(unsignedinta)
unsignedinti,j;
//LCD写入命令函数
//LCD写入数据函数
//LCD初始化函数
for(i=a;i>0;i--)for(j=110;j>0;j--);
}
voidLCDCom(unsignedcharcom)
{
RW=0;
RS=0;
GPIO=com;
Delay1ms(10);
LCDE=1;
Delay1ms(10);
LCDE=0;
}
voidLCDwriteDate(unsignedchardat){
RS=1;
RW=0;
GPIO=dat;
Delay1ms(10);
LCDE=1;
Delay1ms(10);
LCDE=0;
}
voidLCDInit()
{
LCDCom(0x38);
LCDCom(0x0c);
LCDCom(0x06);
LCDCom(0x01);
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);
for(i=0;i<13;i++)
{
LCDwriteDate(exp[i]);
}
Delay1ms(2000);
LCDCom(0x01);
LCDCom(0x80);
for(i=0;i<16;i++)
{
LCDwriteDate(ini[i]);
}
LCDCom(0x80+0x40);
for(i=0;i<16;i++)
{
LCDwriteDate(xup[i]);
}
Delay1ms(2000);
LCDCom(0x80);
for(i=0;i<15;i++)
{
LCDwriteDate(sel[i]);
}
while
(1)
{
if(a==0x0e)
{
LCDCom(0x80);
for(i=0;i<16;i++)
{
LCDwriteDate(bul[i]);
}
while
(1)
{
switch(a)
{
case0x0e:
{forward();
Delay1ms(70);
LCDCom(0x80+0x40);for(i=0;i<14;i++)
{
LCDwriteDate(fow[i]);
}break;//前
case0x0c:
{back();
Delay1ms(70);
LCDCom(0x80+0x40);for(i=0;i<14;i++)
{
LCDwriteDate(bac[i]);
}
}break;//后
case0x0b:
{turnleft();
Delay1ms(70);
LCDCom(0x80+0x40);for(i=0;i<14;i++)
{
LCDwriteDate(tul[i]);
}
}break;//左
case0x09:
{turnright();
Delay1ms(70);
LCDCom(0x80+0x40);for(i=0;i<14;i++)
{
LCDwriteDate(tur[i]);
}
}break;//右
case0x04:
{stop();
Delay1ms(70);
LCDCom(0x80+0x40);for(i=0;i<14;i++)
{
LCDwriteDate(sto[i]);
}}break;//停
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);
LCDwriteDate('P');
}
elseif((int0==0)&&(int1==0))
{
LCDCom(0x80+0x40+0x0E);
LCDwriteDate('H');
LCDCom(0x80+0x40+0x0F);
LCDwriteDate('P');
}
}
}
elseif(a==0x0c)
{
LCDCom(0x80);
for(i=0;i<16;i++)
{
LCDwriteDate(avo[i]);
}
LCDCom(0x80+0x40);for(i=0;i<6;i++)
{
LCDwriteDate(dis[i]);
}
while
(1)
{
check();
if(dist<=40)
stop();
Delay1ms(400);back();
Delay1ms(600);turnright();
Delay1ms(400);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);
LCDwriteDate('0'+shi);
LCDCom(0x80+0x48);
LCDwriteDate('0'+ge);Delay1ms(10);
LCDCom(0x80+0x49);
LCDwriteDate('c');
LCDCom(0x80+0x4A);
Delay1ms(10);
LCDwriteDate('m');
LCDCom(0x80+0x4B);
LCDwriteDate('');
Delay1ms(10);
LCDCom(0x80+0x4C);
LCDwriteDate('');Delay1ms(10);
LCDCom(0x80+0x4D);
LCDwriteDate('');
Delay1ms(10);
if((int0==1)||(int1==1)||((int0==1)&&(int1==0))||((int0==0)&&(int1==1)))
{
int0=0;
int1=0;
LCDCom(0x80+0x4E);
LCDwriteDate('N');
LCDCom(0x80+0x4F);
LCDwriteDate('P');
}elseif((int0==0)&&(int1==0))
LCDCom(0x80+0x40+0x0E);LCDwriteDate('H');
LCDCom(0x80+0x40+0x0F);
}
}
}
}
LCDwriteDate('P');