硬件驱动
- 初始化
拿到蓝牙模块先将其串口与电脑连接,波特率一般默认为9600,由于我用的是12M的晶阵,产生9600的波特率精度不行所以用4800的波特率。通过电脑串口调式助手发送AT指令修改蓝牙模块的波特率为4800,这些指令在资料里应该都有。(指令之后还有个回车)
AT+BAUD3
- 然后接贴下面代码烧到单片机上去观察相应输出IO的电平看是否正确完事,再按照备注上的说明搭建小车就完美执行(电机驱动用的L289N)
#include "reg52.h"
#include<intrins.h>
#define control P0
typedef unsigned int u16;
typedef unsigned char u8;
sbit LED = P2^4;
sbit motor1=P2^0;
sbit motor2=P2^1;
sbit motor3=P2^2;
sbit motor4=P2^3;
u8 recv[50];
u8 count=0,length=0;
u16 time=0;
u16 speed=50;
u8 state=4;
void delay(u16 i)
{
while(i--);
}
void init()
{
char *a="at+namehardy\r\n";
char *b="at+UUID0xFFE0\r\n";
char *c="at+char0xFFE1\r\n";
TMOD = 0x21;
SCON = 0x50;
PCON = 0X80;
TL1 = 0XF3;
TH1 = 0XF3;
TR1 = 1;
TH0 = 0x0FF;
TL0 = 0x0A4;
ET0 = 1;
TR0 = 1;
IT0=1;
EX0=1;
EA = 1;
ES = 0;
delay(50000);
while(*a!='\0')
{
SBUF=*a;
while(!TI);
TI=0;
a++;
}
delay(50000);
while(*b!='\0')
{
SBUF=*b;
while(!TI);
TI=0;
b++;
}
delay(50000);
while(*c!='\0')
{
SBUF=*c;
while(!TI);
TI=0;
c++;
}
ES = 1;
}
void PWM(){
if(time>100)
{
time=0;
}
if(time <speed)
{
motor1=1;
motor2=1;
motor3=1;
motor4=1;
}
else
{
motor1=0;
motor2=0;
motor3=0;
motor4=0;
}
}
void send(char *str)
{
ES=0;
while(*str!='\0')
{
SBUF=*str;
while(!TI);
TI=0;
str++;
}
ES=1;
}
char* getspeed(){
if(speed<20){
return (char*)"speed:1";
}
if(speed>=20&&speed<40){
return (char*)"speed:2";
}
if(speed>=40&&speed<60){
return (char*)"speed:3";
}
if(speed>=60&&speed<80){
return (char*)"speed:4";
}
if(speed>=80){
return (char*)"speed:5";
}
return "error";
}
char* getstate(){
if(state==0){
return (char*)"go";
}
if(state==1){
return (char*)"back";
}
if(state==2){
return (char*)"trun left";
}
if(state==3){
return (char*)"trun right";
}
if(state==4){
return (char*)"stop";
}
if(state==5){
return (char*)"speed:5";
}
if(state==6){
return (char*)"speed:5";
}
return "error";
}
void forword(){
motor1=1;
motor2=1;
motor3=1;
motor4=1;
control=0x55;
state = 0;
send(getstate());
}
void back(){
motor1=1;
motor2=1;
motor3=1;
motor4=1;
control=0xAA;
state = 1;
send(getstate());
}
void trunLeft(){
motor1=0;
motor2=1;
motor3=0;
motor4=1;
control=0x55;
state = 2;
send(getstate());
}
void trunRight(){
motor1=1;
motor2=0;
motor3=3;
motor4=0;
control=0x55;
state = 3;
send(getstate());
}
void stop(){
motor1=0;
motor2=0;
motor3=0;
motor4=0;
state = 4;
LED=1;
send(getstate());
}
void trunOnLight(){
char *error = "light on";
send(error);
LED = 0;
_nop_();
_nop_();
_nop_();
LED = 1;
}
void acce(){
if(speed<100){
speed = speed+10;
}
send(getspeed());
}
void slow(){
if(speed>0){
speed = speed-10;
}
send(getspeed());
}
void other(){
char *error = "error";
send(error);
}
void main()
{
init();
motor1=0;
motor2=0;
motor3=0;
motor4=0;
control=0xff;
LED = 1;
P1=0xFF;
while(1)
{
if(length != 0){
switch(recv[0]){
case 'f': forword();break;
case 'b': back();break;
case 'l': trunLeft();break;
case 'r': trunRight();break;
case 's': stop();break;
case 'o':trunOnLight();break;
case 'c':acce();break;
case 'w':slow();break;
default:other(); break;
}
length=0;
}
if(state==0||state==1){
PWM();
}
}
}
void ex0() interrupt 0
{
if(P1 != 0xFF){
if(P1 == 0xFE){
forword();
}
if(P1 == 0xFD){
back();
}
if(P1 == 0xFB){
trunLeft();
}
if(P1 == 0xF7){
trunRight();
}
if(P1 == 0xEF){
stop();
}
P1 = 0xFF;
}
}
void Time0(void) interrupt 1
{
TH0 = 0x0FF;
TL0 = 0x0A4;
time++;
}
void rev() interrupt 4
{
char res;
res=SBUF;
RI = 0;
if(res == 35){
length=count;
count = 0;
}
else{
if(res == 36){
length=0;
count = 0;
}
else{
recv[count]=res;
count++;
}
}
}
手机客户端——微信小程序
- 客户端需要很麻烦的蓝牙连接过程,已经全部写好了直接调用接收和发送函数就可以了。代码上千行就不帖了,Gitee地址https://gitee.com/eedui/xiaoche