PWM输出控制LED亮度
          
            时间:12-01 11:02 阅读:1631次
*温馨提示:点击图片可以放大观看高清大图
                
         
        
		  
               简介:这里给大家分享了一个PWM输出控制LED亮度的程序设计
               
                        
          
            #include <reg52.h>
#define uchar unsigned char 
#define uint unsigned int
#define LED P2 //定义LED端口
sbit k1=P3^5;
sbit k2=P3^4;
sbit k3=P3^3;
sbit k4=P3^2;
void k1d();
void k2d();
void k3d();
void k4d();
uchar scale;//用于保存占空比的输出0的时间份额,总共10份
//功能:延时1毫秒
//入口参数:x						
//出口参数:无
//说明:晶振为12M
void delay(uint x)
{
  uint i,j;
  for(i=0;i<x;i++)
    for(j=0;j<122;j++);
}
//1/1200秒定时器2中断
void Timer2(void) interrupt 5
{
 static uchar tt; //tt用来保存当前时间在一秒中的比例位置
 TF2=0;
 tt++;
 if(tt==10) //每1/120秒整开始输出低电平
  {
   tt=0;
   if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影
    LED=0;
  }
 if(scale==tt) //按照当前占空比切换输出高电平
  LED=0xff;
}
//主函数
void main(void) // 主程序
{
 delay(50);//等待系统稳定
 RCAP2H =0xFC; //赋T2的预置值,溢出1次是1/1200秒钟
 RCAP2L =0xE0;
 TR2=1; //启动定时器
 ET2=1; //打开定时器2中断
 EA=1; //打开总中断
 while(1) //程序循环
{
	k1d();
	k2d();
	k3d();
	k4d();
}
}
void k1d()
{
	if(!k1)
	{
		delay(20);
		if(!k1)
		{
			LED=1;
			scale=0;
			while(!k1);
		}
	}
}
void k2d()
{
	if(!k2)
	{
		delay(20);
		if(!k2)
		{
			scale--;
			if(scale==255)
				scale = 0;
			while(!k2);
			
		}
	}
}
void k3d()
{
	if(!k3)
	{
		delay(20);
		if(!k3)
		{
			scale++;
			if(scale==11)
				scale = 10;
			while(!k3);
			
		}
	}
}
void k4d()
{
	if(!k4)
	{
		delay(20);
		if(!k4)
		{
			LED=0;
			scale=10;
			while(!k4);
		}
	}
}