如何同时设置两个呼吸灯(第一个和最后一个)同时其余灯亮度依次递减。求指导

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/722939785866167.jpg "#left"
这个是一个呼吸灯的,如何改为问题中的指令请教一下各位


#include

#include "MacroAndConst.h"

sbit LED = P1^5;

#define LED_ON() LED = 0; //LED亮

#define LED_OFF() LED = 1; //LED灭

#define LED_PWM_LIMIT_MAX 99

#define LED_PWM_LIMIT_MIN 0

static u8 s_u8TimeCounter = 0; //中断计数

static u8 s_u8LedDirection = 0; //LED方向控制 0:渐亮 1:渐灭

static u8 s_u8LedPWMCounter = 0; //LED占空比

void Timer0Init(void)

{

AUXR |= 0x80; //定时器时钟1T模式

TMOD &= 0xF0; //设置定时器模式

TL0 = 0x5C; //设置定时初值

TH0 = 0xF7; //设置定时初值

TF0 = 0; //清除TF0标志

TR0 = 1; //定时器0开始计时

ET0 = 1; //使能定时器0中断

}

void Timer0Isr(void) interrupt 1

{

static int8 s_u8PWMCounter = 0;

TH0 = 0xF7; //定时器初始值(200us中断1次)

TL0 = 0x5C;

if(++s_u8TimeCounter >= 100) //每20ms调整一次LED占空比

{

s_u8TimeCounter = 0;

//如果是渐亮方向变化,则占空比递增

if((s_u8LedPWMCounter <= LED_PWM_LIMIT_MAX)&&(s_u8LedDirection == 0))

{

s_u8LedPWMCounter++;

if(s_u8LedPWMCounter > LED_PWM_LIMIT_MAX)

{

s_u8LedDirection = 1;

s_u8LedPWMCounter = LED_PWM_LIMIT_MAX;

}

}

//如果是渐灭方向变化,则占空比递减

if((s_u8LedPWMCounter > LED_PWM_LIMIT_MIN)&&(s_u8LedDirection == 1))

//此处有坑,若写成“>=”,则达不到预期效果

{

s_u8LedPWMCounter--;

if(s_u8LedPWMCounter <= LED_PWM_LIMIT_MIN)

{

s_u8LedDirection = 0;

s_u8LedPWMCounter = LED_PWM_LIMIT_MIN;

}

}

s_u8PWMCounter = s_u8LedPWMCounter; //获取LED的占空比

}

if(s_u8PWMCounter > 0) //占空比大于0,则点亮LED,否则熄灭

{

LED_ON();

s_u8PWMCounter--;

}

else

{

LED_OFF();

}

}

这是一个呼吸灯的程序,灯从最暗逐渐变亮,之后在逐渐变暗,循环往复。Proteus仿真已经通过。至于题主要求的其他功能,只需在上面修改就行。

#include "reg52.h"

sbit LedHuxi1=P1^0;

#define time (65536-1000) // 单次定时1ms
unsigned char T_High, T, ti, dir;


void InitTimer0(void)
{
  TMOD=0x01;
    TL0 = time;                     //initial timer1 low byte
    TH0 = time >> 8;                //initial timer1 high byte
    TR0 = 1;                        //timer1 start running
    ET0 = 1;                        //enable timer1 interrupt
    EA = 1;                         //open global interrupt switch
}
void Delay(void)
{
  unsigned char i,j;
    for(i=0;i<100;i++)
      for(j=0;j<255;j++)
            ;
}


void main(void)
{
  T_High=0; //高电平
    T=30;      //周期
    ti=0;
    dir=0;
  InitTimer0();
  while(1){
      Delay();
        if((T_High<T)&&(dir==0)) 
            T_High++;
        else if(T_High==T) {
          dir=1;
          T_High--;
        }
        else if((T_High>0)&&(dir==1))
        T_High--;
        else 
            dir=0;
    }

}

/* Timer0 interrupt routine */
void tm0_isr() interrupt 1
{
    TL0 = time;                    
    TH0 = time >> 8;               
    if(ti<T_High){
          LedHuxi1=1;
            ti++;
        }else if(ti<T){
          LedHuxi1=0;
            ti++;
        }else{
          ti=0;
        }
    
}

参考一下呢

首尾两个有了,你的代码是最大2000的循环,中间的要亮度依次递减,只需要亮灯阶段(要看你的电路是led正极接p2还是负极接P2)的时间依次递减就可以了

arduino 对多个led实现不同频率的呼吸灯
https://blog.csdn.net/weixin_43833645/article/details/121587608
如果还有其他问题,也可以发出来,我看到会回复得

没看懂题目,到底几个呼吸灯?