基于单片机labview的温度测量系统设计.docx
《基于单片机labview的温度测量系统设计.docx》由会员分享,可在线阅读,更多相关《基于单片机labview的温度测量系统设计.docx(18页珍藏版)》请在冰豆网上搜索。
基于单片机labview的温度测量系统设计
ThismodelpaperwasrevisedbytheStandardizationOfficeonDecember10,2020
基于单片机labview的温度测量系统设计
串口收发电路的温度测量单片机系统设计
设计目录
第一部分电路设计……………………………………………3
温度采集电路……………………………………….3
串口收发电路……………………………………….7
温度显示电路……………………………………….9
第二部分上位机软件………………………………………...10
基于Labview的温度检测设计
第三部分程序代码…………………………………………..
电路设计
1.1温度采集电路
本设计采用热敏电阻,通过飞利浦公司生产的AD转换芯片PCF9591采集热敏电阻的温度信息,总体电路图如下
PCF8591简介
描述
PCF8591是一个单片集成、单独供电、低功耗、8-bitCMOS数据获取器件。
PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。
PCF8591的3个地址引脚A0,A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。
在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
特性
【1】单独供电
【2】PCF8591的操作电压范围
【3】低待机电流
【4】通过I2C总线串行输入/输出
【5】PCF8591通过3个硬件地址引脚寻址
【6】PCF8591的采样率由I2C总线速率决定
【7】4个模拟输入可编程为单端型或差分输入
【8】自动增量频道选择
【9】PCF8591的模拟电压范围从VSS到VDD
【10】PCF8591内置跟踪保持电路
【11】8-bit逐次逼近A/D转换器
【12】通过1路模拟输出实现DAC增益
引脚信息
AIN0~AIN3:
模拟信号输入端。
A0~A3:
引脚地址端。
VDD、VSS:
电源端。
(~6V)
SDA、SCL:
I2C总线的数据线、
时钟线。
OSC:
外部时钟输入端,内部时钟
输出端。
EXT:
内部、外部时钟选择线,使
用内部时钟时EXT接地。
AGND:
模拟信号地。
AOUT:
D/A转换输出端。
VREF:
基准电源端。
PCF8591操作
内部地址寄存器
内部控制寄存器
AD转换总时序
先送入要读取的器件的地址,即所要读取的通道,然后等待应答信号,开始读取下位机芯片送来的AD数据。
底层驱动时序如下
单字读写
起始以及停止信号
准备完毕的应答信号,上位机接收
本电路通过PCF8591的AIN2通道采集热敏电阻的温度信息,通过I2C总线方式读取下位机提取的信息,实现温度采集。
温度传感器PT100简介
设计原理
pt100是铂热电阻,它的阻值会随着温度的变化而改变。
PT后的100即表示它在0℃时阻值为100欧姆,在100℃时它的阻值约为欧姆。
它的工业原理:
当PT100在0摄氏度的时候他的阻值为100欧姆,它的阻值会随着温度上升而成匀速增长的。
温度特性曲线
由上图,可以拟合其温度与电阻的关系为
R=77/200*Temperature+100;
串联的限流电阻的值为100欧姆,则AD输入电压的计算公式为
ADValue/255*5000=100/(R+100)*5000;
由以上两公式换算可以得到
Temperature=200/77*(100*255/ADValue-100)
1.2串口收发电路
通过串口收发电路,将采集到的温度信息提取后传送到电脑上,通过上位机显示所采集的温度信息,实现人机交互界面,更加人性化电路如下:
串口通信芯片采用美信公司的MAX232
引脚介绍
第一部分是电荷泵电路。
由1、2、3、4、5、6脚和4只电容构成。
功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。
第二部分是数据转换通道。
由7、8、9、10、11、12、13、14脚构成两个数据通道。
其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。
8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。
TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。
第三部分是供电。
15脚GND、16脚VCC(+5v)。
主要特点
1、符合所有的技术标准
2、只需要单一+5V电源供电
3、片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V电压V+、V-
4、功耗低,典型供电电流5mA
5、内部集成2个RS-232C驱动器
6、内部集成两个RS-232C接收器
7、高集成度,片外最低只需4个电容即可工作。
温度显示电路
温度显示电路采用1602液晶,与单片机的P0口相连,实现温度显示,其电路图如下
液晶电路的读写时序以及其内部寄存器的操作可以在网上查找,此处不作详述,用液晶屏幕实现静态显示温度的功能。
整体电路如下
上位机软件
前面板设计
温度超过限定值或者低于限定值时,指示灯亮起,温度读取开关,用于串口的打开和关闭。
后面板程序框图设计
程序代码
温度采集部分
/********************此部分为I2C总线驱动程序*******************/
2C
#include<>
#include<>
#definenop_nop_()
sbitSCL=P2^1;
sbitSDA=P2^0;
bitack;
/*--------------------startI2c-------------*/
voidStart_I2c(void)
{
SDA=1;
nop;
SCL=1;
nop;
nop;
nop
nop;
nop;
SDA=0;//SDAtolow,sendstartflag
nop;
nop;
nop
nop;
nop;
SCL=0;
nop;
nop;
}
/*---------------stopI2c--------------*/
voidStop_I2c(void)
{
SDA=0;
nop;
SCL=1;
nop;
nop;
nop
nop;
nop;
SDA=1;//sendstopflag
nop;
nop;
nop;
nop;
}
/*--------------sendbyte---------------*/
voidSend_Byte(unsignedcharc)
{
unsignedcharBitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
if((c<elseSDA=0;
nop;
SCL=1;
nop;
nop;
nop
nop;
nop;
SCL=0;
}
nop;
nop;
SDA=1;
nop;
nop;
SCL=1;
nop;
nop;
nop;
if(SDA==1)ack=0;
elseack=1;
SCL=0;
nop;
nop;
}
/*----------------rescivebyte----------*/
unsignedcharReceive_Byte(void)
{
unsignedcharreceive;
unsignedcharBitCnt;
receive=0;
SDA=1;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
nop;
SCL=0;
nop;
nop;
nop
nop;
nop;
SCL=1;
nop;
nop;
receive<<=1;
if(SDA==1)receive+=1;
nop;
nop;
}
SCL=0;
nop;
nop;
returnreceive;
}
/*-------------Acknowledgement------------*/
voidAck_I2c(bita)
{
if(a==0)SDA=0;
elseSDA=1;
nop;
nop;
nop;
SCL=1;
nop;
nop;
nop;
nop;
nop;
SCL=0;
nop;
nop;
}
/*********************************此部分为温度的读取部分******************/
#include<>
#include<2C>
unsignedcharADValue;
unsignedintTemperature;
#definePCF85910x90//器件地址
bitADC_Send_Byte(unsignedcharsla,unsignedcharc)
{
Start_I2c();
Send_Byte(sla);
if(asc==0)return0;
Send_Byte(c);
if(asc==0)return0;
Stop_I2c();
return1;
}
//ADCReceiveByte
unsignedcharAD_Receive_Byte(unsignedcharsla)
{
unsignedcharc;
Start_I2c();
Send_Byte(sla+1);
if(ack==0)return0;
c=Receive_Byte;
Ack_I2c
(1);
Stop_I2c();
returnc;
}
VoidGet_ADValue(void)
{
ADC_Send_Byte(PCF8591,0x43);
ADValue=AD_Receive_Byte(PCF8591);
}
/////////////////////以下为温度换算部分//////////////////////////
VoidGet_TPValue()
{
Temperature=200/77*(100*255/ADValue-100);
}
/***********************此部分为LCD液晶显示模块**********************/
#include<>
#include<>
#include“”
sbitrs=P2^6;//
sbitrw=P2^5;
sbitep=P2^7;
unsignedcharcodeTital[]={"Thetemperatureis"};
unsignedcharTemperatureshow[3];
delay(unsignedcharms)
{//
unsignedchari;
while(ms--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
bitLcd_Busy()
{//
bitresult;
rs=0;
rw=1;
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P0&0x80);
ep=0;
returnresult;
}
Lcd_Write_CMD(unsignedcharcmd)
{//
while(Lcd_Busy());
rs=0;
rw=0;
ep=0;
_nop_();
_nop_();
P0=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
Lcd_Place(unsignedcharpos)
{
Lcd_Write_CMD(pos|0x80);
}
Lcd_Send_Byte(unsignedchardat)
{
while(Lcd_Busy());
rs=1;
rw=0;
ep=0;
P0=dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
lcd_init()
{
Lcd_Write_CMD(0x38);
delay
(1);
Lcd_Write_CMD(0x0c);
delay
(1);
Lcd_Write_CMD(0x06);
delay
(1);
Lcd_Write_CMD(0x01);
delay
(1);
}
VoidLcd_Show()
{
Unsignedchari;
Lcd_Place(0);
i=0;
while(Tital[i]!
='\0')
{
Lcd_Send_Byte(Tital[i]);
i++;
}
Temperatureshow[0]=Temperature/100+’0’;
Temperatureshow[1]=Temperature%100/10+’0’;
Temperatureshow[0]=Temperature%10+’0’;
Lcd_Place[0x45];
i=0;
while(Temperature[i]!
='\0')
{
Lcd_Send_Byte(Temperatureshow[i]);
i++;
}
}
/************************此处为串行口的通信部分***************************/
#include<>
#include“”
VoidSCI_Init()
{
SCON=0x50;
TMOD|=0x20;
PCON|=0x80;//波特率倍增
TH1=0xF3;//串口波特率9600
TL1=0xF3;
TR1=1;
ES=0;//禁止串口中断
EA=0;
}
VoidSend_Temperature()
{
SBUF=Temperature;
while(!
TI);
TI=0;
SBUF=Temperature>>8;
while(!
TI);
TI=0;
}
/************************以下为主函数******************************/
#include<>
#include“”
#include“”
#include“”
VoidSystem_Start()
{
SCI_Init();
lcd_init();
}
Voidmain()
{
While
(1)
{
Get_ADValue();
Get_TPValue();
Lcd_Show();
Send_Temperature();
}
}