89C51实现LED灯渐亮渐灭
:IT学习乐园
:Builder
:20220927
:252

电流、负载不变的情况下,调整电压,实际上电流也在不断的变化;也可以通过输出脉冲信号,调整占空比来控制亮度。  

#include <REG52.H>
#define LED P1
#define LED_ON() LED=0x00;
#define LED_OFF() LED=0xFF;
#define LED_PWM_LIMIT_MAX 99
#define LED_PWM_LIMIT_MIN 0
static unsigned int s_u8TimeCounter = 0 ; //中断计数
static unsigned int s_u8LedDirection = 0 ; //LED方向控制 0 :渐亮 1 :渐灭
static int  s_s8LedPWMCounter  = 0 ; //LED占空比
void Timer0Init(void){
 TMOD &=0xF0;
 TMOD |=0x01;
 TH0=0xFF;
 TL0=0x47;
 TR0=1;
 ET0=1;
}
void Time0Isr(void) interrupt 1
{     
    static int s_s8PWMCounter = 0  ;
    TH0=0xFF;           //定时器重新赋初值
    TL0=0x47 ;
    if(++s_u8TimeCounter >= 100) //每20MS调整一下LED的占空比
    {
      s_u8TimeCounter = 0 ;
      //如果是渐亮方向变化,则占空比递增                  
  if((s_s8LedPWMCounter <= LED_PWM_LIMIT_MAX) &&(0 ==s_u8LedDirection))
         {
            s_s8LedPWMCounter++  ;
        if(s_s8LedPWMCounter > LED_PWM_LIMIT_MAX)
            {
              s_u8LedDirection = 1 ;
              s_s8LedPWMCounter =  LED_PWM_LIMIT_MAX ;             
             }            
         }
         //如果是渐暗方向变化,则占空比递渐
        if((s_s8LedPWMCounter >= LED_PWM_LIMIT_MIN) &&(1 ==s_u8LedDirection))
         {
       s_s8LedPWMCounter-- ;
             if(s_s8LedPWMCounter < LED_PWM_LIMIT_MIN)
             {
      s_u8LedDirection = 0 ;
      s_s8LedPWMCounter =  LED_PWM_LIMIT_MIN ;             
              }    
    }
    s_s8PWMCounter = s_s8LedPWMCounter ;  //获取LED的占空比
    }
    if(s_s8PWMCounter > 0) //占空比大于0,则点亮LED,否则熄灭LED
    {
      LED_ON() ;
      s_s8PWMCounter-- ;
    }
    else
    {
      LED_OFF();    
    }
}

 void main(void){
 Timer0Init();
 EA=1;
 while(1);
 }



华为内容分发网络
华为内容分发网络

CDN全时包,客户可享受0点到18点期间流量免费.综合价...

立刻前往...
域名建站专场
域名建站专场

域名建站专场:域名1元起,免费云解析,一站式建站,买3年...

立刻前往...
阿里对象存储OSS
阿里对象存储OSS

个人新用户免费试用3个月;企业新用户免费试用3个月!...

立刻前往...
企业上云钜惠
企业上云钜惠

多款刚需产品,满足企业通用场景需求,云服务器2.5折起...

立刻前往...