#include<REG52.h>
#include <stdio.h>
#define u8 unsigned char
#define u16 unsigned int
#define T 10000
u16 PWM_Value[2]={1500,1500};
sbit PWM_OUT0=P2^0; //定义I/O口 该I/O口连接上面的舵机
sbit PWM_OUT1=P2^1; //定义I/O口
sbit red_qian=P1^0;
sbit red_hou=P1^1;
sbit red_zuo=P1^2;
sbit red_you=P1^3;
u16 time=5000;
u8 order1; //定时器扫描序列
u16 flag;
void delay(u16 a )
{
while(a--);
}
void delay_nms(u16 a )
{
u16 b;
while(a--)
for(b=0;b<1000;b++);
} //周期2500
void timer0() interrupt 1 using 1
{
switch(order1)
{
case 1: PWM_OUT0=1;
TH0=-PWM_Value[0]/256;
TL0=-PWM_Value[0]%256;
break;
case 2: PWM_OUT0=0;
TH0=-(T-PWM_Value[0])/256;
TL0=-(T-PWM_Value[0])%256;
break;
case 3: PWM_OUT1=1;
TH0=-PWM_Value[1]/256;
TL0=-PWM_Value[1]%256;
break;
case 4: PWM_OUT1=0;
TH0=-(T-PWM_Value[1])/256;
TL0=-(T-PWM_Value[1])%256;
break;
default : order1=0;
}
order1++;
}
int StrideStep1 =4; //调整步长也可以调节舵机的运动速度,这里的值不要太大,大家在1.2.3.4.5之间选择就行了
void Movement_bd(void)//这是舵机打角的函数,在这里改变一些数值,可以对应改变舵机的打角范围,但是不会超过0到180。
{
PWM_Value[0]=1500;
PWM_Value[1]=1500;
delay_nms(1000);
}
void Movement_hou()//这是舵机打角的函数,在这里改变一些数值,可以对应改变舵机的打角范围,但是不会超过0到180。
{
u16 m;
for(m=PWM_Value[0];m>1000;m-=StrideStep1)// 这个for循环的意思就是,让舵机比例角度从 1500到 1000
{
PWM_Value[0]=m; //
delay(time);
}
}
void Movement_qian(void)//这是舵机打角的函数,在这里改变一些数值,可以对应改变舵机的打角范围,但是不会超过0到180。
{
u16 m;
for(m=PWM_Value[0];m<2000;m+=StrideStep1)// 这个for循环的意思就是,让舵机比例角度从 1500到 1000
{
PWM_Value[0]=m; //
delay(time);
}
}
void Movement_zuo(void)//这是舵机打角的函数,在这里改变一些数值,可以对应改变舵机的打角范围,但是不会超过0到180。
{
u16 m;
for(m=PWM_Value[1];m>1000;m-=StrideStep1)// 这个for循环的意思就是,让舵机比例角度从 1500到 1000
{
PWM_Value[1]=m; //
delay(time);
}
}
void Movement_you(void)//这是舵机打角的函数,在这里改变一些数值,可以对应改变舵机的打角范围,但是不会超过0到180。
{
u16 m;
for(m=PWM_Value[1];m<2000;m+=StrideStep1)// 这个for循环的意思就是,让舵机比例角度从 1500到 1000
{
PWM_Value[1]=m; //
delay(time);
}
}
void Movement_houzuo(void)//这是舵机打角的函数,在这里改变一些数值,可以对应改变舵机的打角范围,但是不会超过0到180。
{
u16 m;
for(m=PWM_Value[1];m>1000;m-=StrideStep1)// 这个for循环的意思就是,让舵机比例角度从 1500到 1000
{
PWM_Value[1]=m; //
delay(time);
PWM_Value[0]=m; //
delay(time);
}
}
void Movement_qianyou(void)//这是舵机打角的函数,在这里改变一些数值,可以对应改变舵机的打角范围,但是不会超过0到180。
{
u16 m;
for(m=PWM_Value[0];m<2000;m+=StrideStep1)// 这个for循环的意思就是,让舵机比例角度从 1500到 1000
{
PWM_Value[0]=m; //
delay(time);
PWM_Value[1]=m;
delay(time); //
}
}
void Movement_houyou(void)//这是舵机打角的函数,在这里改变一些数值,可以对应改变舵机的打角范围,但是不会超过0到180。
{
u16 m;
for(m=PWM_Value[0];m>1000;m-=StrideStep1)// 这个for循环的意思就是,让舵机比例角度从 1500到 1000
{
PWM_Value[0]=m; //
delay(time);
PWM_Value[1]=m+2*StrideStep1; //
delay(time);
}
}
void Movement_qianzuo(void)//这是舵机打角的函数,在这里改变一些数值,可以对应改变舵机的打角范围,但是不会超过0到180。
{
u16 m;
for(m=PWM_Value[0];m<2000;m+=StrideStep1)// 这个for循环的意思就是,让舵机比例角度从 1500到 1000
{
PWM_Value[0]=m; //
delay(time);
PWM_Value[1]=m-2*StrideStep1; // 1500--1000
delay(time);
}
}
/*void move_zh()
{
u16 m;
for(m=PWM_Value[1];m<1500;m+=StrideStep1)
{
PWM_Value[1]=m;
delay(time);
}
}
void move_yh()
{
u16 m;
for(m=PWM_Value[1];m>1500;m-=StrideStep1)
{
PWM_Value[1]=m;
delay(time);
}
}
void move_hh()
{
u16 m;
for(m=PWM_Value[0];m<1500;m+=StrideStep1)
{
PWM_Value[0]=m;
delay(time);
}
}
void move_qh()
{
u16 m;
for(m=PWM_Value[0];m>1500;m-=StrideStep1)
{
PWM_Value[0]=m;
delay(time);
}
}
void move_hzh()
{
u16 m;
for(m=PWM_Value[1];m<1500;m+=StrideStep1)// 这个for循环的意思就是,让舵机比例角度从 1500到 1000
{
PWM_Value[1]=m; //
delay(time);
PWM_Value[0]=m; //
delay(time);
}
}
void move_qyh()
{
u16 m;
for(m=PWM_Value[0];m>1500;m-=StrideStep1)// 这个for循环的意思就是,让舵机比例角度从 1500到 1000
{
PWM_Value[0]=m; //
delay(time);
PWM_Value[1]=m;
delay(time); //
}
}
void move_hyh()
{
u16 m;
for(m=PWM_Value[0];m<1500;m+=StrideStep1)// 这个for循环的意思就是,让舵机比例角度从 1500到 1000
{
PWM_Value[0]=m; //
delay(time);
PWM_Value[1]=m-2*StrideStep1; //
delay(time);
}
}
void move_qzh()
{
u16 m;
for(m=PWM_Value[0];m>1500;m-=StrideStep1)// 这个for循环的意思就是,让舵机比例角度从 1500到 1000
{
PWM_Value[0]=m; //
delay(time);
PWM_Value[1]=m+2*StrideStep1; // 1500--1000
delay(time);
}
} */
void InitPWM(void)
{
order1=1;
TMOD |=0x01;
TH0=-1500/256;
TL0=-1500%256;
EA=1;
ET0=1;
TR0=1;
}
void examing()
{
if(red_qian==0&&red_hou==1&&red_zuo==1&&red_you==1)Movement_qian();
else if(red_qian==0&&red_hou==0&&red_zuo==0&&red_you==1)Movement_zuo();
else if(red_qian==1&&red_hou==0&&red_zuo==0&&red_you==1)Movement_houzuo();
else if(red_qian==1&&red_hou==1&&red_zuo==0&&red_you==1)Movement_zuo();
else if(red_qian==1&&red_hou==1&&red_zuo==1&&red_you==0)Movement_you();
else if(red_qian==0&&red_hou==1&&red_zuo==1&&red_you==0)Movement_qianyou();
else if(red_qian==0&&red_hou==0&&red_zuo==1&&red_you==0)Movement_you();
else if(red_qian==1&&red_hou==0&&red_zuo==0&&red_you==0)Movement_hou();
else if(red_qian==1&&red_hou==0&&red_zuo==1&&red_you==1)Movement_hou();
else if(red_qian==1&&red_hou==0&&red_zuo==1&&red_you==0)Movement_houyou();
else if(red_qian==0&&red_hou==1&&red_zuo==0&&red_you==1)Movement_qianzuo();
else if(red_qian==0&&red_hou==1&&red_zuo==0&&red_you==0)Movement_qian();
else Movement_bd();
}
void main(void)
{
InitPWM();
while(1)
{
examing();
}
}
|