微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 遇到一道流水灯问题,大神请进,谢谢了

遇到一道流水灯问题,大神请进,谢谢了

时间:10-02 整理:3721RD 点击:

  1. 题目是第一次一个灯流动一次,第二次两个灯流动,依次到8个灯,时间间隔为300ms。我写出的程序第3次开始灯的显示就有问题。大神帮忙改下,谢谢了。

复制代码


#include<reg52.h>
#include<intrins.h>
void delay(int x)
{
        int i,j;
        for(i=110;i>=0;i--)
                for(j=x;j>=0;j--);
}
void main()
{
       
        int a,b;
        while(1)
        {
                a=0xfe;
                for(b=1;b<8;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(300);
                }
                delay(300);
                a=0xfc;
                for(b=1;b<7;b++)
                {
                P1=a;
                a=_crol_(b,1);
                delay(300);
                }
                delay(300);
                a=0xf8;
                for(b=1;b<6;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(300);
                }
                delay(300);
                a=0xf0;
                for(b=1;b<5;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(300);
                }
                delay(300);
                a=0xe0;
                for(b=1;b<4;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(300);
                }
                delay(300);
                a=0xc0;
                for(b=1;b<4;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(300);
                }
                delay(300);
                a=0x80;
                for(b=1;b<3;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(300);
                }
                delay(300);
                a=0x00;
                P1=a;
                delay(300);
        }
}

谢谢,你的是8种灯亮的情况都写出来,有没有简单一些的

试试直接for循环。我先看看,然后发给你

看不见你发的程序

#include<reg51.h>
#include<intrins.h>
#include<math.h>
void Delay(unsigned int c);
void main()
{
        int a,b;
        while(1)
        {
                P0=0x01;
                for(b=8;b>0;b--)
                {
                        for(a=8;a>0;a--)
                        {
                                Delay(3);
                                P0=_crol_(P0,1);
                        }
                P0=P0+pow(2,8-b);
                }
        }
}
void Delay(unsigned int c)
{
        int a,b;
        for(;c>0;c--)
        {
                for(a=123;a>0;a--)
                {
                        for(b=100;b>0;b--);
                }
        }
}

顶一贴,我是新手,感觉对啊,我的开发板坏了,等我试试哈

不好意思,第一次发的程序有误,这是正确的,亲测无误。

#include<reg52.h>
#include<intrins.h>
void delay(int x)
{
        int i,j;
        for(i=110;i>=0;i--)
                for(j=x;j>=0;j--);
}
void main()
{
        
        int a,b;
        while(1)
        {
                a=0xfe;
                for(b=0;b<8;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xfc;
                for(b=0;b<7;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xf8;
                for(b=0;b<6;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xf0;
                for(b=0;b<5;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xe0;
                for(b=0;b<4;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xc0;
                for(b=0;b<3;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0x80;
                for(b=0;b<2;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                P1=0;
                delay(100);
        }
}

不好意思,第一次发的程序有误,这是正确的,亲测无误。

#include<reg52.h>
#include<intrins.h>
void delay(int x)
{
        int i,j;
        for(i=110;i>=0;i--)
                for(j=x;j>=0;j--);
}
void main()
{
        
        int a,b;
        while(1)
        {
                a=0xfe;
                for(b=0;b<8;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xfc;
                for(b=0;b<7;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xf8;
                for(b=0;b<6;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xf0;
                for(b=0;b<5;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xe0;
                for(b=0;b<4;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xc0;
                for(b=0;b<3;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0x80;
                for(b=0;b<2;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                P1=0;
                delay(100);
        }
}

不好意思,第一次发的程序有误,这是正确的,亲测无误。

#include<reg52.h>
#include<intrins.h>
void delay(int x)
{
        int i,j;
        for(i=110;i>=0;i--)
                for(j=x;j>=0;j--);
}
void main()
{
        
        int a,b;
        while(1)
        {
                a=0xfe;
                for(b=0;b<8;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xfc;
                for(b=0;b<7;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xf8;
                for(b=0;b<6;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xf0;
                for(b=0;b<5;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xe0;
                for(b=0;b<4;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0xc0;
                for(b=0;b<3;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                a=0x80;
                for(b=0;b<2;b++)
                {
                P1=a;
                a=_crol_(a,1);
                delay(100);
                }
                delay(100);
                P1=0;
                delay(100);
        }
}

这个应该满足你的要求,前提是将硬件设置好
#include<reg52.h>
void delay();
void main()
{
        P0 = 0xFF;                               //此行可不要,是我的习惯
        while(1)
        {
                unsigned char i, j;
                unsigned char shift;                  //设定临时变量,通过改变变量值为P0口赋值
                for(i=1; i<9; i++)
                {
                        j = i;
                        shift = 0x01;
                        while(j--)
                        {
                                P0 = ~shift;
                                shift = shift << 1;
                                delay();
                        }       
                }       
        }                                          
}
void delay()      //时间自己确定改变i的值即可
{
        unsigned int i;
        for(i=0; i<35000; i++);
}

不好意思,可能是我没表达清楚,第一次只有一个灯在流动,第二次两个灯一起流动,以此类推。还是谢谢你的回答,有兴趣的话就继续帮想下这题怎么做。

本人亲测,符合你的要求。
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code dat[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
void Delayms(uint n)
{
        uint i,j;
        for(i=n;i>0;i--)
                for(j=115;j>0;j--);
}
void main()
{
        uchar a,b,c;
        while(1)
        {
                for(a=0;a<7;a++)
                {
                        c=dat[a];
                        for(b=8-a;b>0;b--)
                        {
                                P0=c;
                                Delayms(300);
                                c=_crol_(c,1);
                        }
                }
                a=4;
                while(a--)
                {
                        P0=0x00;
                        Delayms(300);
                        P0=~P0;
                        Delayms(300);
                }
        }
}

我的板子是低电平点亮,如果你的是高电平点亮的话,就将数组改为以下数据:
uchar code dat[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};

赤焰火狐正解,我的板子没问题

已经学知识感谢

已经学知识感谢

谢谢,正解!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top