51单片机学习日志-4
接下来讲一个同样和发光二极管相关的案例,就是如何通过编辑代码的方式,实现发光二极管的闪烁。其实从这个需求来看的话,只需要在原来代码的基础上进行一些修改即可,基本的思路是这样的:在循环中单片机引脚的电平不再是固定不变的,而是在不断变化的,也就是从高电平变为低电平,再从低电平变为高电平,这样就形成了闪烁的效果。但是这里其实有一个问题,就是单片机引脚变化的速率是非常快的,所以由于人眼存在视觉暂留效应以及二极管的余辉效应,会发现发光二极管是在一直亮着的。所以为了解决这个问题,就需要将单片机引脚电平变化的速率降低,而如何降低呢,这里就要用到一种叫做延时函数的东西。什么叫做延时函数,就是通过一些没有实际操作的空循环占用单片机的内存,从而达到使单片机在短时间内没有有效动作的目的,这样做的效果就是让引脚的电平维持一段时间没有变化,也就是所谓的延时效果,当延时函数结束时,在让单片机执行下一条命令,这样就实现了延后引脚电平变化过程,从而降低了二极管状态变化的速率,也就可以将发光二极管的闪烁速率降低到人眼可以观察到程度,这就是延时函数的效果。而如何得到这样的一种延时函数呢,这里就需要在主函数外定义一个可被调用的函数了,这个函数可以设计为通过输入参数来调节延时长度的功能,所以可以将输入函数设计为一个无符号整型,而在函数内部则需要设计函数的运行逻辑。由于延时函数的逻辑就是通过无意义的循环来占用单片机,于是就可以设计有一定循环次数的空循环,这里用到了for循环,而其中包含了一个嵌套的for循环,内部的循环通过固定的循环次数,来达到延时一定的时间,而外部的循环通过输入的无符号整型变量来控制循环次数,从而能够控制延时函数整体的延时时间,可以看到内部的循环一共有110次(从i为110到i为1一共有110次循环),这个时间大约有一毫秒的时间,这样通过外部输入的无符号整型,决定的就是延时时间具体是几毫秒,这样我们就得到了能够决定延时时间的延时函数,并且可以在主函数中使用。这里要注意一个外部函数的知识,就是如果函数定义出现在调用之前,则不用进行声明,但是如果函数定义出现在主函数之后,就需要先进行函数的声明,而声明只需要将函数的第一行写出来,再加上分号即可。总之,定义了延时函数后,就可以通过在主函数的调用,来验证函数的效果了,而且由于该函数没有输出,所以不用考虑接收该函数的输出,直接使用即可。由于该实验同上一个时间的电路连接时相同的,这里只给出代码部分即可。由于电路部分没有改动,所以只需要对软件代码进行改动即可,又因为只是需要改变发光二极管明暗变化的速率,所以也只需增加一个延时函数即可,所以相对来说还是比较简单的。



浙公网安备 33010602011771号