分享

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

 guitarhua 2018-01-07
本帖最后由 51黑tt 于 2016-3-4 20:11 编辑

                                                                                   
         Labview2013程序设计分享教程开始了】
         ---ICKEY社区小雨儿   
        前言          网络上各种各样的labview教程层出不穷,大部分都是讲解的labview的仿真应用,教程或课件中的VI程序也大部分如此!除了NI公司提供丰富的硬件,可以使用DAQ做数据采集,高端的FPGA开发外,难道真的就没有更精彩的应用了吗?回答是否定的,labview是可以和MCU、DSP做无缝连接的,就像在仿真程序上和matlab的无缝集成一样。当然,MCU和DSP与labveiw的接口,这个课题范围太大了,探讨起来也是一个很广泛的话题。时下,最流行的MCU当然是ARM公司的CORTEX-MO/M3/M4内核,DSP当然是TI的TMS320FXXX系列,也就是通常的C2000/C5000/C6000,高端的FPGA平台中,无论是ATLERA还是XINLIX公司的平台,其软核IP大部分也是这些内核罢了,CORTER-A8/A9这样的内核已经是专门的嵌入式领域了,这里笔者水平有限,也没有精力去研究这些了。         在工作中,受到大牛和大神们气氛熏陶,我也逐渐从51、STC/MSP430这样8位、16位的平台,过度到32位平台,期间经历了LM3S的大起大落,C2000/C5000的高富帅,最后到情有独钟的STM32。在认识STM32的岁月里,发现它确实很容易应用,价格适中,资料丰富,开发环境友好,适合一般的工控应用及消费电子应用,同时,作为labview的粉丝,我对它也是不离不弃。在这样的环境下,我逐渐地将STM32和Labview放在了一起,并在大神的指点下,也有了一些小应用。
        下面本版主将推出一系列教程,详细介绍STM32和labview结合下的一些应用,希望这些应用对大家学习labview有所帮助,并欢迎大家提出各种意见
        第一集:基于labview的七彩流水灯界面设计

         20140228203017_73913.jpg

         流水灯描述
         在开始STM32和labview的应用讲解之前,先发一个七彩流水灯的设计。说到七彩流水灯,大家都觉得很简单,其实不然。首先,这里有一个思路问题,我们在开发MCU程序时,要点亮一个LED流水灯,比如8个BIT的流水灯,大家首先想到的就是端口赋值,从BIT7—BIT0依次赋值0x80 0x40 0x20 0x10 0x08 0x040x02 0x01,或者反向赋值,中间插入延时函数即可,这样确实是可以的,我刚开始学习编程也是这样做的。在不断的流水灯的过程中,我们发现上面编程的代码量还是不小的,每个赋值后,再加入延时,就是一个16段代码。后来,长经验了,就学会了数据移位,定义一个变量,让这个数初始值是0x01或者是0x80,然后循环左移或者右移,每次移动后,把变量值赋给端口,采用一个For循环就能实现了,真是简便啊,这就是学到新知识的喜悦。
        在成功的实现了8个BIT位的流水灯,那么16BIT的流水灯呢?在8/16位机上就得占用两个端口,在32位机上,就得占用一个端口。继续向下问,如果是32BIT的流水灯呢?那么就出现了两种选择,一种是端口量翻倍,可惜现在的MCU端口都不是太多,笔者手工焊过引脚最多的也就是144PIN,大部分PIN都是有特殊用途,比如地址和数据的并行总线,不可能拿出那么多的端口来玩,就得采用第二种,IO扩展,采用逻辑芯片,锁存器,串并转换等74芯片来做,本质就是分时复用,那样电路就庞大了。
        在Labview上玩流水灯就简单多了,而且彩色也丰富,不像实际中,就那么几种颜色可以选择。在Labview中,流水灯可以达到64BIT,够嗨吧,呵呵。下面讲解一个20BIT流水灯的界面设计,作为后续教程的热身吧。
        20BIT流水灯思路就是采用了数据移位的原理。思路如下:
        建立一个虚拟的20BIT的布尔数组变量,让这个布尔数组的第一个位为布尔值1,其余为布尔值0, 然后让布尔数组的布尔值1循环移动,移动20次后,返回到初始点.这个思路是很简单,不过实现起来就需要一定的技巧了,要不然,编写的代码又会很长哦。具体实现过程:
         20BIT布尔数组的实现
        我们知道,流水灯要实现一个20BIT的初始化为1的序列,即
        1000 0000 0000 0000 0000 ,0100 0000 0000 0000 0000 ,
        0010 0000 0000 0000 0000 。。。0000 0000 0000 0000 0001.  
        每个位对应于一个LED灯。那么如何产生这个序列呢?这里,我们采用了一个判断语句来实现,当条件满足时,产生布尔值1,不满足时,产生布尔值0,让这个条件循环执行20次。就会得到我们要实现的这个序列了。那么,应该满足什么条件呢?这里我们采用了一个Labview函数,首次调用函数。它位于同步模块里面,首次调用函数的功能:当按下运行按钮第一次调用时,输出TRUE,否则为FLASE。
        
        这样,第一次运行时,判断函数就输出布尔值1,第二次循环时,判断函数就输出布尔值0了。利用FOR循环20次,就输出20个布尔值了,这20个布尔值就可以通过一个自动索引隧道输出成一个布尔数组了。
         20140228203322_39885.jpg
         20BIT的布尔灯控件放入簇中
         实现好了20BIT的布尔数组后,我们在前面板上再定义20个LED灯,做好排列后,放入一簇中,如图:
        20140228203452_93704.jpg

         利用好循环移位寄存器
         在前面讲到,判断函数执行20次循环后,会输出一个布尔值数组,这个数组我们怎么对应到簇数组里并循环起来,那就要借助移位寄存器了。在循环结构中经常用到一种数据处理方式,即把第i次循环执行的结果作为第i+1次循环的输入,我们通过一个while循环,就可以让20BIT的布尔值序列不停地运行了。
         数组移位操作函数和数组到簇的转换
        通过一维数组的循环移位和数组到簇的转换,我们就可以将布尔数组不停地移位起来,再加上一个简单的延时函数,这样就能显示出流水灯的效果了。
         20140228203625_57671.jpg
        20140228203742_55873.jpg

         数组循环移位函数,这里n=1,即每次循环移动一位。
        20140228203952_82531.jpg
        加入一个判断函数,当开启时,正常运行。关闭时,20BIT灯全部关闭,就是给簇赋值布尔值0哦。
         程序运行效果图如下:
        20140228204126_30930.jpg

        点击紫色按钮,流水灯关闭。拉动滑动杆,可以控制流水灯的速度。



        下一集为大家分享一个Labview控制STM32板子上的LED灯的程序设计。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多