无需编程,DIY自己智能小车的Android蓝牙遥控软件(三)

本文介绍如何使用手机通过蓝牙DIY一个智能小车遥控器,利用Roll和Pitch数据控制小车,程序每300ms执行一次发送指令,并提供了错误处理。完成所有步骤后,下载生成的.apk安装到手机即可使用。
摘要由CSDN通过智能技术生成

可以用手机自测一下,这用我们只用Roll 和Pitch两个数据,当手机平置时,它们接近于0,当手机前翻或侧翻时,两个值分别在±90之间变化。利用这两个数据便可搭建传送蓝牙指令的程序了。

4、


我们把发送指令的程序段放在时钟里面,这里每300ms执行一次程序段:


5、

最后考虑一下当程序出错了要怎么办吧:


Final:

51单片机蓝牙小车的安卓软件 /**************************************************************************** 简单寻迹程序:接法 关于单片机电源:本店驱动模块内带LDO稳压芯片,当电池输入6V时时候可以输出稳定的5V 分别在针脚标+5 与GND 。这个输出电源可以作为单片机系统的供电电源。 注意: 本例程使用315无线遥控控制小车 1.315无线遥控同按键开关原理一摸一样 2.315无线遥控连线需要按照程序要求 D0 - P1.7 D1 - P1.6 D2 - P1.5 D3 - P1.4 VT - P1.3 3.如果小车转动方向不一直,请查看小车连线是否正常。 ****************************************************************************/ #include<AT89x51.H> #define Left_moto_pwm P1_0 //接驱动模块ENA 使能端,输入PWM信号调节速度 #define Right_moto_pwm P1_1 //接驱动模块ENB #define Left_1_led P2_0 //四路寻迹模块接口第一路 #define Left_2_led P2_1 //四路寻迹模块接口第二路 #define Right_1_led P2_2 //四路寻迹模块接口第路 #define Right_2_led P2_3 //四路寻迹模块接口第四路 #define Left_moto_Stop {P3_3=1,P3_4=1;} //P3_4 P3_5 接IN1 IN2 当 P3_4=1,P3_5=1; 时左电机停转 #define Right_moto_Stop {P3_5=1,P3_6=1;} //P3_5 P3_6 接IN1 IN2 当 P3_5=1,P3_6=0; 时右电机停转 #define Left_moto_go {P3_3=0,P3_4=1;} //P3_3 P3_4 接IN1 IN2 当 P3_3=0,P3_4=1; 时左电机前进 #define Left_moto_back {P3_3=1,P3_4=0;} //P3_3 P3_4 接IN1 IN2 当 P3_3=1,P3_4=0; 时左电机后退 #define Right_moto_go {P3_5=0,P3_6=1;} //P3_5 P3_6 接IN1 IN2 当 P3_5=0,P3_6=1; 时右电机前转 #define Right_moto_back {P3_5=1,P3_6=0;} //P3_5 P3_6 接IN1 IN2 当 P3_5=1,P3_6=0; 时右电机后退 #define beep P3_7 /************************************************************************/ #define uchar unsigned char #define uint unsigned int uchar a; uchar sendbuf[10]={0}; uchar revdbuf[10]={0}; #define LED_OPEN P2_3 uchar state = 0; uchar flag = 0; #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 #define STOP 5 void ser() interrupt 4 { // uint j; revdbuf[0]=SBUF; //收取数据 // beep = 0; switch(revdbuf[0]) { case 0x1f: state = UP; break; case 0x2f: state = DOWN; break; case 0x3f: state = LEFT; break; case 0x4f: state = RIGHT; break; case 0xa0: case 0xb0: case 0xc0: case 0xd0: state = STOP; } flag = 1; RI=0; } void SendDataUart(uchar *buf,uchar buflen) { uchar i; a=0; for (i=0;i<buflen;i++) { ES=0; //进入发送数据时先关闭串行中断 SBUF=buf[i]; //将数据原样发回 while(!TI); //等待数据发完 TI=0; ES=1; //退出进再开串行中断 } } void init() { TMOD=0X20; //设置定时器1为方式2 TH1=0xfd ; TL1=0xfd ; //装初值 TR1=1; //启动定时器1 REN=1; // 使能接收 SM0=0; SM1=1; //设置串口为工作方式1 EA=1; // 打开总中断开关 ES=1; // 打开串口中断开关 } //延时函数 void delay(unsigned int k) { unsigned int x,y; for(x=0;x<k;x++) for(y=0;y<2000;y++); } /************************************************************************/ //前速前进 void run(void) { Left_moto_go ; //左电机往前走 Right_moto_go ; //右电机往前走 } //前速后退 void backrun(void) { Left_moto_back ; //左电机往前走 Right_moto_back ; //右电机往前走 } //左转 void leftrun(void) { Left_moto_back ; //左电机往前走 Right_moto_go ; //右电机往前走 } //右转 void rightrun(void) { Left_moto_go ; //左电机往前走 Right_moto_back ; //右电机往前走 } //STOP void stoprun(void) { Left_moto_Stop ; //左电机往前走 Right_moto_Stop ; //右电机往前走 } void main() { init(); Left_moto_pwm = 1; Right_moto_pwm = 1; beep = 1; state = STOP; stoprun(); flag = 0; while(1) { if(flag == 1) { beep = 0; delay(30); beep = 1; flag = 0; } switch(state) { case UP: { sendbuf[0]=0x1f; sendbuf[1]=0x00; run(); } break; // 发送的是A 前进指令 case DOWN: { sendbuf[0]=0x2f; sendbuf[1]=0x00; backrun(); } break; // 发送的是B 右转指令 case LEFT: { sendbuf[0]=0x3f; sendbuf[1]=0x00; leftrun(); } break; // 发送的是C 左转指令 case RIGHT: { sendbuf[0]=0x4f; sendbuf[1]=0x00; rightrun(); } break; case STOP: { sendbuf[0]=0x00; sendbuf[1]=0x00; stoprun(); } break; //P2口是我的电机驱动的控制端 default: break; } } }
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值