发布时间: 2026-04-16
本文是面向电子爱好者以及初学者的,给出了基于51单片机的舵机控制程序的完整方案。舵机控制的关键在于生成周期为20ms、脉宽处于0.5ms至2.5ms之间的PWM信号。最常被使用的控制程序存在三种,分别是按键调节角度程序、固定角度程序、串口指令程序。
经对应关系可知,舵机凭借PWM信号的脉宽达成对角度的控制,像如SG90、MG995这般的标准舵机伟创动力舵机,其对应关系为如下所述那般。
具权威性的来源表明,上述所提及的数据,是依据舵机行业里普遍通用的PWM控制协议而来的,并且各个品牌的舵机数据手册当中,都存有这样的标准。
#
sbit servo = P1^0; // 舵机信号线接P1.0
void delay( int t) {
while(t);
}
void main() {
while(1) {
servo = 1;
delay(150); // 产生1.5ms高电平(90°)
servo = 0;
delay(18500); // 剩余周期时间(20ms1.5ms)
}
}
应用场景: 智能车转向轮居中、机械臂初始位姿固定。
#
sbit servo = P1^0;
sbit = P3^0; // 增加角度按键
sbit = P3^1; // 减少角度按键
int = 150; // 初始1.5ms对应90°
// 范围:50(0°)到250(180°)
void delay( int t) {
while(t);
}
void () {
if( == 0) {
delay(1000); // 消抖
if( == 0) {
if( < 250) += 10;
while(!);
}
}
if( == 0) {
delay(1000);
if( == 0) {
if( > 50) = 10;
while(!);
}
}
}
void main() {
while(1) {
();
servo = 1;
delay();
servo = 0;
delay(20000 );
}
}
![]()
平常会遇到的问题处理办法:按下按键一次就跳跃好多角度,一般来讲是由于消除抖动的延迟时间不够,把delay(1000)改成delay(5000)就行。
#
sbit servo = P1^0;
int = 150; // 默认90°
void delay( int t) {
while(t);
}
void () {
TMOD = 0x20; // 定时器1模式2
TH1 = 0xFD; // 9600波特率(11.晶振)
TL1 = 0xFD;
TR1 = 1;
SCON = 0x50; // 串口模式1,允许接收
ES = 1; // 开启串口中断
EA = 1; // 开启总中断
}
void () 4 {
char cmd;
if(RI) {
cmd = SBUF;
RI = 0;
(cmd) {
case '0': = 50; break; // 0°
case '1': = 100; break; // 45°
case '2': = 150; break; // 90°
case '3': = 200; break; // 135°
case '4': = 250; break; // 180°
}
}
}
void main() {
();
while(1) {
servo = 1;
delay();
servo = 0;
delay(20000 );
}
}
利用串口调试助手来发送指令,发送字符'0',发送字符'1',发送字符'2',发送字符'3',发送字符'4',通过这些字符就能控制舵机转到对应角度。
标准接线(以SG90舵机为例):
舵机的红线,连接到5V电源,要注意,由于51单片机IO口电流不足,所以外接5V供电。
舵机棕线 → GND(与单片机共地)
舵机橙线 → 单片机P1.0
三大常见故障及解决:
![]()
主要理念反复:51单片机操控舵机的实质是制造周期为20ms的PWM信号,并且脉宽处于0.5ms至2.5ms范围,借助调节高电平时间能够控制角度从0°至180°。
行动建议:
1. 初学者:先烧录固定角度程序,验证硬件接线正确
2. 项目开发:根据控制方式(手动/远程)选择按键或串口程序
3. 故障排查:优先检查供电是否≥5V/2A,以及共地是否可靠
做了上述任意一个程序的烧录,并且正确完成接线之后,舵机应该在1秒之内做出响应,进而转到指定的角度。要是需要更为精确的角度控制,那么可以结合外部晶振,或者采用定时器中断来生成PWM。