打印
[应用相关]

《STM32和labview》之基于labview的七彩流水灯界面设计

[复制链接]
1848|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
慢醇|  楼主 | 2021-7-21 22:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
第一集:基于labview的七彩流水灯界面设计

使用特权

评论回复
沙发
慢醇|  楼主 | 2021-7-21 22:18 | 只看该作者
一 流水灯描述
         在开始STM32和labview的应用讲解之前,先发一个七彩流水灯的设计。说到七彩流水灯,大家都觉得很简单,其实不然。首先,这里有一个思路问题,我们在开发MCU程序时,要点亮一个LED流水灯,比如8个BIT的流水灯,大家首先想到的就是端口赋值,从BIT7—BIT0依次赋值0x80 0x40 0x20 0x10 0x08 0x040x02 0x01,或者反向赋值,中间插入延时函数即可,这样确实是可以的,我刚开始学习编程也是这样做的。在不断的流水灯的过程中,我们发现上面编程的代码量还是不小的,每个赋值后,再加入延时,就是一个16段代码。后来,长经验了,就学会了数据移位,定义一个变量,让这个数初始值是0x01或者是0x80,然后循环左移或者右移,每次移动后,把变量值赋给端口,采用一个For循环就能实现了,真是简便啊,这就是学到新知识的喜悦。

使用特权

评论回复
板凳
慢醇|  楼主 | 2021-7-21 22:18 | 只看该作者
在成功的实现了8个BIT位的流水灯,那么16BIT的流水灯呢?在8/16位机上就得占用两个端口,在32位机上,就得占用一个端口。继续向下问,如果是32BIT的流水灯呢?那么就出现了两种选择,一种是端口量翻倍,可惜现在的MCU端口都不是太多,笔者手工焊过引脚最多的也就是144PIN,大部分PIN都是有特殊用途,比如地址和数据的并行总线,不可能拿出那么多的端口来玩,就得采用第二种,IO扩展,采用逻辑芯片,锁存器,串并转换等74芯片来做,本质就是分时复用,那样电路就庞大了。

使用特权

评论回复
地板
慢醇|  楼主 | 2021-7-21 22:19 | 只看该作者
在Labview上玩流水灯就简单多了,而且彩色也丰富,不像实际中,就那么几种颜色可以选择。在Labview中,流水灯可以达到64BIT,够嗨吧,呵呵。下面讲解一个20BIT流水灯的界面设计,作为后续教程的热身吧。

使用特权

评论回复
5
慢醇|  楼主 | 2021-7-21 22:21 | 只看该作者
20BIT流水灯思路就是采用了数据移位的原理。思路如下:
        建立一个虚拟的20BIT的布尔数组变量,让这个布尔数组的第一个位为布尔值1,其余为布尔值0, 然后让布尔数组的布尔值1循环移动,移动20次后,返回到初始点.这个思路是很简单,不过实现起来就需要一定的技巧了,要不然,编写的代码又会很长哦。具体实现过程:

使用特权

评论回复
6
慢醇|  楼主 | 2021-7-21 22:27 | 只看该作者
  二 20BIT布尔数组的实现
        我们知道,流水灯要实现一个20BIT的初始化为1的序列,即
        1000 0000 0000 0000 0000 ,0100 0000 0000 0000 0000 ,
        0010 0000 0000 0000 0000 。。。0000 0000 0000 0000 0001.  

使用特权

评论回复
7
慢醇|  楼主 | 2021-7-21 22:28 | 只看该作者
每个位对应于一个LED灯。那么如何产生这个序列呢?这里,我们采用了一个判断语句来实现,当条件满足时,产生布尔值1,不满足时,产生布尔值0,让这个条件循环执行20次。就会得到我们要实现的这个序列了。那么,应该满足什么条件呢?这里我们采用了一个Labview函数,首次调用函数。它位于同步模块里面,首次调用函数的功能:当按下运行按钮第一次调用时,输出TRUE,否则为FLASE。

使用特权

评论回复
8
慢醇|  楼主 | 2021-7-21 22:29 | 只看该作者

使用特权

评论回复
9
慢醇|  楼主 | 2021-7-21 22:32 | 只看该作者
这样,第一次运行时,判断函数就输出布尔值1,第二次循环时,判断函数就输出布尔值0了。利用FOR循环20次,就输出20个布尔值了,这20个布尔值就可以通过一个自动索引隧道输出成一个布尔数组了。

使用特权

评论回复
10
慢醇|  楼主 | 2021-7-21 22:32 | 只看该作者

使用特权

评论回复
11
慢醇|  楼主 | 2021-7-21 22:35 | 只看该作者
   三 20BIT的布尔灯控件放入簇中
         实现好了20BIT的布尔数组后,我们在前面板上再定义20个LED灯,做好排列后,放入一簇中,如图:

使用特权

评论回复
12
慢醇|  楼主 | 2021-7-21 22:38 | 只看该作者

使用特权

评论回复
13
慢醇|  楼主 | 2021-7-21 22:39 | 只看该作者
四 利用好循环移位寄存器
         在前面讲到,判断函数执行20次循环后,会输出一个布尔值数组,这个数组我们怎么对应到簇数组里并循环起来,那就要借助移位寄存器了。在循环结构中经常用到一种数据处理方式,即把第i次循环执行的结果作为第i+1次循环的输入,我们通过一个while循环,就可以让20BIT的布尔值序列不停地运行了。

使用特权

评论回复
14
慢醇|  楼主 | 2021-7-21 22:40 | 只看该作者
五 数组移位操作函数和数组到簇的转换
        通过一维数组的循环移位和数组到簇的转换,我们就可以将布尔数组不停地移位起来,再加上一个简单的延时函数,这样就能显示出流水灯的效果了。

使用特权

评论回复
15
慢醇|  楼主 | 2021-7-21 22:41 | 只看该作者

使用特权

评论回复
16
慢醇|  楼主 | 2021-7-21 22:42 | 只看该作者

使用特权

评论回复
17
慢醇|  楼主 | 2021-7-21 22:43 | 只看该作者
数组循环移位函数,这里n=1,即每次循环移动一位。

使用特权

评论回复
18
慢醇|  楼主 | 2021-7-21 22:43 | 只看该作者
加入一个判断函数,当开启时,正常运行。关闭时,20BIT灯全部关闭,就是给簇赋值布尔值0哦。

使用特权

评论回复
19
慢醇|  楼主 | 2021-7-21 22:46 | 只看该作者
  程序运行效果图如下:

使用特权

评论回复
20
慢醇|  楼主 | 2021-7-21 22:46 | 只看该作者
点击紫色按钮,流水灯关闭。拉动滑动杆,可以控制流水灯的速度。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

125

主题

1241

帖子

5

粉丝