89C51实现LED灯渐亮渐灭
:IT学习乐园
:Builder
:20240420
:1K+

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

#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);
 }



阿里新人特惠专享
阿里新人特惠专享

新用户首购1元起,精选云服务器ECS 1核2G n4 9...

立刻前往...
阿里飞天加速计划
阿里飞天加速计划

高校学生免费领用ECS 2.5个月! 助力开发者全生命周...

立刻前往...
腾讯云限时秒杀
腾讯云限时秒杀

热门云产品首单特惠秒杀,1核2G云服务器首年38元。...

立刻前往...
新用户专属大礼包
新用户专属大礼包

新客户无门槛领取总价值高达2860元代金券,先到先得。...

立刻前往...