用AT89c52单片机控制2个驱动模块,一个驱动模块控制两个电机,并且包含pwm调速的蓝牙小车代码
时间: 2023-05-26 07:01:00 浏览: 85
A:
这里提供一份基于AT89C52单片机控制2个驱动模块,一个驱动模块控制两个电机的蓝牙小车代码。该代码包含pwm调速功能,可以通过蓝牙控制小车的前进、后退、左转、右转、加速、减速等操作。
整个电路主要包括AT89C52单片机、HC-05蓝牙模块、L298N驱动模块、电机和电池等。其中L298N驱动模块用于控制电机的正反转和速度调节,HC-05蓝牙模块用于接收蓝牙信号并传输给单片机进行控制。
下面给出完整的代码:
```c
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char SCMD[] = {'F', 'B', 'L', 'R', 'G', 'H', '\0'}; //蓝牙命令识别
unsigned char M_CMD[] = {0x00, 0x55, 0x33, 0xcc}; //电机驱动命令
uchar ri;
uchar curcmd;
uchar cmdok = 0;
uint Speed1, Speed2;
/************** 蓝牙模块初始化 **************/
void BT_Init(void)
{
SCON = 0x50; //8位数据,可变波特率
PCON |= 0x80; //串口波特率加倍
TMOD &= 0x0f;
TMOD |= 0x20; //设置定时器1为模式2
TH1 = 0xfd; //9600波特率计算方式:大致公式:TH1 = 256 - (晶振频率 / 32) / (波特率 / 1)
TL1 = 0xfd; //小致公式:TH1 = 256 - (晶振频率 / 16) / 波特率 // 要可以控制波特率,只需将晶振频率和波特率输入公式即可
ET1 = 0;
EA = 1; //总中断允许
ES = 1; //串口中断允许
TR1 = 1; //启动定时器1
}
/************** 串口接收 **************/
void USART_Rx() interrupt 4
{
uchar r;
if (RI)
{
RI = 0;
r = SBUF;
if (curcmd == 0) //等待接收命令字
{
if (r >= 'A' && r <= 'Z') //收到合法的命令字
{
cmdok = 0;
curcmd = r;
ri = 0;
}
}
else if (curcmd != 0) //开始接收命令参数
{
if (r >= '0' && r <= '9' && ri < 4) //收到数字参数
{
M_CMD[ri] = r - '0';
ri++;
}
else if (r == curcmd) //收到命令结尾
{
cmdok = 1;
curcmd = 0;
}
}
}
}
/************** 发送驱动命令到电机 **************/
void send_M_CMD(unsigned char* cmd)
{
unsigned char i;
for (i = 0; i < 4; i++)
{
P0 = cmd[i];
P2 = i + 4; //选择工作组
delay_ms(1); //等待数据稳定
P2 = 0; //停止工作组
}
}
/************** 控制小车动作 **************/
void control()
{
uchar i;
//识别命令
for (i = 0; i < 6; i++)
{
if (SCMD[i] == curcmd) //识别命令成功
{
switch (i)
{
case 0: //前进
{
M_CMD[1] = Speed1;
M_CMD[2] = Speed2;
M_CMD[0] = 0x0A;
break;
}
case 1: //后退
{
M_CMD[1] = Speed1;
M_CMD[2] = Speed2;
M_CMD[0] = 0x05;
break;
}
case 2: //左转
{
M_CMD[1] = Speed1;
M_CMD[2] = Speed1;
M_CMD[0] = 0x09;
break;
}
case 3: //右转
{
M_CMD[1] = Speed2;
M_CMD[2] = Speed2;
M_CMD[0] = 0x06;
break;
}
case 4: //加速
{
if (Speed1 > 20) Speed1 -= 20;
if (Speed2 > 20) Speed2 -= 20;
break;
}
case 5: //减速
{
if (Speed1 < 230) Speed1 += 20;
if (Speed2 < 230) Speed2 += 20;
break;
}
}
send_M_CMD(M_CMD); //发送驱动命令到电机
break;
}
}
}
/************** 延时函数 **************/
void delay_ms(uint ms)
{
uint i;
while (ms--)
{
for (i = 0; i < 125; i++);
}
}
/************** 主函数 **************/
void main()
{
BT_Init();
while (1)
{
if (cmdok == 1)
{
control(); //控制小车动作
cmdok = 0;
ri = 0;
}
}
}
```
这份代码中,首先进行了蓝牙模块的初始化,并通过串口中断接收蓝牙信号。在控制函数中,通过识别收到的命令来控制小车的运动,同时通过pwm技术调节电机的速度。
当我们接收到命令之后,会根据命令类型分别进行如下操作:
- 前进:设置马达驱动命令,左右马达速度为设定速度,向前行驶
- 后退:设置马达驱动命令,左右马达速度为设定速度,向后行驶
- 左转:设置马达驱动命令,左右马达速度都为设定速度,向左转
- 右转:设置马达驱动命令,左右马达速度都为设定速度,向右转
- 加速:将设定速度根据一定规则递减
- 减速:将设定速度根据一定规则递增
注意:该代码仅供参考,具体实际应用中需要根据自己的需求进行灵活处理。同时在接线及调试时需要注意安全事项,避免电路短路等意外情况的发生。
阅读全文