当前位置: 代码迷 >> 单片机 >> 单片机控制3个LED灯渐亮渐灭解决办法
  详细解决方案

单片机控制3个LED灯渐亮渐灭解决办法

热度:122   发布时间:2016-04-28 15:05:07.0
单片机控制3个LED灯渐亮渐灭
要求这3个灯在同一时刻有一个灯最亮,有一个灯半亮,有一个灯不亮。现在我有控制一个灯渐亮渐灭的代码,怎么改成控制3个灯的?请老鸟指教一下
void slow()
{
 LED0=1;
 Delay(60000);        //特意加延时,可以看到熄灭的过程
 for(PWM1=1;PWM1<CYCLE;PWM1++)
 {

    LED0=0;    //点亮LED  
    Delay(PWM1);//延时长度,600次循环中从1加至599
    LED0=1;        //熄灭LED
       Delay(CYCLE-PWM1);//延时长度,600次循环中从599减至1
   }
       LED0=0;
 for(PWM1=CYCLE-1;PWM1>0;PWM1--){ //与逐渐变亮相反的过程

    LED0=0;
    Delay(PWM1);
    LED0=1;
       Delay(CYCLE-PWM1);
     
   }
   
 }
------解决方案--------------------
 Delay 函数占据了 cpu, 此原理不行,另想别法,比如用 pwm 功能, dac 功能。。。或硬件
------解决方案--------------------
如果非要在你这个程序上改


reentrant void slow(uchar cs)
{
  switch(cs)
  {
    case 0:LED0=1;break;
    case 1:LED1=1;break;
    case 2:LED2=1;break;
    default:break; 
  }
    Delay(60000); //特意加延时,可以看到熄灭的过程
  for(PWM1=1;PWM1<CYCLE;PWM1++)
  {

  switch(cs)
  {
    case 0:LED0=0;break;
    case 1:LED1=0;break;
    case 2:LED2=0;break;
    default:break; 
  } 
   Delay(PWM1);//延时长度,600次循环中从1加至599
  switch(cs)
  {
    case 0:LED0=1;break;
    case 1:LED1=1;break;
    case 2:LED2=1;break;
    default:break; 
  }
   Delay(CYCLE-PWM1);//延时长度,600次循环中从599减至1
   }
  switch(cs)
  {
    case 0:LED0=1;break;
    case 1:LED1=1;break;
    case 2:LED2=1;break;
    default:break; 
  }
  for(PWM1=CYCLE-1;PWM1>0;PWM1--){ //与逐渐变亮相反的过程

  switch(cs)
  {
    case 0:LED0=0;break;
    case 1:LED1=0;break;
    case 2:LED2=0;break;
    default:break; 
  }
   Delay(PWM1);
  switch(cs)
  {
    case 0:LED0=1;break;
    case 1:LED1=1;break;
    case 2:LED2=1;break;
    default:break; 
  }
   Delay(CYCLE-PWM1);
     
  }
     
 }


参考楼上的意见,你这么多延时是不对的
------解决方案--------------------
最邪恶的方法,肯定行  就是先点亮一个灯,然后用你原本的方法控制一个半亮的灯,最后不亮的无视  不就好了...别吐我,我是根据题意想到的....

还有你要同时控制,你可以写一个定时器吧.定的时间短点,然后做一个计数器,比如1-100  然后分别设置3个灯的计算值  比如常量就是100  不亮是1 半亮是50   然后在定时器内计数值为1的时候把灯全点上,然后分别到各自灯的计数值的时候,把灯灭了...由于时间很快 1的时候点亮,下面判断的时候立马又把灯灭了,所以不亮的那个灯是看不出亮过的....

还不行,你找我....
------解决方案--------------------
楼主你多动脑筋,这个用定时器可以实现,就是过程复杂点

[code=C/C++]
uchar bright[3]={0,0,100,};//3个灯的亮度0不亮,100:最亮
uchar tcnt=0

void main()
{
  uchar i;
  while(1)//主循环有3个阶段,1:LED2变暗,LED0变亮  2:LED0,LED1变亮 3:LED1变暗,LED2变亮 
  {
      for(i=0;i<100;i++)//1阶段
      {
        if(bright[0]<100)bright[0]++;//LED0变亮
        if(bright[2]>0)bright[2]--;//LED2变暗
        delay(x);//自己根据实际情况确定延时时间
      }
      for(i=0;i<100;i++)
      {
        if(bright[1]<100)bright[1]++;//LED1变亮
          if(bright[0]>0)bright[0]--;//LED0变暗
        delay(x);//自己根据实际情况确定延时时间
      }
      for(i=0;i<100;i++)
      {
        if(bright[2]<100)bright[2]++;//LED2变亮
          if(bright[1]>0)bright[1]--;//LED1变暗
        delay(x);//自己根据实际情况确定延时时间
      }
  }
}

//1ms定时,初始值你自己算
void timer0(void) interrupt x
{
   if(tcnt<99)tcnt++;else tcnt=0;
   if(bright[0]>tcnt)LED0_ON;//自己把LED0_ON #define 下
    else LED0_OFF;
  相关解决方案