51直行调速代码stc89c52,两个直流电机分别决定两个轮子的速度,每个电机有两个接口。由于两个电机功率不同,故同一初始速度下两个轮子转速不同。用按键调速,四个按键分别控制两个电机的加速减速,使其速度一致
时间: 2024-05-06 10:18:29 浏览: 103
51单片机控制直流电机的调速设计
5星 · 资源好评率100%
以下是一份可能的代码实现,用于STC89C52单片机控制两个直流电机的速度。该代码使用4个按键分别控制两个电机的加速和减速,以使两个轮子的速度保持一致。
```c
#include <reg52.h>
sbit A1 = P1^0; // 电机 A 正转引脚
sbit A2 = P1^1; // 电机 A 反转引脚
sbit B1 = P1^2; // 电机 B 正转引脚
sbit B2 = P1^3; // 电机 B 反转引脚
sbit KEYUPA = P3^3; // 电机 A 加速按键
sbit KEYDOWNA = P3^2; // 电机 A 减速按键
sbit KEYUPB = P3^1; // 电机 B 加速按键
sbit KEYDOWNB = P3^0; // 电机 B 减速按键
unsigned char speedA = 100; // 电机 A 初始速度
unsigned char speedB = 80; // 电机 B 初始速度
/**
* 电机 A 控制函数
* @param speed 电机速度,0-255
*/
void controlA(unsigned char speed) {
if (speed > 0) {
A1 = 1;
A2 = 0;
if (speed < 255) {
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 256 - speed;
TL0 = TH0;
TR0 = 1;
} else {
TR0 = 0;
}
} else if (speed < 0) {
A1 = 0;
A2 = 1;
if (speed > -255) {
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 256 + speed;
TL0 = TH0;
TR0 = 1;
} else {
TR0 = 0;
}
} else {
A1 = 0;
A2 = 0;
TR0 = 0;
}
}
/**
* 电机 B 控制函数
* @param speed 电机速度,0-255
*/
void controlB(unsigned char speed) {
if (speed > 0) {
B1 = 1;
B2 = 0;
if (speed < 255) {
TMOD &= 0x0F;
TMOD |= 0x10;
TH1 = 256 - speed;
TL1 = TH1;
TR1 = 1;
} else {
TR1 = 0;
}
} else if (speed < 0) {
B1 = 0;
B2 = 1;
if (speed > -255) {
TMOD &= 0x0F;
TMOD |= 0x10;
TH1 = 256 + speed;
TL1 = TH1;
TR1 = 1;
} else {
TR1 = 0;
}
} else {
B1 = 0;
B2 = 0;
TR1 = 0;
}
}
/**
* 延时函数
* @param n 延时时间
*/
void delay(unsigned int n) {
unsigned int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < 120; j++);
}
}
/**
* 初始化定时器
*/
void initTimer() {
TMOD &= 0x00;
TMOD |= 0x11;
TH0 = 256 - speedA;
TL0 = TH0;
TH1 = 256 - speedB;
TL1 = TH1;
TR0 = 1;
TR1 = 1;
}
void main() {
initTimer();
while (1) {
if (!KEYUPA) { // 电机 A 加速
delay(10); // 延时去抖动
if (!KEYUPA) {
speedA += 10;
controlA(speedA);
}
while (!KEYUPA); // 等待按键释放
}
if (!KEYDOWNA) { // 电机 A 减速
delay(10); // 延时去抖动
if (!KEYDOWNA) {
speedA -= 10;
controlA(speedA);
}
while (!KEYDOWNA); // 等待按键释放
}
if (!KEYUPB) { // 电机 B 加速
delay(10); // 延时去抖动
if (!KEYUPB) {
speedB += 10;
controlB(speedB);
}
while (!KEYUPB); // 等待按键释放
}
if (!KEYDOWNB) { // 电机 B 减速
delay(10); // 延时去抖动
if (!KEYDOWNB) {
speedB -= 10;
controlB(speedB);
}
while (!KEYDOWNB); // 等待按键释放
}
}
}
```
该代码中,`controlA` 和 `controlB` 函数分别用于控制电机 A 和电机 B 的转速。这些函数会改变引脚的状态,并配置定时器以产生 PWM 信号控制电机转速。在这里我们使用了 8 位定时器,并将其配置为模式 1,以产生 PWM 信号。定时器的初值和重载值根据电机速度进行调整。
在 `main` 函数中,我们使用了 4 个按键分别控制两个电机的加速和减速。当按下某个按键时,我们会等待一段时间以去除按键抖动,然后再改变电机速度。在每次改变电机速度后,我们会调用 `controlA` 和 `controlB` 函数来控制电机转速。
请注意,该代码中还使用了一个简单的延时函数来进行延时操作,以等待按键抖动消失。这种延时函数并不精确,因此在实际使用中应该使用更加可靠的去抖动方法,例如使用外部中断来处理按键输入。
阅读全文