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

📄 main.lst

📁 按键控制步进电机正反转
💻 LST
字号:
C51 COMPILER V8.08   MAIN                                                                  04/03/2009 13:14:46 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          #define uint unsigned int;
   3          #define uchar unsigned char
   4          
   5          //以下定义LED片选信号
   6          sbit LED_1 = P3^0; 
   7          sbit LED_2 = P3^1;
   8          sbit LED_3 = P1^6;
   9          sbit LED_4 = P1^7;
  10          
  11          //以下定义M1驱动信号
  12          sbit M1_1  = P2^0;
  13          sbit M1_2  = P2^1;
  14          sbit M1_3  = P2^2;
  15          sbit M1_4  = P2^3;
  16          
  17          //以下定义M2驱动信号
  18          sbit M2_1  = P2^4;
  19          sbit M2_2  = P2^5;
  20          sbit M2_3  = P2^6;
  21          sbit M2_4  = P2^7;
  22          
  23          //以下定义M3驱动信号
  24          sbit M3_1  = P3^4;
  25          sbit M3_2  = P3^5;
  26          sbit M3_3  = P3^6;
  27          sbit M3_4  = P3^7;
  28          
  29          //定义输入按键的序号
  30          sbit K_1 = P1^0;
  31          sbit K_2 = P1^1;
  32          sbit K_3 = P1^2;
  33          sbit K_4 = P1^3;
  34          sbit K_5 = P1^4;
  35          sbit K_6 = P1^5;
  36          
  37          //以下定义共阴极LED的显示代码,0~9
  38          uchar code tab[10] = 
  39          {       0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f       };
  40          
  41          //以下定义电机正转代码
  42          uchar code zheng[9] =
  43          {       0x00,0x03,0x02,0x06,0x04,0x0c,0x08,0x09,0x01  };
  44          
  45          //以下定义电机反转代码
  46          uchar code fan[9]   =
  47          {       0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x00  };
  48          
  49          //下面定义全局变量
  50          uchar m1_zheng                  = 0;//主轴正转,用1表示,停止用0表示
  51          uchar m1_zheng_val      = 0;//正转的步进
  52          uchar m1_fan                    = 0;//主轴反转,用2表示,停止用0表示
  53          uchar m1_fan_val                = 0;//反转步进
  54          
  55          uchar m2_mode                   = 0;//m2状态 X轴增加时用0,递减时用1
C51 COMPILER V8.08   MAIN                                                                  04/03/2009 13:14:46 PAGE 2   

  56          uchar m2_zheng_val      = 0;//m2 X轴递增时的位置 
  57          uchar m2_fan_val        = 0;//m2 X轴递减时的位置 
  58          uchar m2_pre_mode       = 0;//存储m2前一次的状态,递增为0,递减为1
  59          
  60          uchar m3_mode                   = 0;//m3状态 Y轴增加时用0,递减时用1
  61          uchar m3_zheng_val      = 0;//m3 Y轴递增时的位置
  62          uchar m3_fan_val                = 0;//m3 Y轴递减时的位置 
  63          uchar m3_pre_mode               = 0;//存储m3前一次的状态,递增为0,递减为1
  64          
  65          uchar inc_dec                   = 0;//递增为0,递减为1
  66          uchar choose_motor              = 0;//电机驱动选择,1为驱动M1,2为驱动M2,3为驱动M3
  67          
  68          
  69          //下面是 函数声明
  70          extern void delay(uchar time);//延时程序
  71          void init_cpu(void);//初始化51单片机
  72          void led_show(void);//LED显示程序
  73          void int0_isr();//中断处理程序
  74          void motor_driver();//电机控制程序
  75          void key_1();//KEY_1处理程序,既主轴正转程序
  76          void key_2();//主轴反转程序
  77          void key_3();//M2处理程序,既X轴电机
  78          void key_4();//M3处理程序,既Y轴电机
  79          void key_5();//设置X轴或Y轴位置递增或递减程序
  80          void key_6();//未定义,留待功能扩展
  81          //主函数开始
  82          void main()
  83          {
  84   1              init_cpu();//初始化单片机
  85   1              while(1)
  86   1              {
  87   2              led_show(); //显示当前电机状态
  88   2              }
  89   1      }
  90          void init_cpu()
  91          {
  92   1              EA  = 0;//关所有中断
  93   1              IT0 = 0;//下降沿触发
  94   1              EX0 = 1;//允许INT0中断
  95   1              EA  = 1;//开所有中断
  96   1      }
  97          void led_show()
  98          {
  99   1              uchar i;
 100   1              LED_1 = 0;//显示第一个LED,既M1的状态
 101   1              if(m1_zheng == 1) //如果是正传,i = 1
 102   1                      i = 1;
 103   1              else if (m1_fan == 2)//如果是反转,i = 2
 104   1                              i = 2;
 105   1                       else
 106   1                              i = 0;       //如果是停止,i = 0
 107   1              P0    = tab[i];
 108   1              delay(20);//延时20ms
 109   1              LED_1 = 1;
 110   1              LED_2 = 0;//显示第二个LED,既M2的状态
 111   1              i     = m2_mode;
 112   1              P0        = tab[i];
 113   1              delay(20);//延时20ms
 114   1              LED_2 = 1;
 115   1              LED_3 = 0;//显示第三个LED,既M3的状态
 116   1              i     = m3_mode;
 117   1              P0    = tab[i];
C51 COMPILER V8.08   MAIN                                                                  04/03/2009 13:14:46 PAGE 3   

 118   1              delay(20);
 119   1              LED_3 = 1;
 120   1      }
 121          
 122          void int0_isr() interrupt 0 using 0
 123          {       EX0 = 0;
 124   1              K_1 = 1;//读数前先置1
 125   1              if (K_1 == 0) key_1();//key_1按下,则调用key_1()
 126   1              K_2 = 1;//读数前先置1
 127   1              if (K_2 == 0) key_2();//key_2按下,则调用key_2()
 128   1              K_3 = 1;//读数前先置1
 129   1              if (K_3 == 0) key_3();//key_3按下,则调用key_3()
 130   1              K_4 = 1;//读数前先置1
 131   1              if (K_4 == 0) key_4();//key_4按下,则调用key_4()
 132   1              K_1 = 1;//读数前先置1
 133   1              if (K_5 == 0) key_5();//key_5按下,则调用key_5()
 134   1              K_6 = 1;//读数前先置1
 135   1              if (K_6 == 0) key_6();//key_6按下,则调用key_6()
 136   1              EX0 = 1;
 137   1      }
 138          
 139          void key_1()
 140          {
 141   1              m1_zheng = 1;//表示主轴正转
 142   1              m1_fan   = 0;//清除反转标志
 143   1              while( K_1 == 0 )//KEY_1键一直按着,则一直循环显示正转信号和主轴正转
 144   1              {       
 145   2                      
 146   2      
 147   2                      led_show();
 148   2                      choose_motor = 1;//驱动M1
 149   2                      motor_driver();
 150   2                      if (m1_zheng_val <= 7 )
 151   2                              m1_zheng_val++;
 152   2                      else
 153   2                              m1_zheng_val = 0;
 154   2      
 155   2              }       
 156   1      
 157   1      }
 158          
 159          void key_2()
 160          {
 161   1              m1_zheng = 0;//清除正转标志
 162   1              m1_fan   = 2;//表示反转
 163   1              while( K_2 == 0 )//KEY_2键一直按着,则循环显示反转信号和主轴反转
 164   1              {
 165   2                      
 166   2                      led_show();
 167   2                      choose_motor = 1;//驱动M1
 168   2                      motor_driver();
 169   2                      if (m1_fan_val <= 7 )
 170   2                              m1_fan_val++;
 171   2                      else
 172   2                              m1_fan_val = 0;
 173   2               }
 174   1      }
 175          
 176          void key_3()
 177          {   
 178   1              if( inc_dec == 0)//如果是递增的,
 179   1                              m2_mode = 0;//m2X轴位置递增
C51 COMPILER V8.08   MAIN                                                                  04/03/2009 13:14:46 PAGE 4   

 180   1              else 
 181   1                              m2_mode = 1;//m2X轴位置递减
 182   1              if ( m2_mode != m2_pre_mode ) //判断前一次和这次不都是递增或者递减
 183   1              {
 184   2                      if (inc_dec == 0) m2_zheng_val=0;//这次递增,前一次递减则m2_zheng_val清0
 185   2                      else m2_fan_val = 0;//这次递减,前一次递增,则m2_fan_val清0
 186   2              }
 187   1              led_show();
 188   1              choose_motor = 2;//驱动M2
 189   1              motor_driver();
 190   1              if( (inc_dec == 0) && (m2_zheng_val <= 8 ) )//如果是递增的,且m2_zheng_val <= 7
 191   1                      m2_zheng_val++;
 192   1              if ( m2_zheng_val == 9 )m2_zheng_val = 0;//m2_zheng_val等于9则清0
 193   1              if( (inc_dec == 1 ) && (m2_fan_val <= 8 ))//如果是 递减,且m2_fan_val <= 7
 194   1                      m2_fan_val++;
 195   1              if ( m2_fan_val == 9 )m2_fan_val = 0;//m2_fan_val等于9则清0
 196   1              while( K_3 == 0 ){;}//当KEY_3还按着时,等待,直到KEY_3松开
 197   1      }
 198          
 199          void key_4()
 200          {
 201   1              if (inc_dec == 0 )//如果是递增的,则m3_y加1,否则减1
 202   1                              m3_mode = 0;//m3 y轴位置递增
 203   1              else
 204   1                              m3_mode = 1;//m3 y轴位置递减
 205   1              led_show();
 206   1              choose_motor = 3;//驱动M3
 207   1              motor_driver();
 208   1              if( (inc_dec == 0) && (m3_zheng_val <= 8 ) )//如果是递增的,且m3_zheng_val <= 7
 209   1                      m3_zheng_val++;
 210   1              if ( m3_zheng_val == 9 )m3_zheng_val = 0;//m3_zheng_val等于9则清0
 211   1              if( (inc_dec == 1 ) && (m3_fan_val <= 8 ))//如果是 递减,且m3_fan_val <= 7
 212   1                      m3_fan_val++;
 213   1              if ( m3_fan_val == 9 )m3_fan_val = 0;//m3_fan_val等于9则清0
 214   1              while( K_4 == 0 );//KEY_4未松开,等待
 215   1      }
 216          
 217          void key_5()
 218          {
 219   1              uchar i ;
 220   1              i = (inc_dec ^ 0x0ff );//inc_dec中的值与0x0ff异或,值变反
 221   1          inc_dec = i;
 222   1              while( K_5 == 0 ){;}//KEY_5未松开,等待
 223   1      }
 224          
 225          void key_6()
 226          {
 227   1      ;}
 228          
 229          void motor_driver()
 230          {
 231   1              uchar j;
 232   1              if (choose_motor == 1 )//驱动M1
 233   1              {       
 234   2                      if(m1_zheng == 1)//如果是 正转
 235   2                                      j = zheng[m1_zheng_val];
 236   2                      if(m1_fan == 2 )//如果是 反转
 237   2                                      j = fan[m1_fan_val];
 238   2                      M1_1 = j^0;
 239   2                      M1_2 = j^1;
 240   2                      M1_3 = j^2;
 241   2                      M1_4 = j^3;
C51 COMPILER V8.08   MAIN                                                                  04/03/2009 13:14:46 PAGE 5   

 242   2              }
 243   1              if (choose_motor == 2 )//驱动M2
 244   1              {
 245   2                      if(m2_mode == 0 )//正转,+X
 246   2                              j = zheng[m2_zheng_val];
 247   2                      if(m2_mode == 1 )//反转,-X
 248   2                              j = fan[m2_fan_val];
 249   2                      M2_1 = j^0;
 250   2                      M2_2 = j^1;
 251   2                      M2_3 = j^2;
 252   2                      M2_4 = j^3;
 253   2              }
 254   1              if (choose_motor == 3 )//驱动M3
 255   1              {
 256   2                      if(m3_mode == 0 )//正转,+X
 257   2                              j = zheng[m3_zheng_val];
 258   2                      if(m3_mode == 1 )//反转,-X
 259   2                              j = fan[m3_fan_val];
 260   2                      M3_1 = j^0;
 261   2                      M3_2 = j^1;
 262   2                      M3_3 = j^2;
 263   2                      M3_4 = j^3;
 264   2              }
 265   1      }
 266          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    572    ----
   CONSTANT SIZE    =     28    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     14       1
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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