打印
[C语言]

跪求大神指导 用红外控制舵机的程序 红外检测到很久之后舵机才开始反应

[复制链接]
941|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
月照深林上|  楼主 | 2016-12-7 20:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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();
}
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝