首页 > 行业资讯 >减速电机
TECHNICAL SUPPORT

51单片机控制舵机接线与代码教程

发布时间: 2026-05-11

01如何用51单片机驱动舵机?从接线到代码,一步一动手

你有没有碰到过这般状况:购入了一架舵机,想着借助51单片机促使它转动起来,然而查阅了诸多资料,不是代码运行不起来,就是舵机不停地抖动,甚至压根就不转动?关键缘由在于:舵机所需的是精准的20ms周期PWM信号,而51单片机得正确配置定时器才可生成此信号。 本文径直给出完备的解决办法——硬件接线、定时器初始值计算、C51代码、常见故障排查,保证你依照步骤操作后,舵机能平稳地转动至任意角度。

一、舵机工作原理(只需记住两个关键数字)

舵机的内部,存在着一个直流电机,还有减速齿轮组以及角度反馈电路。你并不需要去了解全部的细节,仅仅需要知道:

有那么一种信号,它被称作控制的信号,这个信号呢,是带有特定周期的,其周期时长为20毫秒,而20毫秒所对应的频率是50赫兹,它还是一种PWM信号,也就是脉冲宽度调制信号。

在以最常见的从0°至180°的舵机作为示例来看时,脉冲宽度跟角度之间存在着的对应关系:

0.5ms 脉冲 → 0度

1.0ms 脉冲 → 45度

1.5ms 脉冲 → 90度(中点)

2.0ms 脉冲 → 135度

2.5ms 脉冲 → 180度

存在这样的情况,不同品牌的舵机,或者不同型号的舵机,其脉宽范围有可能存在微小的差异,举例来说,差异范围在于0.55ms至2.45ms,然而,上述所提到的标准,是适用于在市面上占比90%的微型舵机的,像SG90、MG995这类的舵机便是如此。要是有疑问产生,那就去查阅一下你手上舵机的数据手册。

二、硬件连接(三步完成)

你需要准备:

51单片机开发板(最小系统即可,如)

一个标准舵机(推荐先用小扭矩舵机调试)

有着5V直流电的电源,舵机电源得单独于单片机逻辑电源,除非舵机小巧且电流比200mA小,这样才行。

杜邦线若干

接线表:

舵机线颜色(通常) 功能 连接点
棕色/黑色 地线(GND) 单片机GND和电源GND共地
红色 正极(VCC) 5V电源正极(不要接单片机5V输出引脚!
橙色/黄色 信号线 单片机任意I/O口(本文以P1.0为例)

关键要点:

单片机驱动舵机需要驱动板吗_如何使用单片机控制舵机的转动_51单片机驱动舵机教程

要实现共地,舵机的地线,需与单片机的地线相连,且外接电源的地线也得与之全部连接在一起。

舵机开始启动的那一瞬间,电流是比较大的,能够达到1A以上,所以要用单独的能够提供稳定电压的电源或者电池来供电。要是使用通过USB的方式进行供电,那么有可能会致使单片机出现复位的情况。

常出现的案例是,好多刚开始学习的人直接拿开发板上的5V引脚为舵机供应电力,随后一旦运行程序,舵机就会出现抖动或者单片机发生死机情况。正确的做法是,由开发板给出信号,通过外部电源为舵机供电。

三、程序编写(完整可直接下载的代码)

51单片机不存在硬件PWM模块,所以我们得借助定时中断来模拟PWM波形,其思路具体为,利用一个定时器生成周期为20ms的中断,然后在中断服务函数里依据目标角度去设定信号引脚的高低电平。

第一步:计算定时器初值

假定运用12MHz晶振,定时器0处于模式1(即16位定时器)工作状态。若要生成20ms中断,那就需要计数20,000个机器周期。每个机器周期等于1µs(在12MHz的情况下)于是:

计数初值 = 65536 20000 = 45536

将十六进制表示为:,这意味着,TH0等于是0xB1,并且TL0等于0xE0。

当进行实际编程操作的时候,我们一般会把20ms划分成更小的时间片就像是0.1ms那样,随后借助计数器累计相加而生成不一样宽度的脉冲。有更简便并且常用的办法是,让定时器每隔0.1ms就产生一次中断,当中断达到200次的时候便达成了20ms。在中断的过程当中去判断当下是第几次,进而决定引脚的状态。

第二步:完整C51代码

# 
sbit servo = P1^0;   // 信号引脚
 char  = 0;      // 0.1ms计数,0~199共200个
 char  = 15;     // 脉宽比较值(单位0.1ms),对应1.5ms > 90度
// 延时函数(用于演示角度变化)
void ( int ms)
{
     int i,j;
    for(i=0;i 0度
        (1000);
         = 15;  // 1.5ms > 90度
        (1000);
         = 25;  // 2.5ms > 180度
        (1000);
    }
}
void (void)  1
{
    // 重新赋初值,保证0.1ms周期
    TH0 = 0xFF;
    TL0 = 0x9C;
    ++;
    if( < )
    {
        servo = 1;   // 保持高电平
    }
    else
    {
        servo = 0;   // 低电平
    }
    if( >= 200)  // 20ms周期结束
    {
         = 0;
    }
}

代码解释:

控制变量来把控高电平持续的时长,其范围处于5至25之间,这一范围对应的是0.5毫秒至2.5毫秒。每增加或者减少1,脉宽就会产生0.1毫秒的变化,角度变化大约为9度(180度除以20步)。

没隔0.1ms就触发一次中断,倘若计数比小,那么输出高电平,不然就输出低电平,等一个周期(200次中断)结束之后重置计数。

51单片机驱动舵机教程_单片机驱动舵机需要驱动板吗_如何使用单片机控制舵机的转动

在主循环里,演示了角度渐变的典型惯用方式伟创动力舵机,你能够直接去修改这个值,以此来设定任意的角度。

四、调试与常见问题解决

现象 可能原因
舵机完全不动 1. 供电不足 2. 信号线接错 3. 共地问题 用万用表测量舵机VCC与GND间电压(至少4.8V)。检查信号线是否接到P1^0。确认所有GND连通。
舵机抖动、来回小范围转动 PWM周期或脉宽不稳定,或电源电流不足 检查定时器初值是否正确(精确到1μs)。在舵机电源两端并联一个100~470μF的电解电容。
旋转角度不准 脉宽范围与舵机标称不匹配 用示波器测量PWM波形,调整的最小和最大值。例如某些舵机0度对应0.6ms(=6),180度对应2.4ms(=24)。
单片机程序烧录后无反应 定时器中断未打开或main函数死循环结构错误 确认代码中ET0=1,EA=1,TR0=1。检查while(1)中是否有延时过短导致舵机来不及动作。
下载程序后舵机一直转到最大角度然后卡住 初始值超出范围(如0或大于200) 确保初始化在5~25之间。在中断中添加限幅:if(<5) =5; if(compare>25) =25;

五、进阶扩展:使用外部中断精度更高吗?

,51单片机运用定时器中断去模拟PWM已然足够精准,其误差处于±1μs范围以内,这完全能够满足舵机所需,舵机通常对精度的要求是±10μs。,要是你有同时驱动多个舵机的需求,那么可以采用“分时法”,或者使用带有硬件PWM的增强型51,典型的如STC15/STC8系列,不过其基本原理和本教程是完全一样的。

核心观点重申与行动建议

核心观点是,用51单片机去驱动舵机,唯一正确的路径在于,要借助定时器中断来生成周期为20ms的PWM信号,脉宽需在0.5至2.5ms之间伟创动力,一定要做到共地,而且得是独立供电。

行动建议:

1. 按照本文接线图连接电路(特别注意电源共地和独立供电)。

2. 在Keil里头将完整代码进行复制,接着实施编译,从而生成HEX文件,随后把该文件下载到单片机那儿。

3. 伊始观察舵机有没有呈周期性摆动,从0角度摆动至90角度,再摆动至180角度,若情况正常,那就表明你所具备的软件以及硬件全然正确无误。

4. ,对值予以修改运用,实际测试你所需要的角度所对应的数值,举例来说,运用维持某个值,并借助眼睛或者角度尺进行验证。

5. 保存下你实测的脉宽角度对照表,后续项目直接调用。

无论使用何种品牌的 51 单片机或舵机,只要你严格遵循上述步骤,就能在 30 分钟内成功驱动若遇到本文未列出的异常,要检查你的示波器或逻辑分析仪波形,确保周期为 20ms,脉宽在有效范围内

为所有产品提供动力单元

联系伟创动力产品专家,为你的产品推荐合适的驱动系统所需部件。

发送邮件
在线留言
WhatsApp
+86 0769 8399 3238
 
kpowerMap