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

📄 text2.lst

📁 基于51单片机pwm直流调速系统 c语言编程
💻 LST
字号:
C51 COMPILER V8.05a   TEXT2                                                                05/14/2008 12:22:47 PAGE 1   


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

line level    source

   1          
   2          
   3          //-----------------------函数声明,变量定义--------------------------------------------------------
   4          #include <reg51.h>
   5          sbit INT_0 =P1^2;              // 将p3.2外部中断0
   6          sbit pulse_A=P1^2;               // P1.2为脉冲A输入
   7          sbit PWM=P1^0;                   //PWM波形输出 
   8          sbit DR=P1^1;                    //方向控制
   9          //-----------------------预定义值--------------------------------------------------------
  10          #define PWM_T 1800              //定义PWM的周期T为18ms
  11          #define Ts    1000              //定义光电编码器采样时间为10ms
  12          #define  timer_data  (256-10) //定时器预置值,12M时钟是,定时0.01ms
  13          //-----------------------预设定值--------------------------------------------------------
  14          bit direction;                  //方向标志位               用户设定
  15          unsigned char R;                //需要得到的直流电机转速   用户设定
  16          //-----------------------实际运行状态--------------------------------------------------------
  17          bit real_direction;             //电机实际运行方向   
  18          unsigned char Rr;               //直流电机实际转速
  19          //-----------------------计算所得补偿状态------------------------------------------
  20          bit    compensate_polarity;     //补偿极性
  21          unsigned char dR;               //转速补偿
  22          //-----------------------经补偿后得到的脉宽------------------------------------------
  23          unsigned char PWM_t;            //PWM_t为脉冲宽度(320~400)时间为3.2~4.0ms
  24          unsigned char PWM_count;        //输出PWM周期计数
  25          //-----------------------各中间计数值------------------------------------------
  26          unsigned char pulseB_count;     //脉冲计数
  27          unsigned char time0_count;      //定时计数
  28          unsigned char time1_count;      //定时计数
  29          //--------------------------------------------------------------------------------------------------
  30          // 函数名称:timer_init
  31          // 函数功能:初始化设置定时器
  32          //--------------------------------------------------------------------------------------------------
  33          void timer_init()
  34               {
  35   1         TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */
  36   1            PCON=0x00;
  37   1            TF0=0; 
  38   1            TH0=timer_data;   //保证定时时长为0.01ms
  39   1            TL0=TH0;
  40   1         TH1=timer_data;   //保证定时时长为0.01ms
  41   1            TL1=TH0;
  42   1            ET0=1;            //定时器0中断允许
  43   1         TR0=1;            //定时器0开始计数
  44   1         ET1=1;            //定时器1中断允许
  45   1         TR1=1;            //定时器1开始计数
  46   1            EA=1;             //中断允许
  47   1         }
  48          //--------------------------------------------------------------------------------------------------
  49          // 函数名称: INT0_init()
  50          // 函数功能: 初始化设置
  51          //            设定INT0的工作方式
  52          //--------------------------------------------------------------------------------------------------
  53          void INT0_init(void )  
  54                       {
  55   1          pulseB_count=0;        //脉冲计数器清零
C51 COMPILER V8.05a   TEXT2                                                                05/14/2008 12:22:47 PAGE 2   

  56   1                    IT0=1;     //选择INT0为沿触发方式
  57   1                    EX0=1;     //外部中断允许
  58   1                    EA=1;      //系统中断允许
  59   1                    }
  60          //--------------------------------------------------------------------------------------------------
  61          // 函数名称:setting_PWM
  62          // 函数功能:设置PWM的脉冲宽度和设定方向
  63          //--------------------------------------------------------------------------------------------------
  64          void setting_PWM()
  65                {
  66   1       // direction=1;  //设定转动方向
  67   1       // R=540;        //设定转速
  68   1       // dR=0;         //转速补偿为零
  69   1       // calculate_PWM_t();      //重新计算脉宽
  70   1         }
  71          //--------------------------------------------------------------------------------------------------
  72          // 函数名称: calculate_PWM_t
  73          // 入口参数: R需要得到的直流电机转速,dR转速补偿
  74          // 出口参数: PWM_t为脉冲宽度(320~400)时间为3.2~4.0ms
  75          // 函数功能: 计算脉冲宽度,PWM_t=R/150;
  76          //--------------------------------------------------------------------------------------------------
  77          void calculate_PWM_t()
  78                        {
  79   1            if(compensate_polarity==1) //正补偿
  80   1                     PWM_t=(R+dR)/150;
  81   1            else
  82   1             PWM_t=(R-dR)/150;        //负修正
  83   1            }
  84          //--------------------------------------------------------------------------------------------------
  85          // 函数名称: calculate_Rr
  86          // 入口参数: pulseB_count脉冲计数
  87          // 出口参数: Rr直流电机实际转速
  88          // 函数功能: 计算实际转速
  89          //--------------------------------------------------------------------------------------------------
  90          void calculate_Rr()
  91                        {
  92   1                     Rr=pulseB_count/6;
  93   1            }
  94          //--------------------------------------------------------------------------------------------------
  95          // 函数名称: compensate_dR
  96          // 入口参数: Rr直流电机实际转速
  97          //            R需要得到的直流电机转速
  98          // 出口参数: dR转速补偿
  99          // 函数功能: 计算实际补偿值和补偿极性 ,根据不同的补偿算法重新设计
 100          //--------------------------------------------------------------------------------------------------
 101          void compensate_Rr()
 102                        {
 103   1                    Rr=1;
 104   1                    if(Rr>R)
 105   1            compensate_polarity=0;     //补偿极性
 106   1           else 
 107   1                     compensate_polarity=1;
 108   1            }
 109          //--------------------------------------------------------------------------------------------------
 110          // 函数名称: INT0_intrupt
 111          // 函数功能: 外部中断0处理程序
 112          //--------------------------------------------------------------------------------------------------
 113          void INT0_intrupt() interrupt 0 using 1
 114                  {
 115   1        pulseB_count++;
 116   1              if(pulse_A==0)
 117   1                {   
C51 COMPILER V8.05a   TEXT2                                                                05/14/2008 12:22:47 PAGE 3   

 118   2                real_direction=1;  //若P1.2为低电平,则电机为正转,计数器N的值加1
 119   2                }
 120   1              else                //若为高电平,则电机为反转,计数器N值减l。
 121   1                 {
 122   2                  real_direction=1;
 123   2                }
 124   1      }
 125          //--------------------------------------------------------------------------------------------------
 126          // 函数名称:IntTimer0
 127          // 函数功能:定时器中断处理程序
 128          //--------------------------------------------------------------------------------------------------
 129          void IntTimer0() interrupt 1
 130                        {
 131   1           time0_count++;
 132   1                    DR=direction;
 133   1           if(time0_count>=PWM_T)
 134   1                    {
 135   2           time0_count=0;
 136   2           PWM_count++;
 137   2           setting_PWM();  //每输出一个PWM波调用一次
 138   2           }
 139   1           if(time0_count<PWM_t)
 140   1           PWM=1;
 141   1           else 
 142   1           PWM=0;
 143   1           }
 144          //--------------------------------------------------------------------------------------------------
 145          // 函数名称:IntTimer1
 146          // 函数功能:定时器中断处理程序
 147          //--------------------------------------------------------------------------------------------------
 148          void IntTimer1() interrupt 3
 149                        {
 150   1           time1_count++;
 151   1           if(time1_count==1)
 152   1                    {
 153   2           INT0_init();           //初始化外部中断设置
 154   2           }
 155   1           if(time1_count>=Ts)
 156   1           {
 157   2           time1_count=0;          //一个补偿周期结束,计数器清零
 158   2           calculate_Rr();         //计算实际转速
 159   2           compensate_Rr();        //计算实际补偿值和补偿极性
 160   2           calculate_PWM_t();      //重新计算脉宽
 161   2           }
 162   1           }
 163          //--------------------------------------------------------------------------------------------------
 164          // 函数名称:main
 165          // 用户主函数
 166          // 函数功能:主函数
 167          //--------------------------------------------------------------------------------------------------
 168          void main()
 169               {
 170   1           direction=1;  //设定转动方向
 171   1        R=540;        //设定转速
 172   1        dR=0;         //转速补偿为零
 173   1        calculate_PWM_t();      //重新计算脉宽
 174   1        timer_init();
 175   1        }
 176          


MODULE INFORMATION:   STATIC OVERLAYABLE
C51 COMPILER V8.05a   TEXT2                                                                05/14/2008 12:22:47 PAGE 4   

   CODE SIZE        =    200    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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