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

📄 pwm-motor.cpp

📁 基于ATMEL89s52单片机
💻 CPP
字号:
  程序名:PWM直流电机调速                                                      */
/*                                                                                  */
/*     晶振:12.0 M                                        CPU型号:AT89S52         */
/*                                                                                  */                                             
/*                                                                                  */
/*     功能描述: 将J12的2,3脚和J8的7,8脚(均自上而下数)分别相连!       */
/*                     直流电机的pwm波控制,可以直接的调速从0到20级的调速           */ 
/*                                                                                  */
/************************************************************************************/ 
#include<reg51.h>

#define  TH0_TL0  (65536-1000)//设定中断的间隔时长

unsigned char count0 = 0;
unsigned char count1 = 0;

bit  Flag = 1;//电机正反转标志位,1正转,0反转

sbit Key_add=P1 ^ 4;  //电机减速
sbit Key_dec=P1 ^ 5;  //电机加速
sbit Key_turn=P1 ^ 6; //电机换向

sbit PWM1=P3^6;//PWM 通道 1
sbit PWM2=P3^7;//PWM 通道 2

unsigned char Time_delay;

//函数声明
void Delay(unsigned char x);
void Motor_speed_high(void);
void Motor_speed_low(void);
void Motor_turn(void);
void Timer0_init(void);

/******************************************************************************/
void Delay(unsigned char x)//延时处理
{
 Time_delay = x;

 while(Time_delay != 0);
}

/******************************************************************************/
void Timer0_int(void) interrupt 1 using 1//定时0中断处理
{
 TR0 = 0;
    TL0 += (TH0_TL0 + 9) % 256;
    TH0 += (TH0_TL0 + 9) / 256 + (char)CY;
    TR0 = 1;

 if(Time_delay != 0)//延时函数用
 {
  Time_delay--; 
 }

 if(Flag == 1)//电机正转
 {
  PWM1 = 0; 

  if(++count1 < count0)
  {
   PWM2 = 1;
  }
  else 
   PWM2 = 0;

  if(count1 >= 100)
  {
   count1=0;
  }
  }
 else      //电机反转
 {
  PWM2 = 0; 

  if(++count1 < count0)
  {
   PWM1 = 1;
  }
  else 
   PWM1 = 0;

  if(count1 >= 100)
  {
   count1=0;
  }
  }//反转
}

/******************************************************************************/
void Motor_speed_high(void)//按键处理加pwm占空比,电机加速
{
 if(Key_add==0)
 {
  Delay(10);
  if(Key_add==0)
  {
   count0 += 5;
  
   if(count0 >= 100)
   {
    count0 = 100;
   } 
     }
  while(Key_add == 0);//等待键松开
 }
}

/******************************************************************************/
void Motor_speed_low(void)//按键处理减pwm占空比,电机减速
{
 if(Key_dec==0)
 {
  Delay(10);
  if(Key_dec==0)
  {
   count0 -= 5;
 
   if(count0 <= 0)
   {
    count0 = 0;
   } 
     }
  while(Key_dec == 0);
 } 
}

/******************************************************************************/
void Motor_turn(void)//电机正反向控制
{
 if(Key_turn == 0)
 {
  Delay(10);
  if(Key_turn == 0)
  {
   Flag = ~Flag;
  }
  while(Key_turn == 0);
 }
}

/******************************************************************************/
void Timer0_init(void)//定时器0初始化
{
 TMOD=0x01;
 TH0=TH0_TL0 / 256;
 TL0=TH0_TL0 % 256;
 TR0=1;
 ET0=1;
 EA=1;
}

/******************************************************************************/
void main(void)//主函数
{
    Timer0_init();
           
 while(1)
 {
  Motor_turn();

  Motor_speed_high();
  Motor_speed_low();
  }
}



⌨️ 快捷键说明

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