基于pt100热电阻的简易温度测量系统_第1页
基于pt100热电阻的简易温度测量系统_第2页
基于pt100热电阻的简易温度测量系统_第3页
基于pt100热电阻的简易温度测量系统_第4页
基于pt100热电阻的简易温度测量系统_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE40基于PT100热电阻的简易温度测量仪摘要:本文首先简要介绍了铂电阻PT100的特性以及测温的方法,在此基础上阐述了基于PT100的温度测量系统设计。在本设计中,是以铂电阻PT100作为温度传感器,采用恒流测温的方法,通过单片机进行控制,用放大器、A/D转换器进行温度信号的采集。通过对电路的设计,减小了测量电路及PT100自身的误差,使温控精度在0℃~100℃范围内达到±本文采用STC89C52RC单片机,TLC2543A/D转换器,AD620放大器,铂电阻PT100及液晶系统,编写了相应的软件程序,使其实现温度及温度曲线的实时显示。该系统的特点是:使用简便;测量精确、稳定、可靠;测量范围大;使用对象广。关键词:PT100单片机温度测量AD620TL431AbstractThisarticlebrieflydescribesthecharacteristicsofPT100platinumresistanceandtemperaturemeasurementmethod,onthebasisitdescribesthedesignoftemperaturemeasurementsystembasedonPT100.Inthisdesign,itisuseaPT100platinumresistanceastemperaturesensor,inordertoacquisitionthetemperaturesignal,ituseofconstant-currenttemperaturemeasurementmethodandusesingle-chipcontrol,Amplifier,A/Dconverter.Itcanstillimprovetheperformusedtwo-wiretemperaturecircuitandreducethemeasurementeror.Thetemperatureprecisionisreached±0.1℃between0℃~ThesystemcontainsSCM(STC89C52),analogtodigitalconvertdepartment(TLC2543),AD620amplifier,PT100platinum,LCD12864,writethecorrespondingsoftwareprogramtoachievereal-timetemperaturedisplay.Thesystemissimple,accurate,stableandwiderange.Keywords:PT100MCUTemperatureMeasuresAD620TL431目录前言 4第一章方案设计与论证 61.1传感器的选择 61.2方案论证 71.3系统的工作原理 81.4系统框图 9第二章硬件设计 92.1PT100传感器特性和测温原理 92.2硬件框图以及简要原理概述 112.3恒流源模块测温模块设计方案 112.4信号放大模块 122.5A/D转换模块 152.6单片机控制电路 182.7显示模块 19第三章软件设计 193.1系统总流程的设计 193.2主函数的设计 203.3温度转换流程图的设计 213.4显示流程图 213.5按键流程的设计 22第四章数据处理与性能分析 234.1采集的数据及数据处理 234.2性能测试分析 23第五章结论与心得 241结论 242心得 24附录1原理图 25附录2元器件清单 26附录3程序清单 27前言随着科技的发展和“信息时代”的到来,作为获取信息的手段——传感器技术得到了显著的进步,其应用领域越来越广泛,对其要求越来越高,需求越来越迫切。因此,了解并掌握各类传感器的基本结构、工作原理及特性是非常重要的。传感器主要用于测量和控制系统,它的性能好坏直接影响系统的性能。因此,不仅必须掌握各类传感器的结构、原理及其性能指标,还必须懂得传感器经过适当的接口电路调整才能满足信号的处理、显示和控制的要求,而且只有通过对传感器应用实例的原理和智能传感器实例的分析了解,才能将传感器和信息通信与信息处理结合起来,适应传感器的生产、研制、开发和应用。另一方面,传感器的被测信号来自于各个应用领域,每个领域都为了改革生产力、提高工效和时效,各自都在开发研制适合应用的传感器,于是种类繁多的新型传感器及传感器系统不断涌现。温度传感器是其中重要的一类传感器。其发展速度之快,以及其应用之广,并且还有很大潜力。为了提高对传感器的认识和了解,尤其是对温度传感器的深入研究以及其用法与用途,基于实用、广泛和典型的原则而设计了本系统。本文利用单片机结合温度传感器技术而开发设计了这一温度测量系统。文中将传感器理论与单片机实际应用有机结合,详细地讲述了利用热电阻作为温度传感器来测量实时的温度,以及实现热电转换的原理过程。本设计应用性比较强,设计系统可以作为温度测量显示系统,如果稍微改装可以做热水器温度调节系统、生产温度监控系统等等。本课题主要任务成环境温度检测并显示温度和实时的时间。设计后的系统具有操作方便,控制灵活移植性强等优点。本设计系统包括温度传感器,信号放大电路,A/D转换模块,数据处理与控制模块,温度、显示模块六个部分。文中对每个部分功能、实现过程作了详细介绍。整个系统的核心是进行温度测量与显示,完成了课题所有要求。第一章方案设计与论证1.1传感器的选择本设计目的是式设计一个测温系统。首先要考虑的就是温度传感器的选择。温度传感器从使用的角度大致可分为接触式和非接触式两大类,前者是让温度传感器直接与待测物体接触,而后者是使温度传感器与待测物体离开一定的距离,检测从待测物体放射出的红外线,达到测温的目的。在接触式和非接触式两大类温度传感器中,相比运用多的是接触式传感器,非接触式传感器一般在比较特殊的场合才使用,目前得到广泛使用的接触式温度传感器主要有热电式传感器,其中将温度变化转换为电阻变化的称为热电阻传感器,将温度变化转换为热电势变化的称为热电偶传感器。热电阻传感器可分为金属热电阻式和半导体热电阻式两大类,前者简称热电阻,后者简称热敏电阻。常用的热电阻材料有铂、铜、镍、铁等,它具有高温度系数、高电阻率、化学、物理性能稳定、良好的线性输出特性等,常用的热电阻如Pt100、Pt1000等。近年来各半导体厂商陆续开发了数字式的温度传感器,如DALLAS公司DS18B20,MAXIM公司的MAX6576、MAX6577,ADI公司的AD7416等,这些芯片的显著优点是与单片机的接口简单,如DS18B20该温度传感器为单总线技术,MAXIM公司的2种温度传感器一个为频率输出,一个为周期输出,其本质均为数字输出,而ADI公司的AD7416的数字接口则为近年也比较流行的I2C总线,这些本身都带数字接口的温度传感器芯片给用户带来了极大的方便,但这类器件的最大缺点是测温的范围太窄,一般只有-55~+125℃,而且温度的测量精度都不高,好的才±0.5℃,一般有±热电偶是目前接触式测温中应用也十分广泛的热电式传感器,它具有结构简单、制造方便、测温范围宽、热惯性小、准确度高、输出信号便于远传等优点。常用的热电偶材料有铂铑-铂、铱铑-铱、镍铁-镍铜、铜-康铜等,各种不同材料的热电偶使用在不同的测温范围场合。热电偶的使用误差主要来自于分度误差、延伸导线误差、动态误差以及使用的仪表误差等。非接触式温度传感器主要是被测物体通过热辐射能量来反映物体温度的高低,这种测温方法可避免与高温被测体接触,测温不破坏温度场,测温范围宽,精度高,反应速度快,既可测近距离小目标的温度,又可测远距离大面积目标的温度。目前运用受限的主要原因一是价格相对较贵,二是非接触式温度传感器的输出同样存在非线性的问题,而且其输出受与被测量物体的距离、环境温度等多种其它因素的影响。由于本设计的任务是要求测量的范围为0℃~100℃,测量的分辨率为±0.1℃,综合价格以及后续的电路,决定采用线性度相对较好的PT100作为本课题的温度传感器,具体的型号为WZP型铂电阻,该传感器的测温范围从-200℃~+650℃1.2方案论证温度测量的方案有很多种,可以采用传统的分立式传感器、模拟集成传感器以及新兴的智能型传感器。

方案一:采用模拟分立元件

如电容、电感或晶体管等非线形元件,该方案设计电路简单易懂,操作简单,且价格便宜,但采用分立元件分散性大,不便于集成数字化,而且测量误差大。

方案二:采用温度传感器

通过温度传感器采集温度信号,经信号放大器放大后,送到A/D转换芯片,将模拟量转化为数字量,传送给单片机控制系统,最后经过液晶显示温度。

热电阻也是最常用的一种温度传感器。它的主要特点是测量精度高,性能稳定,使用方便,测量范围为-200℃~6501.3系统的工作原理测温的模拟电路是把当前PT100热电阻传感器的电阻值,转换为容易测量的电压值,经过放大器放大信号后送给A/D转换器把模拟电压转为数字信号后传给单片机STC89C52RC,单片机再根据公式换算把测量得的温度传感器的电阻值转换为温度值,并将数据送出到液晶进行显示。1.4系统框图本设计系统主要包括温度信号采集单元,单片机数据处理单元,时间、温度显示单元。其中温度信号的数据采集单元部分包括温度传感器、温度信号的获取电路(采样)、放大电路、A/D转换电路。系统的总结构框图如图1-1所示。信号放大调理电路信号放大调理电路PT100温度传感器A/D转换电路复位电路按键控制电路STC89C52RC单片机液晶显示电路图1-1系统的总结构框图第二章硬件设计2.1PT100传感器特性和测温原理电阻式温度传感器(RTD,ResistanceTemperatureDetector)是指一种物质材料作成的电阻,它会随温度的改变而改变电阻值。PT100温度传感器是一种以铂(Pt)做成的电阻式温度传感器,属于正电阻系数,其电阻阻值与温度的关系可以近似用下式表示:在0~650℃Rt=R0(1+At+Bt2)(公式1)在-200~0℃Rt=R0(1+At+Bt2+C(t-100)t3)(公式2)式中A、B、C为常数,A=3.96847×10-3;B=-5.847×10-7;C=-4.22×10-12;由于它的电阻—温度关系的线性度非常好,因此在测量较小范围内其电阻和温度变化的关系式如下:R=Ro(1+αT),其中α=0.00392,Ro为100Ω(在0℃PT100温度传感器的测量范围广:-200℃~+650主要技术指标:1.测温范围:-200~650摄氏度;2.测温精度:0.1摄氏度;3.稳定性:0.1摄氏度Pt100是电阻式温度传感器,测温的本质其实是测量传感器的电阻,通常是将电阻的变化转换成电压或电流等模拟信号,然后再将模拟信号转换成数字信号,再由处理器换算出相应温度。采用Pt100测量温度一般有两种方案:方案一:设计一个恒流源通过Pt100热电阻,通过检测Pt100上电压的变化来换算出温度。方案二:采用惠斯顿电桥,电桥的四个电阻中三个是恒定的,另一个用Pt100热电阻,当Pt100电阻值变化时,测试端产生一个电势差,由此电势差换算出温度。两种方案的区别只在于信号获取电路的不同,其原理上基本一致。2.2硬件框图以及简要原理概述本电路通过电源模块给温度感应模块提供一个稳定的电源使其正常工作。再将温度感应模块产生的信号通过信号放大模块就行放大,最后将放大的信号送A/D转换。图2-1硬件框图2.3恒流源模块测温模块设计方案本电路是基于热敏电阻Pt100的温度检测电路,Pt100的电阻值会随着温度的变化而变化,故电源模块可设计一个横流源电路使得通过Pt100的电流恒定不变,这时当温度变化时Pt100的阻值发生变化,电压也就能发生相应的线性变化。只要通过对Pt100两端的电压进行处理就能测得外界环境的温度。图2-2恒流源电路及信号放大电路本电路中恒流源电路是基于TL431稳压集成电路设计的高精度恒流源,电路图如图2-2所示。当TL431两端接上电压后其参考极将输出稳定的2.5V的电压,但是TL431的阴极和阳极不能直接接在电压上所以需要串上一个电阻进行分压,本电路中使其串上1500Ω的电阻。当TL431的参考极和地端之间接上一个电阻时该之路的电流就是一个恒定的电流,这时再如图中所示接上一个处于放大区的三级管使其发射极和集极的电流近乎相等,这时通过连接在集极的Pt100热敏电阻的电流就是恒定值。由于通过Pt100的电流需要在1~1.5mA内,以及为了计算的方便,在本电路中理想情况下我们要使通过Pt100的电流约为1mA。2.4信号放大模块2.4.1P由于热敏电阻Pt100的电阻对温度的改变量比较小只有几十欧姆的变化(Pt100分度表如表一所示),所以其两端的电压差相对来说是一个很小的值,所以需要对该电压信号进行放大。表2-1一Pt100分度表2.4.2放大器AD620放大器的选择好坏对提高测量精度也十分关键,根据查阅的相关资料,在放大器电路精选中,一般在首级放大器有低噪声、低输入偏置电流、高共模抑制比等要求的大多采用自制的三运放结构,如下图2-3所示,三运放中由A1、A2构成前级对称的同相、反相输入放大器,后级为差动放大器,在这个结构图中,要保证放大器高的性能,参数的对称性与一致性显得尤为重要,不仅包括外围的电阻元件R1与R2、R3与R4、R5与R6,还包括A1与A2放大器的一致性,因此,要自制高性能的放大器对器件要求相当高。随着微电子技术的发展,市场上出现了专用的高性能的仪用放大器,它的内部核心结构还是三运放,但是,采用微电子来解决刚才的参数匹配问题已不是什么复杂的问题。图2-3三运放结构的高性能放大器原理图随着近年来微电子技术的发展,市面上出现了不少专用的高性能的芯片,AD620、AD623就是具有上述描述的三运放结构,在本设计中我们根据手中的元器件材料最终选择了AD620作为放大器电路的首级放大。AD620是低价格、低功耗仪用放大器,它只需要一只外部电阻就可设置1~1000倍的放大增益,它具有较低的输入偏置电流、较快的建立时间和较高的精度,特别适合于精确的数据采集系统,如称重和传感器接口,也非常适合医疗仪器的应用系统(如ECG检测和血压监视)、多路转换器及干电池供电的前置放大器使用。AD620的内部结构是由OP-07组成的三运放结构,性能大大优于自制的三运放IC电路设计,其基本接法是在1脚与8脚之间外接一RG电阻,增益由式G=1+49.4KΩ/RG确定,由于它的外围电路十分简单,所以它在本系统中的应用见下图2-4所示。由于我们的温度测量范围是0~100℃,而此时的温度传感器的电阻值根据分度表为100欧姆~138.51欧姆,由于我们设计的恒流源为5/3毫安,因此AD620的输入端为166.7毫伏,假设考虑我们的TLC2543的最大输入为5.000V,我们设计的放大器的增益在尽量保证分辨率的条件下,则为20倍,假设我们只用一个AD620,则AD620的输出为2V~5V(TLC只能转换5V),这样12位的A/D转换器的分辨率则大于题目的要求0.1图2-4放大电路2.5A/D转换模块2.5.1TLC2543简介在本设计系统中,为了将模拟量温度转换成数字量,采用德州仪器公司生产的12位开关电容型逐次逼近模数转换器TLC2543,它具有三个控制输入端,采用简单的3线SPI串行接口可方便地与微机进行连接,是12位数据采集系统的最佳选择器件之一。TLC2543与外围电路的连线简单,三个控制输入端为CS(片选)、输入/输出时钟(I/O

CLOCK)以及串行数据输入端(DATA

INPUT)。片内的14通道多路器可以选择11个输入中的任何一个或3个内部自测试电压中的一个,采样-保持是自动的,转换结束,EOC输出变高。2.5.2TLC2543的主要特性(1)11个模拟输入通道;

(2)66ksps的采样速率;

(3)最大转换时间为10μs;(4)SPI串行接口;

(5)线性度误差最大为±1LSB;

(6)低供电电流(1mA典型值);

(7)掉电模式电流为4μA。2.5.3

TLC2543引脚简介TLC2543的引脚排列如图2-5所示。图2-5TLC2543的引脚AIN0~AIN10:模拟输入端,由内部多路器选择。对4.1MHz的I/O

CLOCK,驱动源阻抗必须小于或等于50Ω。CS:片选端,CS由高到低变化将复位内部计数器,并控制和使能DATA

OUT、DATA

INPUT和I/O

CLOCK。CS由低到高的变化将在一个设置时间内禁止DATA

INPUT和I/O

CLOCK。DATA

INPUT:串行数据输入端,串行数据以MSB为前导并在I/O

CLOCK的前4个上升沿移入4位地址,用来选择下一个要转换的模拟输入信号或测试电压,之后I/O

CLOCK将余下的几位依次输入。DATA

OUT:A/D转换结果三态输出端,在CS为高时,该引脚处于高阻状态;当CS为低时,该引脚由前一次转换结果的MSB值置成相应的逻辑电平。EOC:转换结束端。在最后的I/O

CLOCK下降沿之后,EOC由高电平变为低电平并保持到转换完成及数据准备传输。

VCC、GND:电源正端、地。REF+、REF-:正、负基准电压端。通常REF+接VCC,REF-接GND。最大输入电压范围取决于两端电压差。I/O

CLOCK:时钟输入/输出端。TLC2543每次转换和数据传送使用16个时钟周期,且在每次传送周期之间插入CS的时序。根据TLC2543时序图可以看出,在TLC2543的CS变低时开始转换和传送过程,I/O

CLOCK的前8个上升沿将8个输入数据位键入输入数据寄存器,同时它将前一次转换的数据的其余11位移出DATA

OUT端,在I/O

CLOCK下降沿时数据变化。当CS为高时,

I/O

CLOCK和DATA

INPUT被禁止,DATA

OUT为高阻态。TLC2543与单片机的连接如图所示。A0A01A12A23A34A45A56A67A78A89GND10A911A1012R-13R+14/CS15DO16DI17CLOK18EOC19VCC20TLC2543VCC5VCLOKD1D0/CSA0图2-6TLC2543与单片机连接图2.6单片机控制电路本设计是采用STC89C52RC单片机作为主控电路,其中P1口为A/D转换器,P2.0,P2.1,P2.2为按键控制,P0为液晶数据端口,P2为液晶控制端口,用于对液晶进行控制。如图8所示。图2-7STC89C52RC单片机控制电路2.7显示模块本设计采用液晶12864来显示温度及温度曲线。其连线图如下:图2-8液晶显示第三章软件设计3.1系统总流程的设计本系统先进行初始化,然后PT100进行温度采集,然后经过放大,A/D采集后由单片机处理读到的数据,然后通过液晶显示温度及温度曲线。流程图如下:开始开始系统初始化PT100温度数据采集处理读到的数据显示温度及温度曲线结束图3-1系统总流程图3.2主函数的设计系统初始化,调用温度子程序,调用显示子程序,调用扫描按键程序,然后循环。流程图如下:开始开始系统初始化调用温度子程序调用显示子程序调用扫描按键程序图3-2主函数流程图3.3温度转换流程图的设计温度转换函数先行初始化,A/D转换开始工作,单片机将转换后的电压转换成温度。流程图如下:开始开始初始化函数A/D转换器进行A/D转换将转换后的电压转换为温度返回图3-3温度转换流程图3.4显示流程图主函数将数据写入12864,读取温度值。并显示温度及温度曲线。流程图如下:开始开始将温度数据写入12864液晶读取温度值显示温度值及温度曲线返回图3-4显示流程图3.5按键流程的设计图3-5按键流程图第四章数据处理与性能分析4.1采集的数据及数据处理表4-1采集的数据温度℃35.13942.145.1495569748093电压V3.443.463.513.543.593.673.833.863.964.09通过最小二乘法拟合的直线:Y=X*86.548-261.613(公式3)4.2性能测试分析做实际的电路板时为了调零的需要先将Pt100用100Ω的电阻来代替,模拟出一个外界温度为0℃的环境,以便于通过对电位器的调节使其输出电压为0V。先检查电路各个模块是否能正常工作,如T431的参考极的电压是否为2.5V,代替Pt100的100Ω电阻两端的电压是否是0.1V,通过对信号放大模块中的电位器的调节是否能正常影响信号放大模块和运放加减模块的输出电压。将电路板调试正常后,调节电位器使电路最终输出端的电压降到0V,但是在实际调节中输出电压调节到0.6V时就没有办法继续下调了,由于输出电压是随电位器的电压上升而下降的,故可能是和电位器串联的电阻R8设置得太小了。将100Ω电阻拆下换上Pt100热敏电阻进行实际测量,测得电压为2.1V,测得的温度为21℃,而这时用标准的温度传感器测得的温度也为21℃第五章结论与心得1结论根据电路板的测试结果表明电路工作正常,能实现设定的功能,达到指标要求,但是对低温的测量可能存在着较大的误差。2心得通过这次的课程设计我掌握了一些简单的设计过程和调试方法。在设计一个电路时可以先查阅相关资料,然后先确定电路中各个模块要实现的功能以及基本指标,再确定对各个模块中的器件的型号和常数,最后将各个模块联系起来再进一步进行调整。将设计好的电路放到仿真软件上进行仿真,观察电路以及各个模块能否按设定的状态工作,最终结果是否正确,将实际电路做出来后要进行调试,调试时可先测试最终的输出能否达到预想的结果,电路不能正常工作是要对电路的各个模块进行检查,可以和软件仿真调试时一样检查各个模块是否正常工作,找到工作不正常的模块后,对该模块的各个性能指标以及各点输入输出是否正确,然后分析可能产生错误的原因后再进行进一步的排查和调试。然后不断的重复以上对实际电路的调试过程,直到电路全部正常工作。在对各个模块进行检测时可先检测电源模块是否正常工作,因为很多错误都是电源部分出问题导致或可以影响并反映在电压部分上,如在这次的调试过程中发现大多数同学的电路出现问题都是电源的问题,要么是TL431烧坏了,要么是芯片烧坏了影响到了TL431的参考极的电压,导致电源部分异常。本电路可以检测TL431参考极的电压是否正确,发现不正确可先将芯片(尤其是做隔离网络模块的芯片)取出后检测参考极的电压是否正常,如果发现正常,说明很可能是芯片烧坏了,如果发现电压还是不正确,那很可能是TL431烧坏了,更换器件后再次检查电源部分是否正确,如果发现不正确再排查其他可能性。附录1原理图附录2元器件清单名称数量TL4311OP072AD6201TLC25431STC89C52RC1LCD128641510Ω210K11K16.8K120K110K电位器110uF1导线焊锡丝杜邦线若干附录3程序清单typedefunsignedcharuchar;typedefunsignedintuint;#include<reg52.h>#include"tlc2543.h"#include"key.h"#include"lcd_12864.h"#include"delay.h"ucharcodedis_buf1[]={"℃"};ucharcodedis_buf2[]={"当前水温:"};ucharcodedis_buf3[]={"按14号键温度曲线"};ucharcodedis_buf4[]={"按13号键显示温度"};ucharcodedis_buf5[]={"欢迎使用"};ucharcodedis_buf6[]={"PT100测温系统"};ucharcodedis_buf7[]={"按15号键返回"};floattemp,voltage;voiddisplay(){ lcd_init(); lcd_pos(0,2); str_dis(dis_buf5); lcd_pos(1,0); str_dis(dis_buf6); lcd_pos(2,0); str_dis(dis_buf4); lcd_pos(3,0); str_dis(dis_buf3);}voidtemp_dis(){ lcd_init(); lcd_pos(0,2); str_dis(dis_buf2); lcd_pos(1,5); str_dis(dis_buf1); lcd_pos(2,1); str_dis(dis_buf7); while(1) { voltage=read2543(1); //lcd_pos(0,4); //float_dis(voltage,3); lcd_pos(1,2); temp=voltage*86.548-261.613; float_dis(temp,1); delay_1ms(200); if(key_check()==1) { if(key_event()==15) { display(); return; } } } }voidcurve_dis(){ uchari,j; write_cmd(0x01); lcd_init_pic(); lcd_gdram_clear(); /*********建立坐标系*********/ Lcd12864_drawline_x(0,127,63,1); Lcd12864_drawline_y(0,0,63,1); Lcd12864_draw_dots(1,1,1); Lcd12864_draw_dots(1,2,1); Lcd12864_draw_dots(2,2,1); //Lcd12864_draw_dots(4,2,1); Lcd12864_draw_dots(126,62,1); Lcd12864_draw_dots(125,62,1); Lcd12864_draw_dots(125,61,1); //Lcd12864_draw_dots(126,62,1); /******************************/ for(i=0;i<127;i++) { voltage=read2543(1); temp=voltage*86.548-261.613; j=82-(uchar)temp; Lcd12864_draw_dots(i+1,j,1); delay_1ms(1000); } for(;;) { if(key_check()==1) { if(key_event()==15) { display(); return; } } } }voidmain(){ ucharkey_value; display(); while(1) { if(key_check()==1) { key_value=key_event(); switch(key_value) { case13:temp_dis();break; case14:curve_dis();break; default:break; } } }}typedefunsignedcharuchar;typedefunsignedintuint;#include<reg52.h>#include<intrins.h>#include"tlc2543.h"#defineM5sbitTLC2543_CLK=P2^0;sbitTLC2543_ADIN=P2^1;sbitTLC2543_DOUT=P2^2;sbitTLC2543_CS=P2^3;sbitEOC=P2^4;floatread2543(ucharport){ uchari,j,temp; uintad_value[M]={0}; floatad=0; temp=port; TLC2543_CS=1; for(j=0;j<M;j++) { TLC2543_CLK=0; TLC2543_CS=0; TLC2543_DOUT=1; EOC=1; port<<=4; for(i=0;i<12;i++) { TLC2543_ADIN=(bit)(port&0x80); TLC2543_CLK=1; if(TLC2543_DOUT) ad_value[j]|=0x01; _nop_(); _nop_(); _nop_(); TLC2543_CLK=0; _nop_(); _nop_(); _nop_(); port<<=1; ad_value[j]<<=1; } TLC2543_CS=1; ad_value[j]>>=1; port=temp; } for(i=0;i<M;i++) { ad=ad+ad_value[i]; } ad=ad/M; ad=ad*0.001221; //5.0/4095 returnad;}typedefunsignedcharuchar;typedefunsignedintuint;#include<reg52.h>#include<math.h>#include"lcd_12864.h"#include"delay.h"#definelcd_dataP0#defineA5sbitRS=P2^5; //命令数据选择端sbitRW=P2^6; //读写选择端sbitLCDEN=P2^7; //使能端ucharcodedis_buf[]={"0123456789."};voidread_busy(){ //lcd_data=0xff; RS=0; RW=1; LCDEN=1; while(lcd_data&0x80); LCDEN=0;}voidwrite_cmd(ucharcmd) //液晶写命令函数{ read_busy(); RS=0; //写命令开 RW=0; //写开 //LCDEN=0; lcd_data=cmd; //写命令 LCDEN=1; //给个脉冲 delayUs2x(1); LCDEN=0;}voidwrite_data(uchardat) //液晶写数据函数{ read_busy(); RS=1; RW=0; //LCDEN=0; lcd_data=dat; LCDEN=1; delayUs2x(1); LCDEN=0;}voidlcd_init(){write_cmd(0x30);delay_1ms(1);write_cmd(0x0c);//显示开,关光标delay_1ms(1);write_cmd(0x01);//清除LCD的显示内容delay_1ms(1);}voidlcd_init_pic(){write_cmd(0x36);//扩充指令操作//delay_1ms(1);write_cmd(0x0c);//显示开,关光标//delay_1ms(1);write_cmd(0x01);//清除LCD的显示内容//delay_1ms(1);}ucharReadByte(void) //读数据{uchara;read_busy();lcd_data=0xff;RS=1;RW=1;//LCDEN=0;LCDEN=1;a=lcd_data;LCDEN=0;returna;}voiddisplay_bmp(uchar*address){ uchari,j; for(i=0;i<32;i++) { write_cmd(0x80+i); //送垂直地址 write_cmd(0x80); //送水平地址 for(j=0;j<16;j++) { write_data(*address); address++; } } for(i=0;i<32;i++) { write_cmd(0x80+i); //送垂直地址 write_cmd(0x88); //送水平地址 for(j=0;j<16;j++) { write_data(*address); address++; } }}voidLcd12864_draw_dots(ucharx,uchary,ucharcolor){ ucharRow,xlabel,xlabel_bit; ucharRead_H,Read_L; write_cmd(0x34); write_cmd(0x36); xlabel=x>>4; //x/16 xlabel_bit=x&0x0f; //x%16 if(y<32) Row=y; //上半屏 else { Row=y-32; //下半屏 xlabel+=8; } write_cmd(Row+0x80); //送垂直地址 write_cmd(xlabel+0x80); //送水平地址 ReadByte(); //须先读一个字节 Read_H=ReadByte(); Read_L=ReadByte(); write_cmd(Row+0x80); write_cmd(xlabel+0x80); if(xlabel_bit<8) //修改高位 { switch(color) { case0:Read_H&=(~(0x01<<(7-xlabel_bit)));break; //若变白 case1:Read_H|=(0x01<<(7-xlabel_bit));break; //若涂黑 case2:Read_H^=(0x01<<(7-xlabel_bit));break; //若反转 default:break; } write_data(Read_H); write_data(Read_L); } else //修改低位 { switch(color) { case0:Read_L&=(~(0x01<<(15-xlabel_bit)));break; //若变白 case1:Read_L|=(0x01<<(15-xlabel_bit));break; //若涂黑 case2:Read_L^=(0x01<<(15-xlabel_bit));break; //若反转 default:break; } write_data(Read_H); write_data(Read_L); } write_cmd(0x30);}voidLcd12864_drawline_x(ucharx0,ucharx1,uchary,ucharcolor){ uchartemp; if(x0>x1) { temp=x0; x0=x1; x1=temp; } for(;x0<=x1;x0++) Lcd12864_draw_dots(x0,y,color);}voidLcd12864_drawline_y(ucharx,uchary0,uchary1,ucharcolor){ uchartemp; if(y0>y1) { temp=y0; y0=y1; y1=temp; } for(;y0<=y1;y0++) Lcd12864_draw_dots(x,y0,color);}voidLcd12864DrawLine_f(ucharStartX,ucharStartY,ucharEndX,ucharEndY,ucharColor){ intt,distance; /*根据屏幕大小改变变量类型(如改为int型)*/ intx=0,y=0,delta_x,delta_y; charincx,incy; delta_x=EndX-StartX; delta_y=EndY-StartY; if(delta_x>0) { incx=1; } elseif(delta_x==0) { Lcd12864_drawline_y(StartX,StartY,EndY,Color); return; } else { incx=-1; } if(delta_y>0) { incy=1; } elseif(delta_y==0) { Lcd12864_drawline_x(StartX,EndX,StartY,Color); return; } else { incy=-1; } delta_x=abs(delta_x); delta_y=abs(delta_y); if(delta_x>delta_y) { distance=delta_x; } else { distance=delta_y; } Lcd12864_draw_dots(StartX,StartY,Color); /*DrawLine*/ for(t=0;t<=distance+1;t++) { Lcd12864_draw_dots(StartX,StartY,Color); x+=delta_x; y+=delta_y; if(x>distance) { x-=distance; StartX+=incx; } if(y>distance) { y-=distance; StartY+=incy; } }}voidlcd_gdram_clear(){uchari,j; write_cmd(0x34);write_cmd(0x34);for(j=0x80;j<0xA0;j++){ write_cmd(j); //设置垂直地址write_cmd(0x80);//设置水平地址for(i=0;i<32;i++){ write_data(0x00); }}}voidlcd_pos(ucharx,uchary) //液晶操作位置定位{ switch(x){ case0:write_cmd(0x80+y);break; case1:write_cmd(0x90+y);break; case2:write_cmd(0x88+y);break; case3:write_cmd(0x98+y);break; default:break; }}voidstr_dis(uchar*p){while(*p>0){write_data(*p);p++;}}voidfloat_dis(floatnumber,ucharcnt)//cnt为小数点后保留位数{ //num数 cnt小数位 浮点数显示chari=0,cheak=1,dis[A]; longnum; for(i=0;i<cnt;i++) { number=number*10.0; } num=(long)(number);for(i=0;i<A;i++) //拆分bcd{ dis[i]=num%10;;num=num/10;}for(i=A-1;i>cnt;i--) //灭零{if(dis[i]==0) dis[i]=11; else break;}for(i=A-1;i>=0;i--) //逐个显示{if((i==cnt-1)&&(cheak==1)){write_data('.');i++;cheak=0;}else write_data(dis_buf[dis[i]]);}} typedefunsignedcharuchar;typedefunsignedintuint;#include<reg52.h>#include"delay.h"voiddelayUs2x(uintdelay1us){ uintj; for(;delay1us>0;delay1us--) for(j=20;j>0;j--);}voiddelay_1ms(uintz){ uinti,j; for(i=z;i>0;i--) for(j=110;j>0;j--);}typedefunsignedcharuchar;typedefunsignedintuint;#include<reg52.h>#include"key.h"#include"delay.h"#defineKeybordP1ucharcodeBuffer[4]={0xfe,0xfd,0xfb,0xf7};ucharkey_check(void) //按键检测函数,有键按下时置返回1,无键按下返回0{ ucharflag;// uchartemp; Keybord=0xf0;// temp=Keybord; if(Keybord!=0xf0) { delay_1ms(15); //按键消抖 if(Keybord!=0xf0) { flag=1; } else flag=0; } else flag=0; returnflag;}ucharkey_event(void) //取键值函数,并将键值通过key_value返回{ uchari,j,temp,key_value; for(j=0;j<4;j++) { Keybord=Buffer[j]; temp=0x10; //00010000 for(i=0;i<4;i++) { if(!(Keybord&temp)) { key_value=i+j*4; while(!(Keybord&temp)); break; } temp<<=1; } } returnkey_value;} 目录第一章总论 11.1项目背景 11.2项目概况 31.3结论与建议 6第二章改造的意义和必要性 82.1项目实施的背景 82.2项目实施的意义和必要性 8第三章改造方案 123.1技改前情况 123.2改造方案 12第四章场址方案 144.1场址所在位置现状 144.2场址建设条件 14第五章技术方案、设备方案与工程方案 185.1技术方案 185.2主要设备方案 265.3工程方案 28第六章主要原材料、燃料供应 296.1主要原材料供应 296.2燃料供应 29第七章总图运输与公用辅助工程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论