1、和单片机的接线方式:与《L9110S电机驱动模块》一节中的连接方式一致
2、信号传递路线:
3、串口控制策略:
电机指令 | 默认停止:“STOP” | 前进:“M1” | 后退:“M2” | 左前方转:“M3” | 右前方转:“M4” | 左后方转:“M5” | 右后方转:“M6” |
判断方法:在小车不同方向的控制中,我们的有效指令的关键字眼的第一个字符都是'M',所以我们这里使用了switch语句来进行判断。格式如下:
if(serial_buffer[0]=='M'){
switch(serial_buffer[1]){
case '1':
break;
case '2':
break;
case '3':
break;
case '4':
break;
case '5':
break;
case '6':
break;
default :
stop();
break;
}
}
注意事项:在串口中断程序中需要注意memset()函数的书写位置,应该把memset()函数写在switch语句之中,而不是switch语句之后。否则会出现如下BUG:一个相同的指令需要发送两遍,单片机才会响应,只发送一遍指令是没有反应的。
4、主程序:【项目工程文件夹】
#include "reg52.h"
#include "motor.h"
#include "delay.h"
#include "uart.h"
void main(void)
{
UartInit();
while(1){
Delay1000ms();
sendString("hello\r\n"); //心跳包
}
}
5、“串口”模块:
#include "reg52.h"
#include
#include "motor.h"
#define len 12
sfr AUXR = 0x8E;
sbit ledD5 = P3^7;
char serial_buffer[len];
void Uart_Routine() interrupt 4
{
static int i = 0; //静态全局区的变量,数组下标
char temp;
/* 中断处理程序中,对于接收中断的响应 */
if(RI == 1){
RI = 0;//清除接收中断标志位
temp = SBUF;
if(temp=='M'){ //从数据缓冲寄存器SBUF中读到字符后,关心一件事
i = 0;
}
serial_buffer[i] = temp;
i++;
if(i == len){
i = 0;
}
//电机指令:默认--STOP; M1--FORWARD; M2--BACK; M3--FORWARD_LEFT;
// M4--FORWARD_RIGHT; M5--BACK_LEFT; M6--BACK_RIGHT
if(serial_buffer[0]=='M'){
switch(serial_buffer[1]){
case '1':
goForward();
memset(serial_buffer, '\0', len);
break;
case '2':
goBack();
memset(serial_buffer, '\0', len);
break;
case '3':
goForward_left();
memset(serial_buffer, '\0', len);
break;
case '4':
goForward_right();
memset(serial_buffer, '\0', len);
break;
case '5':
goBack_left();
memset(serial_buffer, '\0', len);
break;
case '6':
goBack_right();
memset(serial_buffer, '\0', len);
break;
default :
stop();
break;
}
}
}
/* 中断处理程序中,对于发送中断的响应 */
if(TI == 1){
// 暂时不做任何事情
}
}
void UartInit(void) //[email protected]
{
AUXR = 0x01;
SCON = 0x50; //8位UART,允许串口接收
TMOD &= 0xDF;
TMOD |= 0x20; //定时器8位重载工作模式
TH1 = 0xFD;
TL1 = 0xFD; //9600波特率初值
TR1 = 1;
EA = 1;
ES = 1; //开启串口中断
}
void sendByte(char data_msg)
{
SBUF = data_msg;
// Delay10ms();
while(TI == 0);
TI = 0;
}
void sendString(char *str)
{
char *p = str;
while(*p != '\0'){
sendByte(*p);
p++;
}
}
6、“电机”模块:
#include "reg52.h"
sbit RightCon_1A = P3^2; //L9110S的MotorB_1A--右轮电机下接触点
sbit RightCon_1B = P3^3; //L9110S的MotorB_1B--右轮电机上接触点
sbit LeftCon_1A = P3^4; //L9110S的MotorA_1A--左轮电机下接触点
sbit LeftCon_1B = P3^5; //L9110S的MotorA_1B--左轮电机上接触点
void goForward()
{
/* 右轮:前进 */
RightCon_1A = 0;
RightCon_1B = 1;
/* 左轮:前进 */
LeftCon_1A = 0;
LeftCon_1B = 1;
}
void goBack()
{
/* 右轮:倒退 */
RightCon_1A = 1;
RightCon_1B = 0;
/* 左轮:倒退 */
LeftCon_1A = 1;
LeftCon_1B = 0;
}
void goForward_left()
{
/* 右轮:前进 */
RightCon_1A = 0;
RightCon_1B = 1;
/* 左轮:不转 */
LeftCon_1A = 0;
LeftCon_1B = 0;
}
void goForward_right()
{
/* 右轮:不转 */
RightCon_1A = 0;
RightCon_1B = 0;
/* 左轮:前进 */
LeftCon_1A = 0;
LeftCon_1B = 1;
}
void goBack_left()
{
/* 右轮:倒退 */
RightCon_1A = 1;
RightCon_1B = 0;
/* 左轮:不转 */
LeftCon_1A = 0;
LeftCon_1B = 0;
}
void goBack_right()
{
/* 右轮:不转 */
RightCon_1A = 0;
RightCon_1B = 0;
/* 左轮:倒退 */
LeftCon_1A = 1;
LeftCon_1B = 0;
}
void stop()
{
/* 右轮:不转 */
RightCon_1A = 0;
RightCon_1B = 0;
/* 左轮:不转 */
LeftCon_1A = 0;
LeftCon_1B = 0;
}
7、“延时”模块:
#include "intrins.h"
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
1、和单片机的接线方式:
2、信号传递路线:
3、蓝牙APP自定义按键:我们用现成的APP,按键设置如下图所示
4、点动控制策略:
5、主程序“main”:【项目工程文件夹】
#include "reg52.h"
#include "motor.h"
#include "delay.h"
#include "uart.h"
void main(void)
{
UartInit();
while(1){
stop();
}
}
6、“串口”模块:
#include "reg52.h"
#include
#include "motor.h"
#include "delay.h"
#define len 12
sfr AUXR = 0x8E;
sbit ledD5 = P3^7;
char serial_buffer[len];
void Uart_Routine() interrupt 4
{
static int i = 0; //静态全局区的变量,数组下标
char temp;
/* 中断处理程序中,对于接收中断的响应 */
if(RI == 1){
RI = 0;//清除接收中断标志位
temp = SBUF;
if(temp=='M'){ //从数据缓冲寄存器SBUF中读到字符后,关心一件事
i = 0;
}
serial_buffer[i] = temp;
i++;
if(i == len){
i = 0;
}
//电机指令:默认--STOP; M1--FORWARD; M2--BACK; M3--FORWARD_LEFT;
// M4--FORWARD_RIGHT; M5--BACK_LEFT; M6--BACK_RIGHT
if(serial_buffer[0]=='M'){
switch(serial_buffer[1]){
case '1':
goForward();
memset(serial_buffer, '\0', len);
Delay10ms();
break;
case '2':
goBack();
memset(serial_buffer, '\0', len);
Delay10ms();
break;
case '3':
goForward_left();
memset(serial_buffer, '\0', len);
Delay10ms();
break;
case '4':
goForward_right();
memset(serial_buffer, '\0', len);
Delay10ms();
break;
case '5':
goBack_left();
memset(serial_buffer, '\0', len);
Delay10ms();
break;
case '6':
goBack_right();
memset(serial_buffer, '\0', len);
Delay10ms();
break;
default :
stop();
break;
}
}
}
/* 中断处理程序中,对于发送中断的响应 */
if(TI == 1){
// 暂时不做任何事情
}
}
void UartInit(void) //[email protected]
{
AUXR = 0x01;
SCON = 0x50; //8位UART,允许串口接收
TMOD &= 0xDF;
TMOD |= 0x20; //定时器8位重载工作模式
TH1 = 0xFD;
TL1 = 0xFD; //9600波特率初值
TR1 = 1;
EA = 1;
ES = 1; //开启串口中断
}
void sendByte(char data_msg)
{
SBUF = data_msg;
// Delay10ms();
while(TI == 0);
TI = 0;
}
void sendString(char *str)
{
char *p = str;
while(*p != '\0'){
sendByte(*p);
p++;
}
}
7、“电机”模块:
#include "reg52.h"
sbit RightCon_1A = P3^2; //L9110S的MotorB_1A--右轮电机下接触点
sbit RightCon_1B = P3^3; //L9110S的MotorB_1B--右轮电机上接触点
sbit LeftCon_1A = P3^4; //L9110S的MotorA_1A--左轮电机下接触点
sbit LeftCon_1B = P3^5; //L9110S的MotorA_1B--左轮电机上接触点
void goForward()
{
/* 右轮:前进 */
RightCon_1A = 0;
RightCon_1B = 1;
/* 左轮:前进 */
LeftCon_1A = 0;
LeftCon_1B = 1;
}
void goBack()
{
/* 右轮:倒退 */
RightCon_1A = 1;
RightCon_1B = 0;
/* 左轮:倒退 */
LeftCon_1A = 1;
LeftCon_1B = 0;
}
void goForward_left()
{
/* 右轮:前进 */
RightCon_1A = 0;
RightCon_1B = 1;
/* 左轮:不转 */
LeftCon_1A = 0;
LeftCon_1B = 0;
}
void goForward_right()
{
/* 右轮:不转 */
RightCon_1A = 0;
RightCon_1B = 0;
/* 左轮:前进 */
LeftCon_1A = 0;
LeftCon_1B = 1;
}
void goBack_left()
{
/* 右轮:倒退 */
RightCon_1A = 1;
RightCon_1B = 0;
/* 左轮:不转 */
LeftCon_1A = 0;
LeftCon_1B = 0;
}
void goBack_right()
{
/* 右轮:不转 */
RightCon_1A = 0;
RightCon_1B = 0;
/* 左轮:倒退 */
LeftCon_1A = 1;
LeftCon_1B = 0;
}
void stop()
{
/* 右轮:不转 */
RightCon_1A = 0;
RightCon_1B = 0;
/* 左轮:不转 */
LeftCon_1A = 0;
LeftCon_1B = 0;
}
8、“延时”模块:
#include "intrins.h"
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 18;
j = 235;
do
{
while (--j);
} while (--i);
}