首页 > 行业资讯 >无刷电机
TECHNICAL SUPPORT

STC15单片机控制舵机程序,从零写代码到成功驱动

发布时间: 2026-05-04

01STC15控制舵机能做什么?一个常见案例让你快速理解

好多电子爱好者于打造机械臂、智能小车或者简易机器人之际,均会碰到要操控舵机转动特定角度的情形。比如说,你打算用一个小型舵机带动一个摄像头云台,使其能够左右摆动进行监控。这时,你手头恰好有一块STC15系列单片机(像是或者),那要怎么编写程序才能够达成控制呢?本文会直接给出基于STC15单片机的完整舵机控制程序、电路连接方法以及常见故障排除,让你一次成功。

02核心原理:为什么STC15能控制舵机?

用于舵机(标准180度舵机)的控制信号,是那种周期为20ms(50Hz)的高电平脉冲宽度调制信号(PWM),其中,高电平持续的时间处于0.5ms至2.5ms之间,该时间范围对应着0°至180°。

关键结论是,你仅需运用STC15的随便一个普通状况下的输入输出端口,去输出一串具有频率为每二十毫秒一个周期、并且脉冲宽度能够变化的脉冲序列,便能够达成对舵机转动至任意角度的控制。

不依赖专用PWM模块伟创动力舵机,完全可以用定时器来实现。

03硬件连接(已验证可用)

STC15引脚 舵机线(以常见SG90为例)
任意I/O口(如P1.0) 橙色(信号线)
5V输出或外部5V电源 红色(VCC)
GND 棕色(GND)

stc15控制舵机程序_控制舵机的程序_如何用程序控制舵机

很关键的提醒: 舵机开始启动的那一瞬间,电流能够达到500mA以上。要是直接采用STC15开发板上的LDO来供电,就有可能引发单片机复位。要为舵机单独去提供5V/1A以上的电源,并且要共地(也就是把舵机的GND和STC15的GND连接在一起)

04完整C51程序(基于系列,适用于所有STC15)

本程序借由定时器0来生成20ms中断,于中断里操控P1.0输出电平,达成角度精准控制,代码已在上经实际测试通过。

// 舵机控制程序  STC15系列
// 晶振频率:12MHz
# 
sbit Servo = P1^0;          // 舵机信号引脚
 int ;  // 高电平时间(单位:0.1ms),值范围:5~25 对应 0.5ms~2.5ms
// 定时器0初始化,12T模式,12MHz下每计数一次为1us
void (void) {
    AUXR &= 0x7F;       // 定时器0工作在12T模式
    TMOD &= 0xF0;       // 设置定时器0为模式1(16位)
    TMOD |= 0x01;
    TH0 = 0xF8;         // 设置初始值:高8位 0xF8,低8位 0xCC →  = 2ms
    TL0 = 0xCC;
    ET0 = 1;            // 使能定时器0中断
    EA = 1;             // 开总中断
    TR0 = 1;            // 启动定时器0
}
// 设置舵机角度:angle 0~180
void ( char angle) {
    // 限制角度范围
    if (angle > 180) angle = 180;
    // PWM高电平时间 = 0.5ms + (angle / 180)  2.0ms
    // 单位0.1ms:  5 + (angle  20 / 180) = 5 + angle/9
     = 5 + ( int)(angle / 9);
    // 边界保护:5~25
    if ( < 5)  = 5;
    if ( > 25)  = 25;
}
// 定时器0中断服务程序(每2ms进入一次,累计10次得到20ms周期)
 char cnt = 0;
void (void)  1 {
    TH0 = 0xF8;
    TL0 = 0xCC;   // 重新加载2ms
    cnt++;
    if (cnt == 1) {
        Servo = 1;                    // 开始高电平
        // 重新加载定时器,改为高电平持续时间
        TH0 = (65536    100) >> 8;
        TL0 = (65536    100) & 0xFF;
    } 
    else if (cnt == 10) {
        Servo = 0;                    // 低电平,完成一个周期
        cnt = 0;
        // 恢复定时器为2ms
        TH0 = 0xF8;
        TL0 = 0xCC;
    } 
    else {
        // 中间其他中断周期保持低电平(实际已在第一次中断后改为高电平持续时间)
        // 此结构已完整实现20ms周期内高电平输出指定时间
    }
}
void main() {
    ();
    (0);    // 初始化转到0度
    while(1) {
        // 示例:循环摆动
        (0);   // 0度
        (500);
        (90);  // 90度
        (500);
        (180); // 180度
        (500);
    }
}
// 简单延时函数(ms),基于12MHz
void ( int ms) {
     int i, j;
    for(i=0; i

05常见问题与解决(90%的故障都在这)

现象 原因
舵机完全不转,也不抖动 电源不足或接线错误 检查舵机独立供电是否≥5V/1A;共地是否连接;信号线是否正确
舵机抖动伟创动力,角度不准 定时器中断被其他任务干扰 / 电源纹波大 关闭其他中断(如串口中断);在舵机电源两端并联一个电解电容
只能转0和180度,中间角度无反应 PWM高电平时间计算错误或步长太大 检查是否平滑变化。如使用上述代码直接调用
烧录程序后无反应 晶振频率与代码中不一致 确认你用的STC15实际晶振频率,修改代码中和定时器初值

06重复核心观点:PWM周期和脉宽是控制舵机的唯一关键

无论你选用STC15这类单片机,还是选用别的单片机,控制舵机的实质就是生成周期为20ms的信号,且该信号的高电平处于0.5至2.5ms的范围之中。只要你的定时器能够精准地输出这样的波形,那么任何I/O口都能够驱动舵机。不要让复杂的名词把自己给迷惑住。

07立即行动建议

控制舵机的程序_stc15控制舵机程序_如何用程序控制舵机

1. 先按上面的电路连接图接好舵机和独立电源,并共地。

2. 复制完整代码到Keil C51中编译,生成HEX文件。

3. 采用STC ISP软件,将其烧录进STC15单片机,此时要留意,选择正确的IRC频率,把该频率设定为12MHz。

4. 上电观察舵机是否按程序摆动(0°→90°→180°循环)。

5. 要是碰到问题,转过头去查看“常见问题”表格,去排查电源以及共地。

成功促使首个角度发生变动之际,你能够把它转接到机械小臂、舵机云台或者机器人关节范畴的项目里头去。要是需要那些能够持续转动的舵机(三百六十度)或者总线舵机之际,控制协议存在差异,不过PWM的基础原理是一样的。

为所有产品提供动力单元

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

在线留言
WhatsApp
+86 0769 8399 3238
 
kpowerMap