单片机交流
直播中

吴藩

9年用户 801经验值
擅长:可编程逻辑
私信 关注
[问答]

如何去实现一种LED流水灯来回循环点亮的设计?

如何去实现一种LED流水灯来回循环点亮的设计?其程序代码该怎样去写?

回帖(1)

陈博朴

2021-7-14 13:49:31
  在上一次的实验当中,也就是昨天的时候,历经千辛万苦,总算是理解的延时的计算,多少明白点了汇编语言的写法,以及看到汇编或者是C语言之后,如何去进行两者之间的相互转换。虽然如果你给我一个延时时间,让我直接去写出延时函数,我目前还不行。但这不是有软件嘛,自动生成就好了,哥们我只需要去理解即可,基础的做好吧。
  那么这篇博客,个人就来接着上一次的流水灯实验,来说说刚做好的“流水灯来回循环点亮”。
  实验所用到的程序如下:
  #include《reg51.h》
  #include《intrins.h》
  #define led P0
  void delay500ms(void) //误差500ms
  {
  unsigned char a,b,c;
  for(c=205;c》0;c--)
  for(b=116;b》0;b--)
  for(a=9;a》0;a--); //此处的难点就在于对于延时时间的计算与设定。
  }
  void main()
  {
  unsigned char i,j;
  led=~0x01; // 点亮第一个led灯。
  delay500ms(); // 延迟500ms,等待一个灯被点亮。
  for(i=0;i《7;i++) // 将led右移一位
  {
  led=_crol_(led,1); // led灯轮流输入低电平,也就是轮流点亮。
  delay500ms();
  }
  for(j=1;j《7;j++)
  {
  led=_cror_(led,1);
  delay500ms();
  }
  }
  其实如果对比昨天的实验程序,你会发现只多了一个右移函数的使用,另外就是一个for循环的使用了。刚开始我以为把左移函数当中的i《7,改为i《4,后面的循环当中加上一个i《3即可了。但在把程序烧录进入单片机之后,发现实验现象并不是我像的那样,只有前几个灯开始来回点亮。这个时候,我就意识到自己应该是错了,有点离谱的那种,没有理解for循环的意思。这也是自己学习单片机到现在一直都有的毛病。
  之后我又做了一个实验,那就是让led灯先点亮中间的I/O口,因为我调用的是P0口,所以应该是把P0.3口先点亮。之后让他先向右循环点亮四个I/O口,再返回P0.3口,再向左循环点亮3个I/O口。
  实验程序如下:
  #include《reg51.h》
  #include《intrins.h》
  #define led P0
  void delay500ms(void) //误差500ms
  {
  unsigned char a,b,c;
  for(c=205;c》0;c--)
  for(b=116;b》0;b--)
  for(a=9;a》0;a--); //此处的难点就在于对于延时时间的计算与设定。
  }
  void main()
  {
  unsigned char i,j;
  led=~0x08; // 点亮第一个led灯。
  delay500ms(); // 延迟500ms,等待一个灯被点亮。
  for(i=0;i《3;i++) // 将led右移一位
  {
  led=_cror_(led,1); // led灯轮流输入低电平,也就是轮流点亮。
  delay500ms();
  }
  led=~0x08; // 点亮第一个led灯。
  delay500ms();
  for(j=0;j《4;j++)
  {
  led=_crol_(led,1);
  delay500ms();
  }
  }
  这里首先就要把P0.3口输入低电平,这其实和最开始的点亮led灯是一样的道理,运用到了16进制和十进制的转换。之后就进入一个简单的for循环,让点亮之后延迟500ms的低电平先进入P0.4口,点亮。之后就是把第一个for循环给执行完毕,也就是把P0.3-P0.7这几个I/O口给全部输入低电平。
  然后在程序当中,我就又直接加入了最开始的点亮P0.3口的输出低电平程序,为的就是再次让程序运行到P0.3口开始执行。后面就是一个左移函数了,向左点亮P0.0-P0.3这四个I/O口。
  到这里,我的LED点灯,以及流水灯实验也就全部结束了。总结下吧:
  1,首先要敢于去写,想学会单片机,不下功夫是不行的。遇到不会的知识,就要学习去百度,新手刚学,咱要搞懂基础的东西。不要给了实例,自己看懂了就行,看懂和能写出来这是两码事情。
  2,回归到实验当中去说。首先要搞懂各种定义,比如***it led=P0^.0。这就是很简单的定义一个位变量名,直接把P0.0口用“led”给代替了,也是为了后续书写方便。紧接着就是各种库了,比如#include 《intrins.h》,这个库可以调用很多的特殊寄存器以及特殊位变量,外加就是左移和右移函数的调用了。然后就是#define led P0,这其实和之前的定义没什么区别,不过一个是定义位变量,一个是定义了总的I/O口。
  再往后就是理解延时的计算了,懂的汇编和C语言之间的转换,知道循环该怎么去算机器周期,可以套用公式。
  3,最后就是有想法就去做,不会就去查,不要怕,每天时间很多,深入学习会发现很多新奇的东西,继续加油!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分