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

📄 motor.lst

📁 一个单片机控制步进电机的经典例子,KEIL下直接编译,用PROTEUS仿真,欢迎大家下载!
💻 LST
字号:
C51 COMPILER V8.05a   MOTOR                                                                08/21/2007 16:36:56 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE MOTOR
OBJECT MODULE PLACED IN motor.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE motor.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <REG52.H>
   2          #include <intrins.h>
   3          #define uchar unsigned char        //用uchar代替unsigned char
   4          #define uint unsigned int          //uint代替unsigned int
   5          #define MotPort P1
   6          #define TH0VAL -64608/256
   7          #define TL0VAL -64608%256               //定时初始
   8          
   9          uchar code Mot1Code[]={0xf2,0xf6,0xf4,0xfc,0xf8,0xf9,0xf1,0xf3};        //M1步码表
  10          uchar code Mot2Code[]={0x2f,0x6f,0x4f,0xcf,0x8f,0x9f,0x1f,0x3f};        //M2步码表
  11          uchar code SpeedTab[]={45,38,30,23,17,12,8,5,3,2};                                      //10级速度表
  12          
  13          /*马达状态字定义
  14          ---------------------------------------------
  15          MotorWorkMode | D3 | D2 | D1 | D0 | 16进制值
  16          ---------------------------------------------
  17          M1停止M2正转  | 0  | 1  | x  | 0  |0x4或0x6
  18          ---------------------------------------------
  19          M1停止M2反转  | 1  | 1  | x      | 0  |0xc或0xe
  20          ---------------------------------------------
  21          M1正转M2停止  | x  | 0  | 0      | 1  |0x1或0x9
  22          ---------------------------------------------
  23          M1反转M2停止  | x  | 0  | 1      | 1  |0x3或0xb
  24          ---------------------------------------------
  25          M1正转M2正转  | 0  | 1  | 0      | 1  |0x5
  26          ---------------------------------------------
  27          M1反转M2正转  | 0  | 1  | 1      | 1  |0x7
  28          ---------------------------------------------
  29          M1正转M2反转  | 1  | 1  | 0      | 1  |0xd
  30          ---------------------------------------------
  31          M1反转M2反转  | 1  | 1  | 1      | 1  |0xf
  32          ---------------------------------------------
  33          */
  34          uchar bdata MotorWorkMode=0;         //马达工作状态寄存器
  35          sbit B_M1StartStop=MotorWorkMode^0;      //M2运动/停止(0:停止;1:运动)
  36          sbit B_M1Face=MotorWorkMode^1;           //M2方向(0:正转;1:反转)
  37          sbit B_M2StartStop=MotorWorkMode^2;      //M1运动/停止(0:停止;1:运动)
  38          sbit B_M2Face=MotorWorkMode^3;           //M1方向(0:正转;1:反转)
  39          
  40          sbit K_M1StartStop=P0^0;                         //M1停止/运行
  41          sbit K_M1Face=P0^1;                                      //M1方向
  42          sbit K_M2StartStop=P0^2;                         //M2停止/运行
  43          sbit K_M2Face=P0^3;                                      //M2方向
  44          sbit K_SpeedAdd=P0^4;                            //速度加
  45          sbit K_SpeedDec=P0^5;                            //速度减
  46          
  47          sbit P_M1H=P3^0;                                         //M1上限
  48          sbit P_M1L=P3^1;                                         //M1下限
  49          sbit P_M2H=P3^2;                                         //M2上限
  50          sbit P_M2L=P3^3;                                         //M2下限
  51          uchar count=1;                                           //计数器
  52          uchar SpeedStep;                                 //速度级0-9
  53          //主函数
  54          void main()                      
  55          {                                                        
C51 COMPILER V8.05a   MOTOR                                                                08/21/2007 16:36:56 PAGE 2   

  56   1              TH0 = TH0VAL;
  57   1              TL0 = TL0VAL;                           //定时器0初值
  58   1              TR0 = 1;                                        //定时器0开始计数
  59   1              ET0 = 1;                                        //开CTC0中断
  60   1              EA = 1;                                         //开总中断
  61   1              P0=0xff;
  62   1              while(1)
  63   1              {
  64   2      
  65   2                      if (!K_M1StartStop)
  66   2                      { 
  67   3                              while(!K_M1StartStop);
  68   3                              B_M1StartStop=!B_M1StartStop;
  69   3                      }
  70   2      
  71   2                  if (!K_M1Face)
  72   2                      {
  73   3                               while(!K_M1Face);
  74   3                               B_M1Face=!B_M1Face;
  75   3                      }
  76   2      
  77   2                      if (!K_M2StartStop)
  78   2                      { 
  79   3                              while(!K_M2StartStop);
  80   3                              B_M2StartStop=!B_M2StartStop;
  81   3                      }
  82   2      
  83   2                      if (!K_M2Face)
  84   2                      {
  85   3                               while(!K_M2Face);
  86   3                               B_M2Face=!B_M2Face;
  87   3                      }
  88   2      
  89   2                      if (!K_SpeedAdd)        //速度加
  90   2                      {
  91   3                              while(!K_SpeedAdd);
  92   3                              SpeedStep++;
  93   3                              if (SpeedStep==10) {SpeedStep=9;}
  94   3                      }
  95   2      
  96   2                      if (!K_SpeedDec)        //速度减
  97   2                      {
  98   3                              while(!K_SpeedDec);
  99   3                              SpeedStep--;
 100   3                              if (SpeedStep==255) {SpeedStep=0;}
 101   3                      }
 102   2              }
 103   1      }
 104          
 105          //定时器0中断
 106          void Timer0(void) interrupt 1 using 2
 107          {
 108   1              static uchar M1Index,M2Index;  //步码索引
 109   1              TH0 = TH0VAL;
 110   1              TL0 = TL0VAL;                              //定时器0初值
 111   1              count--;
 112   1              if (count==0)
 113   1              {
 114   2                      count=SpeedTab[SpeedStep];               //根据速度级重装计数器,需要更快速度请更改定时器初值
 115   2                      switch (MotorWorkMode)
 116   2                      {
 117   3                              case 0x4:{if (P_M2H==1) {M2Index++;} break;}     //M2正转,M1停止
C51 COMPILER V8.05a   MOTOR                                                                08/21/2007 16:36:56 PAGE 3   

 118   3                              case 0x6:{if (P_M2H==1) {M2Index++;} break;}     //M2正转,M1停止
 119   3      
 120   3                              case 0xc:{if (P_M2L==1) {M2Index--;} break;}     //M2反转,M1停止
 121   3                              case 0xe:{if (P_M2L==1) {M2Index--;} break;}
 122   3      
 123   3                              case 0x1:{if (P_M1H==1) {M1Index++;} break;}     //M1正转,M2停止
 124   3                              case 0x9:{if (P_M1H==1) {M1Index++;} break;}
 125   3      
 126   3                              case 0x3:{if (P_M1L==1) {M1Index--;} break;}     //M1反转,M1停止
 127   3                              case 0xb:{if (P_M1L==1) {M1Index--;} break;}
 128   3      
 129   3                              case 0x5:{if (P_M1H==1) {M1Index++;} if (P_M2H==1) {M2Index++;} break;} //M1正转,M2正转
 130   3                              case 0x7:{if (P_M1L==1) {M1Index--;} if (P_M2H==1) {M2Index++;} break;} //M1反转,M2正转
 131   3                              case 0xd:{if (P_M1H==1) {M1Index++;} if (P_M2L==1) {M2Index--;} break;} //M1正转,M2反转
 132   3                              case 0xf:{if (P_M1L==1) {M1Index--;} if (P_M2L==1) {M2Index--;} break;} //M1反转,M2反转
 133   3                              default:break;
 134   3                      }
 135   2                      if (M1Index==8)
 136   2                      {M1Index=0;}
 137   2                      else
 138   2                      {
 139   3                              if (M1Index==255) {M1Index=7;}
 140   3                      }
 141   2                      if (M2Index==8)
 142   2                      {M2Index=0;}
 143   2                      else
 144   2                      {
 145   3                              if (M2Index==255) {M2Index=7;}
 146   3                      }
 147   2                      MotPort=Mot1Code[M1Index]&Mot2Code[M2Index];     //输出M1和M2步码 ----驱动电机运动的代码
 148   2              }
 149   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    352    ----
   CONSTANT SIZE    =     26    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5    ----
   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 + -