c++编写51单片机控制电机速度代码,并用数码管实时显示速度
时间: 2024-05-08 09:21:18 浏览: 74
这里给出一个简单的代码示例,使用定时器来控制电机速度,同时使用数码管实时显示速度。代码中使用了51单片机的定时器1和P0口来控制电机速度,使用P2口连接数码管,在数码管上显示电机速度。
```c
#include <reg51.h>
#define MOTOR_PIN P0
#define DISPLAY_PIN P2
unsigned char speed = 0; // 电机速度
// 数码管显示数字表
unsigned char display_table[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
void delay_ms(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 120; j++);
}
}
void display_speed(unsigned char speed) {
unsigned char digit1, digit2;
digit1 = speed / 10; // 十位数
digit2 = speed % 10; // 个位数
DISPLAY_PIN = 0xff; // 关闭所有数码管
// 显示十位数
DISPLAY_PIN = ~(1 << 7);
MOTOR_PIN = display_table[digit1];
delay_ms(5);
// 显示个位数
DISPLAY_PIN = ~(1 << 6);
MOTOR_PIN = display_table[digit2];
delay_ms(5);
}
void timer1_isr() interrupt 3 {
static unsigned char counter = 0;
counter++;
if (counter >= speed) {
counter = 0;
MOTOR_PIN = ~MOTOR_PIN; // 反转电机输出
}
}
void main() {
TMOD = 0x10; // 定时器1工作在模式1
TH1 = 0xfd; // 计数器初值
TL1 = 0xfd; // 计数器初值
ET1 = 1; // 允许定时器1中断
TR1 = 1; // 启动定时器1
EA = 1; // 允许中断
while (1) {
display_speed(speed); // 显示电机速度
if (P1_0 == 0) { // 按键S1按下,加速
if (speed < 10) {
speed++;
}
delay_ms(10); // 延时去抖动
}
if (P1_1 == 0) { // 按键S2按下,减速
if (speed > 0) {
speed--;
}
delay_ms(10); // 延时去抖动
}
}
}
```
在上面的代码中,定时器1的中断服务函数(timer1_isr)用来控制电机速度,每隔一定时间反转电机输出一次,实现电机转速控制。在主循环中,通过按键S1和S2来调整电机速度,同时调用display_speed函数将电机速度显示在数码管上。
阅读全文