找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1057|回复: 18
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
各位论坛的大佬,又碰到问题了。电路图如下,就是想实现从左边开始的流水灯。代码也附上了,可是运行的时候就是只有最左边的LED闪烁,运行环境是proteus8.17sp4,麻烦大家看看原因出在哪里?
#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;
    while( 1 )
    {
        P2 = 0xfe;
        for( i = 7; i > 0; i -- )
        {
            delay1s( 1 );
            P2 = _crol_( P2, 1 );
        }
    }
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 );
//                }
        }
}
回复

使用道具 举报

板凳
ID:1145592 发表于 2025-10-25 11:25 | 只看该作者
你在while(1)里面的P2 = _crol_( P2, 1 );已经做成了循环左移了,不用再在外面套一个for循环
回复

使用道具 举报

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

运行后显示的结果有什么不同么
回复

使用道具 举报

5#
ID:409878 发表于 2025-10-26 23:04 | 只看该作者
undyme 发表于 2025-10-25 11:25
你在while(1)里面的P2 = _crol_( P2, 1 );已经做成了循环左移了,不用再在外面套一个for循环

不用for循环,就只会左移一次。
回复

使用道具 举报

6#
ID:409878 发表于 2025-10-26 23:05 | 只看该作者
WL0123 发表于 2025-10-24 19:53
#include
#include
#define u8 unsigned char

这个运行结果一样。
回复

使用道具 举报

7#
ID:409878 发表于 2025-10-26 23:05 | 只看该作者
man1234567 发表于 2025-10-26 11:42
运行后显示的结果有什么不同么

问题照样没解决。
回复

使用道具 举报

8#
ID:1133081 发表于 2025-10-27 08:28 | 只看该作者
suiwinder 发表于 2025-10-26 23:05
这个运行结果一样。

如果用的是沙发代码在楼主截图电路仿真,结果不是由左至右反复循环。只能是楼主太自信且不仔细。
回复

使用道具 举报

9#
ID:161164 发表于 2025-10-27 10:26 | 只看该作者
请检查有没有生成Hex档
Proteus引用的Hex档是不是正确的
回复

使用道具 举报

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

为啥不是反复循环?
楼主的意思是为啥输出的口没有按照代码改变吧,只有P2.7有变化,其他的脚没有。
回复

使用道具 举报

11#
ID:409878 发表于 2025-10-27 13:31 | 只看该作者
WL0123 发表于 2025-10-27 08:28
如果用的是沙发代码在楼主截图电路仿真,结果不是由左至右反复循环。只能是楼主太自信且不仔细。

你有好的办法吗?
回复

使用道具 举报

12#
ID:1109793 发表于 2025-10-27 17:45 | 只看该作者
suiwinder 发表于 2025-10-27 13:31
你有好的办法吗?

先给端口直接赋值,看看那些指示灯能不能有对应的变化
回复

使用道具 举报

13#
ID:384109 发表于 2025-10-27 21:08 | 只看该作者
定义一个变量,这个变量进行移位,然后再把变量赋值给P2口
回复

使用道具 举报

14#
ID:281828 发表于 2025-10-27 21:37 | 只看该作者
用实验板测试验证以下代码可以实现流水显示,代码如下:

****
void main(void)


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

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

回复

使用道具 举报

15#
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);
    }
}
回复

使用道具 举报

16#
ID:409878 发表于 2025-10-29 22:12 | 只看该作者
谢谢网友的回复。
这个代码在proteus 8.17 sp5上运行的时候,一个灯都不亮。
回复

使用道具 举报

17#
ID:409878 发表于 2025-10-29 22:13 | 只看该作者
wannenggong 发表于 2025-10-27 21:37
用实验板测试验证以下代码可以实现流水显示,代码如下:

****

谢谢你的回复。
加入for循环是必要的。但是你这个代码和楼下的是一样的。
回复

使用道具 举报

18#
ID:409878 发表于 2025-10-29 22:14 | 只看该作者
lkc8210 发表于 2025-10-27 10:26
请检查有没有生成Hex档
Proteus引用的Hex档是不是正确的

谢谢你的热心回复。
生成了hex文档的,proteus引用也是正确的。就是没有按预想的仿真结果出现。
回复

使用道具 举报

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

想要很快的解决问题,把你高傲的proteus 8.17 sp5工程文件和程序文件打包发上来吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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