89C51实现LED灯渐亮渐灭
:IT学习乐园
:Builder
:20240425
: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元起,免费云解析,一站式建站,买3年...

立刻前往...
华为云容器引擎
华为云容器引擎

提供高可靠性的企业级容器应用管理服务,支持K8应用工具....

立刻前往...
注册认证上云抽好礼
注册认证上云抽好礼

汇聚全站年度销量TOP云产品,每天上午9点限量秒杀,优惠...

立刻前往...
阿里ECS新春特惠
阿里ECS新春特惠

2022年2月20日期前,您点击链接,并完成实名认证,即...

立刻前往...