学习单片机,流水灯项目必做的一个项目,可以说是I/O输出控制的一个非常典型的例子。流水灯一般是指控制单片机的I/O口的电平状态使开发板上的8个小灯依次一个接一个的点亮,流动起来。今天我们总结一下单片机的流水灯的实现方法。
一、流水灯控制的原理
首先来看8个LED的核心电路,如图所示,8个LED灯的通过限流电阻接到了P1口对应的8个引脚上。通过程序向P1口写入一个8位二进制数来改变每个引脚的输出状态,从而控制8个发光二极管的亮灭。当P1=0x7F,将P1口的8位设置为01111111输出,点亮P1.7引脚连接的发光二极管。当P1=0xBF,将P1口的8位设置为10111111输出,点亮P1.6引脚连接的发光二极管。当P1=0xDF,将P1口的8位设置为110111111输出,点亮P1.5引脚连接的发光二极管。当P1=0xEF,将P1口的8位设置为11101111输出,点亮P1.4引脚连接的发光二极管。当P1=0xF7,将P1口的8位设置为11110111输出,点亮P1.3引脚连接的发光二极管。当P1=0xFB,将P1口的8位设置为11111011输出,点亮P1.2引脚连接的发光二极管。当P1=0xFD,将P1口的8位设置为11111101输出,点亮P1.1引脚连接的发光二极管。当P1=0xFE,将P1口的8位设置为11111110输出,点亮P1.0引脚连接的发光二极管。
所以通过以上分析,要想让单片机流水灯流动起来,只需要依次给P1的赋值为0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F即可。
二、流水灯程序实现方法
通过上面的分析,要实现流水灯效果,关键就是通程序按照0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F顺序改变P1口的状态。他的实现方法有以下几种:
1.通过C语言数据的数组实现
数组(Array)是有序的元素序列。这里P1口的状态总共有8个,属于有限个类型相同的变量,用数组存放这些状态恰到好处。用数组实现的方法如下:
2.通过C语言移位操作实现
P1端口的状态0xFE、0xFD…0x7F转化为二进制就是11111110、11111101…01111111,也就是0位即低电平是向左移动,状态没变化一次即0位往左移动一次。这样就可以用左移操作,其操作符为<<。大家需要注意,移位操作是针对二进制移位,针对本例来如果11111110左移一就变成11111100,第1位0移到了第2位,移动完了低位是补零的,这样就亮起了两个灯。只用一个移位操作还不行,这里还需要用到取反操作,取反操作也是针对二进制数的,取反操作符位~。比如11111110取反之后就是00000001。
所以在采用移位操作实现流水灯时,我们先对00000001进行移位,以为之后再取反即可。移位操作实现流水灯的代码如下:
3.通过内部库函数实现
可以通过内部函数_cror_()实现循环右移功能,使P1端口在01111111、10111111…11111110之间变化,并且通过while循环语句重复执行,实现状态循环右移和延时,从而实现流水灯效果,流水灯实际运行效果:
以上是我学习的时候,通过以上三种方式实现了流水灯,你还有别的方法吗?
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/chanchairen/article/details/127459795
|