资源描述
基于单片机labview的温度测量系统设计
32
2020年4月19日
文档仅供参考
串口收发电路的温度测量单片机系统设计
设计目录
第一部分 电路设计……………………………………………3
1.1 温度采集电路……………………………………….3
1.2 串口收发电路……………………………………….7
1.3 温度显示电路……………………………………….9
第二部分 上位机软件………………………………………...10
2.1 基于Labview的温度检测设计
第三部分 程序代码…………………………………………..
电路设计
1.1 温度采集电路
本设计采用热敏电阻,经过飞利浦公司生产的AD转换芯片PCF9591采集热敏电阻的温度信息,总体电路图如下
PCF8591简介
描述
PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是经过双线双向I2C总线以串行的方式进行传输。
特性
【1】单独供电
【2】PCF8591的操作电压范围2.5V-6V
【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:电源端。 (2.5~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℃时它的阻值约为138.5欧姆。它的工业原理:当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、符合所有的RS-232C技术标准
2、只需要单一 +5V电源供电
3、片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V电压V+、V-
4、功耗低,典型供电电流5mA
5、内部集成2个RS-232C驱动器
6、内部集成两个RS-232C接收器
7、高集成度,片外最低只需4个电容即可工作。
1.3 温度显示电路
温度显示电路采用1602液晶,与单片机的P0口相连,实现温度显示,其电路图如下
液晶电路的读写时序以及其内部寄存器的操作能够在网上查找,此处不作详述,用液晶屏幕实现静态显示温度的功能。
整体电路如下
上位机软件
2.1前面板设计
温度超过限定值或者低于限定值时,指示灯亮起,温度读取开关,用于串口的打开和关闭。
后面板程序框图设计
程序代码
温度采集部分
/********************此部分为I2C总线驱动程序*******************/
-------------------------I2C.c----------------------------
#include <reg52.h>
#include <intrins.h>
#define nop _nop_()
sbit SCL=P2^1;
sbit SDA=P2^0;
bit ack;
/*--------------------start I2c-------------*/
void Start_I2c(void)
{
SDA=1;
nop;
SCL=1;
nop;
nop;
nop
nop;
nop;
SDA=0; //SDA to low ,send start flag
nop;
nop;
nop
nop;
nop;
SCL=0;
nop;
nop;
}
/*---------------stop I2c--------------*/
void Stop_I2c(void)
{
SDA=0;
nop;
SCL=1;
nop;
nop;
nop
nop;
nop;
SDA=1;//send stop flag
nop;
nop;
nop;
nop;
}
/*--------------send byte---------------*/
void Send_Byte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
if((c<<BitCnt)&0x80) SDA=1;
else SDA=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;
else ack=1;
SCL=0;
nop;
nop;
}
/*----------------rescive byte----------*/
unsigned char Receive_Byte(void)
{
unsigned char receive;
unsigned char BitCnt;
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;
return receive;
}
/*-------------Acknowledgement------------*/
void Ack_I2c(bit a)
{
if(a==0) SDA=0;
else SDA=1;
nop;
nop;
nop;
SCL=1;
nop;
nop;
nop;
nop;
nop;
SCL=0;
nop;
nop;
}
/*********************************此部分为温度的读取部分******************/
------------------------------AD.c----------------------------
#include<reg52.h>
#include <I2C.H>
unsigned char ADValue;
unsigned int Temperature;
#define PCF8591 0x90 //器件地址
bit ADC_Send_Byte(unsigned char sla,unsigned char c)
{
Start_I2c();
Send_Byte(sla);
if(asc==0) return 0;
Send_Byte(c);
if(asc==0) return 0;
Stop_I2c();
return 1;
}
//ADC Receive Byte
unsigned char AD_Receive_Byte(unsigned char sla)
{
unsigned char c;
Start_I2c();
Send_Byte(sla+1);
if(ack==0) return 0;
c=Receive_Byte;
Ack_I2c(1);
Stop_I2c();
return c;
}
Void Get_ADValue(void)
{
ADC_Send_Byte(PCF8591,0x43);
ADValue=AD_ Receive_Byte(PCF8591);
}
/////////////////////以下为温度换算部分//////////////////////////
Void Get_TPValue()
{
Temperature=200/77*(100*255/ADValue-100);
}
/***********************此部分为LCD液晶显示模块**********************/
--------------------------------LCD.c---------------------------------
#include <reg51.h>
#include <intrins.h>
#include “AD.h”
sbit rs = P2^6; //
sbit rw = P2^5;
sbit ep = P2^7;
unsigned char code Tital[] = {"The temperature is"};
unsigned char Temperatureshow[3];
delay(unsigned char ms)
{ //
unsigned char i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
bit Lcd_Busy()
{ //
bit result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0 & 0x80);
ep = 0;
return result;
}
Lcd_Write_CMD(unsigned char cmd)
{ //
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 (unsigned char pos)
{
Lcd_Write_CMD(pos | 0x80);
}
Lcd_Send_Byte(unsigned char dat)
{
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);
}
Void Lcd_Show()
{
Unsigned char i;
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++;
}
}
/************************此处为串行口的通信部分***************************/
----------------------------SCI.c--------------------------------
#include <reg52.h>
#include “AD.h”
Void SCI_Init()
{
SCON = 0x50;
TMOD|= 0x20;
PCON|= 0x80; //波特率倍增
TH1 = 0xF3; //串口波特率9600
TL1 = 0xF3;
TR1 = 1;
ES = 0; //禁止串口中断
EA = 0;
}
Void Send_Temperature()
{
SBUF=Temperature;
while(!TI);
TI = 0;
SBUF=Temperature>>8;
while(!TI);
TI = 0;
}
/************************以下为主函数******************************/
---------------------------------main.c----------------------------
#include <reg52.h>
#include “AD.h”
#include “LCD.h”
#include “SCI.h”
Void System_Start()
{
SCI_Init();
lcd_init();
}
Void main()
{
While(1)
{
Get_ADValue();
Get_TPValue();
Lcd_Show();
Send_Temperature();
}
}
展开阅读全文