单片机交流
直播中

成尔秩

7年用户 944经验值
私信 关注
[问答]

51单片机如何控制SG90舵机?

51单片机如何控制SG90舵机?

回帖(1)

王丽娟

2021-10-26 15:03:51
基本介绍

舵机的分类

大致分为以下三种吧 只是我现在用过就三种 。
180° 有限位 (不上电 只能转180度 真正转也就是180° )
180° 无限位 (不上电 能转360° 但是真正转也就是180°)
360° 无限位 (这个就是上电不上电都能转360°以上)
我这里用的是 180° 无限位的舵机
首先看看一下图片:





接线

接线其实很简单。
[tr]51单片机SG90舵机[/tr]
VCCVCC(红色)
GNDGND(棕色)
P1.0信号线 (橙色)
代码


#include #include "delay.h"unsigned int count;      //次数标识unsigned int angle=5;         //角度标识***it pwm =P1^0 ;          //PWM信号输出/*定时器初始化函数*/void Timer0_Init(void)                //100微秒@11.0592MHz{        TMOD |= 0x01;                //设置定时器模式        TL0 = 0xA4;                //设置定时初值        TH0 = 0xFF;                //设置定时初值        TF0 = 0;                //清除TF0标志        TR0 = 1;                //定时器0开始计时        ET0 = 1;}/*串口初始化函数*/void Uart_Init(void)                //9600bps@11.0592MHz{        SCON = 0x50;                //8位数据,可变波特率        TMOD |= 0x20;                //设定定时器1为8位自动重装方式        TL1 = 0xFD;                //设定定时初值        TH1 = 0xFD;                //设定定时器重装值        ET1 = 0;                //禁止定时器1中断        TR1 = 1;                //启动定时器1        ES = 1;        EA = 1;}/*串口发送一字节函数*/void Uart_SendData(unsigned char dat ){        SBUF = dat;        while(TI == 0);        TI = 0;}/*串口发送字符串函数*/void Uart_SendString(char *s){        while (*s)                      {                Uart_SendData(*s++);        }}/*程序入口*/void main(void){        //angle与对应角度关系        //4   5   6   ...... 19  20        //0   11  22  ...... 166 177        Uart_Init();        Timer0_Init();        Uart_SendString("舵机正在旋转。\r\n");        for(angle=4;angle<21;angle++)//从0到177度,步进11度        {                delay_ms(2);        }        delay_ms(2000);        for(angle=21;angle>4;angle--)//从177到0度,步进11度        {                delay_ms(2);        }        Uart_SendString("舵机正在往复旋转。\r\n");        while(1)        {                                     }}/*串口中断服务函数*/void Uart_Isr() interrupt 4{    if (RI)    {        RI = 0;          }}/*定时器中断服务函数*/void Timer0_Isr() interrupt 1{        TL0 = 0xA4;                //设置定时初值        TH0 = 0xFF;                //设置定时初值        if(count< angle)              //判断次数是否小于角度标识      pwm=1;                  //确实小于,PWM输出高电平    else      pwm=0;                  //大于则输出低电平    count=(count+1);          //0.1ms次数加1    count=count%160;     //保持周期为20ms,普通51单片机定时100us有误差,经示波器测量约为50Hz}delay.c

#include #include "delay.h"#include "intrins.h"//延时约1msvoid delay_ms(unsigned int ms)               {        unsigned int a,b;        for(a=ms;a>0;a--)                for(b=114;b>0;b--);}delay.h

#ifndef __DELAY_H#define __DELAY_H#include void delay_ms(unsigned int ms);#endif
举报

更多回帖

发帖
×
20
完善资料,
赚取积分