[其它应用] 用51单片机控制SG90舵机工作

[复制链接]
4833|15
 楼主| 青春洋溢001 发表于 2022-5-10 11:03 | 显示全部楼层 |阅读模式

下面是我用keil写的程序,怎么烧录到STC89C52单片机中实现不了预期功能呢?
本来是按下jia键,舵机就转180度,按下jian键就转0度。可是我的舵机却反应得不那么
灵敏。我用的是SG90舵机,接在开发板5v,该舵机正常工作电压是4.6-6v,是这个舵机
驱动不起来吗?还是我的程序有问题?求大神指点指点
#include
#define uchar unsigned char
#define uint unsigned int

sbit jia=P3^4;
sbit jian=P3^5;
sbit pwm=P3^7;

uchar jd,count;

void delay (uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=118;j>0;j--);
}

void display()
{
if(jia==0)
{
delay (10);
if(jia==0)
{
jd=0;
count=0;
while(jia==0);
}
}
if(jian==0)
{
delay (10);
if(jian==0)
{
jd=5;
count=0;
while(jian==0);
}
}
}

void main()
{
TMOD=0x01;
TH1=(65536-655036)/256;
TL1=(65536-655036)%256;
EA=1;
ET1=1;
TR1=1;
jd=1;
count=0;
while(1)
{
display();
}
}

void T0_time() interrupt 3
{
TH1=(65536-655036)/256;
TL1=(65536-655036)%256;

if(count<jd)
pwm=1;
else
pwm=0;
count=(count+1);
count=count%40;
}


tpgf 发表于 2025-4-9 10:07 | 显示全部楼层
使用51单片机控制SG90舵机,通常需要通过产生脉宽调制信号来调整舵机的转动角度
梦塑者 发表于 2025-4-10 15:24 | 显示全部楼层
这代码写的,阅读起来难度有点大呀
磨砂 发表于 2025-4-11 15:51 | 显示全部楼层
使用51单片机的定时器来生成PWM信号。首先需要初始化定时器的工作模式、计数初值等
晓伍 发表于 2025-4-12 08:42 | 显示全部楼层
将SG90舵机的信号线(通常为橙色或黄色)连接到51单片机的一个数字I/O口,用于发送PWM信
八层楼 发表于 2025-4-12 10:57 | 显示全部楼层
通过调整PWM信号的脉冲宽度,可以控制SG90舵机的转动角度。通常,脉冲宽度在0.5ms到2.5ms之间变化时,舵机可以转动0度到180度
观海 发表于 2025-4-12 13:21 | 显示全部楼层
#include <reg52.h>

// 定义SG90舵机连接的I/O口
sbit Servo = P1^0;

// 定时器初始化函数
void Timer0_Init() {
    TMOD &= 0xF0; // 清除T0控制位
    TMOD |= 0x01; // 设置T0为工作方式1(16位定时器)
    TH0 = (65536 - 50000) / 256; // 计算并设置初始计数值高8位
    TL0 = (65536 - 50000) % 256; // 计算并设置初始计数值低8位
    TR0 = 1; // 启动定时器0
    ET0 = 1; // 允许定时器0中断
    EA = 1; // 开启总中断
}

// 定时器0中断服务函数
void Timer0_Interrupt(void) interrupt 1 {
    static unsigned int count = 0;
    if (count < 20000) { // 根据需要的脉冲宽度调整此值
        Servo = 1; // 输出高电平
    } else {
        Servo = 0; // 输出低电平
    }
    count++;
    if (count >= 40000) { // 根据PWM周期调整此值
        count = 0;
        TH0 = (65536 - 50000) / 256; // 重置计数值高8位
        TL0 = (65536 - 50000) % 256; // 重置计数值低8位
    }
}

// 主函数
void main(void) {
    Timer0_Init(); // 初始化定时器
    while (1) {
        // 根据需要添加控制逻辑,如按键检测、角度计算等
    }
}


guanjiaer 发表于 2025-4-12 15:45 | 显示全部楼层
确保提供给SG90舵机的电源稳定且足够,以避免因电源问题导致舵机转动异常
小迷糊仙 发表于 2025-6-4 11:20 | 显示全部楼层
这个有点深奥  学习了
快乐制造机 发表于 2025-6-6 14:38 | 显示全部楼层
看起来你的程序逻辑是正确的,但是SG90舵机的控制信号是PWM波,需要一定的频率和占空比。你的程序中PWM信号的频率和占空比可能没有设置正确,导致舵机反应不灵敏。你可以尝试调整TH1和TL1的值,以改变PWM信号的频率和占空比。
暖茶轻语 发表于 2025-6-6 19:21 | 显示全部楼层
看起来你的程序逻辑是正确的,但是SG90舵机对PWM信号的响应可能需要更精确的控制。你可以尝试调整PWM的占空比,确保舵机接收到正确的信号。
老橘树下的桥头 发表于 2025-7-10 21:03 | 显示全部楼层
[color=rgba(0, 0, 0, 0.85)]51 单片机通过定时器产生 20ms PWM 信号,调整 1-2ms 脉冲宽度(占空比 5%-10%)即可控制 SG90 舵机角度。
拿走一光年 发表于 2025-8-27 12:56 | 显示全部楼层
51 单片机控制 SG90:通过定时器输出 20ms 周期 PWM,占空比 0.5-2.5ms 对应 0-180°,程序配置定时器和 IO 口实现角度控制。
夜晚有三年 发表于 2025-9-1 13:16 | 显示全部楼层
51 单片机通过定时器输出 20ms 周期 PWM,高电平 0.5-2.5ms 对应 0-180°,连接 SG90 信号脚,编程控制占空比实现角度调节。
旧年胶片 发表于 2025-10-13 11:28 | 显示全部楼层
用 51 单片机控制 SG90 舵机,需先明确舵机通过 20ms 周期、0.5-2.5ms 高电平的 PWM 信号控制角度(对应 0-180°)。可利用定时器(如 T0/T1)生成 PWM:配置定时器工作模式,计算初值以输出 20ms 周期信号,再通过改变高电平持续时间(如 0.5ms 对应 0°),将信号从单片机 I/O 口(如 P1.0)输出到 SG90 信号端,通电后即可实现舵机角度控制。
梦境摆渡人 发表于 2025-10-16 20:23 | 显示全部楼层
你的程序中PWM信号的周期设置可能不太适合SG90舵机。SG90舵机一般需要20ms周期的PWM信号
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

53

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部