51_PWM_呼吸灯

 

 /**********************51单片机学习例程************************
*  平台:Keil U4 + STC89C52
*  名称:定时器0,方式2,输出PWM,周期2000us占空比每120ms改变5%,控制呼吸灯
*  编写:Tony
*  日期:2022-1-27
*   QQ : 674749794
*  晶体:12MHZ
*	 变更记录:无
******************************************************************/

#include <reg52.h>
unsigned char ZHOUQI_COUNT;    //进入中断的次数,满一个周期清零,计20次,周期2ms
unsigned char PWM_VALUE;       //当前高电平对应的定时次数 
unsigned int UPDATA_COUNT;     //占空比更新时间,计1200次,120ms更新一次占空比
bit direc_flag;				   //占空比更新方向,0增加,1减少
sbit led= P1^0;					  
void Timer0_Init();		   
/********************************************
定时器0初始化函数,8位定时器,0.1ms溢出一次,开启中断
********************************************/
void Timer0_Init()
{
    TMOD=0x02;  //模式设置,0b0000 0010,定时器0,工作模式2,8位定时器	  (M1=1,M0=0)
	ET0=1;    	//开启定时器0中断
	TH0=0x9c;	//0.1ms溢出
	TL0=0x9c;	//
	EA=1;		//开启总中断
	TR0=1;		//使能定时器0
}




void main()
{
    UPDATA_COUNT=0;
	ZHOUQI_COUNT=0;
	PWM_VALUE=10;
	direc_flag=0;
   	led=0;
	Timer0_Init();
	while(1);
}

void Timer0_In() interrupt 1
{
  	
	ZHOUQI_COUNT++;	//计数加1
	UPDATA_COUNT++;

	if(ZHOUQI_COUNT==PWM_VALUE) 	//判断是否到点亮led的时候
	   led=1;//亮led
    if(ZHOUQI_COUNT==20)//当前周期结束
	{
	   ZHOUQI_COUNT=0; //重新计时
	   led=0;			//熄灭led
	}
	if(UPDATA_COUNT==1200&&(direc_flag==0))	 //120ms
	{
	   UPDATA_COUNT=0;
	   PWM_VALUE++;			//占空比增加5%
	   if(PWM_VALUE==19)
	   {
	      direc_flag=1;		//占空比方向改变
	   }
	   
	}
	if(UPDATA_COUNT==1200&&(direc_flag==1)) 
     { 
	   UPDATA_COUNT=0;
	   PWM_VALUE--;			//占空比减少5%
	   if(PWM_VALUE==1)
	   {
	      direc_flag=0;
	   }
	 }
}

  

 

posted @ 2022-01-27 20:56  xiaoberber  阅读(153)  评论(0编辑  收藏  举报