51单片机实现LED二极管亮度阶梯变化

时间:2021-09-03 19:44:20

说明:

    1、采用PWM调光实现该功能,周期为2.5ms,占空比有10个等级的变化,LED亮度也同样呈现10个等级

    2、开发板电路图参照郭天祥单片机电路

    3、流经LED的电流应不大于20mA,与LED串联的电阻采用270欧姆,而非1K,这样可使增加LED最大亮度

代码:

#include<reg52.h> 
char code table[]={
 0x06,0x5b,0x4f,
 0x66,0x6d,0x7d,0x07,
 0x7f,0x6f,0x77
};
unsigned int scale=1;   //控制占空比
sbit led1=P1^0;
sbit key1=P3^4;
sbit dula=P2^6;
sbit wela=P2^7;
unsigned int num=0;
void change();
void delay(int);
void main(void)       // 主程序
{
 TMOD=0x02;  //定时器0,工作模式2(0000,0010),8位定时模式
 TH0=0x06;   //写入预置初值6到定时器0,使250微秒溢出一次(12MHz)
 TL0=0x06;   //写入预置值
 EA=1;     //允许总中断
 ET0=1;    //允许定时器0中断
 TR0=1;    //启动定时器

 wela=1;
 P0=0xc0;
 wela=0;
 while(1){   
   change();
   dula=1;
   P0=table[scale-1];
   dula=0;
   delay(200);		  //避免按键时间过长而导致scale变化过快
   }
}
void timer0() interrupt 1    //定时器0中断服务程序
{
  num++;
  if(num==10){			 //num=10 	pwm周期为 250us x 10 即 2.5ms
    led1=0;
	num=0;
  }
  if(num==scale){
   led1=1;
  }
  
}
void change(){			 //用按键来改变占空比 scale
  if(key1==0){
		delay(100);
		if(key1==0){
			 scale++;
			 if(scale==10){
				   scale=1;
		}
  }
}
}
void delay(int xms){    //延时程序,用于键盘防抖动
 int i,j;
 for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
}