微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机电机控制

51单片机电机控制

时间:10-02 整理:3721RD 点击:
程序介绍:
按键有三个
KEY短按进行模式切换,长按电机加速
KEY1短按进行模式切换,长按电机减速
KEY2长按3S开始工作,再次长按3秒停止工作。
共10种模式进行切换。
这个程序可以用在按摩器材上。
根据我们公司的一个产品写的程序,经过多次调试和优化。算法可能不是太好,但总算实现了功能。
经过输出波形的检测,应该不会有太多BUG了。
给大家参考使用。
#include<reg51.h>  //51头文件,
#include<intrins.h>
//---------常用的两个宏定义--------------
#define uint8 unsigned char
#define uint16  unsigned int
//------------函数的声明-----------------
void DelayMS(uint16 dly);
//--定义使用的IO口--//
sbit KEY=P1^0;
sbit KEY1=P1^1;
sbit KEY2=P1^2;
sbit PWM=P0^0;
sbit LED2=P0^2;
//--定义一个全局变量--//
unsigned char timer1,pwm; //定时器返回值
int i;
signed char cycle;
void Timer0Interrupt();
void InitTimer1();
void Keyscan();
void out1();
void out2();
void out3();
void out4();
void out5();
void out6();
void out7();
void out8();
void out9();
void out10();
void Delay10ms(unsigned int c)   //误差 0us
{
    unsigned char a, b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
    for (;c>0;c--)
{
  for (b=38;b>0;b--)
  {
   for (a=130;a>0;a--);
  }
           
}      
}
void InitTimer1(void)
{
    TMOD = 0x10;
    TH1 = 0x0FE;
    TL1 = 0x0C;
    EA = 1;
    ET1 = 1;
    TR1 = 1;
}
void main(void)
{   
   
    signed char k=1,power=0;
InitTimer1();
i=30;

while(1)
{   
        
        int j;
  while((KEY==0)||(KEY1==0)||(KEY2==0))
  {
         if(power)
      {
    if (KEY==0)  //检测按键K1是否按下
    {
    Delay10ms(1); //消除抖动
   
    if (KEY==0) //再次检测按键是否按下
    {
        Delay10ms(50);
              if(KEY==1)
     {
      k++;
     }
             else while(KEY==0)
     {
      j=0;
      while (j<10)  //检测按键是否松开
      {
       Delay10ms(1);
       j++;
       }
       i++;
       TR1=1;
      }
      }
      }
          else if (KEY1==0)
         {
       Delay10ms(1); //消除抖动
   
       if (KEY1==0) //再次检测按键是否按下
       {
      
                 Delay10ms(50);
        if(KEY1==1)
        {
         k--;
        }
                 else while(KEY1==0)
        {
         j=0;
         while (j<10)  //检测按键是否松开
         {
          Delay10ms(1);
          j++;
          }
          i--;
          TR1=1;
         }
         }     
       }
      }
        if (KEY2==0)
          {
        Delay10ms(1); //消除抖动
     
        if (KEY2==0) //再次检测按键是否按下
        { if(power)
            {TR1=1;}
                  j=0;
         while ((j<300)&&(KEY2==0))  //检测按键是否松开
         {
          Delay10ms(1);
          j++;
          }
         if((KEY2==0)&&(j>250))
         {
          if(power==0)
          {power=1;
          TR1=1;}
          else
          {power=0;
          TR1=0;}
          if(TR1==0)
          {PWM=0;}
          k=1;
                 while(KEY2==0)
         {
         }
           }
          }     
       }
         
      }
   P2=~k;
   if(power)
   {
   if(k>10)
   {k=1;}
   if(k<1)
   {k=10;}
   switch (k)
   {
    case(1) :out1();
            break;
  case(2) :out2();
            break;
  case(3) :out3();
            break;
  case(4) :out4();
            break;
  case(5) :out5();
            break;
  case(6) :out6();
            break;
  case(7) :out7();
            break;
  case(8) :out8();
            break;
  case(9) :out9();
            break;
  case(10) :out10();
            break;
  default:
    break;
   }
   }
       else
      {
     TR1=0;
     PWM=0;
    }
   }
  
}

void Timer1Interrupt(void) interrupt 3
{
    TH1 = 0x0FE;
    TL1 = 0x0C;
pwm++;
  if(i>=100)
  {i=100;}
  if(i<=0)
  {i=0;}
if(pwm>100)  //PWM周期为100*0.5ms
  {
   pwm=0;
  }
  if(pwm <i) //改变30这个值可以改变直流电机的速度
  {
   PWM=1;
  }
  else
  {
   PWM=0;
  }
  
    //add your code here!
}
void out1()
{
char a;
TR1=1;
while((a<100)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
    Delay10ms(1);
a++;
}
}
void out2()
{
char a=0;
TR1=1;
while((a<50)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<50)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
}
void out3()
{
char a;
TR1=1;
i=i+2;
a=0;
while((a<10)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
if(i>90)
{i=10;}
}
void out4()
{
char a;
TR1=1;
i=i-2;
a=0;
while((a<10)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
if(i<10)
{i=90;}
}
void out5()
{
char a;
TR1=1;
if(cycle)
{
i=i+2;
if(i>90)
cycle=~cycle;
}
else
{
i=i-2;
if(i<10)
cycle=~cycle;
}
a=0;
while((a<10)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
}
void out6()
{
char a;
TR1=1;
a=0;
while((a<50)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<50)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
TR1=1;
a=0;
while((a<100)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<100)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
TR1=1;
a=0;
while((a<30)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<80)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
TR1=1;
a=0;
while((a<30)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<80)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
}
void out7()
{    unsigned char a;     
  out2();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
  out4();  
      a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
     out6();

}
void out8()
{     
      unsigned char a;
   out2();
        a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
   out3();
     a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
   out4();
     a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
   out2();
     a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
   out3();
     a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
      out4();
     a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
      out5();
     a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
     
}
void out9()
{
   out4();
   out4();
   out4();
   out2();
   out1();
      out2();
      out2();
      out5();
}
void out10()
{
   out1();
   out2();
   out3();
   out4();
   out5();
      out6();
      out7();
      out8();
   out9();
}

感谢分享。小编去抖时间方面没自己的想法?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top