打印

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

[复制链接]
27213|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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也可以。

使用特权

评论回复
5
cool_coder| | 2021-9-28 22:44 | 只看该作者
看看

使用特权

评论回复
6
Bobby13| | 2021-9-29 08:05 | 只看该作者
吃饭必须用筷子?

使用特权

评论回复
7
linnjing| | 2021-11-27 23:05 | 只看该作者
P1_1定义有问题。

使用特权

评论回复
8
粤原点科技| | 2021-12-2 15:59 | 只看该作者

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

用延时是最傻但是容易理解的方法,但可以用轮询的方式,这样CPU的资源就不会一直被延时程序占用。

使用特权

评论回复
9
dirtwillfly| | 2021-12-3 14:45 | 只看该作者
延时是最开始学习时用的,比较常见的方法是用定期中断

使用特权

评论回复
10
flytianya2010| | 2021-12-3 15:13 | 只看该作者
延时必须得。

使用特权

评论回复
11
GlenX| | 2022-1-8 17:57 | 只看该作者

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

最简单的就是用位移加定时。搜索
复制

程序很少

使用特权

评论回复
12
416369123| | 2022-1-28 13:03 | 只看该作者

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

你的p1_1是位定义,直接赋值char型的,能工作还怪了

使用特权

评论回复
13
YiMichael| | 2022-12-28 13:26 | 只看该作者

使用特权

评论回复
14
wangxiangtan2| | 2023-1-30 15:27 | 只看该作者
一晃两年半过去了,估计楼主也已经大学毕业走上工作岗位了,
如今楼主回过头来看到p1_1和temp的数据定义估计就懂了

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝