原创 基于labview串口通讯的虚拟数字电压表的设计

2010-7-28 16:18 8159 11 16 分类: 测试测量

文章里的图,需登录网站才能看到。我发的两篇原创文章,已经发表。


1. 引言


Labview是由美国国家仪器公司推出的,主要面向计算机测控领域的虚拟仪器软件开发平台,是一种基于图形开发、调试和运行的集成化环境。本设计利用单片机电路作为下位机前端数据采集电路,电路中的8位A/D转换器芯片ADC0808采集电压信号,把转换出的数字量通过RS-232串口通讯送给上位机,同时在上位机的Labview开发平台下,通过串口读取下位机上传的数据,并处理和显示电压值,从而设计出Labview环境下的基于单片机和PC机串口通讯的虚拟电压表。


 2.基于Labview的上位机信号处理和显示软件设计


Labview虚拟仪器程序由前面板和框图程序组成,前面板是人机交互的界面,界面上有用户输入和显示输出两类控件;框图程序则是用户编制的程序源代码,以定义和控制在前面板上的控件输入和输出功能。图1为虚拟数字电压表的电压测量框图程序。


df059f07-e68f-4f4c-b76e-e54bc0ccf7f0.jpg


图1 虚拟数字电压表的Labview框图程序


上图的图形化框图程序是采用NI_VISA串口Serial函数来访问和控制串口的。VISA中的Serial函数库里包含VISA Configure Serial Port、VISA Write、VISA Read、VISA Close等子函数。本设计用到的三个VISA串口子函数分别是VISA串口配置函数VISA Configure Serial Port、VISA读取函数VISA Read和VISA 关闭函数VISA Close[1][2]。它们的图标分别如图2所示:


b80c7c3f-ba28-4d0a-865e-b17a17b3f333.jpg


图2 VISA串口子函数图标


VISA串口配置函数VISA Configure Serial Port的作用是完成串口参数的初始化设置,包括了串口资源名称,波特率,奇偶校验、数据比特、是否启用终止符等,图1中该函数连接了两个输入变量,变量名为“请选择串口名”和“波特率”,它们分别连在串口资源名称和波特率参数端子上,变量值由前面板上的相应控件来设定,另外该函数在是否启用终止符的端子上还连接了一个布尔常量,常量值为false,含义是不启用终止符,其它输入参数采用默认值。图1中VISA串口配置函数有两个输出端子,图标上面输出端子输出的是串口资源名称,下面输出端子输出的是错误码,输出端子向下游函数传递信息。


       VISA读取函数VISA Read有三个输入端子,图1中VISA Read图标的上面输入端子是前面VISA Configure Serial Port函数传递的串口资源名称,下面的输入端子传递的是错误码,意思是若前面的函数出错了,会往这里输入一个错误码,然后继续往下面传递,有错误码出现时程序是不会工作的。中间输入端子是每次从串口读取的数据字节数,本文设置的字节数常量是1。


图1中VISA Read函数包含在While循环结构中,每次循环从串口读取1个字节,并从该函数的中间输出端子,以字符串的形式输出,每次循环的字符串只包含一个8位字符。VISA Read函数图标上面输出端子输出的是串口资源名称,下面的输出端子输出的是错误码,继续向下游函数传递信息。在前面板按下“停止”按钮,结束While循环。


       VISA关闭函数VISA Close的作用是当程序停止之前,必须要把使用的串口设备关闭,若不关闭,其他程序就不能使用该设备。


       从VISA Read输出的字符串,通过“字符串至字符数组转换”函数把字符串转换为字符数组,再通过“索引数组”函数,把第0元素从字符数组取出,这样就把每次While循环从串口采集的字符串格式数据转换成无符号字节数据,该数据再除以255,乘以5,就可以得到图4所示电位器RV1输出的实测电压值,然后分别以仪表和波形图表的形式显示在前面板中。


       在While循环结构的外面,还有事件结构,在前面板按下“测量”按钮,“测量”控件的值被改变,引发事件,允许执行事件结构内部的While循环结构,于是开始测量电压,直到按下前面板中的“停止”按钮[3][4]


图1的程序源代码所支持的虚拟仪器前面板如图3所示。


fe2af5fd-2dcd-4d24-90b9-fa3735a7aafc.jpg


图3 虚拟数字电压表的Labview前面板


右击图3的前面板“仪表”,出现快捷菜单,选择“属性”,在“属性”对话框的“外观”选项中,打勾选中“显示数字显示框”,于是在前面板中出现电压当前值显示框。程序运行时,先在前面板设置串口资源名称为COM1,波特率为9600,再按“测量”按钮,电压值会以数值、仪表、波形图的形式实时显示出来。按下“停止”按钮,测量结束。


3.基于单片机的下位机信号采集和通讯电路的软硬件设计


图4所示硬件电路是以单片机AT89C51为控制核心,用8位逐次逼近型A/D转换器ADC0808来转换电位器RV1输出的模拟电压值,得到8位数字量,通过RS-232与PC机通讯,送给上位PC机处理[5]


图4电路中单片机的晶振选择是11.0592MHz,是为了当波特率设为9600bps时,保证串行通讯的同步性能[6]。由于单片机RXD和TXD引脚输出TTL电平与RS232串口发送的电平不一致,所以电路中需要一个电平转换器,这里选择了MAX232芯片,单5V供电。


fa53c1ff-dd12-451c-abac-9c250860491f.jpg


图4 单片机采集和通讯硬件电路


根据图4的硬件电路,数据采集和通讯的软件编程思路是:通过AT89C51定时器0方式2产生使?P2.4引脚产生50KHz的方波作为ADC0808转换器的时钟信号,单片机P2.6引脚控制ADC0808的模数转换启动,通过查询ADC0808的引脚EOC,判断转换是否结束。若ADC0808的引脚OE置为高电平,则允许转换结果输出,并通过P0口送入单片机内部处理。


       单片机的串口通讯设置为方式1,10位异步收发,其中1位起始位,8位数据位,1位停止位,由定时器1的溢出率控制波特率。定时器1设置为8位计数初值自动重装的方式2工作模式,通过设置计数初值把串口波特率固定在9600bps,这与上位机Labview软件设置的波特率是一致的。


程序清单和注释如下:


#include <reg51.h>


#define uchar unsigned char


//声明单片机与模数转换芯片ADC0808的相连引脚


sbit CLOCK=P2^4;


sbit EOC=P2^5;


sbit START=P2^6;


sbit OE=P2^7;


//声明暂存模数转换结果的变量


uchar ADC_result;


//定时器0中断子函数,产生50KHz的方波


void pluse_int(void) interrupt 1


{     CLOCK=!CLOCK; }


//主程序


void main()


{


//设置定时器0和1的工作方式均为方式2


    TMOD=0x22;


//设定定时器0的初值,为产生50KHz的方波


       TH0=0xf7;TL0=0xf7;


//设定定时器1的初值,使串口通讯的波特率为9600bps


     TH1=0xfd; TL1=0xfd;


//设定串口通讯方式为方式1,10位异步收发,波特率由定时器1控制


    SCON=0x50;


//开放中断


       ES=1; ET0=1; EA=1;


//定时器0和1启动


       TR0=1; TR1=1;


       while(1)


       {


//启动ADC0808模数转换


              START=0;START=1;START=0;


//判断转换是否结束


              while(EOC);


              while(!EOC);


//转换后的8位数字量暂存在变量ADC_result


             OE=1;ADC_result=P0;OE=0;


//把ADC_result中的数字量通过串口发送到PC机


               ES=0;


              SBUF=ADC_result;


              while(TI= =0);


              TI=0;


              ES=1;


     }


}


 


4 结束语


由于Labview硬件采集卡昂贵,本文利用Labview虚拟仪器软件,设计了基于51单片机硬件采集电路,具有成本低廉,配置灵活的优点。通过与通用电压表的对照测试,按本设计方法制作的虚拟数字电压表所测量的数据结果正确,达到了预期的设计目标。

PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

用户448520 2013-5-6 16:21

zenmexia

用户1714199 2012-4-21 12:45

好麻烦,看图片不好操作

用户349895 2011-5-16 18:15

您好,可以给我源代码不?谢谢yangshan1112@163.com

用户1567473 2011-3-12 01:22

楼主您好! 我是一名大三学生,现在和一名伙伴在做科创项目。最后的阶段需要写这样一个串口数据处理显示软件,看到您这个觉得非常好,可以麻烦您发给我源代码么? 当然,我不是要窃取您的劳动果实,只是想从中借鉴好的思路。而且我们没有学过Labview,自学起来很慢,请您理解! 我的邮箱是137783359@qq.com 再次致谢!

用户33273 2011-1-20 16:45

我想问问图4 单片机采集和通讯硬件电路里面ADC0808的EOC脚跟51单片机的26脚是不是要加一个非门,还有,这个电路图是不是没有什么问题了?我现在做这个课程设计。谢谢
相关推荐阅读
用户374501 2011-10-22 21:38
用LabVIEW前面板遥控乐高NXT机械手车
乐高NXT套件自带的软件是NXT-G软件,它是以国家仪器公司的LabVIEW软件为核心架构的,NXT-G软件界面简单易懂,但要进行复杂功能的程序开发,还需采用更高阶的开发平台,如NI公司的LabVI...
用户374501 2011-10-18 17:20
键盘遥控NXT机器人的LabVIEW编程详解
键盘遥控乐高NXT机器人:图1 基于LabVIEW的键盘遥控NXT机器人示意图视频请观看:  程序下载:键盘遥控labview程序.rar      要用键盘遥控乐高NXT机器人,首先需把键盘的按键...
用户374501 2011-10-09 11:39
乐高Technic伐木车8049驾驶部分电控改造
    最近我购买了乐高Technic伐木车8049套件,大多数买乐高科技套件的LEGO爱好者,到不是为了照着搭建手册体验下套件的魅力,主要还是为了套件里的零件,“零件”圈里人的说法是“肉”,也就是说...
用户374501 2011-09-25 18:42
用Matlab软件为乐高NXT机器人编程
要在matlab环境下给NXT机器人编程,你必须拥有Matlab R2008以上版本,还必须安装德国亚琛大学开发的NXT Toolbox组件。我的版本Matlab 2009a,32位的版本,64位版...
用户374501 2011-08-29 20:40
开博周年,用微软机器人软件MSRS编程实例来纪念
去年,大概这个时间段,我开始在EDN写博客,其实在这以前我也在其他论坛和博客网写些东西,后来我想还是找个技术博客大站来长期保留我的文章,同时也可以分享些东西给其他同仁,于是选择了EDN,哈哈,我的选择...
用户374501 2011-08-27 17:23
用微软机器人软件MSRS给NXT控制器编程
Microsoft Robotics Studio可以使你在PC机上创建程序来远程控制机器人,在这个软件所支持众多公司的机器人控制器中,当然也支持乐高迷手头的NXT控制器。所以赶快去安装免费的微软...
我要评论
5
11
关闭 站长推荐上一条 /3 下一条