51单片机蓝牙控制l298n代码加控速
时间: 2023-10-23 20:08:46 浏览: 80
以下是51单片机蓝牙控制L298N电机驱动模块的代码加控速部分:
```c
#include <reg51.h>
#include <stdlib.h>
#include <string.h>
// 串口波特率设置
#define BAUDRATE 9600
// L298N电机驱动模块控制端口定义
sbit IN1 = P2^0;
sbit IN2 = P2^1;
sbit IN3 = P2^2;
sbit IN4 = P2^3;
sbit ENA = P2^4;
sbit ENB = P2^5;
// 定时器0的初值和重装值,控制PWM的占空比
#define TH0_INIT 0
#define TL0_INIT 0
#define TH0_RELOAD 0
#define TL0_RELOAD 0
// 蓝牙模块接收缓存长度
#define BUFLEN 20
// 蓝牙模块接收缓存
char recv_buf[BUFLEN];
// 蓝牙模块接收缓存指针
char *recv_ptr = recv_buf;
// 蓝牙模块接收标志
bit recv_flag = 0;
// 定时器0中断服务函数,控制PWM的占空比
void timer0_isr() interrupt 1
{
static unsigned char cnt = 0;
if(cnt < ENA) EN1 = 1;
if(cnt < 255-ENA) EN2 = 1;
cnt++;
if(cnt == 255) cnt = 0;
}
// 串口中断服务函数,接收蓝牙模块的数据
void uart_isr() interrupt 4
{
if(RI)
{
RI = 0;
*recv_ptr = SBUF;
recv_ptr++;
if(recv_ptr == recv_buf + BUFLEN) recv_ptr = recv_buf;
recv_flag = 1;
}
}
// 初始化定时器0,控制PWM的占空比
void init_timer0()
{
TMOD |= 0x01;
TH0 = TH0_INIT;
TL0 = TL0_INIT;
ET0 = 1;
TR0 = 1;
}
// 初始化串口,与蓝牙模块通信
void init_uart()
{
SCON = 0x50;
TMOD |= 0x20;
TH1 = 256 - BAUDRATE / 9600;
TL1 = TH1;
TR1 = 1;
ES = 1;
}
// 设置电机方向和速度
void set_motor(char dir, unsigned char speed)
{
switch(dir)
{
case 'F': IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 0; break;
case 'B': IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 1; break;
case 'L': IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 1; break;
case 'R': IN1 = 0; IN2 = 1; IN3 = 1; IN4 = 0; break;
case 'S': IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 0; break;
}
ENA = speed;
ENB = speed;
}
// 主函数
void main()
{
init_timer0();
init_uart();
EA = 1;
set_motor('S', 0);
while(1)
{
if(recv_flag)
{
recv_flag = 0;
if(strncmp(recv_buf, "F", 1) == 0) set_motor('F', atoi(recv_buf+1));
if(strncmp(recv_buf, "B", 1) == 0) set_motor('B', atoi(recv_buf+1));
if(strncmp(recv_buf, "L", 1) == 0) set_motor('L', atoi(recv_buf+1));
if(strncmp(recv_buf, "R", 1) == 0) set_motor('R', atoi(recv_buf+1));
if(strncmp(recv_buf, "S", 1) == 0) set_motor('S', 0);
recv_ptr = recv_buf;
memset(recv_buf, 0, BUFLEN);
}
}
}
```
这段代码实现了蓝牙模块的数据接收、电机的方向和速度控制以及PWM的占空比控制。在主函数中通过比较接收缓存中的数据,判断控制指令是前进、后退、左转、右转还是停止,并调用`set_motor`函数设置电机方向和速度。`set_motor`函数根据输入的参数设置电机的方向和速度,并设置PWM的占空比,控制电机的转速。PWM的占空比在定时器0中断服务函数中控制,每隔一定的时间修改一次占空比,从而控制PWM输出。需要注意的是,由于L298N电机驱动模块的ENA和ENB引脚需要接入PWM信号,因此需要使用定时器0来生成PWM信号。在代码中,定时器0的初值和重装值均为0,即产生一个周期为256的定时器中断,占空比由ENA的值控制。
阅读全文