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

📄 dianji.c

📁 利用定时器产生PWM控制电机,并且利用单片机读取增量式编码器的信息控制电机旋转角度
💻 C
字号:
/*-------------------------------------------------------------------------------*/
/*********************************************************************************/
/*单片机:STC89C58RD+.晶振:11.0592M.                                              */
/*P1.2为刹车,P1.3为旋转方向,P1.4为pwm输出,P3.5接光电编码器的一个引脚(A或B)控制旋 */                                           
/*时间.P1.6接收过流信号;P2.6为过流指示灯,P2.7为T0运行指示灯                      */
/*                                                                               */
/*********************************************************************************/
/*-------------------------------------------------------------------------------*/ 
#include "REG51.H"

/*-------------------------------------------------------------------------------*/
#define uchar       unsigned char
#define uint        unsigned int
/*-------------------------------------------------------------------------------*/
#define pwm_speed1 0x08     //比值控制占空比,调速.
#define pwm_speed2 0x02     //
sbit stop=P1^2;             //刹车.
sbit dir=P1^3;              //方向.
sbit pwm=P1^4;              //pwm输出.
sbit safety=P1^6;           //接收过流信号.
sbit led_safety=P2^6;       //过流指示灯.
sbit led_T0=P2^7;           //T0运行正常指示灯.
/*-------------------------------------------------------------------------------*/
/*********************************************************************************/
    uint pwm_HL=1;                            //pwm高低电平标志位.
    uint unsafety_time;                       //记录过流次数.
    uint pwm1=pwm_speed1,pwm2=pwm_speed2;
      
void main()
{ 
  void delay_s(int t);                        //秒级延时.
  TMOD=0x51;
  delay_s(5);
  TH1=0xFF;  TL1=0xFA;
  TH0=0xFF;  TL0=0xED;
  EA=1; 
  pwm=1;dir=1;stop=1;                         //pwm初始状态.
  TR1=1;ET1=1;TR0=1;ET0=1;
 for(;;)
    {;}
}
/*-------------------------------------------------------------------------------*/
/****************************T0定时器中断产生pwm方波******************************/

void pwm_t0(void) interrupt 1
{
   if(safety==1)                             //如果过流,进行处理.
    {
    unsafety_time++;                         //记录过留次数
    stop=0;led_T0=1;led_safety=0;            //刹车并点亮过流指示灯
    delay_s(5);
    TH1=0xFF;TL1=0xFA;
    dir=!dir;                                //过流后反方向旋转
    stop=1;
    }
   else                                      //正常旋转调制.
    {
    led_safety=1;                            //过流指示等灭.
    led_T0=0;                                //点亮T0运行指示灯.
    
        if(pwm_HL==1)                        //pwm高电平
           {   
            switch(pwm1--)
                  {
                   case 0: TH0=0xFF;TL0=0xED;
                           pwm_HL=0;pwm2=pwm_speed2;
                           break;
                   default:pwm=1;
                           TH0=0xFF;TL0=0xED;
                           break;  
                  }
           }
        if(pwm_HL==0)
           {
            switch(pwm2--)
                   {
                   case 0: TH0=0xFF;TL0=0xED;
                           pwm_HL=1;pwm1=pwm_speed1;
                           break;
                   default:pwm=0;
                           TH0=0xFF;TL0=0xED;
                           break;
                   }
           }   
        }
}


/*********************************************************************************/
/*-------------------------------------------------------------------------------*/
/*****************************T1计数器中断控制旋转方向****************************/
 
void dir_T1(void) interrupt 3
{
    stop=0;led_T0=1;                 //刹车并熄灭T0运行指示灯.
    pwm1=pwm_speed1;pwm2=pwm_speed2;
    TH1=0xFF;TL1=0xFA;
    delay_s(5);
    dir=!dir;                        //改变方向.
    stop=1;
    
}

/*********************************************************************************/
/*-------------------------------------------------------------------------------*/
/***********************************秒级延时函数**********************************/

void delay_s(uint t)  
{
int i;uint j;
   for(i=0;i<t;i++)
      {
       for(j=0;j<120000;j++)
          {;}
      }
}

/**********************************************************************************/
/*--------------------------------------结束--------------------------------------*/ 

⌨️ 快捷键说明

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