各位老师:
    我准备做一个大约20米长、200个红色发光二极管组成的流水灯(按一定的速度流水点亮),用89C51单片机怎么做呀?有C程序的源码吗?急用!!谢谢!

解决方案 »

  1.   

    200个LED灯,需要200个输出点呢。
      

  2.   

    200个LED,同时点亮的有几个?这么说吧,不可能是同时只有一个灯亮,然后从1到200流.要达到有方向性的流水效果,至少只需要3个LED一组即可,70个一串,共三串,再加个CD4017做流水驱动,以及LED部分的恒流源就可以了,单片机都不同.....
      

  3.   

    每次只点亮一个LED,200个灯作流水控制
      

  4.   

    这需求真变态.那就用CPLD扩展IO,比如epm1270f256,电路也简单.
      

  5.   

        一个51单片机一般有4组8位I/O,用矩阵排列线路,再用数码管的刷屏方式输出,16*16=256个,也就是说一个单片机用矩阵刷屏法可以控制256个LED。当然,如果你的不是LED,比如是那种光管,器件的点亮与熄灭速度没那么快,那就不能用这种矩阵刷屏法工作。
        对于这种情况,有两种方案,第一种是扩展I/O口,以二进制方式输出信号,当符合8位或16位之后,目标I/O整体变化输出。第二种就是多弄几个单片机,然后分为主控和被控,单片机之间可用串口或SPI方式通讯,按照具体自己定义的规则工作。
        其实在控制或程序上,无论那种方式都不算难,但考虑到功率和器件特性,可能就要有针对性的处理,比如LED,就用达林顿管用共阴的方式就很好解决,但如果是别的东西,可能要用到MOS管或专门的驱动模块来控制,电压电流的不同,器件的选型控制都不同,对于弱电控制上,51单片机是比较合适的,但对于非通信运用的控制领域,PLC 相对来说用的人比较多。所以,做一个硬件项目,很多细节上的不同,采用的方案可能截然不同,这点上硬件与软件是有天壤之别的。
      

  6.   


    1、用一个单片机,一位输出口,软件实现串行输出,再有几位控制用(比如锁存信号、移位信号等)所以
         C2051就够了
    2、分配一块儿存储区,把亮灯模式(待循环输出数据DN)存进去。比如:每间隔7个灯亮一个,D=00000001B
       间隔四个灯亮一个 D=00010001B,每隔15个灯亮一个 D1=00000000B  D2=00000001B 以此类推。
    3、编一个软件定时,通过改变定时数控制灯的流速。
    4、硬件支持:做一个200位的移位寄存器(8位的链接起来,要带所存的),驱动LED灯。
           注:只靠单片机,没有任何硬件支持,恐怕不太好办。
      把亮灯模式DN循环串出就可以了。用汇编就行了,不必C.细节问题就不赘述了。
      不一定对,供参考。
      

  7.   

    额……记得结贴给分
    If 本楼给分 Then
        楼主木有小jj
    End If
      

  8.   

    #include<reg52.h>
    #include <intrins.h>
    #define uint unsigned int 
    #define uchar unsigned char 
    uchar temp,num,num1;
    sbit beep=P2^3;
    void delay(uint);void main()
    {

            temp=0xfe;
    while(1)
    {
    for(num1=0;num1<3;num1++)
    {
    for(num=0;num<8;num++)
    {
    P1=temp;
    beep=0;
    delay(100);
    temp=_crol_(temp,1);
    P1=0xff;
    beep=1;
    delay(100);
    }
    }
    for(num1=0;num1<3;num1++)
    {
    for(num=0;num<8;num++)
    {
    P1=temp;
    beep=0;
    delay(100);
    temp=_cror_(temp,1);
    P1=0xff;
    beep=1;
    delay(100);
    }
    }
    while(1);
    }
    }void delay(uint z)
    {
    uint x,y;
    for(x=z;x>0;x--)
    for(y=110;y>0;y--);
    }