1.libview配置
1.1 下载ni_visa
NI-VISA驱动官方版_NI-VISA驱动程序免费下载19.5 - 系统之家
这个必须要安装,要不然libview识别不了串口。
安装好后检查是否可以检测到com口,如果不能则说明版本不对。
1.2 libview编程
1.安装libview,(建议安装有中文版的,方便找器件,推荐2018版),新建VI,然后保存。
2.打开后面板,ctrl+E.
3.在后面板中对各个器件逻辑进行编写。
参考:Labview与51单片机串口通信控灯_哔哩哔哩_bilibili
4.再按CTRL+E进入前面板,将各个前面板器件摆放整齐。
5.点击运行即可。
2.单片机编程
51单片机里面对串口收发程序进行编写,如下。
usart.c
#include "uart.h"
/*********************************
½ÓÊÕÊý¾Ý£¬ÔÚÖжÏÖжÔÊý¾Ý½øÐд¦Àí
***********************************/
unsigned char temp;
unsigned char recv_flag=0;
void UartInit() //9600bps@11.0592MHz
{
PCON &= 0x7F; //²¨ÌØÂʲ»±¶ËÙ
SCON = 0x50; //8λÊý¾Ý,¿É±ä²¨ÌØÂÊ
TMOD &= 0x0F; //ÉèÖö¨Ê±Æ÷ģʽ
TMOD |= 0x20; //ÉèÖö¨Ê±Æ÷ģʽ
TL1 = 0xFD; //ÉèÖö¨Ê±³õʼֵ
TH1 = 0xFD; //ÉèÖö¨Ê±ÖØÔØÖµ
ET1 = 0; //½ûÖ¹¶¨Ê±Æ÷%dÖжÏ
TR1 = 1; //¶¨Ê±Æ÷1¿ªÊ¼¼Æʱ
ES=1; //´®¿ÚÖжϴò¿ª
EA=1;
}
void sendByte(unsigned char dat)
{
SBUF=dat;
while(!TI);
TI=0;
}
void sendString(unsigned char *dat)//×Ö·û´®·¢ËÍ
{
while(*dat!='\0')//×Ö·û´®·¢Ëͼì²âÊÇ·ñ·¢Íê
{
sendByte(*dat++);
}
}
/***********************************************
¹¦ÄÜ£ºµ±ÉÏλ»úÊý¾Ý·¢ËÍÍ꣬½ÓÊÕµ½±ê־룬RIÓ²¼þÖÃ1¡£ÖÃ1ºó»áÉêÇëÖжϣ¬µ½ÖжϺ¯ÊýÖÐ
Ò»¸öÖжϺ¯Êý½â¾öÁ½¸öÖжÏÎÊÌâ¡£
***************************************************/
void uart_ISR() interrupt 4 //ÖжϷþÎñº¯Êý´¦Àí¶ÁÈ¡Êý¾Ý½â¾öÊÕ·¢ÎÊÌâ
{
//ÅжÏÊÇ·¢ËÍÖжϻ¹ÊǽÓÊÕÖжÏ
if(RI==1) //µ±·¢ËÍÍê±Ïºó£¬×Ô¶¯RI×Ô¶¯±äΪ1
{
RI=0; //½øÈ¥¾ÍÒª°ÑRIÖÃ0
temp=SBUF;//µ¥Æ¬»ú½ÓÊÕ£¬°ÑÊý¾Ý¶Á×ߣ¬±£´æ
recv_flag=1;//Ôö¼ÓÒ»¸ö±êÖ¾£¬¿´ÊÇ·ñ½ÓÊÕÍê±Ï£¬ÔÚÖ÷º¯ÊýÖÐʵÏÖ¹¦ÄÜ
}
}
usart.h
#ifndef _UART_H_
#define _UART_H_
#include <reg52.h>
void UartInit() ;
void sendByte(unsigned char dat);
void sendString(unsigned char *dat);
extern unsigned char temp;//ÔÚÖ÷º¯ÊýÖÐÐèҪʹÓÃÔÚÁ½¸ö±äÁ¿£¬ËùÒÔ¼Óextern
extern unsigned char recv_flag;
#endif
main.c
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include "lcd1602.h"
#include "delay.h"
#include "customdef.h"
#include "motor_b.h"
#include "DHT11.h"
#include "uart.h"
char dis0[16]; //打印数组初始化
char dis1[16]; //打印数组初始化
char DHTdata1[5];
int DHT11_time = 0; //控制温湿度采样频率
uint readDHTFlags=1;
void main (void)
{
uint i;
uint lock = 1; //控制电机只执行一次
LCD_Init(); //初始化液晶·
DelayMs(20); //延时有助于稳定
LCD_Write_String(0,0," ");//显示
LCD_Clear();
DelayMs(20); //延时有助于稳定
UartInit();
while (1) //主循环
{
if(recv_flag==1)
{
recv_flag=0;
switch(temp)
{
case 0x1:P1=0xfe;sendByte('A');break;
case 0x2:P1=0xfd;sendByte('B');break;
case 0x3:P1=0xfb;sendByte('C');break;
case 0x4:P1=0xf7;sendByte('D');break;
default :break;
}
}
sprintf(dis0,"temp:%d",temp);
LCD_Write_String(0,0,dis0);//显示
}
}
3.测试效果
点击运行,输入1,收到A,输入2,收到B。
显示结果如果不想用十进制显示,可以在属性里面修改为默认,修改后如下。
3.1 高阶玩法
3.1.1截取出数据里面的温湿度
通过增加截至位,此次设置的是P,ASCII位80.
增加截至位后,读取的数据变为如下:以P作为结束。
然后增加偏移量即可。
增加偏移量后,读取的数据就可以单独显示出来了。
3.1.2 增加图表显示
将数据连接到图标是即可,注意要放在循环里面。
3.1.3 增加弹窗并报警
增加一个弹窗显示报警信息,同时增加报警指示灯,如下。
控件里面加入对应判断即可。