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

[复制链接]
27734|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 | 显示全部楼层
  1. #include <intrins.h>
  2. //sbit p1_1=P1^0;
  3. #define uchar unsigned char//宏定义
  4. #define uint2 unsigned int
  5. uchar temp;//字符型,要8位的,uchar是8位的
  6. unsigned int a;
  7. void delay(uint2);
  8. void main()
  9. {
  10.         temp=0xfe;
  11.         P1=temp;
  12.         while(1)
  13.         {
  14.                 temp=_crol_(temp,1);
  15.                 {       
  16.                         uint2 x,y;
  17.                         a=50000;
  18.                         while(a--);
  19.                         for(x=130;x>0;x--)
  20.                                 for(y=452;y>0;y--);
  21.                 }
  22.                 P1=temp;
  23.         }
  24. }
查阅一下 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 来自手机 | 显示全部楼层
吃饭必须用筷子?
linnjing 发表于 2021-11-27 23:05 | 显示全部楼层
P1_1定义有问题。
粤原点科技 发表于 2021-12-2 15:59 | 显示全部楼层

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

用延时是最傻但是容易理解的方法,但可以用轮询的方式,这样CPU的资源就不会一直被延时程序占用。
dirtwillfly 发表于 2021-12-3 14:45 | 显示全部楼层
延时是最开始学习时用的,比较常见的方法是用定期中断
flytianya2010 发表于 2021-12-3 15:13 来自手机 | 显示全部楼层
延时必须得。
GlenX 发表于 2022-1-8 17:57 | 显示全部楼层

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

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

程序很少
416369123 发表于 2022-1-28 13:03 | 显示全部楼层

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

你的p1_1是位定义,直接赋值char型的,能工作还怪了
YiMichael 发表于 2022-12-28 13:26 | 显示全部楼层
wangxiangtan2 发表于 2023-1-30 15:27 | 显示全部楼层
一晃两年半过去了,估计楼主也已经大学毕业走上工作岗位了,
如今楼主回过头来看到p1_1和temp的数据定义估计就懂了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部