电机控制程序

   #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');
}
 }  
   
 }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值