专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

单片机控制松下伺服电机正反转程序

作者:佚名   来源:本站原创   点击数:  更新时间:2010年08月26日   【字体:
//***************************************************************************     
//     
//  文 件 名: download.c     
//     
  
//     
//  目标对象: AT89S52     
//     
//  编 译 器: ISP     
//     
//  功能描述: 下料部单独控制程序     
//     
//  修改版本: 0.0     
//     
//  创建日期:2009-03-09     
//     
//***************************************************************************     
    
#include <REG52.H>     
#include<ABSACC.H>     
#include <INTRINS.H>     
#define uchar unsigned char     
#define uint  unsigned int     
    
//***************************************************************************     
    
sbit    DOWNLOAD_HS30806_Y_PULSE1       =   P1^0;//HS30806_Y电机脉冲-     
sbit    DOWNLOAD_HS30806_Y_DIR      =   P1^1;//HS30806_Y电机方向-     
sbit    DOWNLOAD_HS30806_X_PULSE1       =   P1^2;//HS30806_X电机脉冲-     
sbit    DOWNLOAD_HS30806_X_DIR      =   P1^3;//HS30806_X电机方向-     
sbit    SERVO_PULSE1        =   P3^0;//伺服电机脉冲-     
sbit    SERVO_DIR       =   P3^3;//伺服电机方向-     
sbit    SERVO_ON    =   P3^2;//伺服ON使能     
sbit    QIGANG=P3^1;    
sbit    SERVO_POINT=P2^0;    
sbit    Y_POINT=P2^1;    
sbit    S2 = P3^2;    
sbit    S3 = P3^3;    
sbit    S4 = P3^4;    
sbit    S5 = P3^5;    
    
//****************************************************************************     
    
//延时1us     
    
//****************************************************************************     
    
 void mDelay(uchar DelayTime1)    
{       
        uchar i=0;    
        for(;DelayTime1>0;DelayTime1--)    
        {       
            for(i=0;i<0x16;i++)    
                {    
                    
                }    
        }    
}    
//具体延时时间=DelayTime1*[10+3*m]+10个指令周期     
/* void mDelay(uint DelayTime1)    
{       
    for(;DelayTime1>0;DelayTime1--)    
        {       
                
        }    
}    
*/    
void Delay()    
{    
        
    ;    
;    
    
}    
//***************************************************************************     
    
//下料部Y右转程序     
    
//***************************************************************************     
    
void RIGHT_MOVE_DOWNLOAD_HS30806_Y(uint Pluse1_num)    
{       
            
    DOWNLOAD_HS30806_Y_DIR=1;    
    DOWNLOAD_HS30806_Y_PULSE1   =   1;//脉冲负     
        
    mDelay(20);         
    for(;Pluse1_num>0;Pluse1_num--)    
    {    
        DOWNLOAD_HS30806_Y_PULSE1   =   ~DOWNLOAD_HS30806_Y_PULSE1;//脉冲负     
        mDelay(20);     
        DOWNLOAD_HS30806_Y_PULSE1   =   ~DOWNLOAD_HS30806_Y_PULSE1;//脉冲负     
        mDelay(20);     
    }    
}       
    
//***************************************************************************     
    
//下料部Y左转程序     
    
//***************************************************************************     
    
void LEFT_MOVE_DOWNLOAD_HS30806_Y(uint Pluse2_num)    
{       
        DOWNLOAD_HS30806_Y_DIR=0;    
        DOWNLOAD_HS30806_Y_PULSE1   =   1;//脉冲负     
        mDelay(20);         
    for(;Pluse2_num>0;Pluse2_num--)    
    {    
        DOWNLOAD_HS30806_Y_PULSE1   =   ~DOWNLOAD_HS30806_Y_PULSE1;//脉冲负     
        mDelay(20);    
        DOWNLOAD_HS30806_Y_PULSE1   =   ~DOWNLOAD_HS30806_Y_PULSE1;//脉冲负     
        mDelay(20);     
    }    
}       
    
//***************************************************************************     
    
//下料部Y停止程序     
    
//***************************************************************************     
    
void DOWNLOAD_HS30806_Y_Stop()    
{    
        DOWNLOAD_HS30806_Y_DIR=0;    
        DOWNLOAD_HS30806_Y_PULSE1   =   1;//脉冲负     
        mDelay(20);         
}    
    
//***************************************************************************     
    
//下料部X右转程序     
    
//***************************************************************************     
    
void RIGHT_MOVE_DOWNLOAD_HS30806_X(uint Pluse1_num)    
{       
            
    DOWNLOAD_HS30806_X_DIR=1;    
    DOWNLOAD_HS30806_X_PULSE1   =   1;//脉冲负     
        
    mDelay(20);         
    for(;Pluse1_num>0;Pluse1_num--)    
    {    
        DOWNLOAD_HS30806_X_PULSE1   =   ~DOWNLOAD_HS30806_X_PULSE1;//脉冲负     
        mDelay(20);     
        DOWNLOAD_HS30806_X_PULSE1   =   ~DOWNLOAD_HS30806_X_PULSE1;//脉冲负     
        mDelay(20);     
    }    
}       
    
//***************************************************************************     
    
//下料部X左转程序     
    
//***************************************************************************     
    
void LEFT_MOVE_DOWNLOAD_HS30806_X(uint Pluse2_num)    
{       
        DOWNLOAD_HS30806_X_DIR=0;    
        DOWNLOAD_HS30806_X_PULSE1   =   1;//脉冲负     
        mDelay(20);         
    for(;Pluse2_num>0;Pluse2_num--)    
    {    
        DOWNLOAD_HS30806_X_PULSE1   =   ~DOWNLOAD_HS30806_X_PULSE1;//脉冲负     
        mDelay(20);    
        DOWNLOAD_HS30806_X_PULSE1   =   ~DOWNLOAD_HS30806_X_PULSE1;//脉冲负     
        mDelay(20);     
    }    
}       
//***************************************************************************     
    
//下料部X停止程序     
    
//***************************************************************************     
    
void DOWNLOAD_HS30806_X_Stop()    
{    
        DOWNLOAD_HS30806_X_DIR=0;    
        DOWNLOAD_HS30806_X_PULSE1   =   1;//脉冲负     
        mDelay(20);         
}    
    
//***************************************************************************     
    
//伺服电机右转程序     
    
//***************************************************************************     
    
void RIGHT_MOVE_SERVO(uint Pluse1_num)    
{       
    //SERVO_ON  =   0;     
    //mDelay(100);     
    SERVO_DIR   =   1;    
    mDelay(3);    
    SERVO_PULSE1    =   1;//脉冲负     
        
                
    for(;Pluse1_num>0;Pluse1_num--)    
    {    
        SERVO_PULSE1    =   ~SERVO_PULSE1;//脉冲负     
         mDelay(3);    
    //  mDelay(2);       
        SERVO_PULSE1    =   ~SERVO_PULSE1;//脉冲负     
         mDelay(3);    
    //  mDelay(2);       
    }    
}       
    
//***************************************************************************     
    
//伺服电机左转程序     
    
//***************************************************************************     
    
void LEFT_MOVE_SERVO(uint Pluse2_num)    
{       
//  SERVO_ON    =   0;     
//  mDelay(100);     
    SERVO_DIR   =   0;    
    mDelay(33);    
    SERVO_PULSE1    =   1;//脉冲负     
            
    for(;Pluse2_num>0;Pluse2_num--)    
    {    
        SERVO_PULSE1    =   ~SERVO_PULSE1;//脉冲负     
        //Delay();     
        mDelay(3);    
        SERVO_PULSE1    =   ~SERVO_PULSE1;//脉冲负     
        //Delay();//     
        mDelay(3);      
    }    
}       
    
//***************************************************************************     
    
//伺服电机停止程序     
    
//***************************************************************************     
    
void SERVO_PULSE1_Stop()    
{    
        SERVO_DIR=0;    
        SERVO_PULSE1    =   1;//脉冲负     
        mDelay(20);         
}    
//***************************************************************************     
    
//键盘处理程序     
    
//***************************************************************************     
    
uchar Key()    
{       
    uchar KValue;    
    uchar tmp;    
    P3|=0x3c;           //将P3口的接键盘的中间四位置1     
    KValue=P3;    
    KValue|=0xc3;       //将未接键的4位置1     
    if(KValue==0xff)    //中间4位均为1,无键按下       
        return(0);      //返回     
    mDelay(10);     //延时10ms,去键抖     
    KValue=P3;    
    KValue|=0xc3;       //将未接键的4位置1     
    if(KValue==0xff)    //中间4位均为1,无键按下       
        return(0);      //返回     
//如尚未返回,说明一定有1或更多位被按下     
    for(;;)    
    {   tmp=P3;         
        if((tmp|0xc3)==0xff)    
            break;      //等待按键释放     
    }    
    return(KValue);    
}    
    
void KProce(uchar KValue)   //键值处理     
{       
    if((KValue&0x04)==0)    
        
    LEFT_MOVE_SERVO(10000);    
    
    //RIGHT_MOVE_DOWNLOAD_HS30806_X(2000);     
    //QIGANG=0;     
    if((KValue&0x08)==0)    
        
        RIGHT_MOVE_SERVO(10000);    
    //LEFT_MOVE_DOWNLOAD_HS30806_X(2000);     
    //QIGANG=1;     
    if((KValue&0x10)==0)    
    SERVO_ON    =   0;    
    mDelay(100);    
//  RIGHT_MOVE_DOWNLOAD_HS30806_Y(2000);     
    if((KValue&0x20)==0)    
    SERVO_ON    =   1;    
    mDelay(100);    
    //LEFT_MOVE_DOWNLOAD_HS30806_Y(2000);     
}    
    
//***************************************************************************     
    
//初始化程序     
    
//***************************************************************************     
    
void    init()    
{    
//  P0=0xFF;     
//  P1=0xFF;     
//  P2=0xFF;     
//  P3=0xFF;     
    P3=0xFD;    
    mDelay(1000);    
    while(S2==1)    
    {    
            LEFT_MOVE_DOWNLOAD_HS30806_Y(1);    
    }    
    RIGHT_MOVE_DOWNLOAD_HS30806_Y(1600);    
        while(S3==1)    
    {    
            LEFT_MOVE_DOWNLOAD_HS30806_X(1);    
    }    
    RIGHT_MOVE_DOWNLOAD_HS30806_X(1600);    
}    
    
//***************************************************************************     
    
//主函数     
    
//***************************************************************************     
    
/*    
void main()    
{    
    uchar KValue,m;//,n,flag;               //存放键值;     
//g init();//     
//SERVO_ON  =   0;     
//mDelay(100);//延时0.00111300s     
mDelay(1);    
mDelay(2);    
mDelay(3);    
mDelay(4);    
mDelay(10);    
mDelay(20);    
for(m=0;m<100;m++)    
{    
RIGHT_MOVE_SERVO(25000);    
//mDelay(20);//延时0.00023s     
LEFT_MOVE_SERVO(25000);    
mDelay(20);    
}    
while(1)    
{    
//  for(m=0;m<100;m++)     
//  {     
//  RIGHT_MOVE_DOWNLOAD_HS30806_Y(800);     
//  }     
        
    for(;;)    
    {   KValue=Key();           //调用键盘程序并获得键值     
        if(KValue)              //如果该值不等于0     
        {    
            KProce(KValue); //调用键盘处理程序     
        }    
    }    
    
}    
    
 }    
    
*/    
void Initia()    
{    
    LEFT_MOVE_SERVO(1);     
    mDelay(6);    
}    
    
void main()    
{    
    Initia();    
    RIGHT_MOVE_SERVO(100);    
    while(SERVO_POINT==0)    
        while(1)    
        {    
            while(S2==0)    
            {    
                while(1)    
                {       
                    RIGHT_MOVE_SERVO(100);    
                    mDelay(20);    
                    LEFT_MOVE_SERVO(100);       
                    mDelay(20);    
                }    
            }    
        }    
}   
关闭窗口

相关文章