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

📄 main.lst

📁 P89LV51RD2单片机直流电机测速源码
💻 LST
字号:
C51 COMPILER V7.09   MAIN                                                                  07/01/2006 09:37:42 PAGE 1   


C51 COMPILER V7.09, 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          /*
   2                  Main.C
   3                  直流电机测速程序
   4          */
   5          
   6          
   7          #include <REG51.H>
   8          #include <ABSACC.H>
   9          #include <CTYPE.H>
  10          
  11          
  12          //定义I/O接口
  13          sbit PWM = P1^6;        //PWM方波输出(接至ZDJA,控制直流电机转速)
  14          sbit KEY1 = P2^0;       //按键1(电机加速)
  15          sbit KEY2 = P2^1;       //按键2(电机减速)
  16          
  17          
  18          //定义全局变量
  19          unsigned char DispBuf[8];       //定义数码管显示缓冲区(由T1定时中断自动扫描)
  20          unsigned char Speed;            //预设的电机转速值,范围20~250
  21          bit SWTR;       //软件定时器运行标志
  22          bit SWTF;       //软件定时器溢出标志
  23          unsigned int SWTV;      //软件定时器定时值
  24          
  25          
  26          /*
  27          函数:T1INTSVC()
  28          功能:定时器T1的中断服务函数(每100μs中断一次)
  29          */
  30          void T1INTSVC() interrupt 3
  31          {
  32   1              code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  33   1              static unsigned char n = 0;
  34   1              static unsigned char t = 0;
  35   1      //扫描数码管
  36   1              P0 = 0xFF;              //暂停显示
  37   1              XBYTE[0xE800] = ~DispBuf[n];    //更新扫描数据
  38   1              P0 = ~com[n];   //重新显示
  39   1              n++;
  40   1              n &= 0x07;
  41   1      //产生PWM方波,驱动电机
  42   1              t++;
  43   1              if ( t < Speed )
  44   1              {
  45   2                      PWM = 1;
  46   2              }
  47   1              else
  48   1              {
  49   2                      PWM = 0;
  50   2              }
  51   1      //模拟一个软件定时器
  52   1              if ( SWTR )
  53   1              {
  54   2                      if ( --SWTV == 0 ) SWTF = 1;
  55   2              }
C51 COMPILER V7.09   MAIN                                                                  07/01/2006 09:37:42 PAGE 2   

  56   1      }
  57          
  58          
  59          /*
  60          函数:DispChar()
  61          功能:在数码管上显示字符
  62          参数:
  63                  x:显示位置(0~7)
  64                  c:要显示的字符(仅限0~9、AbCdEF和-)
  65          */
  66          void DispChar(unsigned char x, unsigned char c)
  67          {
  68   1              code unsigned char Tab[] =
  69   1              {//0123456789AbCdEF的数码管字型数据
  70   1                      0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  71   1                      0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
  72   1              };
  73   1              unsigned char t;
  74   1              x &= 0x07;
  75   1              x = 7 - x;
  76   1              if ( c == '-' )
  77   1              {
  78   2                      DispBuf[x] = 0x40;
  79   2              }
  80   1              else
  81   1              {
  82   2                      t = toint(c);
  83   2                      if ( t < 16 )
  84   2                      {
  85   3                              DispBuf[x] = Tab[t];
  86   3                      }
  87   2              }
  88   1      }
  89          
  90          
  91          /*
  92          函数:DispStr()
  93          功能:在数码管上显示字符串
  94          参数:
  95                  x:起始显示位置(0~7)
  96                  *s:要显示的字符串(其中的字符仅限0~9、AbCdEF和-)
  97          */
  98          void DispStr(unsigned char x, unsigned char *s)
  99          {
 100   1              unsigned char c;
 101   1              for (;;)
 102   1              {
 103   2                      c = *s++;
 104   2                      if ( c == '\0' ) break;
 105   2                      DispChar(x++,c);
 106   2              }
 107   1      }
 108          
 109          
 110          /*
 111          函数:Delay()
 112          功能:延时0.1ms~6.5536s
 113          参数:
 114                  t>0时,延时(t*0.1)ms
 115                  t=0时,延时6.5536s
 116          */
 117          void Delay(unsigned int t)
C51 COMPILER V7.09   MAIN                                                                  07/01/2006 09:37:42 PAGE 3   

 118          {
 119   1              SWTV = t;       //软件定时器赋初值
 120   1              SWTR = 1;       //启动软件定时器
 121   1              while ( !SWTF );        //等待溢出
 122   1              SWTR = 0;       //停止软件定时器
 123   1              SWTF = 0;       //清除溢出标志
 124   1      }
 125          
 126          
 127          /*
 128          函数:ByteToStr()
 129          功能:字节型变量c转换为十进制字符串
 130          */
 131          void ByteToStr(unsigned char idata *s, unsigned char c)
 132          {
 133   1              code unsigned char Tab[] = {100,10};
 134   1              unsigned char i;
 135   1              unsigned char t;
 136   1              for ( i=0; i<2; i++ )
 137   1              {
 138   2                      t = c / Tab[i];
 139   2                      *s++ = '0' + t;
 140   2                      c -= t * Tab[i];
 141   2              }
 142   1              *s++ = '0' + c;
 143   1              *s = '\0';
 144   1      }
 145          
 146          
 147          /*
 148          函数:MeasureSpeed()
 149          功能:测量电机转速
 150          返回:转速值(单位:转/秒)
 151          */
 152          unsigned char MeasureSpeed()
 153          {
 154   1              TH0 = TL0 = 0;  //清除计数器T0
 155   1              TR0 = 1;                //启动计数器T0
 156   1              Delay(2500);    //延时250ms(因为直流电机转盘上正好有4个槽)
 157   1              TR0 = 0;                //停止计数
 158   1              TF0 = 0;                //清除(可能的)溢出标志
 159   1              return TL0;             //返回结果(单位:转/秒;已知电机转速不会超过100)
 160   1      }
 161          
 162          
 163          /*
 164          函数:KeyScan()
 165          功能:键盘扫描
 166          返回:扫描到的键值
 167          */
 168          unsigned char KeyScan()
 169          {
 170   1              unsigned char k = '\0';
 171   1              if ( KEY1 == 0 ) k = '+';
 172   1              if ( KEY2 == 0 ) k = '-';
 173   1              return k;
 174   1      }
 175          
 176          
 177          /*
 178          函数:SysInit()
 179          功能:系统初始化
C51 COMPILER V7.09   MAIN                                                                  07/01/2006 09:37:42 PAGE 4   

 180          */
 181          void SysInit()
 182          {
 183   1              unsigned char i;
 184   1              for ( i=0; i<8; i++ )
 185   1              {
 186   2                      DispBuf[i] = 0x00;      //数码管初始化为全灭
 187   2              }
 188   1              Speed = 30;             //设置电机初始转速
 189   1              SWTR = 0;
 190   1              SWTF = 0;
 191   1              SWTV = 0;
 192   1              TMOD &= 0x0F;
 193   1              TMOD |= 0x20;   //设置T1为8位定时器,自动重装
 194   1              TH1 = TL1 = 0xA4;       //设置T1初值,对应100μs
 195   1              ET1 = 1;        //使能T1中断
 196   1              TR1 = 1;        //启动T1
 197   1              EA = 1;         //使能总中断
 198   1              TMOD &= 0xF0;
 199   1              TMOD |= 0x05;
 200   1      }
 201          
 202          
 203          void main()
 204          {
 205   1              unsigned char k;
 206   1              unsigned char spd;
 207   1              unsigned char s[4];
 208   1              SysInit();
 209   1              for (;;)
 210   1              {
 211   2                      for (;;)
 212   2                      {
 213   3                              spd = MeasureSpeed();
 214   3                              ByteToStr(s,spd);
 215   3                              DispStr(5,s);
 216   3                              k = KeyScan();  //键盘扫描
 217   3                              if ( k != '\0' ) break;         //如果有键按下,退出循环
 218   3                      }
 219   2                      switch ( k )            //判断键值,执行具体功能
 220   2                      {
 221   3                      case '+':
 222   3                              if ( Speed < 250 ) Speed += 5;
 223   3                              break;
 224   3                      case '-':
 225   3                              if ( Speed > 20 ) Speed -= 5;
 226   3                              break;
 227   3                      default:
 228   3                              break;
 229   3                      }
 230   2                      for (;;)
 231   2                      {
 232   3                              spd = MeasureSpeed();
 233   3                              ByteToStr(s,spd);
 234   3                              DispStr(5,s);
 235   3                              if ( KeyScan() == '\0' ) break; //如果按键抬起,退出循环
 236   3                      }
 237   2              }
 238   1      }
 239          


C51 COMPILER V7.09   MAIN                                                                  07/01/2006 09:37:42 PAGE 5   

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