久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2148|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 波多野吉衣久久 | 亚洲一区二区在线视频 | 欧美日韩福利 | 热久久免费视频 | 啪啪毛片 | 亚洲国产精品一区二区第一页 | 欧美电影免费网站 | 蜜桃传媒av | 欧美亚洲激情 | 九九综合 | 国产乱码精品一区二区三区五月婷 | 亚洲国产精品第一区二区 | 一区二区三区中文字幕 | 日韩高清一区 | 亚洲电影在线播放 | 国产成人在线视频 | 亚洲精品在线免费看 | 国产精品成人品 | 99pao成人国产永久免费视频 | 日韩在线一区二区三区 | 国产精品1 | 极品粉嫩国产48尤物在线播放 | 国产91在线精品 | 成人在线不卡 | 一区二区福利视频 | 亚洲免费视频网站 | 在线看片网站 | 国产精品99久久免费观看 | 国产乱码久久久久久一区二区 | 91在线资源 | 日本三级线观看 视频 | 欧亚av在线| 8x国产精品视频一区二区 | 久久久久久亚洲精品 | 欧美一区二区三区大片 | 久久久久九九九九 | 日日干日日操 | 欧美自拍第一页 | 中文字幕第一页在线 | 91久久精品国产 | 精品成人在线观看 |