51单片机pwm控制电机c程序
时间: 2023-08-05 16:02:59 浏览: 98
51单片机pwm控制电机
下面是一个使用51单片机的PWM模块控制电机的C程序示例:
```
#include <reg52.h>
sbit EN = P1^0; // 电机使能引脚
sbit IN1 = P1^1; // 电机控制引脚1
sbit IN2 = P1^2; // 电机控制引脚2
void InitPWM() // 初始化PWM模块
{
TMOD &= 0xF0; // 清零T0控制寄存器低四位
TMOD |= 0x01; // 配置T0为16位定时器模式
TH0 = 0xFC; // 定时器初值高位
TL0 = 0x67; // 定时器初值低位
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
P1ASF = 0x00; // 将P1口所有引脚配置为通用I/O口
P1M1 = 0x00; // 将P1口所有引脚配置为标准推挽输出
P1M0 = 0xFF; // 将P1口所有引脚配置为标准推挽输出
PWM_CLK = 0; // PWM时钟选择为Fosc/12
PWM_CON = 0x00; // PWM输出方式为单边输出,输出极性为高电平有效
PWM_P01 = 0; // PWM0输出使能
PWM0 = 0; // 初始PWM占空比为0
}
void main()
{
InitPWM(); // 初始化PWM模块
EN = 1; // 使能电机
while (1)
{
IN1 = 1; // 控制电机正转
IN2 = 0;
for (int i = 0; i < 100; i++) // 增加PWM占空比,使电机加速
{
PWM0 = i;
delay(10);
}
delay(1000); // 等待1秒
for (int i = 100; i > 0; i--) // 减小PWM占空比,使电机减速
{
PWM0 = i;
delay(10);
}
IN1 = 0; // 控制电机反转
IN2 = 1;
for (int i = 0; i < 100; i++) // 增加PWM占空比,使电机加速
{
PWM0 = i;
delay(10);
}
delay(1000); // 等待1秒
for (int i = 100; i > 0; i--) // 减小PWM占空比,使电机减速
{
PWM0 = i;
delay(10);
}
}
}
void Timer0_ISR() interrupt 1 // 定时器0中断服务程序
{
TH0 = 0xFC; // 重新设置定时器初值高位
TL0 = 0x67; // 重新设置定时器初值低位
}
```
这个程序使用定时器0和PWM模块来控制电机的转速和方向。首先在`InitPWM()`函数中初始化PWM模块和定时器0,然后在`main()`函数中控制电机的正转和反转,并使用PWM占空比来调节电机的转速。定时器0的中断服务程序`Timer0_ISR()`用于重新设置定时器初值,以实现PWM的周期性输出。
阅读全文