流水灯程序求助


求助 做一流水灯实验仿真,要求用C语言编程,请各位大侠帮忙解答,可以的话请将程序发到信箱xixixh@hotmail.com。谢谢
硬件前提:用51的P1口控制8个LED,1 点亮,0 熄灭。
(1)第1,3,5,7个灯半亮,其余的全亮。
(2)第1个亮1/4,第2个亮2/4第3个亮3/4,第4个全亮,第5个全亮,第6个亮3/4,第7个亮2/4,第8个1/4亮。
(3)所有的灯逐渐从暗到全亮(0->1/4->2/4->3/4->1),再由全亮到暗。
(4)8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。这才是真正流水灯。

搞了一天弄出来不知道这样行不行。定时器参数可能要调。只是在proteus上试了下,不怎么看的出效果。
忘各位大虾指教。
#include <reg51.h>
#define uchar unsigned char
main()
{
   uchar Count;
   TMOD=0x02;
   TH0=0xdf;
   TL0=0xdf;
   TR0=1;
   while(1)
   {
       uchar i,j,k;
       k=0;
       //第一个功能
       for(i=0;i<8;i++)
       {
          while(TF0==0);
          TF0=0;
          if(i<=4)
             {P1=0xFF;}
          else
             {P1=0x55;}
       }
       //第二个功能
      for(i=0;i<8;i++)
      {
          while(TF0==0);
          TF0=0;
          P1=0xFF<<i;
      }
      //第三个功能第一步
      for(i=0;i<8;i++)
         for(j=0;j<8;j++)
         {
             while(TF0==0);
             TF0=0;
             if(j<=i)
              {P1=0xFF;}
             else
              {P1=0x00;}
         }
  //第三个功能第二步
   for(i=0;i<8;i++)
         for(j=0;j<8;j++)
         {
             while(TF0==0);
             TF0=0;
             if(j<=i)
              {P1=0x00;}
             else
              {P1=0xFF;}
         }
       //第四个功能第一步
    for(k=0;k<8;k++)      
      for(i=0;i<8;i++)
          for(j=0;j<8;j++)
          {
              while(TF0==0);
              TF0=0;
              if(j<=i)
                {P1=0x01+2^k;}
              else
                {P1=0x00+(2^(k-1));}
          }
       //第四个功能第二步
    for(k=0;k<8;k++)      
      for(i=0;i<8;i++)
          for(j=0;j<8;j++)
          {
              while(TF0==0);
              TF0=0;
              if(j<=i)
                {P1=0x7F<<k;}
              else
                {P1=0xFF<<k;}
          }
   }
}

我也来说两句 查看全部回复

最新回复

  • budhy (2008-7-15 12:05:39)

    先问你所指的:亮1/4, 亮2/4,亮3/4, 全亮, 是什么意思?
  • xixixh (2008-7-15 13:00:58)

    你好  我的理解  亮1/4 2/4 这些 应该就是 由暗到亮递增的效果  所以我 想是不是由电压控制呢
  • budhy (2008-7-15 13:11:09)

    QUOTE:

    原帖由 xixixh 于 2008-7-15 13:00 发表
    你好  我的理解  亮1/4 2/4 这些 应该就是 由暗到亮递增的效果  所以我 想是不是由电压控制呢
    我也就是那么想。要是真那样的话,就要玩 PWM 了。不过楼主写的程序根本与 PWM 无关。

    还是等楼主的解答再说。
  • ybzjllj (2008-7-15 13:12:11)

    模拟PWM信号来控制.不知行不.可试之.                                                    .
  • panhearii (2008-7-15 14:48:12)

    定时器 串口 延迟都能用来(伪造)PWM 难度不一
    推荐用定时器做
    比如:
    uchar ucTime0=0,
    void vTimer0 interrupt 1
    {
    TR0=0;
    TH0=0XFF;TL0=0X00;
    ucTime0++;
    if(ucTime0==4){P1=0xff}
    else if(ucTime0==8){P1=0x00;ucTime0=0;}
    TR0=1;
    }
    以上为50%占空比
    12M晶振时 频率约为490HZ(12M/10/256/8)??8档PWM
    我猜是这样。。。
  • xixixh (2008-7-15 17:23:44)

    我如今 只能弄出来  单纯的亮 灭 的效果   可是找了很多资料 不知道如何实现 渐变的过程

    谢谢楼上 提醒

    我会继续努力的
  • budhy (2008-7-15 22:28:55)

    QUOTE:

    原帖由 xixixh 于 2008-7-15 17:23 发表
    我如今 只能弄出来  单纯的亮 灭 的效果   可是找了很多资料 不知道如何实现 渐变的过程

    谢谢楼上 提醒

    我会继续努力的
    楼主还没有答复我们的问题,亮1/4, 亮2/4,亮3/4, 全亮, 究竟是什么意思?
  • shilin (2008-7-19 11:21:31)

    hahaha 顶一下了!