#include <REGX52.H>
int cnt = 0;
sbit sg90 = P1^2;
int jd;
void Delay2000ms() //@11.0592MHz
{
unsigned char i, j, k;
//_nop_();
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
//_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Time_0init() //定时器中断初始化
{
TMOD = 0x01;
TL0 = 0x66; //设置定时初始值0.5ms
TH0 = 0xEA; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1; //进入中断
}
void main()
{ Delay300ms(); //消抖
Time_0init(); //进入初始化
jd = 1; //初始转到0°对应0.5ms
cnt = 0; //初始0次
sg90 = 1; //一上电给高电平
while(1) //不断循环转动,在此可以调度数
{
jd = 4; //相当于135°
cnt = 0; //归零跳到另一种波形
Delay2000ms();
jd = 1; //相当于0°
cnt = 0;
Delay2000ms();
}
}
void Time_0handler() interrupt 1 //(不断传波形信号)
{
cnt++;
TL0 = 0x66; //爆表一次回到初始值
TH0 = 0xEA;
if(cnt < jd) //转过的角度
{
sg90 = 1;
}else
{sg90 = 0;
}
if(cnt == 40) //20ms为舵机一个周期形成一个波形
{
cnt = 0;
sg90 = 1; //从头开始
}
}
原理:
0.5ms————-0度; 相当于jd=1
1.0ms————45度; 相当于jd=2
1.5ms————90度; 相当于jd=3
2.0ms———–135度; 相当于jd=4
2.5ms———–180度; 相当于jd=5
jd原理图:180°一般为20ms 50HZ
单个高低电平组成周期 高电平为jd作用时期