51单片机的学习之路:LED流水灯的来回点亮,延迟500ms。

51单⽚机的学习之路:LED流⽔灯的来回点亮,延迟500ms。在上⼀次的实验当中,也就是昨天的时候,历经千⾟万苦,总算是理解的延时的计算,多少明⽩点了汇编语⾔的写法,以及看到汇编或者是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,回归到实验当中去说。⾸先要搞懂各种定义,⽐如sbit led=P0^.0。这就是很简单的定义⼀个位变量名,直接把P0.0⼝⽤“led”给代替了,也是为了后续书写⽅便。紧接着就是各种库了,⽐如#include <intrins.h>,这个库可以调⽤很多的特殊寄存器以及特殊位变量,外加就是左移和右移函数的调⽤了。然后就是#define led P0,这其实和之前的定义没什么区别,不过⼀个是定义位变量,⼀个是定义了总的I/O⼝。
再往后就是理解延时的计算了,懂的汇编和C语⾔之间的转换,知道循环该怎么去算机器周期,可以套⽤公式。
3,最后就是有想法就去做,不会就去查,不要怕,每天时间很多,深⼊学习会发现很多新奇的东西,继续加油!

本文发布于:2024-09-22 06:39:02,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/353132.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:点亮   循环   延时
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议