打印
[其它应用]

用51单片机控制SG90舵机工作

[复制链接]
2193|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
青春洋溢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信号。首先需要初始化定时器的工作模式、计数初值等

使用特权

评论回复
5
晓伍| | 2025-4-12 08:42 | 只看该作者
将SG90舵机的信号线(通常为橙色或黄色)连接到51单片机的一个数字I/O口,用于发送PWM信

使用特权

评论回复
6
八层楼| | 2025-4-12 10:57 | 只看该作者
通过调整PWM信号的脉冲宽度,可以控制SG90舵机的转动角度。通常,脉冲宽度在0.5ms到2.5ms之间变化时,舵机可以转动0度到180度

使用特权

评论回复
7
观海| | 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) {
        // 根据需要添加控制逻辑,如按键检测、角度计算等
    }
}


使用特权

评论回复
8
guanjiaer| | 2025-4-12 15:45 | 只看该作者
确保提供给SG90舵机的电源稳定且足够,以避免因电源问题导致舵机转动异常

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

53

帖子

0

粉丝