51单片机——舵机(SG90)

一.实物图及接线:

1.实物图:

自带三根线(黄,红,褐)色。
在这里插入图片描述

2.与51单片机接线图:

Vcc(红色) ------> 单片机的5V
GND(褐色) ------> 单片机的GND
信号线(黄色) ------> 这里接P21(只要不冲突,这根随机)
在这里插入图片描述

二.定义和原理:

1.参数及定义:

  • 舵机是一种伺服驱动器,适用于角度不断变化并可以保持的控制系统。
  • 这款舵机是模拟舵机,理解为需要不断发送PWM信号控制舵机角度,例如1ms的高电平给到信号接口,他就会传输1ms的PWM信号,舵机就会转到1msPWM信号对应的45度角。
  • 使用的是4.8V-6V的电压,正常接单片机的5V就行,有时候舵机出现卡顿或不转,有可能是电压不够,注意这点。精度可以控制在0.2cm。

2.原理:

在这里插入图片描述
占空比:就是一个周期内,高电平所占比例,舵机角度转动多少就是要看高电平占多少,理解这个很重要。

  • 舵机工作的一个周期20ms,这个固定。通过给信号口输入控制信号(0.5ms-2.5ms)多少决定舵机转动的角度。
  • 控制信号对应角度:(忽略上图角度)
    0.5ms -----> 0度
    1.0ms -----> 45度
    1.5ms -----> 90度
    2.0ms -----> 135度
    2.5ms -----> 180度
  • 这里需要用到定时器来控制舵机的一个周期及控制 控制信号的时间。

三.代码思路:

1.定时器的初始化:(以定时器0举例)

  • 选择定时器0的定时模式且方式1;
  • 设置初值TH0和TL0,正常情况下定时0.5ms溢出,因为刚好是角度控制信号的倍数,方便理解,也可以是0.1ms溢出,这里用0.5ms举例。
  • 打开定时器启动位TR0;
  • 打开总中断EA;
  • 打开定时器0中断ET0;
void Time0_Init()
{
        TMOD=0x01;
        TH0=(65536-500)/256;
        TL0=(65536-500)%256;
        TR0=1;
        EA=1;
        ET0=1;
}

2.定时器中断函数:

  • 定义一个变量,用来统计中断次数(定时器溢出申请中断次数),让它递增,直到递增到能够让舵机完成一个周期20ms,也就是40次(0.5ms*40=20ms),才让它归0,反复形成20ms的周期。
  • 不能忘了重新给TH0和TL0重新赋予初值。
  • 定义一个全局变量,用来控制舵机要转的角度,让它与中断次数变量对比,例如,if(中断次数<舵机角度变量){给PWM信号};理解为:一个中断次数时间0.5ms,当舵机角度变量为3时,说明将产生3个PWM信号,这个PWM信号的产生由给P21高电平产生。如果中断次数>舵机角度变量就不给PWM信号,即else{不给PWM信号}

结合下图理解:
在这里插入图片描述

void Time0() interrupt 1
{
        count++;                       //定义一个变量统计中断次数
        TH0=(65536-500)/256;
        TL0=(65536-500)%256;
        if(count==40)                  //一个20ms的周期
        {
                count=0;
        }        
        if(count<number)               //通过给number赋值决定舵机转动角度
        {
                SG90=1;               //给P21口高电平表示传输PWM信号
        }
        else
        {
                SG90=0;
        }
}

3.主函数:

  • 调用定时器初始化函数。
  • 可以调整舵机初始角度。
  • while循环里给舵机角度变量赋值,若要让舵机在两个角度之间跳变,则用延时控制速度。还可以用按键控制想要的角度。
void main()
{
        Time0_Init();
        SG90=1;
        while(1)
        {
                number=1;
                count=0;                //在舵机转动后清空中断次数,为下一个角度做准备
                Delay1ms(1000);

                number=3;
                count=0;
                Delay1ms(1000);
        }
}

四.总代码:

现象1:从0度—>135度来回转动

#include <REGX52.H>
#include "Delay1ms.h"

sbit SG90=P2^1;
void Time0_Init();
unsigned char count=0;
unsigned char number=0;
void main()
{
        Time0_Init();
        SG90=1;
        while(1)
        {
                number=1;
                count=0;
                Delay1ms(1000);

                number=3;
                count=0;
                Delay1ms(1000);
        }
}

void Time0_Init()
{
        TMOD=0x01;
        TH0=(65536-500)/256;
        TL0=(65536-500)%256;
        TR0=1;
        EA=1;
        ET0=1;
}

void Time0() interrupt 1
{
        count++;
        TH0=(65536-500)/256;
        TL0=(65536-500)%256;
        if(count==40)
        {
                count=0;
        }        
        if(count<number)
        {
                SG90=1;
        }
        else
        {
                SG90=0;
        }
}


现象2.独立按键控制0度—>90度转动

#include <REGX52.H>
#include "Delay1ms.h"

sbit SG90=P2^1;
void Time0_Init();
unsigned char count=0;
unsigned char number;
void main()
{
        Time0_Init();
        SG90=1;
        while(1)
        {
                if(P3_1==0)
                {
                        number=1;
                        count=0;
                }
                if(P3_0==0)
                {

                        number=3;
                        count=0;
                }
                
                
        }
}

void Time0_Init()
{
        TMOD=0x01;
        TH0=(65536-500)/256;
        TL0=(65536-500)%256;
        TR0=1;
        EA=1;
        ET0=1;
}

void Time0() interrupt 1
{
        count++;
        TH0=(65536-500)/256;
        TL0=(65536-500)%256;
        if(count==40)
        {
                count=0;
        }        
        if(count<number)
        {
                SG90=1;
        }
        else
        {
                SG90=0;
        }
}


五.效果展示:

1.现象1:

舵机循环旋转

2.现象2:

按键控制舵机转动角度

  • 20
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 按键控制51单片机sg90舵机的步骤如下: 1. 准备好所需材料:51单片机SG90舵机、按键开关、杜邦线以及所需的电源。 2. 将SG90舵机的三个线(VCC、GND、Signal)分别连接到51单片机的电源和IO引脚。将VCC接到单片机的5V电源引脚上,将GND接到单片机的地(GND)引脚上,将Signal接到单片机的IO引脚上。 3. 将按键开关的两个针脚分别连接到单片机的IO引脚和地(GND)引脚上。 4. 编写51单片机的程序代码,实现按键控制SG90舵机的功能。首先,需要初始化IO引脚和按键开关的输入输出设置。然后,在主循环中,不断检测按键开关的状态。当按键按下时,单片机通过IO引脚控制SG90舵机的运动。可以根据需要设置舵机运动的角度和速度。 5. 通过编译、烧录和执行程序,将代码上传到51单片机中。 6. 连接好电源,并将程序运行起来。 7. 通过按下按键开关,检查SG90舵机是否按照预期的方式运动。根据需要,可以调整程序代码中的舵机运动参数,以获得所需的舵机运动效果。 总结:通过以上步骤,可以按键控制51单片机上的SG90舵机。按下按键开关可以触发单片机控制舵机的运动,从而实现各种舵机角度的控制和调整。这样的控制方式可以在很多场景中使用,例如车辆模型的遥控、机器人的动作控制等。 ### 回答2: 控制51单片机上的SG90舵机需要通过GPIO口输出PWM信号来实现角度调节。以下是一个简单的300字结果,供参考: 首先,需要了解SG90舵机工作原理。SG90舵机是一种小型、低成本、高性能的模拟舵机,其主要由直流电机、减速机构和位置反馈电路组成。舵机在工作时,接收到的PWM信号的占空比决定了舵机的位置,通常情况下,SG90舵机的控制PWM信号频率为50Hz(周期为20ms),脉宽范围为0.5ms-2.5ms,其中0.5ms对应舵机的180°角度,1.5ms对应舵机的90°角度,2.5ms对应舵机的0°角度。 在51单片机上,可以利用其中的GPIO(通用输入/输出)口实现PWM输出。具体的步骤如下: 1. 配置GPIO口为输出模式,用于连接舵机。可以使用单片机的开发环境进行配置,具体方法视所使用的开发环境而定。 2. 通过编程控制GPIO口的输出信号,生成PWM波形。可以使用单片机的定时器/计数器模块来实现精确的控制。在每个周期内,根据所需要的舵机角度,计算出对应的脉宽,并将此脉宽赋值给GPIO口输出。 3. 根据实际需求,编写适当的延时函数,来控制舵机在给定的角度停留的时间。可以使用单片机的延时函数或者自行编写延时函数,保证舵机能够稳定运行。 以上是控制51单片机上的SG90舵机的基本步骤。需要特别注意的是,为了保证操作的稳定性,可以添加适当的保护电路,如电阻、电容等,以防止过电流或过电压的损坏。另外,在编程中要注意舵机的工作电压和电流限制,避免给舵机提供超出其能力范围的信号。 当以上步骤完成后,即可通过按键控制51单片机上的SG90舵机。根据按键的状态,编写相应的控制程序,通过改变PWM信号的占空比,实现舵机角度的调节。可以使用按键中断来检测按键状态的变化,然后在中断程序中更新舵机的PWM信号输出。在程序中可以设置不同的按键功能,如按下按键舵机逆时针旋转一定角度,松开按键舵机停止。根据具体需求,可以进行灵活的调整和扩展。 ### 回答3: 要按键控制51单片机上的sg90舵机,你需要做以下步骤: 1. 准备材料:51单片机sg90舵机、蓝牙模块、面包板、按键开关、跳线等。 2. 将sg90舵机连接到面包板上。将舵机的VCC连接到5V的电源,将GND连接到电源的GND,将信号线连接到51单片机的一个IO口,例如P1.1口。 3. 将按键开关连接到面包板上。一端连接到5V电源,一端连接到GND,中间引出的引脚接到另一个51单片机的IO口,例如P2.3口。引脚上需要加上一个上拉电阻。 4. 将蓝牙模块连接到面包板上。将TX引脚连接到P3.1口,将RX引脚连接到P3.0口。 5. 使用Keil等开发工具编写51单片机的程序代码。在程序中,对按键口进行轮询,如果检测到按键按下,则发送信号给舵机控制程序。在舵机控制程序中,根据接收到的信号来控制舵机旋转的方向和角度。 6. 将编写好的程序下载到51单片机中。可以选择通过USB转串口工具将程序下载到单片机中。 7. 打开蓝牙,以手机等设备与蓝牙模块进行连接。通过发送指定的命令给蓝牙模块,来控制舵机的旋转方向和角度。 通过以上步骤,你就可以实现按键控制51单片机上的sg90舵机了。你可以通过按下按键来控制舵机的旋转,也可以通过蓝牙发送命令来控制舵机的动作。这种方法可以应用于一些需要远程遥控或者按键控制的舵机应用中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值