//*************************************************************************** // // 文 件 名: 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); } } } }