用AT89c52单片机控制2个驱动模块,一个驱动模块控制两个电机,并且包含pwm调速的蓝牙小车代码
时间: 2023-05-23 16:07:40 浏览: 40
A:以下是AT89c52单片机控制2个驱动模块,一个驱动模块控制两个电机,并且包含pwm调速的蓝牙小车代码:
```
#include <reg52.h>
//定义引脚
#define ENA P1_0
#define IN1 P1_7
#define IN2 P1_6
#define ENB P1_1
#define IN3 P1_5
#define IN4 P1_4
//定义蓝牙模块通信引脚
#define TXD P3_1
#define RXD P3_0
//定义变量
unsigned char receive_data;
//初始化串口
void init_uart() {
SCON = 0x50; //设置串口工作在模式1,8位数据,可变波特率
TMOD = 0x20; //设置定时器1为模式2,8位自动重装载定时器,波特率发生器不使用
TH1 = 0xFD; //定时器1计数初值,用于9600波特率
TL1 = TH1; //定时器1计数初值,用于9600波特率
TR1 = 1; //启动定时器1
ES = 1; //开启串口中断
EA = 1; //开启总中断
}
//串口中断服务程序
void uart_isr() interrupt 4 {
if(RI) { //接受数据
RI = 0;
receive_data = SBUF; //将接受到的数据保存到receive_data变量中
}
if(TI) { //发送数据
TI = 0;
}
}
//延时函数
void delay(int count) {
int i, j;
for(i = 0; i < count; i++) {
for(j = 0; j < 120; j++);
}
}
//电机1正转
void motor1_forward() {
IN1 = 1;
IN2 = 0;
}
//电机1反转
void motor1_backward() {
IN1 = 0;
IN2 = 1;
}
//电机1停止
void motor1_stop() {
IN1 = 0;
IN2 = 0;
}
//电机2正转
void motor2_forward() {
IN3 = 1;
IN4 = 0;
}
//电机2反转
void motor2_backward() {
IN3 = 0;
IN4 = 1;
}
//电机2停止
void motor2_stop() {
IN3 = 0;
IN4 = 0;
}
//电机1速度控制
void motor1_speed_control(int pwm) {
EA = 0;
TH0 = 0x10000 - pwm;
TL0 = TH0;
TR0 = 1;
EA = 1;
}
//电机2速度控制
void motor2_speed_control(int pwm) {
EA = 0;
TH2 = 0x10000 - pwm;
TL2 = TH2;
TR2 = 1;
EA = 1;
}
//主函数
void main() {
//初始化
init_uart();
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0;
TL0 = 0;
TH2 = 0;
TL2 = 0;
ET0 = 1;
ET2 = 1;
TR0 = 0;
TR2 = 0;
motor1_stop();
motor2_stop();
//循环执行
while(1) {
switch(receive_data) { //接受蓝牙发送过来的数据
case 'w': //前进
motor1_forward();
motor2_forward();
motor1_speed_control(500);
motor2_speed_control(500);
break;
case 's': //后退
motor1_backward();
motor2_backward();
motor1_speed_control(500);
motor2_speed_control(500);
break;
case 'a': //左转
motor1_backward();
motor2_forward();
motor1_speed_control(500);
motor2_speed_control(500);
break;
case 'd': //右转
motor1_forward();
motor2_backward();
motor1_speed_control(500);
motor2_speed_control(500);
break;
case ' ': //停止
motor1_stop();
motor2_stop();
break;
default:
break;
}
delay(50); //延时以免快速执行
}
}
```
注:该代码仅供参考,实际应用时请根据具体情况进行修改。