C51单片机LED流水灯显示问题

本人初学C51单片机,在实现流水灯效果时,首先使用如下程序进行控制:

#include <reg52.h>
unsigned int a;
void main()
{
    while(1)
    {
        int i=1;
        while (i<=256)
        {
            P1=~i;
            a=50000;
            while (a--);
            i*=2;
        }
    }
}

发现当最下方第8个LED灯亮后,经短暂延迟后最上方第1个LED才点亮。而若使用以下程序:

#include <reg52.h>
unsigned int a;
void main()
{
    while(1)
    {
        int i=1,n=1;
        while (n<=8)
        {
            P1=~i;
            a=50000;
            while (a--);
            i*=2;
            n++;
        }
    }
}

则无此现象,能正常实现LED循环点亮。按本人粗浅的认识,两个程序运行的效果应该不足以造成肉眼能分辨的差异,其中原因请大家多多指教。

1\2\4\8\16\32\64\128这样是8次去分析就知道,当128延时后应该怎么处理和造成的现象就知道了.

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: C51单片机之LED点亮+流水灯【01】中的 3.LED闪烁 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    利用软件延时自动生成相应的延时函数,注意要选好符合当前单片机的指令集。
    在这里插入图片描述

    #include <REGX52.H>
    #include <INTRINS.H> // 包含nop函数
    void Delay500ms() //@11.0592MHz
    {
        unsigned char i, j, k;
    
        _nop_();
        i = 4;
        j = 129;
        k = 119;
        do
        {
            do
            {
                while (--k)
                    ;
            } while (--j);
        } while (--i);
    }
    
    void test2()
    {
        while (1)
        {
            P2 = 0xFE;
            Delay500ms();
            P2 = 0xFF;
            Delay500ms();
        }
    }
    void main()
    {
        test2();
    }
    

    🐱🐱🐱

  • 以下回答来自chatgpt:

    根据参考资料提供的LED点阵屏介绍和代码,可以看出问题出在 _74HC595_WriteByte 函数中。具体来说,该函数在写入字节时,是从高位(第7位)到低位(第0位)依次写入的。因此当最下方第8个LED灯亮起后,需要等待8个时钟才能写入第1位,即最上方的LED才能点亮,因此出现了延迟现象。

    为了优化这一问题,可以考虑改变 _74HC595_WriteByte 函数的写入顺序,从低位到高位依次写入。修改后的代码如下:

    void _74HC595_WriteByte(unsigned char Byte)
    {
        unsigned char i;
        for(i = 0; i < 8; i++)
        {
            SER = Byte & (0x01 << i);
            SCK = 1;
            SCK = 0;
        }
        RCK = 1;
        RCK = 0;
    }
    

    这样修改后,可以保证在写入第1位时,不需要等待前面的位都被写入完毕,从而解决延迟问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^