电机控制程序

来源:互联网 发布:圆方软件破解版 编辑:程序博客网 时间:2024/05/16 02:02
   #include "STC.H"
// sbit s=P1^0;
sbit pul=P0^0; //脉冲信号输出,LED0.0可显示状态
sbit dir=P0^1; //方向信号输出,LED0.1可显示状态
sbit ena=P0^2; //使能信号输出,LED0.2可显示状态
sbit lp0=P1^0;//
sbit lp1=P1^1;
int flag=0;
#define uchar unsigned char
#define uint  unsigned int
//sbit S1=P1^4;  //  方向控制 独立按键K5
//sbit S2=P1^5;  //  使能控制 独立按键K6
unsigned char dat;


unsigned int  v;
unsigned int  x;
unsigned int k;
unsigned char light;
unsigned int sudu[9]={1,2,4,8,25,32,64,128,256};


int pos=0;
void delay_1ms(unsigned int i) //1MS 延时
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<125;j++)
{;}
}


void delay_40us(unsigned int i) //40usS 延时
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<5;j++)
{;}
}


void delay(unsigned int i)//  us级延时
{   
while(--i);
}


void sent_char(uchar i) //发送一个字符
 {
 SBUF=i;
 while(!TI);
 TI=0;
 }


void sent_str(uchar *s)  //发送字符串
{
while(*s!='\0')
  {
  sent_char(*s);
  s++;
  delay_1ms(5);
  }
}




void cd() //每转一个角度,发送一个数据,用于计算长度;
{  if(dir==0&&ena==1&&lp0==0&&lp1==0)
       sent_char('x');
  else if(dir==1&&ena==1&&lp0==0&&lp1==0)
  sent_char('y');
}




void dd()  //到达端点,向电脑发送数据
{  if(dir==0&&ena==1&&lp0==1)
     sent_char('e');
else if(dir==1&&ena==1&&lp1==1)
  sent_char('f');
     
}
/*void keyscan()   //键盘扫描
{
 if(S2==0)
 {
  delay_1ms(10);//延时,防抖
   if(S2==0)
 ena=~ena;// 使能改变
 }
  if(S1==0)
 {
 delay_1ms(10);//延时,防抖
   if(S1==0)
 dir=~dir;// 方向改变
 }


}
 */
   void main(void)
   {  SCON=0x40; 
    TMOD = 0x20;
 TH0 = 0x3c;
 TL0 = 0xb0;
 TH1 = 0xfd;
 TL1 = 0xfd;
 TR1 = 1;
 SM0 = 0;
 SM1 = 1;
 REN = 1;
 EA = 1;
 ES = 1;
 RI = 0;




 TI =0;


 ena=0      ;//高电平使能,初始化为低电平。
      delay(5) ;//使能信号要至少要早于方向信号5us建立
      dir=1 ;//初始化转动方向
      delay(5)  ;  //因为方向信号要至少要早于脉冲信号5us建立
 v=4    ;      //速度初始化
 


 P1=0xFF; // P1口置1,为写入端口
while(1)
  {
   
  if(RI==1)
  {
  dat=SBUF;   //串口通信接受收据
  RI=0;
  }


if (dat=='a') //开关
{ena=0;pul=0;} 
else if (dat=='b')
      ena=1;
else if(dat=='c')//方向
    {ena=1;dir=0;}
else if(dat=='d')
 {ena=1;dir=1;}
           
 if(ena==1)///电机打开才能进行加减速
          {
            if(dat=='0') //速度调节,dat从0~9,速度依次增大。    
              v=8;
        else if(dat=='1') 
                   v=7;
 else if(dat=='2') 
              v=6;
 else if(dat=='3') 
              v=5;
     else if(dat=='4') 
              v=4;
 else if(dat=='5') 
              v=3;
 else if(dat=='6') 
              v=2;
 else if(dat=='7') 
              v=1;
 else if(dat=='8') 
              v=0;
}  
    x=sudu[v];


     
 
 
// keyscan();  
// delay(5)  ;  //因为方向信号要至少要早于脉冲信号5us建立
if (lp0==1||lp1==1)
 { flag=1;
 //dir=~dir;
 }
if (flag==0)  
 {pul=0;   //pul输出低电平
 delay_40us(x);   //周期的1/2时间
 pul=1;   //pul 输出高电平
 delay_40us(x);  //
 cd();
 }  
 else
 {
 flag=0;
 dd() ;
 dir=~dir;
    for(k=0;k<5000;k++)
{pul=0;   //pul输出低电平
     delay_40us(x);   //周期的1/2时间
     pul=1;   //pul 输出高电平
     delay_40us(x);
      if(dir==0)
      sent_char('x');
      else
  sent_char('y');
}
 }  
   
 }
 }
0 0
原创粉丝点击