提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
一篇文章解决所有智能小车的问题!
提示:以下是本篇文章正文内容,下面案例可供参考
一、先让小车能动起来
1.1 硬件准备
单片机、智能小车套装(电机、电机驱动、电源、车轮、杜邦线)
1.11 L9110s—电机驱动模块
接通VCC,GND 模块电源指示灯亮,以下资料来源官方,官方给的数据有误。(实际要通过自己代码来调试电机正转反转)
IA1输入高电平,IA1输入低电平,【OA1 OB1】电机正转;
IA1输入低电平,IA1输入高电平,【OA1 OB1】电机反转;
IA2输入高电平,IA2输入低电平,【OA2 OB2】电机正转;
IA2输入低电平,IA2输入高电平,【OA2 OB2】电机反转;
1.12 L9110驱动模块与单片机、电源、轮子的接线图
1.2 代码
① motor.c —— 封装小车向前后左右的功能代码
#include "reg52.h"
sbit RightCon1A = P3^2; //右轮
sbit RightCon1B = P3^3;
sbit LeftCon1A = P3^4; //左轮
sbit LeftCon1B = P3^5;
//前进
void goForward()
{
LeftCon1A = 0; //左轮向前
LeftCon1B = 1;
RightCon1A = 0; //右轮向前
RightCon1B = 1;
}
//后退
void goBack()
{
LeftCon1A = 1;
LeftCon1B = 0;
RightCon1A = 1;
RightCon1B = 0;
}
//左转
void goLeft()
{
LeftCon1A = 0; //左轮不动
LeftCon1B = 0;
RightCon1A = 0; //右轮向前
RightCon1B = 1;
}
//右转
void goRight()
{
LeftCon1A = 0; //左轮向前
LeftCon1B = 1;
RightCon1A = 0; //右轮不动
RightCon1B = 0;
}
② main.c —— 主函数
#include "reg52.h"
#include "intrins.h"
#include "motor.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 main()
{
while(1){
goForward();
Delay1000ms();
Delay1000ms();
goBack();
Delay1000ms();
Delay1000ms();
goLeft();
Delay1000ms();
Delay1000ms();
goRight();
Delay1000ms();
Delay1000ms();
}
}
二、蓝牙小车
2.1 先通过串口控制小车
原理
配置串口中断模式,串口不断的接收数据,如果串口接收到我们自己设置【标记】,让小车进行相对应的操作。
步骤
直接将自己之前做的串口接收数据的代码复制粘贴过来 (下面也有附代码),串口初始化和串口发送和接收的代码基本通用的,不用改。
1.配置串口通信中断模式(避免与主函数main执行的程序发生冲突);
2.每次接收到数据都会进行串口中断。如果接收到"M"开头的数据,把数组下标"i"设置为0,让数组从下标0开始保存数据;
3.判断数组存的数据进行相对应的操作;
4.串口处于一直接收数据的状态,如果一直没有接收到我们需要的M开头的数据,存数据的数组慢了(越界了),要记得把数组清0;
5.使用STC-ISP软件的串口助手调试(如下图)。
重点:
①要记得配置串口工作方式1,REN位要使能可以接收数据
②打开串口中断,用串口中断来接收数据
③下面有附上串口通信UART的代码
2.2 代码
①uart.c —— 串口通信的功能代码
#include "reg52.h"
#include "motor.h"
#include "string.h"
#define SIZE 12
sfr AUXR = 0x8E;
char buffer[SIZE];
void UartInit(void) //9600bps@11.0592MHz
{
AUXR