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

📄 89c52-stepmotor.lst

📁 AT89S52通过PWM控制步进电机的C51程序
💻 LST
字号:
C51 COMPILER V8.05a   89C52_STEPMOTOR                                                      03/20/2009 01:55:07 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE 89C52_STEPMOTOR
OBJECT MODULE PLACED IN 89c52-stepmotor.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil uvison3\Keil\C51\BIN\C51.EXE 89c52-stepmotor.c ROM(COMPACT) BROWSE DEBUG OBJE
                    -CTEXTEND

line level    source

   1          /******************************************************************************
   2          *Project:步进电机控制程序练习 A practise program of stepper motor controlment 
   3                  运行开始后电机正转,默认转速为最高速度的50%(2000Hz),速度可微调, 
   4                  每次的增/减量为200Hz;正/反转切换过程中自动进行速度的逐步调节        
   5          *MCU:  AT89s52    Frequency:11.0592MHz                                        
   6          *I/O Port:  P1.0--正转指示LED   P1.1--反转指示LED       P1.3--加速      P1.4--减速
   7                          P1.5--正/反转切换       P1.6--开始/停止;                                                       
   8                          P0.0~P0.3--步进电机ABCD四相控制输出    P0.4--L298使能输出INA,INB;
   9          *Auther:  By yushun HUST 2009-3-19    All rights reserved.                  
  10          *                                                                          
  11          ******************************************************************************/
  12          
  13          
  14          #include<reg52.h>
  15          
  16          #define unchar unsigned char
  17          #define unint unsigned int
  18          
  19          sbit Forword=P1^0;        //Forword LED
  20          sbit Reverse=P1^1;        //Reverse     LED
  21          /*
  22          sbit P13=P1^3;        //SpeedUp
  23          sbit P14=P1^4;        //SpeedDown
  24          sbit P15=P1^5;        //Switch
  25          sbit P16=P1^6;        //Start_Stop
  26          */
  27          sbit PA=P0^0;
  28          sbit PB=P0^1;
  29          sbit PC=P0^2;
  30          sbit PD=P0^3;
  31          
  32          sbit INAB=P0^4;
  33                                                  
  34          unchar code PHA[8]={0x11,0x13,0x12,0x16,0x14,0x1c,0x18,0x19};//高四位为0001B是因运行时INAB=1
  35                            // A    AB   B    BC   C    CD   D    DA
  36          
  37          unchar code PWM_H[10]={0xfc,0xfc,0xfd,0xfd,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe};
  38          unchar code PWM_L[10]={0x65,0xff,0x6c,0xbf,0xff,0x32,0x5c,0x7f,0x9c,0xb5};
  39                                            //  1000Hz                                    2000Hz                          2800Hz
  40          
  41          unchar phase;
  42          unchar pwm,pwm_temp;
  43          bit Switch;                                             //方向切换标志位,正转时Switch=1;
  44          bit Start_Stop;                 //起停控制标志位,开始运转时Start_Stop=1.
  45          
  46          
  47          /*****************************************************************************
  48          延时子程序,延时时间10ms
  49          *****************************************************************************/
  50          void delay10ms(void)                    
  51          {
  52   1              unchar i,j;
  53   1              for(i=20;i>0;--i)
  54   1                      for(j=248;j>0;--j)
C51 COMPILER V8.05a   89C52_STEPMOTOR                                                      03/20/2009 01:55:07 PAGE 2   

  55   1                              ;
  56   1      }
  57          
  58          
  59          /*****************************************************************************
  60          延时子程序,延时时间500ms
  61          *****************************************************************************/
  62          void delay500ms(void)                   
  63          {
  64   1              unchar i,j,k;
  65   1              for(i=5;i>0;--i)
  66   1                      for(j=200;j>0;--j)
  67   1                              for(k=248;k>0;--k)
  68   1                              ;
  69   1      }
  70          
  71          
  72          /*****************************************************************************
  73          键盘扫描子程序
  74          *****************************************************************************/ 
  75          void keyscan(void)
  76          {
  77   1              if((P1 & 0x78)!=0x78)
  78   1              {
  79   2                      delay10ms();                                            //软件去抖
  80   2                      if((P1 & 0x78)!=0x78)
  81   2                      {
  82   3                              if((P1 & 0x78)==0x70)                   //加速
  83   3                              {
  84   4                                      if(pwm<10)
  85   4                                              pwm++;
  86   4                                      else
  87   4                                              pwm=9;
  88   4                                      delay500ms();                           //速度改变频率控制,避免急加减速
  89   4                              }
  90   3      
  91   3                              if((P1 & 0x78)==0x68)                   //减速
  92   3                              {
  93   4                                      if(pwm>0)
  94   4                                              pwm--;
  95   4                                      else
  96   4                                              pwm=0;
  97   4                                      delay500ms();
  98   4                              }
  99   3      
 100   3                              if((P1 & 0x78)==0x58)                //改变运转方向     
 101   3                              {
 102   4                                      Forword=Reverse=0;                       //换向中,两个指示LED同时亮
 103   4                                      while(pwm>0)                             //换向前减速至最低速1000Hz
 104   4                                      {
 105   5                                              pwm--;
 106   5                                              delay500ms();
 107   5                                      }
 108   4      
 109   4                                      PA=PB=PC=PD=1;                           //急停
 110   4                                      delay500ms();
 111   4                                      delay500ms();
 112   4      
 113   4                                      Switch=~Switch;                          //执行方向变更
 114   4                                      if(Switch==1)                            //指示LED变更
 115   4                                              Reverse=1;
 116   4                                      else
C51 COMPILER V8.05a   89C52_STEPMOTOR                                                      03/20/2009 01:55:07 PAGE 3   

 117   4                                              Forword=1;
 118   4      
 119   4                                      while(pwm<5)                             //换向后加速至2000Hz
 120   4                                      {
 121   5                                              pwm++;
 122   5                                              delay500ms();
 123   5                                      }
 124   4      
 125   4                              }
 126   3      
 127   3                              if((P1 & 0x78)==0x38)                    //运转、停止切换
 128   3                              {
 129   4                                      Start_Stop=~Start_Stop;          //Start_Stop=1时运转
 130   4      
 131   4                                      if(Start_Stop==1)                        //由停止开始运转,重新初始化参数
 132   4                                      {
 133   5                                              Switch=1;                                //默认运转方向为正向
 134   5                                              Forword=Reverse=0;
 135   5                                              INAB=1;                                  //使能L298输出
 136   5                                              pwm=pwm_temp=0;
 137   5                                              TH0=PWM_H[pwm];
 138   5                                              TL0=PWM_L[pwm];
 139   5                                              TR0=1;                                   //开定时器0
 140   5                                              delay500ms();
 141   5                                               while(pwm<5)                    //加速至2000Hz
 142   5                                              {
 143   6                                                      pwm++;
 144   6                                                      delay500ms();
 145   6                                              }
 146   5      
 147   5                                              Reverse=1;
 148   5                                      }
 149   4      
 150   4                                      else                                             //由运转到停止,关闭定时器0及L298降低功耗
 151   4                                      {
 152   5                                              Forword=Reverse=0;
 153   5                                              while(pwm>0)                     //停止前减速至最低速1000Hz
 154   5                                              {
 155   6                                                      pwm--;
 156   6                                                      delay500ms();
 157   6                                              }
 158   5      
 159   5                                              PA=PB=PC=PD=1;                           //急停
 160   5                                              delay500ms();
 161   5                                              delay500ms();
 162   5                                              
 163   5                                              TR0=0;                                   //关定时器0
 164   5                                              INAB=0;                                  //关L298,电机自由停止
 165   5                                              Forword=Reverse=1;
 166   5                                      }
 167   4      
 168   4      
 169   4                              }
 170   3      
 171   3      
 172   3                      }
 173   2              }
 174   1      }
 175          
 176          
 177          /*****************************************************************************
 178          定时器0中断服务子程序
C51 COMPILER V8.05a   89C52_STEPMOTOR                                                      03/20/2009 01:55:07 PAGE 4   

 179          依次改变接通的相位phase;若脉宽控制pwm改变,则重新载入定时初值,从而改变脉冲周期
 180          *****************************************************************************/  
 181          void timer0(void) interrupt 1 using 1
 182          {
 183   1              if(Switch==1)                                            //正转时phase递增循环
 184   1              {
 185   2                      if(phase>=7)                                     //判断和改变相位
 186   2                              phase=0;
 187   2                      else
 188   2                              phase++;
 189   2              }
 190   1      
 191   1              if(Switch==0)                                            //反转时phase递减循环
 192   1              {
 193   2                      if(phase<=0)                                     //判断和改变相位
 194   2                              phase=7;
 195   2                      else
 196   2                              phase--;
 197   2              }
 198   1      
 199   1          P0=PHA[phase];                               //相位输出
 200   1              
 201   1              TR0=0;                                                           //关定时器0
 202   1              if(pwm!=pwm_temp)                                        //存在速度改变则重新赋初值
 203   1              {
 204   2                      TH0=PWM_H[pwm];
 205   2                      TL0=PWM_L[pwm];
 206   2              }
 207   1              
 208   1              else
 209   1                      ;
 210   1      
 211   1              TR0=1;  
 212   1              pwm_temp=pwm;
 213   1              
 214   1      }       
 215          
 216          
 217          /*****************************************************************************
 218          主程序main
 219          初始化系统参数及变量,开中断,键盘扫描输入
 220          *****************************************************************************/
 221          void main(void)
 222          {
 223   1              P0=0x00;
 224   1              phase=0;                                                         //同时INAB=1
 225   1              pwm=pwm_temp=0;
 226   1              Switch=1;
 227   1              Start_Stop=0;
 228   1              Forword=Reverse=0;                                       //系统复位指示
 229   1              delay500ms();
 230   1              delay500ms();
 231   1              P1=0xff;                                                         //同时LED熄灭
 232   1      
 233   1              ET0=1;                                                           //定时器0中断允许
 234   1              EA=1;                                                            //总中断允许
 235   1      
 236   1              while(1)
 237   1              {
 238   2                      keyscan();
 239   2              }
 240   1              
C51 COMPILER V8.05a   89C52_STEPMOTOR                                                      03/20/2009 01:55:07 PAGE 5   

 241   1      }                       


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    375    ----
   CONSTANT SIZE    =     28    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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