微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 各位大神,我这个步进电机定义的是2.5周,可以运行起来要4周。烦请各位给指点一二。多谢了。

各位大神,我这个步进电机定义的是2.5周,可以运行起来要4周。烦请各位给指点一二。多谢了。

时间:10-02 整理:3721RD 点击:

  1. /***************************************
  2.   用4X4矩阵键盘进行步进电机操作
  3. ***************************************/

  4. #include <reg52.h>

  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. long g_Beats = 0;

  8. void DelayMs(uint ms);                                   //延时函数声明;
  9. uchar KeyPress(void);                                   //按键按下检测函数声明;
  10. uchar KeyScan(void);                                   //键值扫描函数声明;
  11. void OffMotor(void);
  12. void TurnAngle(long angle);
  13. void OnMotor(void);
  14. void OffMotor(void);
  15. void KeyCode(uchar keycode);
  16. void Timer0Init(void);

  17. void main(void)
  18. {
  19.         Timer0Init();
  20.         while (1)
  21.         {
  22.                 if (KeyPress())
  23.                 {
  24.                         KeyCode(KeyScan());
  25.                 }
  26.         }
  27. }
  28. //定时器0初始化函数
  29. void Timer0Init(void)
  30. {
  31.         TMOD |= 0x01;
  32.         TH0 = 0xFC;
  33.         TL0 = 0x66;
  34.         EA = 1;
  35.         ET0 = 1;
  36.         TR0 = 1;
  37. }
  38. //延时函数
  39. void DelayMs(uint ms)                                //11.0592MHZ 约为1.007MS;
  40. {
  41.         uint x,y;
  42.         for(x=ms;x>0;x--)                                                 
  43.         {
  44.                 for(y=113;y>0;y--);
  45.         }
  46. }
  47. //按键是否按下检测函数
  48. uchar KeyPress(void)
  49. {
  50.         uchar readnum;
  51.         P1 = 0xF0;                                //P1口的高四位作为输入,则需要对高四位进行初始化;                          
  52.         readnum = P1;                        //将端口的状态赋值给一个变量,这样必免直接操作端口时,影响到端口的状态;
  53.         if (readnum == 0xF0)
  54.         {
  55.                 return 0;
  56.         }
  57.         else
  58.         {
  59.                 return 1;
  60.         }
  61. }
  62. //按键扫描函数
  63. uchar KeyScan(void)
  64. {
  65.         uchar index,keycode,keyvalue;
  66.         DelayMs(20);                                  //延时20MS;
  67.         P1 = 0xFF;                                          //定义键盘的输出状态初始值
  68.         index = 0;                                          //输出行索引;
  69.         if (KeyPress())                                  //再次判断按键按下
  70.         {
  71.                 while (1)
  72.                 {
  73.                         P1 = (0xF7 >> index) | 0xF0; //I/O端口不能做为中间变量,如temp = (P1 >> index) 单片机随时读取IO的变化,会导致程序有瞬间错误产生;
  74.                         index++;                                         
  75.                         index = index & 0x03;                     //要扫描四行中哪一行为输出低电平,当index == 4时,index清零;
  76.                         keycode = P1;                                         //当按键按下时,P1端口的高四位为高,若扫描到四行中某一行为0时,此时按键已经按下,P1口的高四位的其中一位将被低四位为0的一行拉低,这样键值就出来了。
  77.                         if ((keycode & 0xF0) != 0xF0)         //如果按键在按下状态,获得键值停止扫描
  78.                         {
  79.                                 break;                                             //获得键码,跳出扫描;
  80.                         }
  81.                        
  82.                 }
  83.                 switch (keycode)
  84.                 {
  85.                         case 0x77 : keyvalue = 0x31;     break;
  86.                         case 0x7B : keyvalue = 0x37;     break;
  87.                         case 0x7D : keyvalue = 0x34;     break;
  88.                         case 0x7E : keyvalue = 0x30;     break;
  89.                        
  90.                         case 0xB7 : keyvalue = 0x1B;     break;
  91.                         case 0xBB : keyvalue = 0x38;     break;
  92.                         case 0xBD : keyvalue = 0x35;     break;
  93.                         case 0xBE : keyvalue = 0x32;     break;

  94.                         case 0xD7 : keyvalue = 0x0D;     break;
  95.                         case 0xDB : keyvalue = 0x39;     break;
  96.                         case 0xDD : keyvalue = 0x36;     break;
  97.                         case 0xDE : keyvalue = 0x33;     break;
  98.                        
  99.                         case 0xE7 : keyvalue = 0x27;     break;
  100.                         case 0xEB : keyvalue = 0x25;     break;
  101.                         case 0xED : keyvalue = 0x28;     break;
  102.                         case 0xEE : keyvalue = 0x26;     break;
  103.                         default : keyvalue = 0xFF;
  104.                         while (KeyPress());                  //等待按键释放
  105.                 }
  106.         }
  107.         else
  108.         {
  109.                 keyvalue = 0xFF;                                                                        //如果没有按键按下时,键值为关闭
  110.         }
  111.         return keyvalue;                                                                                //返回键值;
  112. }
  113. //获取键值函数,
  114. void KeyCode(uchar keycode)
  115. {
  116.          static bit direc = 0;
  117.          if ((keycode >= 0x30) && (keycode <=0x39))
  118.          {
  119.                  if (direc == 0)
  120.                 {
  121.                         TurnAngle(360 * (keycode - 0x30));
  122.                 }
  123.                 else
  124.                 {
  125.                         TurnAngle(-360 * (keycode - 0x30));
  126.                 }
  127.          }
  128.          else if (keycode == 0x26)
  129.          {
  130.                  direc = 0;
  131.          }
  132.          else if (keycode == 0x28)
  133.          {
  134.                  direc = 1;
  135.          }
  136.          else if (keycode == 0x25)
  137.          {
  138.                  TurnAngle(90);
  139.          }
  140.          else if (keycode == 0x27)
  141.          {
  142.                  TurnAngle(-90);
  143.          }
  144.          else if (keycode == 0x1B)
  145.          {
  146.                  OffMotor();
  147.          }
  148. }
  149. //旋转角度函数
  150. void TurnAngle(long angle)
  151. {
  152.         EA = 0;
  153.         g_Beats = (angle * 4076) / 360;
  154.         EA = 1;
  155. }
  156. //关闭步进电机函数
  157. void OffMotor(void)
  158. {
  159.         EA = 0;
  160.         g_Beats = 0;
  161.         EA = 1;       
  162. }
  163. //定时器0中断函数
  164. void Timer0IRQ() interrupt 1                                                 //中断函数不需要声明
  165. {
  166.         TH0 = 0xFC;
  167.         TL0 = 0x66;
  168.         OnMotor();
  169. }
  170. //开启步进电机函数
  171. void OnMotor()
  172. {
  173.         uchar temp;
  174.         static uchar subscript =0;
  175.         uchar code BeatCode[] = {0x0E,0x0C,0x0D,0x09,
  176.                                                           0x0B,0x03,0x07,0x06};
  177.     //P0 = 0xFF;
  178.        
  179.         if (g_Beats != 0)
  180.         {
  181.                 if (g_Beats > 0)
  182.                 {
  183.                    subscript++;
  184.                    subscript &= 0x07;
  185.                    g_Beats--;
  186.                 }
  187.                 else
  188.                 {
  189.                    subscript--;
  190.                    subscript &= 0x07;
  191.                    g_Beats++;
  192.                 }
  193.                 temp = P0;
  194.                 temp = temp & 0xF0;
  195.                 P0 = temp | BeatCode[subscript];
  196.         }
  197.         else
  198.         {
  199.                 P0 |= 0x0F;
  200.         }       
  201. }

复制代码


搞程序是要报酬的

报酬可以,你说个价。

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

网站地图

Top