找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2129|回复: 0
打印 上一主题 下一主题
收起左侧

按键控制步进电机------手把手教你学单片机 历程课

[复制链接]
跳转到指定楼层
楼主
ID:327205 发表于 2018-5-10 22:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include<reg52.h>

sbit KEY_IN_1 = P2^4;
sbit KEY_IN_2 = P2^5;
sbit KEY_IN_3 = P2^6;
sbit KEY_IN_4 = P2^7;
sbit KEY_OUT_1 = P2^3;
sbit KEY_OUT_2 = P2^2;
sbit KEY_OUT_3 = P2^1;
sbit KEY_OUT_4 = P2^0;

unsigned char KeySta[4][4] ={
    {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};

unsigned char code KeyCodeMap[4][4] = {
    {0x31, 0x32, 0x33, 0x26},
        {0x34, 0x35, 0x36, 0x25},
        {0x37, 0x38, 0x39, 0x28},
        {0x30, 0x1B, 0x0D, 0x27}
};

signed long beats = 0;   //单机转动节拍总数

void KeyDriver();
void main()
{
   EA = 1;
   TMOD = 0x01;
   TH0 = 0xFC;
   TL0 = 0x67;
   ET0 = 1;
   TR0 = 1;

   while(1)
   {
      KeyDriver();
   }
}

void StartMotor(signed long angle)
{
    EA = 0;
        beats = (angle*4067) / 360;
        EA = 1;
}

void StopMotor()
{
          EA = 0;
        beats = 0;
        EA = 1;
}

void KeyAction(unsigned char keycode)
{
  static bit  dirMotor = 1;  //电机转动方向

  if ((keycode >= 0x30) && (keycode <= 0x39))  
   {
      if (dirMotor == 0)
           {  
               StartMotor(360 * (keycode-0x30));
           }
          else
            {
                   StartMotor(-360* (keycode-0x30));
                }

   }
   else if (keycode == 0x26)  
   {
     StartMotor(10);
   }
   else if (keycode == 0x28)  
   {
      StartMotor(180);
   }
   else if (keycode == 0x25)  
   {
      StartMotor(90);
   }
   else if (keycode == 0x27)  
   {
      StartMotor(-90);
   }
   else if (keycode == 0x1B)  
   {
      StopMotor();
   }
}

void KeyDriver()
{
   unsigned char i, j;
   static unsigned char backup[4][4] = {
                    {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
   };
   for(i=0; i<4; i++)
      {
      for (j=0; j<4; j++)
             {
       if(backup[i][j] != KeySta[i][j])
                      {
                        if(backup[i][j] == 0)
                           {
                                KeyAction(KeyCodeMap[i][j]);
                           }
                        backup[i][j] = KeySta[i][j];
                   }
             }
      }
}

void TurnMotor()
{
   unsigned char  tmp;
   static unsigned index = 0;
   unsigned char code BeatCode[8] = {
     0x0E, 0x0C, 0x0D, 0x09, 0x0B, 0x03, 0x07, 0x06
   };

   if (beats != 0)
   {
      if (beats > 0)
          {
             index++;
                 index = index & 0x07;
                 beats--;
          }
          else
          {
              index--,
              index = index & 0x07;
                  beats++;
          }
          tmp =        P1;
          tmp = tmp & 0xF0;
          tmp = tmp | BeatCode[index];
          P1 = tmp;
   }
   else
   {
      P1 = 0x0F;
   }
}

void KeyScan()
{
   unsigned char i;
   static unsigned char keyout = 0;
   static unsigned char keybuf[4][4] = {
            {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF},
            {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF}  
   };

   keybuf[keyout][0] = (keybuf[keyout][0] <<1) | KEY_IN_1;
   keybuf[keyout][1] = (keybuf[keyout][1] <<1) | KEY_IN_2;
   keybuf[keyout][2] = (keybuf[keyout][2] <<1) | KEY_IN_3;
   keybuf[keyout][3] = (keybuf[keyout][3] <<1) | KEY_IN_4;

   for (i=0; i<4; i++)
   {
      if ((keybuf[keyout][i] & 0x0F) == 0x00)
          {
             KeySta[keyout][i] = 0;
          }
          else if ((keybuf[keyout][i] & 0x0F) == 0x0F)
          {
             KeySta[keyout][i] = 1;
          }
   }

   keyout++;
   keyout = keyout & 0x03;
   switch (keyout)
   {
      case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break;
          case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;
          case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;
          case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break;
          default: break;
   }
}

void InterruptTimer0() interrupt 1
{
    static bit div = 0;

        TH0 = 0xFC;
    TL0 = 0x67;
        KeyScan();
        div = ~div;
        if (div ==1)
        {
           TurnMotor();  
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表