大部资料都是在网上找到网友大神所共享的,在网上找了几种舵机的,刚接触有点懵,之后找得多了就理解了,想要控制一个硬件就要先了解这个硬件。这里有介绍180度舵机和360度舵机的具体使用,有网上大神的程序,这个更多的是一个网上对舵机使用的一个整合。如果若有不到之处,希望大家积极指出,

 
 
上图就是我们今天的主角,有三条线,接线方法:
       
红-------------------------VCC
橙色----------------------信号线
原理:舵机内部有一个基准电压,微处理器产生的PWM信号通过信号线进入舵机产生直流偏置电压,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。当舵机开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。
那么我们如何获取这个 舵机呢。 
首先我们上某宝能够找到180°、360°SG90舵机。
我们先来讲的是180度的舵机。
我们知道sg90舵机是一个模拟舵机,需要我们一直给指定的脉冲。那么这个指定的脉冲是什么?查资料可以知道180度舵机不同占空比与对应角度
关系:
高电平在一个周期(20ms)的持续时间对应的舵机角度,(在这20ms内每个周期高电平的占空比一致)
| 高电平t占整个周期T(20ms)的时间 | 舵机旋转的角度 | 
| 0.5ms | 0度 | 
| 1ms | 45度 | 
| 1.5ms | 90度 | 
| 2ms | 135度 | 
| 2.5ms | 180度 | 
如图可形象地表示脉冲与角度关系:

      某宝上可能还会有另一种90度sg90舵机,这个是一个另类的180度舵机,可以一样使用上面的程序,他与180度舵机不同的是不同占空比对应的舵机角度如图: 
 
顾名思义,360度舵机可以360度旋转,因此与180度舵机有相当大的区别,首先360度舵机不能够控制旋转角度,一般的舵机是给一个特定的PWM,舵机会转到相应的角度,而360度舵机是只能够控制方向和旋转转速,所以360度舵机给定一个PWM,会以特定的速度和方向转动。
PWM信号与360舵机转速的关系:
0.5ms----------------正向最大转速;
1.5ms----------------速度为0;
2.5ms----------------反向最大转速;
总结:无论是180度90度还是360度舵机,只要我们知道了它脉冲与角度的对应关系我们就可以利用定时器加中断的方法来产生这个相应的PWM信号,进而控制舵机旋转指定角度。 
 
 1 #include<reg52.h>
 2 #define uchar unsigned char
 3 #define uint unsigned int
 4 
 5 sbit pwm=P1^0;      //信号输出
 6 sbit k1=P3^1;        //按键k1接P3^1,控制顺时针旋转
 7 sbit k2=P3^2;        //按键k2接P3^2,控制逆时针旋转
 8 
 9 uchar count=0;
10 uchar n=5;       //初始位置-在0°附近  改变n值可以改变舵机的初始位置
11 //这个n值在不同的舵机可能存在一点误差,可以改变他的值来试试具体位置
12 void delay5ms() 
13 {
14     unsigned char a,b;
15     for(b=19;b>0;b--)
16         for(a=130;a>0;a--);
17 }
18 void key()
19 {
20     if(k1==0)
21     {
22         delay5ms();
23         if(k1==0)
24            {
25             while(k1==0); //判断当键盘松开时
26             if(n<=25)
27             n++;//判断是否旋转到180°
28             else 
29             n=26;           
30            }
31     }
32     if(k2==0)
33       {
34         delay5ms();
35         if(k2==0)
36         {
37             while(k2==0); //判断当键盘松开时
38             if(n>=6) n--; //判断是否旋转到0°
39             else n=3;
40         }
41       }
42 }
43 
44 void InitTimer()        //  0.1ms   11.0592Mhz
45 {
46     TMOD = 0x01;
47     TH0 = 0xFF;
48     TL0 = 0XA3;
49     EA = 1;
50     ET0 = 1;
51     TR0 = 1;
52 }
53 
54 void main()
55 {
56     InitTimer();
57         while(1)
58         {
59           key();
60         }
61 }
62 
63 void Timer() interrupt 1      //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1
64 {
65     TH0 = 0xFF;
66     TL0 = 0xA3;
67     count++;
68     if(count<=200)
69     {
70         if(count<=n)
71         {
72             pwm=1;
73         }
74         else
75         {
76             pwm=0;
77         }
78     }
79     else
80     {
81         count=0;
82         pwm=0;
83     }
84 }
原文:https://www.cnblogs.com/zhj868/p/12534787.html