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

📄 text1.lst

📁 一个步进电机控制程序
💻 LST
字号:
C51 COMPILER V8.02   TEXT1                                                                 10/15/2007 21:53:38 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Text1.c LARGE BROWSE DEBUG OBJECTEXTEND

line level    source

*** WARNING C500 IN LINE 1 OF TEXT1.C: LICENSE ERROR (R208: RENEW LICENSE ID CODE (LIC))

   1          #include <AT89X51.h>//51芯片管脚定义头文件
   2          #include <intrins.h>//内部包含延时函数 _nop_() ;
   3          #include <LCD1602.H>
   4          #define uchar unsigned char
   5          #define uint unsigned int
   6          #define keys P1                                                 //按键控制端口
   7          #define stepper P2                                              //stepper motor control output 
   8          #define TMax 20000
   9          #define TMin 100
  10          uchar nstr[5];          //字符串形式的转速值
  11          uchar code cdis1[ ] = {" welcome "};
  12          uchar code cdis2[ ] = {" On  P "};      
  13          uchar code cdis3[ ] = {" On  N"};
  14          uchar code cdis4[ ] = {" off "};                        
  15          
  16          uchar ctlw[8]={0x0c,0x06,0x03,0x09,0x0c,0x06,0x03,0x09};        //双三拍控制字
  17          uchar m;
  18          bit qt=0;                                                                       //启停
  19          bit fx=0;                                                                       //方向
  20          bit max=0;                                                              //最大转速限制 =1时,到达最大值允许值
  21          bit min=0;                                                              //最小转速限制   
  22          unsigned int T=10000;                                   //时钟控制;
  23          
  24          // init()初始化
  25          void init()
  26          {
  27   1         
  28   1              TMOD = 0x01;                                            // 设置定时器0工作模式
  29   1              EA = 1;
  30   1              ET0 = 1;
  31   1              TH0 = -T/256;
  32   1              TL0 = -T%256;
  33   1              lcd_init();
  34   1              lcd_pos(0) ;
  35   1              m = 0 ;
  36   1          while(cdis1[m] != '\0')
  37   1        {
  38   2          lcd_wdat(cdis1[m]) ; //显示字符
  39   2          m++ ;
  40   2           }
  41   1      }
  42          //计算转速
  43          int ncal()
  44          {
  45   1              uint fw,N,ZR;
  46   1              fw=500000/T;
  47   1              return 60*fw/N/ZR;
  48   1      }
  49          
  50          //整数转字符串,保存到 nstr 中
  51          void itoa(uint Value)
  52          {
  53   1         uchar ch,*right,*left;
  54   1         left = right = nstr;
C51 COMPILER V8.02   TEXT1                                                                 10/15/2007 21:53:38 PAGE 2   

  55   1      
  56   1         //把数字转换成字符串(倒置的)
  57   1         while(Value)
  58   1         {
  59   2            *right = (Value%10)+0x30;
  60   2            Value = Value/10;
  61   2            right++;
  62   2         }
  63   1         *right-- = '\0';
  64   1         //把倒置的字符串正放过来
  65   1         while(right > left)
  66   1         {
  67   2            ch = *left;
  68   2             *left++ = *right;
  69   2             *right-- = ch;
  70   2         }
  71   1      }
  72          
  73          //显示转速
  74          void ndisp()
  75          {
  76   1              uint i=ncal();
  77   1              itoa(i);
  78   1              lcd_pos(0) ;
  79   1              m = 0 ;
  80   1          while(nstr[m] != '\0')
  81   1        {
  82   2          lcd_wdat(nstr[m]) ; //显示字符
  83   2          m++ ;
  84   2           }
  85   1      }
  86          
  87          //显示函数
  88          void display()
  89          {
  90   1              if(qt)
  91   1                {
  92   2                       if(fx)
  93   2                        {lcd_wcmd(0x01) ;
  94   3                         lcd_pos(0) ;
  95   3                     m = 0 ;
  96   3                 while(cdis2[m] != '\0')
  97   3                 {
  98   4                  lcd_wdat(cdis2[m]) ; //显示字符
  99   4                  m++ ;
 100   4                  }
 101   3                              }
 102   2      
 103   2                       else 
 104   2                         {lcd_wcmd(0x01);
 105   3                          lcd_pos(0) ;
 106   3                  m = 0 ;
 107   3                  while(cdis3[m] != '\0')
 108   3                  {
 109   4                   lcd_wdat(cdis3[m]) ; //显示字符
 110   4                   m++ ;
 111   4                   }
 112   3                          }
 113   2                       ndisp();
 114   2                }
 115   1              else
 116   1           {lcd_wcmd(0x01);
C51 COMPILER V8.02   TEXT1                                                                 10/15/2007 21:53:38 PAGE 3   

 117   2                lcd_pos(0) ;
 118   2            m = 0 ;
 119   2            while(cdis4[m] != '\0')
 120   2            {
 121   3                   lcd_wdat(cdis4[m]) ; //显示字符
 122   3                   m++ ;
 123   3                       }
 124   2            }
 125   1       }
 126          //加速
 127          void accelerate()
 128          {
 129   1              if(T>=TMin+500){T-=200;min=0;}
 130   1              else max=1;
 131   1      }
 132          
 133          //减速
 134          void decelerate()
 135          {
 136   1              if(T<=TMax+500){T+=200;max=0;}
 137   1              else min=1;
 138   1      }
 139          
 140          
 141          
 142          
 143          
 144                  
 145          
 146          /* 定时器0服务子程序 */
 147          void time0() interrupt 1 using 1  // 用定时器0中断来产生CLK时钟
 148          {
 149   1              /* 定时10ms,产生20ms周期的时钟,也就是50Hz的时钟 */
 150   1              static uchar n=0;
 151   1              TH0 = -T/256;
 152   1              TL0 = -T%256;
 153   1              if(fx)
 154   1              {
 155   2                      stepper=ctlw[n%4];
 156   2                      if(n<3)n++;
 157   2                      else n=0;
 158   2              }
 159   1              else 
 160   1              {
 161   2                      stepper=ctlw[n%4];
 162   2                      if(n>0)n--;
 163   2                      else n=3;
 164   2              }
 165   1              
 166   1      }
 167          
 168          /* 键消抖延时函数 */
 169          void delay(void)
 170          {
 171   1              uchar i;
 172   1              for (i=300;i>0;i--);
 173   1      }
 174          
 175          /* 键扫描函数 */
 176          void keyscan(void)
 177          {
 178   1              uchar tmpkey;
C51 COMPILER V8.02   TEXT1                                                                 10/15/2007 21:53:38 PAGE 4   

 179   1              keys = 0x0f;                                                            // 发全0行扫描码
 180   1              if ((keys&0x0f)!=0x0f)                                  // 若有键按下
 181   1              {
 182   2                      delay();                                                        // 延时去抖动
 183   2                      if ((keys&0x0f)!=0x0f)                          // 延时后再判断一次,去除抖动影响
 184   2                      {tmpkey=keys&0x0f;
 185   3                      while((keys&0x0f)!=0x0f);                       //直至键松开
 186   3                      switch(tmpkey)
 187   3                              {case 0x0e: 
 188   4                                                      qt=~qt;
 189   4                                                      break;
 190   4                               case 0x0d: 
 191   4                                                      if(qt==1)fx=~fx;
 192   4                                                      break;
 193   4                               case 0x0b: 
 194   4                                                      if(qt==1&&!max)accelerate();
 195   4                                                      break;
 196   4                               case 0x07: 
 197   4                                                      if(qt==1&&!min)decelerate();
 198   4                                                      break;
 199   4                               default:   break;
 200   4                              }
 201   3                       display();
 202   3                      }
 203   2              }                                                               // 无键按下,返回值为0  
 204   1      }
 205          
 206          /* 主程序 */
 207          void main()
 208          { 
 209   1              init();
 210   1              while(1)
 211   1          {
 212   2                      keyscan();                      // 调用键盘扫描函数
 213   2                      if(qt) TR0=1;
 214   2                      else   TR0=0;
 215   2              }
 216   1      }
 217          
 218          
 219          
 220                  
 221                  
 222                  


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


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

⌨️ 快捷键说明

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