基于Labview串口通信.docx
《基于Labview串口通信.docx》由会员分享,可在线阅读,更多相关《基于Labview串口通信.docx(13页珍藏版)》请在冰点文库上搜索。
![基于Labview串口通信.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/ffdb5ca7-12e6-4bde-b1dd-4dab4ed20df6/ffdb5ca7-12e6-4bde-b1dd-4dab4ed20df61.gif)
基于Labview串口通信
题目:
用串口通信将温度,湿度信息发送到PC机进行显示报警。
要求;需要进行单片机的编程和系统方案的设计
一:
硬件设计及原理图
1:
单片机的选择
由于我们的系统中,单片机要完成的任务只有温度的采集和串口数据的发送,所以我们选择的是既能满足要求又比较便宜的TA89s52这款单片机。
单片机最小系统如下图
2:
温度采集电路
这里我们采集温度的传感器是用的18b20。
它的优点有:
直接输出数字量,精度高达0.0625摄氏度,占用的端口资源少。
3电平转换电路
因为单片机串口发出的数据时使用的是TTL电平,而计算机上的串口用的是RS232电平,所有用了TC232这款电平转换芯片来完成电平的匹配。
二:
软件流程图
三:
单片机系统上的程序:
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint;
/*****************************************************************************/
sbitseg1=P2^0;
sbitseg2=P2^1;
sbitseg3=P2^2;
sbitDQ=P1^7;//ds18b20端口
sfrdataled=0x80;//显示数据端口
/**********************************************************************/
uchartemp,s_count=0;
ucharflag_get,count,num,minute,second;
ucharcodetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数码管段码表共阳
ucharstr[3];
unsignedcharsend_dat[4]={42,00,00,35};//发送数据的格式
/***********************************************************************/
voiddelay1(ucharMS);
unsignedcharReadTemperature(void);
voidInit_DS18B20(void);
unsignedcharReadOneChar(void);
voidWriteOneChar(uchardat);
voiddelay(unsignedinti);
voiduart_init(void);
voidtime_init(void);
//voidsend_data(void);
voidlong_delay(intm);
//voiddelay_c(uinti);
/*主程序*/
main()
{
time_init();
uart_init();
while
(1)
{
str[2]=0x39;//显示C符号
str[0]=tab[temp/10];//十位温度
str[1]=tab[temp%10];//个位温度
if(flag_get==1)//定时读取当前温度
{
temp=ReadTemperature();
flag_get=0;
}
s_count=0;
SBUF=send_dat[s_count++];
long_delay(200);
}
}
voidtim(void)interrupt1using1//中断,用于数码管扫描和温度检测间隔
{
TH0=0xef;//定时器重装值
TL0=0xf0;
num++;
if(num==50)
{num=0;
flag_get=1;//标志位有效
second++;
if(second>=60)
{second=0;
minute++;
}
}
count++;
if(count==1)
{P2=0;
dataled=str[0];}//数码管扫描
if(count==2)
{P2=1;
dataled=str[1];}
if(count==3)
{P2=2;
dataled=str[2];
count=0;}
}
/*************************************************************************************/
voiddelay(unsignedinti)//延时函数
{
while(i--);
}
/***************************************************************************************/
//18b20初始化函数
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
delay(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay(80);//精确延时大于480us
DQ=1;//拉高总线
delay(10);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(5);
}
//读一个字节
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
//写一个字节
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(5);
}
//读取温度
unsignedcharReadTemperature(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedchart=0;
//floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
delay(200);
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
//send_dat[2]=b;
//send_dat[3]=a;
b<<=4;
b+=(a&0xf0)>>4;
t=b;
send_dat[1]=t;
//tt=t*0.0625;
//t=tt*10+0.5;//放大10倍输出并四舍五入
return(t);
}
voidtime_init(void)
{
TMOD|=0x01;//定时器设置
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
P2=0x00;
count=0;
}
voiduart_init(void)
{
SCON=0x50;/*SCON:
模式1,8-bitUART,使能接收*/
TMOD|=0x20;/*TMOD:
timer1,mode2,8-bitreload*/
TH1=0xFD;/*TH1:
reloadvaluefor9600baud@11.0592MHz*/
TR1=1;/*TR1:
timer1run*/
EA=1;/*打开总中断*/
ES=1;/*打开串口中断*/
}
/*
voidsend_data(void)
{
unsignedchari;
for(i=0;i<3;i++)
{
SBUF=send_dat[i];
delay(1000);
}
}
*/
voidlong_delay(intm)
{
intj,i;
for(i=m;i>0;i--)
for(j=1000;j>0;j--)
;
}
voidUART_SER(void)interrupt4//串行中断服务程序
{
if(TI==1)
{
TI=0;
if(s_count!
=4)
SBUF=send_dat[s_count++];
}
}
四:
LabVIEW程序
1:
对串口基本参数进行配置
2读取单片机发送至串口的数据,如果没有接受到数据就不读取串口
3:
将读取到得数据进行处理,然后用各种显示器件显示出来
4:
测试结果显示
五:
总结
经过演示,本温度报警器可以显示当前温度,并能在温度超过警报值时发出报警信号,通过此温度系统的设计,使我熟悉了使用LabVIEW的串口与其他系统的通信。
但是由于该系统仅使用了一些比较简单的结构,所以程序框图不够简化,这是需要改进的地方,但是这不影响其正常使用。