打印
[51单片机]

求助一个流水灯程序问题

[复制链接]
3563|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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右移啊,不知为什么左移正常,右移只进行一次

使用特权

评论回复
5
herrible|  楼主 | 2014-4-30 16:58 | 只看该作者
匿名者 发表于 2014-4-30 16:29
这是代号、找本人才能明白。

代码没什么吧,就是结果很郁闷

使用特权

评论回复
6
jxw82284134| | 2014-4-30 19:46 | 只看该作者
你得跳出左移的for循环才能执行右移的for循环
这是我写的程序,可以看看
/********************************
功能:左右流水灯
晶振:11.0592MHz
********************************/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delayms(uint);
uchar aa,i;
void main()
{
        aa=0xfe;
        while(1)
        {
                for(i=0;i<8;i++)
                {       
                        P0=aa;
                        delayms(500);
                        aa=_crol_(aa,1);
                        if (aa == 0x7f)         break;       
                }

                for(i=0;i<8;i++)
                {               
                        P0=aa;
                        delayms(500);
                        aa=_cror_(aa,1);
                         if (aa == 0xfe)         break;       
                }       
        }
}
/***********延时程序***************/
void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
herrible + 2 很给力!
7
herrible|  楼主 | 2014-4-30 20:13 | 只看该作者
jxw82284134 发表于 2014-4-30 19:46
你得跳出左移的for循环才能执行右移的for循环
这是我写的程序,可以看看

当执行左移8次后e=0,不再满足e>0,程序跳出左移,因为在while里,又开始执行右移,感觉没问题,莫名了一天了,谢谢你的程序,对比程序我又学会了不少,我的代码多余了很多不必要的,但也纠结我到底错哪里了

使用特权

评论回复
8
天风立马| | 2014-4-30 20:56 | 只看该作者
你的程序表达的就是这个意思:编译后实际情况是从左到右正常,从右到左只闪亮了一个灯就又执行从左到右了。

使用特权

评论回复
9
天风立马| | 2014-4-30 20:58 | 只看该作者
你把你for循环的9改成8或者,0改成1.试试看吧。你循环的次数不是你想要的。你代码真心叼。

使用特权

评论回复
10
herrible|  楼主 | 2014-4-30 21:11 | 只看该作者
天风立马 发表于 2014-4-30 20:58
你把你for循环的9改成8或者,0改成1.试试看吧。你循环的次数不是你想要的。你代码真心叼。 ...

见笑了,我第二次写程序(大神凑合看),,我从7试到9,都不是,问题是它右移次数很正常,也就是右移循环很正常,但是每次左移只进行了一次,就又跳出了接着又是8次右移,为什么第右移正常,左移只能执行一次,郁闷良久

使用特权

评论回复
11
天风立马| | 2014-4-30 21:12 | 只看该作者
你知道为什么你的问题很简单却没人回答你吗?因为看一眼他们就跑了,第二眼蛋就疼了,最要命的是第三眼,关键我他妈竟然扛着蛋疼给看完了,就是因为我也曾在无助的时候希望有人帮助我,忍了很久才没说你。但是现在我还是没忍住要说你几句(就是前面的几句)。哈哈。好吧,牢骚发完了,鉴于想当初的经历,你有什么问题,可以问我,我会的一定会给你解答。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
herrible + 2 就您的这几句话我就很受鼓励
12
herrible|  楼主 | 2014-4-30 21:14 | 只看该作者
天风立马 发表于 2014-4-30 20:56
你的程序表达的就是这个意思:编译后实际情况是从左到右正常,从右到左只闪亮了一个灯就又执行从左到右了。 ...

如您所说,就是从左到右正常,从右到左只闪亮一个灯就回去了,但是我想要从左到右,再从右到左,让您费心了啊,新手还没上路就各种问题啊

使用特权

评论回复
13
herrible|  楼主 | 2014-4-30 21:20 | 只看该作者
天风立马 发表于 2014-4-30 21:12
你知道为什么你的问题很简单却没人回答你吗?因为看一眼他们就跑了,第二眼蛋就疼了,最要命的是第三眼,关 ...

谢谢您的耐心,我也是厚着脸皮来问的(我做好的挨批的准备,谁让咱早先没好好学习,现在想踏实点从最笨的做起,接受一切批评),我从昨天写好后今天中午加下午一直在调它,实在没辙才来这边的,学长看了我的程序,他给我重写了一个(好看懂,比我的简洁,还对了),但是我想知道我错哪里了,我不甘心啊

使用特权

评论回复
14
天风立马| | 2014-4-30 21:39 | 只看该作者
8次右移是你自己想的。你的程序是9次。。。。你的变量c声明是unsigned char 却赋值5000,溢出了。自己查一查相关资料。

使用特权

评论回复
15
天风立马| | 2014-4-30 21:43 | 只看该作者
herrible 发表于 2014-4-30 21:20
谢谢您的耐心,我也是厚着脸皮来问的(我做好的挨批的准备,谁让咱早先没好好学习,现在想踏实点从最笨的 ...

对,就该这样。我不是批评你。你写这些程序时,想想,比如你的循环,你弄那么多变量没啥用,还显的乱。另外你这么个程序就用了8个data,DATA只有256个字节,省着点用,不过该用还是要用!不用就是浪费。哈哈。虽然可以扩展,扩展后的变味了。

使用特权

评论回复
16
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型里,我改回来了,这里只影响延时时间,实验结果还是没有改变:'(

使用特权

评论回复
17
herrible|  楼主 | 2014-4-30 21:57 | 只看该作者
天风立马 发表于 2014-4-30 21:43
对,就该这样。我不是批评你。你写这些程序时,想想,比如你的循环,你弄那么多变量没啥用,还显的乱。另 ...

学长给我写的程序就一个变量控制,不怕您笑话,我以为用俩才能控制它调到下一个循环(b、e一开始都是零,执行八次都为8,正好第二个for语句条件是b、e等于8跳进去,后来才知道程序会直接执行第二个for语句,当初因为这个想法废了好久才写出这个脑残的程序,哎,用俩变量就是小白的表现)

使用特权

评论回复
18
天风立马| | 2014-4-30 22:00 | 只看该作者
你的P1波形图。

QQ截图20140430215817.png (3.13 KB )

QQ截图20140430215817.png

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
herrible + 3 很给力!
19
herrible|  楼主 | 2014-4-30 22:08 | 只看该作者
天风立马 发表于 2014-4-30 22:00
你的P1波形图。

我不懂这个啊,要回寝室了,实验室要锁门(楼下大爷催得紧啊),明天在看您的回复,不好意思啊,没想到51还能用别的软件检测

使用特权

评论回复
20
天风立马| | 2014-4-30 22:09 | 只看该作者
herrible 发表于 2014-4-30 22:08
我不懂这个啊,要回寝室了,实验室要锁门(楼下大爷催得紧啊),明天在看您的回复,不好意思啊,没想到51 ...

呵呵。就是keil。去吧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

55

帖子

0

粉丝