51单片机舵机控制代码
时间: 2023-06-20 14:10:43 浏览: 106
以下是51单片机控制舵机的代码,其中使用了定时器和PWM功能来控制舵机的角度:
```
#include <reg51.h>
sbit Servo_Pin = P1^0; // 舵机控制引脚
void Timer0_Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x01; // 定时器0工作在模式1
TH0 = 0xFC; // 定时器初值,用于产生20ms的周期
TL0 = 0x67;
ET0 = 1; // 打开定时器0中断
TR0 = 1; // 启动定时器0
}
void PWM_Init(void)
{
TMOD &= 0x0F;
TMOD |= 0x10; // 定时器1工作在模式2
TH1 = 0xFF; // 定时器初值,用于产生50Hz的PWM信号
TL1 = 0xFF;
ET1 = 0; // 关闭定时器1中断
TR1 = 1; // 启动定时器1
}
void main(void)
{
Timer0_Init();
PWM_Init();
while (1); // 主程序循环等待
}
void Timer0_ISR(void) interrupt 1
{
static unsigned char count = 0;
TH0 = 0xFC; // 重置定时器初值
TL0 = 0x67;
if (++count > 50) // 1s计时
{
count = 0;
Servo_Pin = 0; // 在下一个1ms周期开始时,拉低控制引脚
}
else if (count == 1) // 在每个1ms周期的开始时,拉高控制引脚
{
Servo_Pin = 1;
}
}
void PWM_ISR(void) interrupt 3
{
static unsigned char duty = 0;
TH1 = 0xFF; // 重置定时器初值
TL1 = 0xFF;
if (duty < 10) // 舵机控制信号的占空比范围为0.5ms~2.5ms
{
Servo_Pin = 1;
}
else
{
Servo_Pin = 0;
}
if (++duty > 20) // 舵机控制信号的周期为20ms
{
duty = 0;
}
}
```
需要注意的是,舵机的控制信号占空比范围一般为0.5ms~2.5ms,对应的PWM频率为50Hz。因此在代码中,定时器1的初值设置为0xFFFF,每个PWM周期的持续时间为20ms,每个占空比的持续时间为1ms/20=50个定时器1中断周期。在定时器0中断中,每个1ms周期的开始时,拉高舵机控制引脚,持续时间为1ms/20=50个定时器1中断周期;在每个1ms周期的结束时,拉低舵机控制引脚。这样就可以通过改变舵机控制信号的占空比来控制舵机的角度了。