[51单片机] 求助一个流水灯程序问题

[复制链接]
4474|29
 楼主| herrible 发表于 2014-4-30 16:17 | 显示全部楼层 |阅读模式
本帖最后由 herrible 于 2014-4-30 16:19 编辑

程序要求:实现流水灯从左到右依次闪亮,再从右到左依次闪亮如此循环。
程序编写:
#include<reg52.h>
#include<intrins.h>
unsigned char a,c,d,x;
unsigned int b,e;
void delay(unsigned char);
void main()
{        
        e=0;
        a=0xfe;

        while(1)
         {        
             for(b=0,e=0;b<9;b++,e++)
                  {
                        P1=a;
                        delay(250);
                         a=_cror_(a,1);
                                 
                   }
                   for(e=9,b=9;e>0;e--,b--);
                      {
                              P1=a;
                              delay(250);
                                          a=_crol_(a,1);
                                             }

                        
                }                        
}
void delay(unsigned char x)
{
        for(c=5000;c>0;c--)
                for(d=x;d>0;d--);
}
编译后实际情况是从左到右正常,从右到左只闪亮了一个灯就又执行从左到右了。
soso 发表于 2014-4-30 16:29 | 显示全部楼层
这是代号、找本人才能明白。
wangch_sh 发表于 2014-4-30 16:38 | 显示全部楼层
a=_crol_(a,1);
执行的都一样啊!
 楼主| herrible 发表于 2014-4-30 16:58 | 显示全部楼层
wangch_sh 发表于 2014-4-30 16:38
a=_crol_(a,1);
执行的都一样啊!

一个是crol左移一位,一个cror右移啊,不知为什么左移正常,右移只进行一次
 楼主| herrible 发表于 2014-4-30 16:58 | 显示全部楼层
匿名者 发表于 2014-4-30 16:29
这是代号、找本人才能明白。

代码没什么吧,就是结果很郁闷
jxw82284134 发表于 2014-4-30 19:46 | 显示全部楼层
你得跳出左移的for循环才能执行右移的for循环
这是我写的程序,可以看看
  1. /********************************
  2. 功能:左右流水灯
  3. 晶振:11.0592MHz
  4. ********************************/
  5. #include<reg52.h>
  6. #include<intrins.h>
  7. #define uint unsigned int
  8. #define uchar unsigned char
  9. void delayms(uint);
  10. uchar aa,i;
  11. void main()
  12. {
  13.         aa=0xfe;
  14.         while(1)
  15.         {
  16.                 for(i=0;i<8;i++)
  17.                 {       
  18.                         P0=aa;
  19.                         delayms(500);
  20.                         aa=_crol_(aa,1);
  21.                         if (aa == 0x7f)         break;       
  22.                 }

  23.                 for(i=0;i<8;i++)
  24.                 {               
  25.                         P0=aa;
  26.                         delayms(500);
  27.                         aa=_cror_(aa,1);
  28.                          if (aa == 0xfe)         break;       
  29.                 }       
  30.         }
  31. }
  32. /***********延时程序***************/
  33. void delayms(uint xms)
  34. {
  35.         uint i,j;
  36.         for(i=xms;i>0;i--)
  37.                 for(j=110;j>0;j--);
  38. }

评分

参与人数 1威望 +2 收起 理由
herrible + 2 很给力!

查看全部评分

 楼主| herrible 发表于 2014-4-30 20:13 | 显示全部楼层
jxw82284134 发表于 2014-4-30 19:46
你得跳出左移的for循环才能执行右移的for循环
这是我写的程序,可以看看

当执行左移8次后e=0,不再满足e>0,程序跳出左移,因为在while里,又开始执行右移,感觉没问题,莫名了一天了,谢谢你的程序,对比程序我又学会了不少,我的代码多余了很多不必要的,但也纠结我到底错哪里了
天风立马 发表于 2014-4-30 20:56 | 显示全部楼层
你的程序表达的就是这个意思:编译后实际情况是从左到右正常,从右到左只闪亮了一个灯就又执行从左到右了。
天风立马 发表于 2014-4-30 20:58 | 显示全部楼层
你把你for循环的9改成8或者,0改成1.试试看吧。你循环的次数不是你想要的。你代码真心叼。
 楼主| herrible 发表于 2014-4-30 21:11 | 显示全部楼层
天风立马 发表于 2014-4-30 20:58
你把你for循环的9改成8或者,0改成1.试试看吧。你循环的次数不是你想要的。你代码真心叼。 ...

见笑了,我第二次写程序(大神凑合看),,我从7试到9,都不是,问题是它右移次数很正常,也就是右移循环很正常,但是每次左移只进行了一次,就又跳出了接着又是8次右移,为什么第右移正常,左移只能执行一次,郁闷良久
天风立马 发表于 2014-4-30 21:12 | 显示全部楼层
你知道为什么你的问题很简单却没人回答你吗?因为看一眼他们就跑了,第二眼蛋就疼了,最要命的是第三眼,关键我他妈竟然扛着蛋疼给看完了,就是因为我也曾在无助的时候希望有人帮助我,忍了很久才没说你。但是现在我还是没忍住要说你几句(就是前面的几句)。哈哈。好吧,牢骚发完了,鉴于想当初的经历,你有什么问题,可以问我,我会的一定会给你解答。

评分

参与人数 1威望 +2 收起 理由
herrible + 2 就您的这几句话我就很受鼓励

查看全部评分

 楼主| herrible 发表于 2014-4-30 21:14 | 显示全部楼层
天风立马 发表于 2014-4-30 20:56
你的程序表达的就是这个意思:编译后实际情况是从左到右正常,从右到左只闪亮了一个灯就又执行从左到右了。 ...

如您所说,就是从左到右正常,从右到左只闪亮一个灯就回去了,但是我想要从左到右,再从右到左,让您费心了啊,新手还没上路就各种问题啊
 楼主| herrible 发表于 2014-4-30 21:20 | 显示全部楼层
天风立马 发表于 2014-4-30 21:12
你知道为什么你的问题很简单却没人回答你吗?因为看一眼他们就跑了,第二眼蛋就疼了,最要命的是第三眼,关 ...

谢谢您的耐心,我也是厚着脸皮来问的(我做好的挨批的准备,谁让咱早先没好好学习,现在想踏实点从最笨的做起,接受一切批评),我从昨天写好后今天中午加下午一直在调它,实在没辙才来这边的,学长看了我的程序,他给我重写了一个(好看懂,比我的简洁,还对了),但是我想知道我错哪里了,我不甘心啊
天风立马 发表于 2014-4-30 21:39 | 显示全部楼层
8次右移是你自己想的。你的程序是9次。。。。你的变量c声明是unsigned char 却赋值5000,溢出了。自己查一查相关资料。
天风立马 发表于 2014-4-30 21:43 | 显示全部楼层
herrible 发表于 2014-4-30 21:20
谢谢您的耐心,我也是厚着脸皮来问的(我做好的挨批的准备,谁让咱早先没好好学习,现在想踏实点从最笨的 ...

对,就该这样。我不是批评你。你写这些程序时,想想,比如你的循环,你弄那么多变量没啥用,还显的乱。另外你这么个程序就用了8个data,DATA只有256个字节,省着点用,不过该用还是要用!不用就是浪费。哈哈。虽然可以扩展,扩展后的变味了。
 楼主| herrible 发表于 2014-4-30 21:49 | 显示全部楼层
天风立马 发表于 2014-4-30 21:39
8次右移是你自己想的。你的程序是9次。。。。你的变量c声明是unsigned char 却赋值5000,溢出了。自己查一 ...

额,我写的9,但是每次没执行左移前,先执行了b++,所以实际上是执行了1到8,,正好8次,c确实溢出了,我多次改动改的,本来c在int型里,我改回来了,这里只影响延时时间,实验结果还是没有改变:'(
 楼主| herrible 发表于 2014-4-30 21:57 | 显示全部楼层
天风立马 发表于 2014-4-30 21:43
对,就该这样。我不是批评你。你写这些程序时,想想,比如你的循环,你弄那么多变量没啥用,还显的乱。另 ...

学长给我写的程序就一个变量控制,不怕您笑话,我以为用俩才能控制它调到下一个循环(b、e一开始都是零,执行八次都为8,正好第二个for语句条件是b、e等于8跳进去,后来才知道程序会直接执行第二个for语句,当初因为这个想法废了好久才写出这个脑残的程序,哎,用俩变量就是小白的表现)
天风立马 发表于 2014-4-30 22:00 | 显示全部楼层
你的P1波形图。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

参与人数 1威望 +3 收起 理由
herrible + 3 很给力!

查看全部评分

 楼主| herrible 发表于 2014-4-30 22:08 | 显示全部楼层
天风立马 发表于 2014-4-30 22:00
你的P1波形图。

我不懂这个啊,要回寝室了,实验室要锁门(楼下大爷催得紧啊),明天在看您的回复,不好意思啊,没想到51还能用别的软件检测
天风立马 发表于 2014-4-30 22:09 | 显示全部楼层
herrible 发表于 2014-4-30 22:08
我不懂这个啊,要回寝室了,实验室要锁门(楼下大爷催得紧啊),明天在看您的回复,不好意思啊,没想到51 ...

呵呵。就是keil。去吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

55

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部