问答

汇集网友智慧,解决技术难题

21ic问答首页 - 点亮流水灯只能用延时函数吗?

嵌入式stc89c51 函数 流水灯 TE FOR unsigned

点亮流水灯只能用延时函数吗?

LM料穆2021-09-14
本人用delay函数可以成功完成流水灯,但是用for却失败了,问了C语言老师,他也不清楚,请问该如何修改呢?谢谢。/*成功*/。
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp;
void delay();
void main()
{
                temp=0xfe;
                P1=temp;
        while(1)
        {
                temp=_crol_(temp,1);
                delay();
                P1=temp;
        }

}

void delay()
{
        uint x,y;
        for(x=1000;x>0;x--)
                for(y=200;y>0;y--);
}




/*失败*/
#include<reg52.h>
#include <intrins.h>
sbit p1_1=P1^0;
#define uchar unsigned char//宏定义
#define uint2 unsigned int
uchar temp;//字符型,要8位的,uchar是8位的
unsigned int a;
void delay(uint2);
void main()
{
                temp=0xfe;
                p1_1=temp;
        while(1)
        {
                temp=_crol_(temp,1);
                uint2 x,y;
                a=50000;
                p1_1=temp;
                while(a--);
                for(x=130;x>0;x--)
                        for(y=452;y>0;y--);
                a=50000;
                p1_1=temp;
                while(a--);
                for(x=130;x>0;x--)
                        for(y=452;y>0;y--);
        }

}



回答 +关注 1
10807人浏览 3人回答问题 分享 举报
3 个回答
  • 为了简单才用延时函数,用定时器延时亦可,或者用RTOS也可以。
  • 人眼要看见流水效果,则必须有一个合适的速度,这是流水灯的物理意义所在,所以,归根结底,这个延时是必须的,但单片机对延时的处理,可以有很多方法,当然也包括延时函数,你也可以用计数器来实现合适的时间间隔。
    至于到了流水环节,则实施的方法就多了,最笨的,一个一个来跳,指令多,但是理解起来简单。
    巧妙一点的,可以定义一个寄存器,里面只有一个0X01,然后每个间隔时间到,则对这个寄存器左移或者右移,再把寄存器的各位对应的IO映射一下,因为可以用一个统一的端口比如P0,则直接把该寄存器传输到P0就可以了。
    再复杂的,可以定义一整套变换花样,作为流水的花式,存储于一个数据表集合,当然其中一个就是流水灯,再比如光柱条形式什么的,然后根据选择的数据表,根据计数器数据,查灯光花样,然后再驱动输出就成了。当然你还可以用一个接口来控制流水灯时间间隔,效果就是流水速度可调。
  • #include <intrins.h>
    //sbit p1_1=P1^0;
    #define uchar unsigned char//宏定义
    #define uint2 unsigned int
    uchar temp;//字符型,要8位的,uchar是8位的
    unsigned int a;
    void delay(uint2);
    void main()
    {
            temp=0xfe;
            P1=temp;
            while(1)
            {
                    temp=_crol_(temp,1);
                    {       
                            uint2 x,y;
                            a=50000;
                            while(a--);
                            for(x=130;x>0;x--)
                                    for(y=452;y>0;y--);
                    }
                    P1=temp;
            }
    }
    查阅一下 P1_1与P1的区别;
    实现流水灯的方法很多,之前C入门的时候看过一个几十种方法实现流水灯的文章,可惜找不到了。

您需要登录后才可以回复 登录 | 注册