⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 motor_dri.lst

📁 步进电机控制副机程序,与步进电机控制主机程序配合使用。
💻 LST
字号:
C51 COMPILER V7.01  MOTOR_DRI                                                              09/19/2005 08:40:54 PAGE 1   


C51 COMPILER V7.01, COMPILATION OF MODULE MOTOR_DRI
OBJECT MODULE PLACED IN motor_dri.OBJ
COMPILER INVOKED BY: C:\keil\C51\BIN\C51.EXE motor_dri.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #pragma small
   2          #include "reg66x.h"
   3          #include "motor_dri.h"
   4          #include "electromotion.h"
   5          #define T2_CONSTANT_FOR_1MS     (65536-2000)                                            //定时1ms
   6          
   7          //电机驱动器设定:400步一圈,单脉冲方式,半电流,输出电流选择最大。
   8          unsigned int motor_degree[5] = {2048,1024,512,384,340};                 //五级变速调控
   9          bit timer0_end_flag = 1;                                                //==1定时结束,可以走下一步
  10          bit run_next_cycle = 0;                                                                                         //一个呼吸周期标志
  11          unsigned int timer_cycle = 0;                                                                           //一个呼吸周期中循环1ms的个数
  12          
  13          
  14          //定时器初始化
  15          void init_timer(void)
  16          {
  17   1              //T0用作步进电机步间隙时间
  18   1          TMOD = 0x01;                        //方式1
  19   1          TR0 = 0;
  20   1              IEN0 = 0x82;
  21   1              TCON = 0;
  22   1      
  23   1              //T1用作波特率发生器
  24   1              TMOD    |= 0x20;                //方式2
  25   1              TH1 = TL1 = 0xF3;               //12M下2400
  26   1              PCON    = 0x00;
  27   1              S0CON   = 0x50;
  28   1              TR1     = 1;
  29   1              IEN0    |= 0x10;
  30   1      
  31   1              //T2用作定时一个呼吸周期时间
  32   1              TL2 = RCAP2L = T2_CONSTANT_FOR_1MS;
  33   1          TH2 = RCAP2H = T2_CONSTANT_FOR_1MS / 0x100;
  34   1          T2MOD   = 0x00;
  35   1          T2CON   = 0x00;             //自动装载
  36   1          IEN1        = 0x01;
  37   1      }
  38          
  39          
  40          //步进电机归零
  41          void regress_stepmotor(void)
  42          {
  43   1              unsigned char i;
  44   1              unsigned int temp;
  45   1              temp = 65535 - motor_degree[1];
  46   1              P1_4 = 0;
  47   1              P1_5 = 1;
  48   1              for(i = 0;i < 10;i++);
  49   1              if(P1_5)
  50   1              while(P1_5)
  51   1          {
  52   2              P1_1 = BACKWARD;
  53   2              TH0 = temp / 256;
  54   2              TL0 = temp % 256;
  55   2              TR0 = 1;
C51 COMPILER V7.01  MOTOR_DRI                                                              09/19/2005 08:40:54 PAGE 2   

  56   2              timer0_end_flag = 0;
  57   2              while(!timer0_end_flag);
  58   2          }
  59   1              else
  60   1          while(!P1_5)
  61   1          {
  62   2              P1_1 = FORWARD;
  63   2              TH0 = temp / 256;
  64   2              TL0 = temp % 256;
  65   2              TR0 = 1;
  66   2              timer0_end_flag = 0;
  67   2              while(!timer0_end_flag);
  68   2          }
  69   1      }
  70          
  71          
  72          /************************步进电机驱动程序*****************/
  73          /*********************************************************
  74          函数名称:motor_driver()
  75          功能描述:根据提供的速度.脉冲步数和方向,做出实时的处理.
  76          被调用的函数列表:无
  77          参数说明:
  78          返 回 值:
  79          注    释:
  80          **********************************************************/
  81          bit motor_driver(unsigned int motor_speed,unsigned int motor_pulse,bit motor_direct)
  82          {
  83   1          unsigned int i,temp;
  84   1              P1_4 = 0;
  85   1          P1_1 = motor_direct;                                           //==1正转;
  86   1      
  87   1          if(motor_pulse > 200)
  88   1          {
  89   2              motor_pulse -= 200;
  90   2                      temp = 65535 - motor_speed - 30*100;
  91   2              for(i = 0;i < 100;i++)
  92   2              {
  93   3                  TH0 = temp / 256;
  94   3                  TL0 = temp % 256;
  95   3                      temp += 30;
  96   3                  TR0 = 1;
  97   3                  timer0_end_flag = 0;
  98   3                  while(!timer0_end_flag);
  99   3              }
 100   2                      temp = 65535 - motor_speed;
 101   2              for(i = motor_pulse;i>0;i--)
 102   2              {
 103   3                  TH0 = temp / 256;
 104   3                  TL0 = temp % 256;
 105   3                  TR0 = 1;
 106   3                  timer0_end_flag = 0;
 107   3                  while(!timer0_end_flag);
 108   3              }
 109   2                      temp = 65535 - motor_speed;
 110   2              for(i = 100;i > 0;i--)
 111   2              {
 112   3                  TH0 = temp / 256;
 113   3                  TL0 = temp % 256;
 114   3                              temp -= 30;
 115   3                  TR0 = 1;
 116   3                  timer0_end_flag = 0;
 117   3                  while(!timer0_end_flag);
C51 COMPILER V7.01  MOTOR_DRI                                                              09/19/2005 08:40:54 PAGE 3   

 118   3              }
 119   2              motor_pulse = 0;
 120   2                      return(1);
 121   2          }
 122   1          else
 123   1          {
 124   2              if(motor_speed < motor_degree[1])
 125   2              {
 126   3                  temp = 65535 - motor_degree[1];
 127   3                  for(i = 0;i < motor_pulse;i++)
 128   3                  {
 129   4                      TH0 = temp / 256;
 130   4                      TL0 = temp % 256;
 131   4                      TR0 = 1;
 132   4                      timer0_end_flag = 0;
 133   4                      while(!timer0_end_flag);
 134   4                  }
 135   3              }
 136   2              else
 137   2              {
 138   3                      temp = 65535 - motor_speed;
 139   3                  for(i = 0;i < motor_pulse;i++)
 140   3                  {
 141   4                      TH0 = temp / 256;
 142   4                      TL0 = temp % 256;
 143   4                      TR0 = 1;
 144   4                      timer0_end_flag = 0;
 145   4                      while(!timer0_end_flag);
 146   4                  }
 147   3              }
 148   2              motor_pulse = 0;
 149   2                      return(1);
 150   2          }
 151   1      }
 152          
 153          
 154          //T0中断服务函数,定时步进电机每步时间
 155          void timer0_int(void) interrupt 1 using 1
 156          {
 157   1          unsigned char i;
 158   1          TR0 = 0;
 159   1          P1_0 = 1;
 160   1          for (i = 0; i < 30; i++);                            //极限i=20
 161   1          P1_0 = 0;
 162   1          timer0_end_flag = 1;
 163   1      }
 164          
 165          
 166          //T2中断服务函数,定时一个呼吸周期时间
 167          void timer2_int(void) interrupt 7 using 2
 168          {
 169   1          TF2 = 0;
 170   1          TR2 = 1;
 171   1          timer_cycle ++;
 172   1              if(timer_cycle > time_respiration)
 173   1              {
 174   2                      timer_cycle = 0;
 175   2                      run_next_cycle = 1;
 176   2              }
 177   1      }


C51 COMPILER V7.01  MOTOR_DRI                                                              09/19/2005 08:40:54 PAGE 4   

MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    463    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12       4
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -