找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

怎么只是最左边的LED闪烁?附单片机程序

查看数: 1059 | 评论数: 18 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2025-10-24 16:31

正文摘要:

各位论坛的大佬,又碰到问题了。电路图如下,就是想实现从左边开始的流水灯。代码也附上了,可是运行的时候就是只有最左边的LED闪烁,运行环境是proteus8.17sp4,麻烦大家看看原因出在哪里? #include <reg51 ...

回复

ID:619259 发表于 2025-10-29 23:42
suiwinder 发表于 2025-10-29 22:12
谢谢网友的回复。
这个代码在proteus 8.17 sp5上运行的时候,一个灯都不亮。

想要很快的解决问题,把你高傲的proteus 8.17 sp5工程文件和程序文件打包发上来吧。
ID:409878 发表于 2025-10-29 22:14
lkc8210 发表于 2025-10-27 10:26
请检查有没有生成Hex档
Proteus引用的Hex档是不是正确的

谢谢你的热心回复。
生成了hex文档的,proteus引用也是正确的。就是没有按预想的仿真结果出现。
ID:409878 发表于 2025-10-29 22:13
wannenggong 发表于 2025-10-27 21:37
用实验板测试验证以下代码可以实现流水显示,代码如下:

****

谢谢你的回复。
加入for循环是必要的。但是你这个代码和楼下的是一样的。
ID:409878 发表于 2025-10-29 22:12
谢谢网友的回复。
这个代码在proteus 8.17 sp5上运行的时候,一个灯都不亮。
ID:619259 发表于 2025-10-28 10:55
1.楼主的程序问题不大,跑马灯可以跑起来,只是高位灯不亮,只循环点亮7个灯,原因是程序行for( i = 7; i > 0; i -- )有问题,应改为for( i = 8; i > 0; i -- )。
2.程序可以化简,既然用了_crol_()函数,可以不用for循环,也不用定义循环边界,因为_crol_()函数已经内含循环机制,它跟左移运算符<<的运行结果是有区别的。主程序可简化为:
void main(void)
{
    P2=0xfe;
    while( 1 )
    {
                P2=_crol_(P2,1);
                delay1s(1);
    }
}
ID:281828 发表于 2025-10-27 21:37
用实验板测试验证以下代码可以实现流水显示,代码如下:

****
void main(void)


P6=0xfe;
    while(1)
    {
            delay_ms(250);
            P6 = _crol_(P6, 1);
    }

加入for循环效果不变,如果只是验证单向流水加for循环显然是没必要的,实现双向流水时各自加for循环就必要了。

ID:384109 发表于 2025-10-27 21:08
定义一个变量,这个变量进行移位,然后再把变量赋值给P2口
ID:1109793 发表于 2025-10-27 17:45
suiwinder 发表于 2025-10-27 13:31
你有好的办法吗?

先给端口直接赋值,看看那些指示灯能不能有对应的变化
ID:409878 发表于 2025-10-27 13:31
WL0123 发表于 2025-10-27 08:28
如果用的是沙发代码在楼主截图电路仿真,结果不是由左至右反复循环。只能是楼主太自信且不仔细。

你有好的办法吗?
ID:1109793 发表于 2025-10-27 11:55
WL0123 发表于 2025-10-27 08:28
如果用的是沙发代码在楼主截图电路仿真,结果不是由左至右反复循环。只能是楼主太自信且不仔细。

为啥不是反复循环?
楼主的意思是为啥输出的口没有按照代码改变吧,只有P2.7有变化,其他的脚没有。
ID:161164 发表于 2025-10-27 10:26
请检查有没有生成Hex档
Proteus引用的Hex档是不是正确的
ID:1133081 发表于 2025-10-27 08:28
suiwinder 发表于 2025-10-26 23:05
这个运行结果一样。

如果用的是沙发代码在楼主截图电路仿真,结果不是由左至右反复循环。只能是楼主太自信且不仔细。
ID:409878 发表于 2025-10-26 23:05
man1234567 发表于 2025-10-26 11:42
运行后显示的结果有什么不同么

问题照样没解决。
ID:409878 发表于 2025-10-26 23:05
WL0123 发表于 2025-10-24 19:53
#include
#include
#define u8 unsigned char

这个运行结果一样。
ID:409878 发表于 2025-10-26 23:04
undyme 发表于 2025-10-25 11:25
你在while(1)里面的P2 = _crol_( P2, 1 );已经做成了循环左移了,不用再在外面套一个for循环

不用for循环,就只会左移一次。
ID:584814 发表于 2025-10-26 11:42
undyme 发表于 2025-10-25 11:25
你在while(1)里面的P2 = _crol_( P2, 1 );已经做成了循环左移了,不用再在外面套一个for循环

运行后显示的结果有什么不同么
ID:1145592 发表于 2025-10-25 11:25
你在while(1)里面的P2 = _crol_( P2, 1 );已经做成了循环左移了,不用再在外面套一个for循环
ID:1133081 发表于 2025-10-24 19:53
#include <reg51.h>
#include <intrins.h>
#define u8 unsigned char

void delay1s( u8 x )
{
    u8 i, j, k;
    i = x;
    j = 120;
    k = 169;
    while( i )
    {
        while( j )
        {
            while( k )
            {
                ;
                k --;
            }
            k = 169;
            j --;
        }
        j = 120;
        i --;
    }
}

void main( void )
{
//        u8 i;
        P2 = 0xfe;
        while( 1 )
        {       
//                for( i = 7; i > 0; i -- )
//                {
                        delay1s( 1 );
//                        P2 = _crol_( P2, 1 );
                        P2 = _cror_( P2, 1 );
//                }
        }
}

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表