当前位置:文档之家› 温度采集与显示系统

温度采集与显示系统

温度采集与显示系统的设计:学号:摘要:由于人体不能精准的感受到环境中的温度,而温度采集系统能够准确、及时、全面地反映环境质量现状及发展趋势,因而本论文设计了基于8051单片机控制技术的温度采集与显示系统。

该系统通过温度传感器将检测到的温度信号转换成电压信号,该模拟量电压经8路AD0809输出数字量电压值送给单片机。

根据AD值与温度之间的关系利用查表和插值法得出温度值。

并且这些数值都能实时显示在显示屏上。

一、设计容及意义温度采集与显示系统在人们的日常生活中的应用越来越广泛,如花卉栽培温湿度控制、大棚温室控制系统、粮库温室控制系统、现代化居室温湿度控制等等。

随着半导体技术的不断发展,热敏电阻作为一种新型感温元件应用越来越广泛。

他具有体积小、灵敏度高、重量轻、热惯性小、寿命长以及价格便宜等优点。

单片机在测控系统中的作用是对信息进行处理、运算和发出控制命令等,但所要处理的信息是从外界拾取的,拾取的信号可以分为开关量和模拟量两种。

开关量只需放大、整形和电平转换等处理后,即可直接送入单片机系统。

但输入量如果是模拟量,处理的复杂程度就大增加了,由于模拟输入信号一般很微弱,需要进行放大,对于一个测控围较大的仪器,还要有多级可变放大电路。

另外,在放大有用信号的同时,干扰信号也被同时放大,还要进行必要的滤波处理。

所以要设计出一个真正实用的单片机测控系统,必须先设计好适用的前向通道。

根据被测对象输出信号的类型、大小、数量不同,前向通道的结构类型也各不相同。

本系统基于51单片机设计的温度采集与显示系统是A/D转换器、热敏电阻温度传感器、LCD显示屏及相应接口的综合应用。

二、整体设计原理及方案图2.1 整体系统框图该系统是以NTC型热敏电阻为传感器的信号采集端,将温度信号转换成电压信号,再经ADC0809进行模数转换,进一步将电压信号转换成单片机可以处理的00H~FFH数字信号,并保证温度与数字信号实时同步,经单片机8051进行数据处理(查表和线性插值法),再进一步转换成与实际温度相符合的数字信号,并在LCD显示屏上实时跟踪显示。

1、显示模块方案选择:方案一:数码管显示,采用动态扫描的方式。

优点是编程容易,硬件电路调试简单,显示两部分也比较好控制。

缺点是显示的容不够丰富,本系统需要实时显示电压AD值,放大后的十进制值以及温度值,实验台上提供的数码管数就达不到实时显示的效果。

方案二:用LCD液晶显示器显示,优点是功耗低,还能显示更多的字符,有着良好的人机界面,缺点是控制比较复杂。

实验台上提供的是OCMJ2*8的中文模块系列液晶显示器,含汉字字库和英文字库,可以实汉字、ASCII码的同屏显示,能够达到实时显示的效果。

2、AD0809设计AD0809型8位MOS型A/D转换器,可实现8路模拟信号的分时采集,片有8路模拟选通开关,以及相应的通道地址锁存用译码电路,其转换时间为100微秒左右。

图2.2 AD0809逻辑图由图2.2可知,该输出公式为:255⨯--=-+-REFREF REFIN V V V V AD (实验台上基准电压为5V )图2.3 AD0809时序图如图2.3,其工作过程是:1) 在IN0-IN7上可分别接上要测量转换的8路模拟量信号。

该系统只需要将热敏电阻温度传感器的电压输出端接IN0。

2) 将ADDA -ADDC 端给上代表选择测量通道的代码。

该系统选通通道0。

3)将ALE由低电平置为高电平,从而将ADDA-ADDC送进的通道代码锁存,经译码后通道0的模拟量送给部转换单元。

4)给START一个正脉冲。

当上升沿时,所有部寄存器清零。

下降沿时,开始进行A/D转换;在转换期间,START保持低电平。

5)EOC为转换结束信号。

在上述的A/D转换期间,可以对EOC进行不断测量,当EOC为高电平时,表明转换结束。

否则,表明正在进行A/D转换。

6)当A/D转换结束后,将OE设置为1,这时D0-D7的数据便可以读取了。

OE=0,D0-D7输出端为高阻态,OE=1,D0-D7端输出转换的数据。

3、数据处理部分----查表和线性插值法热敏电阻为一种阻值随温度变化的电阻,按其变化关系可分为两类:正温度系数(简称PTC)和负温度系数(简称NTC)。

PTC元件的阻值随温度的上升而上升,NTC元件的阻值随温度的上升而下降。

本模块中使用的为NTC 型热敏电阻,在常温(25℃)下其阻值为10K,其阻值与温度的关系、阻值与电压的关系、电压值与电压AD值得关系如下表所示:在上面列的表格中,温度与阻值的关系是已知的,电压是根据式3-1得出的,电压的AD值是根据式2-1得出的。

电压V与电压AD的关系:195)1000*(VAD (2-1)图2.4 电压AD 值与温度关系折线图根据图2.4可用线性插值法在线性区间建立函数关系,随着电压的改变输出温度值。

三、硬件电路图图3.1 热敏电阻温度采集电路图图3.1中J1、J2、J3分别对应于模块上的V1、Vzero 、Vout 插孔,R3对应与 ZERO 电位器,用于偏置电压调节;R9对应于GAIN 电位器,用于增益调节。

使用时,可先将电路增益调节为1,具体做法如下:调节ZERO 电位器,使Vzero=0V ,用万用表分别测量V1、Vout 端电压,调节GAIN 电位器,使V1=Vout ,此时电路增益为1。

由此可得出电压与电阻之间的关系:1015010110*52121+=+=+•=R R R R R VCC V (3-1)四、程序设计流程图图4.1 主函数程序流程图图4.2 LCD显示流程图图4.3 A/D转换流程图图4.3 中断服务程序五、问题和不足出现的问题及解决方法:在数据处理部分,之前是建立电压值V与温度值T的关系来显示温度,发现再怎么细分线性部分,输出的温度误差还是很大,而且显示的温度值一直在跳变。

于是决定找电压值AD与温度之间的关系,这样减小了误差,显示的温度值也几乎不再跳变了。

不足之处:实验台提供的可调输出电压的围是0-4.5V,正确来说显示的温度围应为-35C︒至90C︒。

这样选定的线性区间才能较小误差,更趋近与表格提供的数值。

所以,更细分的取线性部分得到的数值会更好。

六、总结通过此次实习,使我对所学知识进行了实践。

掌握了A/D转换芯片性能及编程方法、单片机系统中扩展LCD显示的方法以及温度传感器和LCD的工作原理及综合应用。

在数据处理部分学会了线性插值法。

在编写程序时,也发现对一些程序中的函数的处理不够合理,在自己的多次运行下,还是能够实现温度监控的功能。

本次单片机实训让我很有成就感,并对以前所学的单片机知识做了一个小结。

附件#include <reg51.h>#include <stdio.h>#include <intrins.h>#include <absacc.h>#define uchar unsigned char#define ulong unsigned long#define uint unsigned int#define Port_address XBYTE[0X0CFA0]sbit REQ=P3^5; //请求信号,高电平有效sbit BUSY=P3^4; //忙检测sbit EOC=P3^2;//转换结束信号,EOC=1-转换结束,EOC=0-正在转换void delay1ms(uint time) //延迟子程序1{uint ii;uint jj;for (ii=0;ii<time;ii++)for(jj=0;jj<200;jj++);}void delay(uint time) //延迟子程序2{uint ii;uint jj;for (ii=0;ii<time;ii++)for(jj=0;jj<110;jj++);}void write_dat(uchar dat) //OCMJ2X8写时序操作{if(BUSY==0){delay1ms(1);P1=dat;REQ=1;delay1ms(1);REQ=0;}}void write_chinese(uchar x,uchar y,uchar h,uchar l) //OCMJ2X8写汉字操作{write_dat(0xF0);//写汉字命令write_dat(x);//写横坐标(取值围:00-07,02-09,00-09)write_dat(y);//写纵坐标(取值围:00-01,00-03,00-04)write_dat(h);//写汉字码-高位write_dat(l);//写汉字码-低位}void write_ASCII_8x16(uchar x,uchar y,uchar a) //OCMJ2X8写ASCII字符(8x16)操作{write_dat(0xF9);//写ASCII字符(8x16)命令write_dat(x);//写横坐标(取值围:00-0F,04-13,00-13)write_dat(y);//写纵坐标(取值围:00-1F,00-3F,00-4F)write_dat(a);//写ASCII码}void write_point(uchar x,uchar y) //OCMJ2X8 画点(1x1)操作{write_dat(0xF2);//写画点命令write_dat(x);//写横坐标(取值围:00-7F,20-9F,00-9F)write_dat(y);//写纵坐标(取值围:00-40,00-40,00-40)}void clear_lcd() //OCMJ2X8 清屏操作{write_dat(0xF4);}void lcd_init(){REQ=0;BUSY=1;clear_lcd();}/********电压AD显示函数*******/void display_digit(uint date) //分离任意三位数,给LCD送数{uchar bai,shi,ge;bai=date/100;shi=date%100/10;ge=date%10;write_ASCII_8x16(0,16,0x41); //显示"AD"write_ASCII_8x16(1,16,0x44);write_ASCII_8x16(2,16,0x3A); //显示":"write_ASCII_8x16(3,16,0x30+bai);write_ASCII_8x16(4,16,0x30+shi);write_ASCII_8x16(5,16,0x30+ge);}/*******电压V显示函数*********/void display_voltage(uint date) //分离任意五位数,给LCD送数{uchar wan,qian,bai,shi,ge;wan=date/10000;qian=date%10000/1000;bai=date%10000%1000/100;shi=date%10000%1000%100/10;ge=date%10;write_chinese(0,0,18,41); //显示"采集电压"write_chinese(1,0,28,15);write_chinese(2,0,21,71);write_chinese(3,0,49,25);write_ASCII_8x16(8,0,0x3A); //显示":"write_ASCII_8x16(9,0,0x30+wan);write_ASCII_8x16(10,0,0x2E); //显示小数点write_ASCII_8x16(11,0,0x30+qian);write_ASCII_8x16(12,0,0x56); //显示电压符号V }/******温度值显示函数**********/void display_temperature(int date) //分离任意四位数,方便给LCD送数{uchar qian,bai,shi,ge;write_chinese(3,1,46,34);write_chinese(4,1,22,40); //显示"温度"if(date>=0){qian=date/1000;bai=date%1000/100;shi=date%1000%100/10;ge=date%10;write_ASCII_8x16(10,16,0x2b); //显示正号+ write_ASCII_8x16(11,16,0x30+qian);write_ASCII_8x16(12,16,0x30+bai);write_ASCII_8x16(13,16,0x2E); //显示小数点write_ASCII_8x16(14,16,0x30+shi);write_ASCII_8x16(15,16,0x30+ge);}if(date<0){date=-date;qian=date/1000;bai=date%1000/100;shi=date%1000%100/10;ge=date%10;write_ASCII_8x16(10,16,0x2d); //显示负号- write_ASCII_8x16(11,16,0x30+qian);write_ASCII_8x16(12,16,0x30+bai);write_ASCII_8x16(13,16,0x2E); //显示小数点write_ASCII_8x16(14,16,0x30+shi);write_ASCII_8x16(15,16,0x30+ge);}}/*****中断初始化函数*********/void config(void){IT0=1; //INT0下降沿中断EX0=1; //允许INT1中断EA=1;}void AD_init(void){Port_address=0x00; //虚写一次,启动通道0 }/***********AD转换函数**********/uchar AD(void){uchar ad_date; //保存经AD转换后的数据ad_date=Port_address;return ad_date; //返回数据}/*******温度处理函数***********/int deal_wendu(){int v,t;uint da;da=AD();v=da*195;if(da>=14&&da<=24){t=da*100-4400;}if(da>=24&&da<=39){t=67*da-3600;}if(da>=39&&da<=60){t=48*da-2800;}if(da>=60&&da<=86){t=38*da-2300;}if(da>=86&&da<=142){t=36*da-2100;}if(da>=142&&da<=167){t=40*da-2700;}if(da>=167&&da<=188){t=48*da-4000;}if(da>=188&&da<=209){t=da*59-5341;}if(da>=209&&da<=248){t=46*da-3341;}if(da>=248){t=15000;}return t;}void main(){int r=0;uint v,da;config(); //中断初始化lcd_init(); //显示屏初始化AD_init(); //启动通道0delay(700);clear_lcd();delay(700);write_chinese(0,0,46,34); //显示"温度采集系统"write_chinese(1,0,22,40);write_chinese(2,0,18,41);write_chinese(3,0,28,15);write_chinese(4,0,47,21);write_chinese(5,0,45,19);delay(700);clear_lcd();delay(700);while(1){if(r==0){da=AD();v=da*195;display_voltage(v);display_digit(da);display_temperature(deal_wendu());AD_init();}}}void int0(void) interrupt 0{int r=1;EX0 = 0;EX0 = 1;}。

相关主题