51单片机控制舵机问题

新手一个,c语音只能看懂一小部分,需要控制一个舵机往复运动一次,一个按键。现在的代码要按键2次才能转回来,问下大神们怎么修改下按键一次就往复回来,按键一下来回运动一次。
#include<reg52.h>
#define unchar unsigned char
unsigned char count; //0.5ms次数标识
unsigned char jd=0;
sbit pwm1 = P2^1;
unsigned char flag=1;
unsigned char flag1=1;
sbit key1=P3^1;

//void delayms(unsigned int t)
//{
// int i = 0;
// for(;t>0;t--);
// for(i=110;i>0;i--);
//
//}
void Time0_Init() //定时器初始化
{
TMOD = 0x01; //定时器0工作在方式1
TH0 = (65535-500)/256;
TL0 = (65535-500)%256; //12MZ晶振,0.5ms
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}

void Time0_Int() interrupt 1
{
static int t=0;
t++;
TH0 = (65535-500)/256; //重新赋值
TL0 = (65535-500)%256;
if(count< jd) //判断0.5ms次数是否小于角度标识
{
pwm1=1; //确实小于,PWM输出高电平
}
else
{
pwm1=0; //大于则输出低电平
}
count++;//(count+1); //0.5ms次数加1
if(count>=40)
count=0;
//count=count%40; //次数始终保持为40 即保持周期为20ms
// if(t<2000)
// {
// jd=4;
// }
// else if(t<4000)
// {
// jd=1;
// }
// else
// t=0;

}
unsigned char count; //0.5ms次数标识

void keyscan() //按键扫描
{
if(key1==0&&flag1)
{

flag=!flag;
flag1=0;
}else if(key1) flag1=1;

}

void main()
{

count=0;
Time0_Init();
while(1)
{
keyscan();
if(flag)
{
jd=4;

}
else
jd=1;

}
}

舵机是通过占空比,来控制它的旋转角度,控制信号从单片机输出之后,不能直接接舵机,因为功率不够,中间接一个非门就可以了。控制信号的编程应该来说是很简单的,就是总周期是固定的,角度不同,高电平的持续时间就不同,然后,比如,50的高电平,150的低电平,那么这样的周期要多少个呢,这也是一个问题,太少了,旋转时间不够,太多了,连续的角度变化的话就会不流畅。多尝试一下吧,还有,这种例子也很多,我们那个时候调了一星期才调好,单片机的型号,引脚关系大嘛?只要是通用的io口都可以用啊追问

新手小学生,不懂啊,慢慢学习吧,能帮我写一个不,帮我修改下,谢谢啦,

温馨提示:答案为网友推荐,仅供参考