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

📄 test.lst

📁 通过单片机测电机的转速
💻 LST
字号:
C51 COMPILER V7.50   TEST                                                                  11/15/2008 18:47:31 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN Test.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Test.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "reg52.h" 
   2          #define uchar unsigned char
   3          #define uint unsigned int
   4          unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7
             -1,0x00}; //共阴极0~9对应16进制数
   5          //数码管位选控制口定义
   6          sbit LED4=P2^7;
   7          sbit LED3=P2^6;
   8          sbit LED2=P2^5;
   9          sbit LED1=P2^4;
  10          //按键口申明
  11          sbit S1=P2^3;
  12          sbit S2=P2^2;
  13          sbit S3=P2^1;
  14          
  15          sbit PWM=P3^3;  //控制电机的PWM口
  16          unsigned char tabArry[4];       //存入显示数据
  17          
  18          char flag=1;    //按键标志,当flag=1时表示没有按下,当flag=0时表示有按键按下
  19          int counter;    //用于频率计定时器计数,当为50时,定时为1秒
  20          int speed,setspeed=16;  //电机实际转速,设定的电机转速
  21          int speedcount; //转速计数
  22          int keycount=0; //按键计数,为0时测转速,为1时设置转速
  23          int z_counter=0;        //占空比计数,计100次
  24          int zkb=50;                     //所调制的占空比
  25          int pwmcount=0;
  26          //毫秒延时程序
  27          void delayms(int ms)
  28          {
  29   1              uchar i;
  30   1          while(ms--)
  31   1               {
  32   2                      for(i=250;i>0;i--);
  33   2               }
  34   1      }
  35          //数据分位
  36          void change(char ch,unsigned int frequency)
  37          {
  38   1              tabArry[0]=ch;          //显示字母,A为测得转速,b为设置转速
  39   1              tabArry[1]=frequency%1000/100; //百位
  40   1              tabArry[2]=frequency%100/10;    //十位
  41   1              tabArry[3]=frequency%10;                //个位
  42   1      }
  43          //键盘扫描
  44          void keyscan()
  45          {
  46   1              if(flag==1)
  47   1              {
  48   2                      if(S3==0)               //用S3切换实际转速与设定转速
  49   2                      {       
  50   3                              delayms(2);     //延时去抖
  51   3                              if(S3==0)
  52   3                              {
  53   4                                      flag=0;
  54   4                                      keycount++;
C51 COMPILER V7.50   TEST                                                                  11/15/2008 18:47:31 PAGE 2   

  55   4                                      if(keycount>=2) keycount=0;
  56   4                              }
  57   3                      }               
  58   2              
  59   2                      if(S2==0 && keycount==1)        //设置转速加1
  60   2                      {       
  61   3                              delayms(2);
  62   3                              if(S2==0 && keycount==1)
  63   3                              {
  64   4                                      flag=0;
  65   4                                      setspeed++;
  66   4                                      if(setspeed>1000) setspeed=999;
  67   4                              }
  68   3                      }
  69   2                      if(S1==0 && keycount==1)        //设置转速减1
  70   2                      {       
  71   3                              delayms(2);
  72   3                              if(S1==0 && keycount==1)
  73   3                              {
  74   4                                      flag=0;
  75   4                                      setspeed--;
  76   4                                      if(setspeed<0) setspeed=0;
  77   4                              }
  78   3                      }
  79   2      
  80   2              }       
  81   1              if(S1!=0 && S2!=0 && S3!=0) flag=1;       //判断按键是否弹起
  82   1      } 
  83          
  84          //显示函数
  85          void display()
  86          {
  87   1              
  88   1              switch(keycount)        
  89   1              {
  90   2                      case 0:                                         //当keycount=0时显示实际转速
  91   2                              change(0x0a,speed);
  92   2                              break;
  93   2                      case 1:
  94   2                              change(0x0b,setspeed);  //当keycount=1时显示设置转速
  95   2                              break;
  96   2              }  
  97   1              
  98   1              P0 = table[tabArry[0]];
  99   1              LED1=0;
 100   1              delayms(2);
 101   1              LED1=1;
 102   1      
 103   1              P0 = table[tabArry[1]];
 104   1              LED2=0;
 105   1              delayms(2);
 106   1              LED2=1;
 107   1      
 108   1              P0 = table[tabArry[2]];
 109   1              LED3=0;
 110   1              delayms(2);
 111   1              LED3=1;
 112   1      
 113   1              P0 = table[tabArry[3]];
 114   1              LED4=0;
 115   1              delayms(2);
 116   1              LED4=1; 
C51 COMPILER V7.50   TEST                                                                  11/15/2008 18:47:31 PAGE 3   

 117   1      }
 118          //程序初始化
 119          void Init()
 120          {
 121   1              TMOD=0x11; //定时器1方式1,定时器0方式1
 122   1      
 123   1              TH0=0x70;//定义20ms,用于测速,晶振22.1184MHz                                   
 124   1              TL0=0x00;
 125   1      
 126   1          TH1=0xf8; //定义1mS,用于控制电机转速
 127   1              TL1=0xcc;
 128   1      
 129   1          ET0=1;//允许定时0中断
 130   1              ET1=1;//允许定时1中断
 131   1              TR0=1;//定时器0启动
 132   1              TR1=1;//定时器1启动
 133   1              EX0=1;//允许外部中断
 134   1              IT0=1;//边沿出发
 135   1              EA=1;//总中断打开       
 136   1      }
 137          //*******************************************************
 138          void main(void)
 139          {
 140   1          Init();
 141   1              while(1)
 142   1              {
 143   2                      keyscan();//按键程序
 144   2                      display();//显示程序
 145   2         }
 146   1      }
 147          //定时器0,用于测电机转速
 148          void timer0() interrupt 1
 149          {  
 150   1              TH0=0x70;//定义20ms                             
 151   1              TL0=0x00;
 152   1              counter++;
 153   1              if(counter>=50) //1s时将电机脉冲读出
 154   1              {
 155   2                  counter=0;          //定时器计数清零,便于下一次测速计数
 156   2                      speed=speedcount;       //将测得的频率赋给speed显示
 157   2                      speedcount=0;   //将电机转速计数清零,重新计数
 158   2              }
 159   1      
 160   1      }
 161          //定时器1,用于控制PWM输出
 162          void timer1() interrupt 3
 163          {  
 164   1          TH1=0xf8;   //重新赋初值
 165   1              TL1=0xcc;
 166   1              z_counter++;    //占空比计数加1
 167   1              if(z_counter>=100)      z_counter=0;    //当计数超过100后清零,便于重新计数
 168   1              if(setspeed>speed)              //当设定的值大于实际值时,所调制的占空比加1
 169   1              {
 170   2                      zkb++;
 171   2                      if(zkb>100) zkb=100;
 172   2              }
 173   1              else if(setspeed<speed)         //当设定的值小于实际值时,所调制的占空比减1
 174   1              {
 175   2                      zkb--;
 176   2                      if(zkb<0) zkb=0;
 177   2              }
 178   1              else zkb=50;    //当设定的值等于实际值时,所调制的占空恒为50
C51 COMPILER V7.50   TEST                                                                  11/15/2008 18:47:31 PAGE 4   

 179   1              if(z_counter<zkb) PWM=0;
 180   1              else PWM=1;     
 181   1      
 182   1      }
 183          
 184          //外中断0,用于电机速度计数,每产生一次中断计数一次
 185          void  Pint0() interrupt 0       
 186          {  
 187   1              speedcount++;
 188   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    615    ----
   CONSTANT SIZE    =     17    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     21    ----
   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 + -