《基于-单片机labview的温度测量系统设计.doc》由会员分享,可在线阅读,更多相关《基于-单片机labview的温度测量系统设计.doc(20页珍藏版)》请在三一办公上搜索。
1、串口收发电路的温度测量单片机系统设计设计目录第一部分 电路设计3 1.1 温度采集电路.31.2 串口收发电路.7 1.3 温度显示电路.9第二部分 上位机软件.102.1 基于Labview的温度检测设计第三部分 程序代码.电路设计1.1 温度采集电路本设计采用热敏电阻,通过飞利浦公司生产的AD转换芯片PCF9591采集热敏电阻的温度信息,总体电路图如下PCF8591简介描述PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允
2、许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。特性【1】单独供电 【2】PCF8591的操作电压X围2.5V-6V 【3】低待机电流 【4】通过I2C总线串行输入/输出 【5】PCF8591通过3个硬件地址引脚寻址 【6】PCF8591的采样率由I2C总线速率决定 【7】4个模拟输入可编程为单端型或差分输入 【8】自动增量频道选择 【9】PCF8591的模拟电压X围从VSS到VDD 【10】PCF8591内置跟踪保持电路 【11】8-bit逐次逼近A/D转换器 【12】通过1
3、路模拟输出实现DAC增益引脚信息AIN0AIN3:模拟信号输入端。 A0A3:引脚地址端。 VDD、VSS:电源端。 (2.56V) SDA、SCL:I2C 总线的数据线、 时钟线。 OSC:外部时钟输入端,内部时钟 输出端。 EXT:内部、外部时钟选择线,使 用内部时钟时 EXT 接地。 AGND:模拟信号地。 AOUT:D/A 转换输出端。 VREF:基准电源端。PCF8591操作内部地址寄存器内部控制寄存器AD转换总时序先送入要读取的器件的地址,即所要读取的通道,然后等待应答信号,开始读取下位机芯片送来的AD数据。底层驱动时序如下单字读写起始以及停止信号准备完毕的应答信号,上位机接收本电
4、路通过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)
5、*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)、
6、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、功耗低,典型供电电流5m
7、A 5、内部集成2个RS-232C驱动器 6、内部集成两个RS-232C接收器 7、高集成度,片外最低只需4个电容即可工作。1.3 温度显示电路温度显示电路采用1602液晶,与单片机的P0口相连,实现温度显示,其电路图如下液晶电路的读写时序以及其内部寄存器的操作可以在网上查找,此处不作详述,用液晶屏幕实现静态显示温度的功能。整体电路如下上位机软件2.1前面板设计温度超过限定值或者低于限定值时,指示灯亮起,温度读取开关,用于串口的打开和关闭。后面板程序框图设计程序代码温度采集部分/*此部分为I2C总线驱动程序*/-I2C.c-#include #include #define nop _nop_
8、() sbit SCL=P21;sbit SDA=P20;bit ack;/*-start I2c-*/void Start_I2c(void)SDA=1;nop;SCL=1; nop;nop;nopnop;nop;SDA=0;/SDA to low ,send start flagnop;nop;nopnop;nop;SCL=0;nop;nop; /*-stop I2c-*/ void Stop_I2c(void) SDA=0; nop; SCL=1;nop;nop;nopnop;nop;SDA=1;/send stop flagnop;nop;nop;nop;/*-send byte-*/
9、void Send_Byte(unsigned char c) unsigned char Bitt; for(Bitt=0;Bitt8;Bitt+) if(cBitt)&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)
10、unsigned char receive; unsigned char Bitt; receive=0; SDA=1; for(Bitt=0;Bitt8;Bitt+) 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
11、;nop;nop;nop;nop;SCL=0;nop;nop;/*此部分为温度的读取部分*/-AD.c-#include#include 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;
12、/ADC Receive Byteunsigned 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=
13、200/77*(100*255/ADValue-100);/*此部分为LCD液晶显示模块*/-LCD.c-#include #include #include “AD.h”sbit rs= P26;/sbit rw = P25;sbit ep = P27;unsigned char code Tital = The temperature is;unsigned char Temperatureshow3;delay(unsigned char ms)/ unsigned char i;while(ms-)for(i = 0; i 250; i+)_nop_();_nop_();_nop_()
14、;_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_
15、();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_Writ
16、e_CMD (0x06);delay(1);Lcd_Write_CMD (0x01);delay(1);Void Lcd_Show()Unsigned char i;Lcd_Place(0);i = 0;while(Titali != 0)Lcd_Send_Byte(Titali);i+;Temperatureshow0=Temperature/100+0;Temperatureshow1=Temperature%100/10+0;Temperatureshow0=Temperature%10+0;Lcd_Place0x45;i = 0;while(Temperaturei != 0)Lcd_
17、Send_Byte(Temperatureshowi);i+;/*此处为串行口的通信部分*/-SCI.c-#include #include “AD.h”Void SCI_Init()SCON = 0x50;TMOD|= 0x20;PCON|= 0x80;/波特率倍增TH1 = 0xF3;/串口波特率9600TL1 = 0xF3;TR1 = 1;ES = 0;/禁止串口中断EA = 0;Void Send_Temperature()SBUF=Temperature;while(!TI);TI = 0;SBUF=Temperature8;while(!TI);TI = 0;/*以下为主函数*/-main.c-#include #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();