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

[复制链接]
20535|5
手机看帖
扫描二维码
随时随地手机跟帖
LM料穆|  楼主 | 2021-9-14 11:51 | 显示全部楼层 |阅读模式
本人用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--);
        }

}



使用特权

评论回复

相关帖子

yueguang3048| | 2021-9-17 15:12 | 显示全部楼层
#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入门的时候看过一个几十种方法实现流水灯的文章,可惜找不到了。

使用特权

评论回复
tianxj01| | 2021-9-19 16:15 | 显示全部楼层
人眼要看见流水效果,则必须有一个合适的速度,这是流水灯的物理意义所在,所以,归根结底,这个延时是必须的,但单片机对延时的处理,可以有很多方法,当然也包括延时函数,你也可以用计数器来实现合适的时间间隔。
至于到了流水环节,则实施的方法就多了,最笨的,一个一个来跳,指令多,但是理解起来简单。
巧妙一点的,可以定义一个寄存器,里面只有一个0X01,然后每个间隔时间到,则对这个寄存器左移或者右移,再把寄存器的各位对应的IO映射一下,因为可以用一个统一的端口比如P0,则直接把该寄存器传输到P0就可以了。
再复杂的,可以定义一整套变换花样,作为流水的花式,存储于一个数据表集合,当然其中一个就是流水灯,再比如光柱条形式什么的,然后根据选择的数据表,根据计数器数据,查灯光花样,然后再驱动输出就成了。当然你还可以用一个接口来控制流水灯时间间隔,效果就是流水速度可调。

使用特权

评论回复
coody| | 2021-9-21 17:36 | 显示全部楼层
为了简单才用延时函数,用定时器延时亦可,或者用RTOS也可以。

使用特权

评论回复
cool_coder| | 2021-9-28 22:44 | 显示全部楼层
看看

使用特权

评论回复
Bobby13| | 2021-9-29 08:05 | 显示全部楼层
吃饭必须用筷子?

使用特权

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

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

本版热帖

本版活跃用户

优质原创写原创,赢大奖

编辑推荐

  • 1 呐咯密密 得到打赏 ¥310.00
  • 2 gaoyang9992006 得到打赏 ¥200.00
  • 3 yanzhengxin1 得到打赏 ¥150.00
  • 4 qbwww 得到打赏 ¥130.00
  • 5 逍遥李 得到打赏 ¥75.00
  • 6 kk的回忆 得到打赏 ¥50.00
  • 7 cjseng 得到打赏 ¥50.00
  • 8 二哲科技 得到打赏 ¥50.00
  • 9 qintian0303 得到打赏 ¥25.00
  • 10 wangming147 得到打赏 ¥20.00
在线客服 快速回复 返回顶部 返回列表