单片机
返回首页

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

2018-03-07 来源:eefocus

 //    
//  文 件 名: download.c    
//    
//  目标对象: AT89S52    
//    
//  编 译 器: ISP    
//    
//  功能描述: 下料部单独控制程序    
//    
//  修改版本: 0.0    
//   
//    
//***************************************************************************    
    
#include     
#include    
#include     
#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);    
                }    
            }    
        }    
}  

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 开关电源的基本组成及工作原理

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何构建一个触摸传感器电路

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章