找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于51单片机流水灯左移问题求解

  [复制链接]
跳转到指定楼层
楼主
ID:122090 发表于 2016-5-20 00:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
while(1)
        {
          // P1=0xfe;
           for(i=0;i<8;i++)
           {         
                        P1=0xfe; /* 在这里对P1初始化 达不到预期效果 */
                        delay(200);
                        P1=_cror_(P1,1);
           }
        
        }

我是这样想的,首先给第一位灯点亮,延时200ms,然后再进行循环左移。

我在for循环初始化话P1的话,只会一直点亮第一位灯,并不会循环左移。一直进入了死循环。

而当我在while里面初始化的话,就能实现,请问为什么?

不知道在哪里想不明白,求指点 谢谢!

评分

参与人数 1黑币 +5 收起 理由
夏雨天 + 5 虚心求教

查看全部评分

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

使用道具 举报

沙发
ID:97438 发表于 2016-5-20 08:37 | 只看该作者
P1=0xfe; /* 在这里对P1初始化 达不到预期效果 */这个不要在循环里面初始化
P1=_cror_(P1,1);
这后面再加个延时。。。就完事了
回复

使用道具 举报

板凳
ID:7485 发表于 2016-5-20 10:01 | 只看该作者
本帖最后由 ahshmj 于 2016-5-20 10:03 编辑

           // P1=0xfe;                         这一句在这里是对的
           for(i=0;i<8;i++)
           {         
                        P1=0xfe; /* 在这里对P1初始化 达不到预期效果 */ 这一句放这里不合适。
                        delay(200);
                        P1=_cror_(P1,1);
           }
        
        }
回复

使用道具 举报

地板
ID:122122 发表于 2016-5-20 10:06 | 只看该作者
P1=0xfe只需要初始化一次,你放在for循环里面那么每次进去都会从第一位执行,是没有意义的,放在while里面就可以
回复

使用道具 举报

5#
ID:7485 发表于 2016-5-20 10:22 | 只看该作者
在for里面每循环一次都先把P1初始,当然不行了。
回复

使用道具 举报

6#
ID:97948 发表于 2016-5-20 10:25 | 只看该作者
编程思想是这个样子的:先初始化led,后右移动led灯;
回复

使用道具 举报

7#
ID:122090 发表于 2016-5-20 10:30 | 只看该作者
jzy294061282 发表于 2016-5-20 10:06
P1=0xfe只需要初始化一次,你放在for循环里面那么每次进去都会从第一位执行,是没有意义的,放在while里面 ...

我好像明白了,谢谢。
回复

使用道具 举报

8#
ID:92781 发表于 2016-5-20 13:36 | 只看该作者
你两次的程序的处理是这样的
1、在while循环里面,for循环外面 :进入while循环初始化--for循环移位8次--while循环初始化,这是正确的
2、在for循环里面:进入while循环--进入for循环--(初始化--移位1次--初始化--移位1次**共8次)--while循环
在第一种情况里面每个while循环中,for循环移位8次,所以能看到八个灯流动,第二种里面,for循环移位1次后就被初始化,每次都是第一个灯和第二个灯交替闪烁,因为延时的原因,你看到的情况应该是第一个灯几乎常亮但是有闪烁,第二个灯一闪即逝。
回复

使用道具 举报

9#
ID:122201 发表于 2016-5-20 17:08 | 只看该作者
for里面每次都把P1初始
回复

使用道具 举报

10#
ID:122207 发表于 2016-5-20 17:32 | 只看该作者
循环每次执行,你如果在里面初始化,则每次都会初始化。应该在循环外初始化
回复

使用道具 举报

11#
ID:121495 发表于 2016-5-21 13:05 | 只看该作者
这个简单啊
回复

使用道具 举报

12#
ID:122489 发表于 2016-5-22 00:55 | 只看该作者
在for循环里面的话,每次P1都回到0xfe,只点亮P1^1,因为时间短暂,你不会看到P2^2点亮,可以试加delay应该会看到P1^2亮一会。while循环会等for循环结束重新开始,所以就能看到
回复

使用道具 举报

13#
ID:122730 发表于 2016-5-23 10:21 | 只看该作者
这玩意百度上大把。。。
回复

使用道具 举报

14#
ID:110895 发表于 2016-6-25 17:55 | 只看该作者
每次左移前都初始化是不对的。
回复

使用道具 举报

15#
ID:127819 发表于 2016-6-26 08:22 | 只看该作者
你得再加个延时才可以吧
回复

使用道具 举报

16#
ID:128148 发表于 2016-6-26 10:31 | 只看该作者
本帖最后由 www2476742 于 2016-6-26 10:35 编辑

那是肯定的啦,在for循环里面,刚要循环左移时,就立即初始化了,所以你一直在循环初始化。所以一直亮第一位灯,跟点亮一个小灯没什么区别。而在while循坏里面,只循坏初始化一次。然后开始进入for循坏,进行7位移位。
回复

使用道具 举报

17#
ID:128018 发表于 2016-6-26 11:44 | 只看该作者
每次进入循环p1的值都是oxfe,你应该把for里面的第一行代码删除了,应该就对了
回复

使用道具 举报

18#
ID:111634 发表于 2016-7-4 14:55 | 只看该作者
夏雨天这个名字取得满好听的,人一定很聪明,特别在天下雨时。但是别老是下雨,别人会受不了。这两天长江发大水变成灾难了。
回复

使用道具 举报

19#
ID:129167 发表于 2016-7-4 15:05 | 只看该作者
u8 i;for(i=0;i<7;i++){P1=(1<<i);}
回复

使用道具 举报

20#
ID:129213 发表于 2016-7-4 19:36 | 只看该作者
MAIN:MOV  A,#0FEH LOOP:MOV  P0,A LCALL  DEL_1S RL  A SJMP  LOOP DEL_1S:MOV  R5,#20             D2:MOV  R6,#200             D1:MOV  R7,#123 DJNZ  R7,$  DJNZ  R6,D1 DJNZ  R5,D2 RET  END
回复

使用道具 举报

21#
ID:129213 发表于 2016-7-4 19:38 | 只看该作者
试试这个程序,一个灯循环亮。
MAIN:MOV  A,#0FEH
LOOP:MOV  P0,A
LCALL  DEL_1S
RL  A
SJMP  LOOP
DEL_1S:MOV  R5,#20
            D2:MOV  R6,#200
            D1:MOV  R7,#123
DJNZ  R7,$
DJNZ  R6,D1
DJNZ  R5,D2
RET
END
回复

使用道具 举报

22#
ID:129825 发表于 2016-7-26 16:25 | 只看该作者
缺少延时程序
回复

使用道具 举报

23#
ID:126072 发表于 2016-7-28 10:33 | 只看该作者
改改程序
回复

使用道具 举报

24#
ID:135316 发表于 2016-7-28 10:39 | 只看该作者
删掉这段就好了 P1=0xfe; /* 在这里对P1初始化 达不到预期效果 */
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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