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

📄 pwm.c

📁 利用定时器使无PWM功能的51 单片机产生PWM
💻 C
字号:

#include<regX52.h>

#define uchar unsigned char	 
#define uint  unsigned int

#define PWMON	0                  //低 
#define PWMOFF	1                  //高


#define MAXSpeedPWMNum   10          //运行时电机的最高运行速度


#define RCAP2H_025ms 	0xfc		//22.1184*1000000/6=3686400; 1843200  
#define RCAP2L_025ms 	0x67		//3686400/4000=921=0x399   0x10000-0x399=0xfc67


#define RCAP2H_10ms 	0x70
#define RCAP2L_10ms 	0x00		//3686400/100=36864=0x9000  0x10000-0x9000=0x7000


#define  SpeedUpTime 	 5	 //可通过修改SpeedUpTime的值,改变PWM信号启动所用的时间
#define  SpeedDownTime   20	 //可通过修改SpeedDownTime的值,改变PWM信号停止所用的时间

sbit PWM=P0^0;	  	  //PWM输出引脚
bit  StartPWMFlag=0;  //启动PWM标志
bit  StopPWMFlag=0;	  //停止PWM标志
bit  OutPutPWMFlag=0; //输出PWM信号标志

uchar CurSpeed;		 //当前速度
uchar CurMaxSpeed;	 //需要达到的最高速度
uchar CurPWMNum; 	 //当前PWM脉冲数

uchar ChangeSpeedTimesOut=0;  //PWM由0到当前设定值所需要的时间或PWM由当前设定值到0所需要的时间


//****************************************
void timer0(void) interrupt 1	//0.5ms  定时
{
   
    TH0=RCAP2H_025ms;
    TL0=RCAP2L_025ms;

	if(OutPutPWMFlag==1)
	{
	  if(CurPWMNum<CurSpeed)
		 PWM=PWMON;
	   else
	     PWM=PWMOFF;
	  CurPWMNum++;
	  if(CurPWMNum==MAXSpeedPWMNum)
	     CurPWMNum=0;
	}
   else
	 PWM=PWMOFF;  

}

void timer2(void) interrupt 5 	   //10ms  定时
{
	TF2 = 0;
	if(StartPWMFlag==1)			  //启动PWM,每隔50*10ms速度增加一档,当速度增加到CurMaxSpeed时,则停止增速
	{							  //可通过修改SpeedUpTime的值,改变PWM信号启动所用的时间
	  ChangeSpeedTimesOut--;
	  if(ChangeSpeedTimesOut==0)
	  	{ ChangeSpeedTimesOut=SpeedUpTime;
		  CurSpeed++;		  
		  if(CurSpeed>CurMaxSpeed)
		  	{ StartPWMFlag=0;
			  CurSpeed=CurMaxSpeed;
			 }  
		}
	 }

   	if(StopPWMFlag==1)		   //停止PWM,每隔SpeedDownTime*10ms速度降低一档,当CurSpeed==0时,停止输出PWM信号
	{						   //可通过修改SpeedDownTime的值,改变PWM信号停止所用的时间
	  ChangeSpeedTimesOut--;
	  if(ChangeSpeedTimesOut==0)
	  	{
		  ChangeSpeedTimesOut=SpeedDownTime;
		  if(CurSpeed>0)
			  CurSpeed--;
		  if(CurSpeed==0)
		  	{ StopPWMFlag=0;
			  PWM=PWMOFF; 			  
			  OutPutPWMFlag=0;
			 }  
		}
	 }


}



//==========================
void StartPWM(uchar speed)   //启动PWM,参数为该次启动所要达到的速度,speed的值为0~MAXSpeedPWMNum
{

	PWM=PWMOFF;
	CurPWMNum=0;
    CurSpeed=1;
	CurMaxSpeed=speed;
	ChangeSpeedTimesOut=SpeedUpTime;
	StartPWMFlag=1;
	StopPWMFlag=0;
	OutPutPWMFlag=1;     
}

void StopPWM()		     //停止PWM
{
   ChangeSpeedTimesOut=SpeedDownTime;
   StartPWMFlag=0;
   StopPWMFlag=1;
}


//************************************
void Init()
{	EA=0;

	TMOD =0x21;
 

    TH0=RCAP2H_025ms;
    TL0=RCAP2L_025ms;
	ET0=1;
	TR0=1;

	T2MOD = 0x00;			//T2 is in 16 bit autoreload mode
	T2CON = 0x00;

	RCAP2L =RCAP2H_10ms;			//genereating interrupts on 10 ms|22.1184 MHz clock
	RCAP2H =RCAP2L_10ms;
	TL2 = RCAP2L;
	TH2 = RCAP2H;
	ET2 = 1;
	TR2 = 1;
	EA=1;


	PWM=PWMOFF;




}

void  Delayms(uint msNum)
{uint  i=0;
 uint  j=0;
 for(i=0;i<msNum;i++)
     { 
		for(j=0;j<112;j++) 
            ;
      }

}

main()
{

     Init();
	 //SpeedTozero();	  //************ 
	 StartPWM(5);     //例如启动PWM,速度为5
	 Delayms(5000);
	 StopPWM();
	 while(1);
}

⌨️ 快捷键说明

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