学位论文—基于电容充放电技术的温度测试.doc
基于电容充放电技术的温度测试摘要:温度是与人们的生产生活密切相关的物理量之一,目前有多种温度测量方法,如:玻璃温度计测温、半导体测温、热敏电阻测温、红外辐射测温、铂电阻测温以及热电偶测温等等,根据不同的测温精度及温度范围,可选用不同的测温方式。本文采用一种没有ADC模块的模拟量检测方法,通过编写程序控制单片机的通用输入输出口、定时器等模块协同工作,通过捕捉电容充电时间确定当前的热敏电阻阻值,并通过查表实现温度测量。系统实现了060范围内的温度测量,设计的温度计具有低成本、高精度的特点,应用前景较为广阔。关键词:温度;热敏电阻;单片机;电容;系统A Novel Thermometer Based on the Capacitive Charging and Discharging TechnologyAbstract:The temperature is a physical quantity closely related with people's production and life, resulting in a variety of temperature measurement method, a glass thermometer temperature sensor, semiconductor temperature sensor, NTC thermistor temperature sensor, infrared radiation temperature sensor, platinum resistance temperature measuring and thermocouple thermometer, etc. With the different temperature precision and temperature range, we can select different ways of measuring temperature. An analogue test method without ADC module is introduced in this paper, which makes input, output and timer module of MCU work collaboratively by programming, determines the current resistance of thermistor by calculating charge-time of capacitor, and achieve temperature measurement by looking up to table.This System achieves the temperature measurement which ranges from 0 to 60, and the design of thermometer has characteristics of low cost and high precision, which can be widely used in the future.Keywords: AVR MCU; Temperature; Thermistors; SCM; Capacitor; system II目 录摘要IAbstractII1 引言11.1 选题背景与选题意义11.2 本文任务11.3 本文的结构22 测量方法的原理32.1 方案的比较32.2 基于电容充放电技术的温度测量原理42.2.1 测量原理42.2.2 电路说明42.2.3 电容的参数选择52.3 电路的性能及其功能63 系统硬件设计73.1 系统设计的系统框图73.2 各功能模块设计及其实现73.2.1 单片机的复位电路73.2.2 数码管的显示电路83.2.3 温度采集电路93.2.4ISP下载电路113.2.5电源电路124 系统软件设计134.1 主函数134.2 延时子程序154.3 数码管显示程序154.3.1 数码管显示编程的原理154.3.2 数码管显示的程序164.3.3 数码管位的读取184.4 端口设置程序184.5 温度信号采集程序205 实物的调试与误差分析235.1 硬件的调试235.2 温度的误差分析236 体会与展望256.1 总结与体会256.2 设计前景25参考文献27致谢281 引言1.1 选题背景与选题意义人民的生活与环境都与温度息息相关,在信息时代高速发展的今天,随着科学技术水平的不断提高,温度测量技术也得到了不断的发展。现在温度测量的方法有很多,也有很多分类,由于测量原理和测量方法的多样性,很难找到一种完全理想的分类方法。我们大家都知道温度是表征物体冷热程度的物理量,而测量温度的标尺就是温度计,其按照测量方式可以分为接触式和非接触式两种。通常来说的接触式测量仪表比较简单、可靠,测量精度较高,但是因为测温元件与被测介质需要进行充分的热交换,所以其需要一定的时间才能达到热平衡,所以,存在测温延迟现象,同时受耐高温和耐低温材料的限制,不能应用于这些极端的温度测量1;非接触式仪表测温仪是通过热辐射的原理来测量温度的,测温元件不需要与被测介质接触,测温范围广,不受测温上限的限制,也不会破坏被测物体的温度场,反应速度一般也比较快;但受到物体发射率、测量距离、烟尘和水汽等外界因素的影响,其测量误差较大。虽然目前的测温方法多种多样,但是为了寻找一种既经济又有效的测温方式,我选择了用电容充放电来实现温度的测量,现在单片机的内部集成的已经越来越高了。ADC就是最早整合到芯片上的一项功能,但是市场的激烈竞争,让我们想尽办法去节省、节省、在节省,用不带ADC功能的单片机实现ADC功能的模拟量检测2;这种方法虽然已经成熟,但是对于这一方法的灵活运用,在生产的过程中,会给商家带来不菲的经济效益。在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机ATMEGA16,测温电阻使用热敏电阻,用4位共阴极LED数码管实现温度显示,能准确达到以上要求。单片机有体积小、功耗低、性价比高。易于推广应用等显著特点,在自动化装置、智能表仪器仪表、过程控制和家用电器等领域得到广泛的应用。应用单片充当主控器来再加上适量的外围实现此功能,且单片机价格便宜,性能稳定。应用的外围器件相对较少,这就提高了系统的稳定性,且单片机控制简易,开发工具简单,很容易大批量生产。1.2 本文任务要求利用无ADC模块的电路,来检测温度模拟量,达到和ADC模块相同的结果,并通过编写程序来控制单片机的通用输入输出口、定时器等模块协同工作,实现温度信号的数字化测量。主要参数要求:(1)开机自动复位。 (2)利用热敏电阻测量当时的室温。 (3)测量范围为060,精度为±1 (4)用四位共阴数码管显示当前温度值。1.3 本文的结构第一章主要介绍了此设计的历史背景和选题的意义,以及本文的任务要求。第二章主要叙述设计的测量方案原理。第三章主要写系统的硬件实现的过程,即如何将单片机,热敏电阻和显示屏结合在一起以达到设计目标。第四章主要分析编程过程。第五章主要对硬件的调试及误差分析。第六章是对本设计的总结与对本设计未来的期望。2 测量方法的原理2.1 方案的比较方案一由于本设计是测温电路,可以考虑用温度传感器来实现,在单片机电路的设计中,大多数的设计都是使用传感器来完成的,所以这是非常容易想到的,我们可以采用一只温度传感器DS18B20,虽然此传感器可以很容易的直接读取被测温度值,并进行转换,但是从价格角度考虑,这种方案的成本比较高。方案二另外,测温电路还可以用AD590单片集成感温电流源,再利用热敏电阻负温度系数的特性构建出测温电路,并通过STC12C5410AD单片机,内部自带 10位8路的AD转换模块,可以把测量电路输出的电压值通过AD模块转化为数字量,最后通过数码管显示出来,不过这样的成本就会大大的上升,我们要寻找一种既经济又有效的方案。方案三还可以使用热敏电阻之类的器件利用其感温效应,将温度的变化反应为电压或电流的变化,然后又经过A/D电路转换,最后由单片机进行数据处理3;经过论证这种方案虽然可行,但是还是用到了ADC模块,不符合本文所要讲述的一种无需A/D模块的新方法的内容。方案四可以考虑使用温度传感器MAX6675+AT89C52,MAX6675将热电偶测温应用时复杂的线性变化、冷端补偿及数字化输出等问题集中在一个芯片上解决,简化了热电偶测温的方案应用于嵌入式系统领域时复杂的软硬件设计,不过热电偶测温方案是应用于嵌入式系统领域的理想选择,我们的测温电路要应用的更加广泛与普及,所以热电偶的方法还不是本文所要找到的最理想的方法。方案五 进而考虑到可以单独的使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化充电的时间通过编程计数来实现,并进行近似的线性处理,累加时间这些都可以用单片机进行数据的处理,再显示电路上,就可以将被测温度显示出来,这种设计只需要用软件编程就可以轻松的实现,电路也比较容易实现。从以上五种方案,很容易看出,采用方案五,电路比较简单,软件设计也比较方便,故采用了方案五。2.2 基于电容充放电技术的温度测量原理对于热敏电阻模拟信号的检测,我们可以通过对电容充电,把电阻值转化为时间值,并对该时间进行检测和计算,从而获得电阻值或其他我们需要的结果。本文以下将介绍温度检测的具体方法。2.2.1 测量原理我们知道,当我们对RC电路进行充电(参见图2-1)时,如果电压、电容都不变化,而且RC的时间常数又足够大,那么我们就可以认为电阻之比等于充电时间之比。(2.1)在公式(2.1)中,k代表电阻比率。这个公式就是本文所做的设计要用到的理论基础,在该公式中有四个参数,其中和是可以通过单片机的计时器测量出来的。剩下的两个电阻值参数,我们假设其中一个为参考电阻(电阻值已知),我们通过计算就可以很容易地求出另一个被测电阻的阻值。图2-1电容充电曲线2.2.2 电路说明为了实现这个电阻测量的功能,我们需要使用单片机的两个三态I/O口。我们需要求这些I/O口在作为输出端口时,能够提供足够的充/放电电流;而在作为输入端口时,能够对外表现出高阻特性(漏电流越小也好)。许多系列的单片机都满足这些要求,典型的如PIC、AVR等等。另外我还需要CPU内部的计数器,用于检测热敏电阻对电容充电时间的计时。并通过时间的不同输出我们想要测得的温度值。图2-2温度检测电路图2.2.3 电容的参数选择电容值可以按照固定公式计算。另外,实际选用的电容值应该比计算结果稍微小一些。确保测量最大电阻时,计时器不会溢出。(2.2)Ø T为完成额定位数的A/D转换所需的时间;Ø 为最大可能的测量电阻;Ø 为I/O口门限电压;Ø 为参考电压。图2-3电容充/放电波形2.3 电路的性能及其功能该电路可以消除失调、增益、电容、电源电压和温度等因素带来的误差。该电路无法消除因参考电阻、电阻和电容非线性度、I/O引脚漏电、I/O引脚输入门限不定度和单片机定时测量不定度等因素造成的误差。温度测试系统的功能主要有数据采集、数据处理、输出当前的温度值。能对060范围内的各种温度进行测量,同时,四位LED显示器直接显示出当前的温度值,准确度高,显示清晰,稳定可靠,使用方便等特点。这个结果的精度,可以控制在±1%以内。这在一些日常的温度检测功能应用中已经可以满足人们的需求了。3 系统硬件设计3.1 系统设计的系统框图Atmega16单片机单片机复位电路ISP下载电路数码管显示电路RC充放电电路电源电路时钟电路图3-1总体设计方框图本系统采用的是Atmega16单片机,它的内部带有8M经过标定的、可校正的RC振荡器,这个振荡源可作为系统时钟使用,系统上电后自动复位,通过ISP下载电路可直接对单片机进行程序的下载功能,还可通过四位共阴极的数码管显示电路显示温度值。根据系统的设计要求,当单片机上电后,首先对电容两端的电压值进行充分的放电,然后对单片机端口进行方向的设置,连接热敏电阻的端口设置输出,连接普通电路端口的设置为输入,然后开始对电容进行充电,当电容两端的电压值达到单片机端口的门限电压值的时候,输入端口的电压将变成高电平,这就改变了输入端口的方向,此时标志着充电的结束,充电计时的程序将充电所得到的时间发送到ATmega16单片机内部,经ATmega16分析处理,查表找到当时的充电时间所对应的热敏电阻的阻值,然后将这个阻值所对应的温度计算出来,最后将这个温度值发送给单片机与显示器连接的端口,将把温度显示在数码管显示电路上。3.2 各功能模块设计及其实现3.2.1 单片机的复位电路复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,再撤销复位信号。为可靠起见,电源稳定后还需要经一定的延时才可撤销复位信号,这是为了以防电源开关或电源插头分-合过程中引起的抖动而影响复位4。图1是复位电路的原理图图3-2 复位电路的原理图为确保微机系统中电路的稳定并可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位。一般微机电路正常工作需要供电电源为5V±5%,即4.755.25V。由于微机电路是时序数字电路,它需要稳定的时钟信号,因此在电源上电时,只有当VCC超过4.75V低于5.25V以及晶体振荡器稳定工作时,复位信号才被撤除,微机电路开始正常工作。3.2.2 数码管的显示电路数码管电路图如下图3-3 数码管的显示电路原理图在整个系统数码管的显示电路中,将显示电路与单片机连接的端口设为输出,通过1K的电阻连接到数码管的八位段选位上,并通过设置另外的四个端口输出的高低电平情况,控制三极管的导通与截止,经过三极管的导通截止是为了确保数码管的片选端是分别有效的,来决定数码管各个位的亮灭情况。三极管的射极接地,三极管的基极经过4.7K电阻连接在单片机上,三极管的集电极连接到数码管的位选管脚上,当基极给出一个高电平的时候,三极管导通片选端的电平瞬间变低,由于数码管的片选端低电平有效,所以这个位的数码管被选中,数码管接到单片机发出的段选信号,并显示当前的数字,因为本系统采用的是动态显示,所以数码管真实的情况是在轮流的点亮和熄灭,这是因为闪烁的频率比较高,已经超出人眼所能接受的范围,给人的感觉就好像是所有的数码管被同时点亮。3.2.3 温度采集电路为了实现热敏电阻测量温度的功能,我们需要使用单片机的2个三态I/O口。我们要求这些I/O口在作为输出口时,能够提供足够的充/放电电流;而在作为输入口是,能够对外表现出高阻特性(漏电流越小越好)。而ATmega16单片机就能满足这些要求,另外我们需要一个定时器对充电时间计时。在测量温度的电路实现中,大多数的测量都是用DS1820专用的温度传感器来完成的,这里由于成本的关系,现用普通的热敏电阻测量,热敏电阻是利用对温度敏感的半导体材料制成的,其阻值随温度的变化有比较明显的改变,这里采用的是负温度系数的热敏电阻,其特点是,在工作温度范围内,电阻值随着温度的升高而降低、灵敏度高、响应快。当温度大幅上升的时候,电阻值可下降35个数量级。具体的设计方案如下所示:利用单片机I/O口的门槛判别电压来检测由热敏电阻构成的RC电路的充放电时间,从而间接达到测温目的的简单廉价温度测量仪器。电子温度计包括三个部分:其一,热敏电阻阻值测量。其二,计算热敏电阻相应阻值下所对应的充电时间。其三,显示部分,可根据要求精度,选取不同位数的数码管。RC测温电路如下图:图3-4 温度信号采集电路原理图其中电阻R8是标准电阻,用来和热敏电阻对电容充电并比较,当C5的电压值等于PB0端口的端口电压时,R8所连接的端口方向将随之改变,R9是热敏电阻,主要特性是能根据环境温度的大小改变自身的阻值,电容C5的作用是让充电电压缓慢上升或下降。由以上的测温电路可知,通过热敏电阻R9对电容充电,直到放电电压上升到单片机I/O口门槛判别电压时,即时,这时电容C5电压值被充满,记录这段充电时间。当计算出热敏电阻当前的阻值R9所对应的充电时间后,可根据热敏电阻厂家提供的温度阻值对照表进行进行查表计算,如果要求大范围的温度检测时,用上面的方法显的非常困难而繁琐,不但代码冗长,而且精确度还很低,所以这里提供一个差值查表的计算方法,不但可以减少代码冗余长度,而且可以达到很高的精度效果,其原理是把要测量的温度范围分隔成若干段(例如,每隔5度分为一段),分段的数量要看系统的精度要求而定,把每一段近似看做一个直线,通过每一段的上限温度阻值和下限温度阻值之差与每一段中包括的温度点数(如5个温度点)之比,求得这个段的直线斜率:(3.1)再求出当前热敏电阻阻值在这一段的差值由式(3.2)可见,到此可以根据斜率K和差值R计算出当前温度在这一段中的温度由式(3.3)可见,最后把这个计算出来的温度加上这个段的温度值即为当前温度值由式(3.4)可见。(3.2)(3.3)(3.4)温度的检测步骤:l 设置端口方向l 对电容进行充分放电l 更改端口方向l 对电容进行充电l 记录充电的时间l 计算电阻比率电阻比率公式:(3.5)l 查表求温度值表3-1NTC分度表 /= T的单位是、R单位是TRTR027.3720356.9424522.1167405.82651017.9810454.91241514.7050504.15992012.0938553.53772510.0000603.0208308.31153.2.4ISP下载电路ISP(In-System Programming)在线系统可编程,指电路板上的空白器件可以通过编程写入用户编写的最终代码,而不需要从电路板上取下器件,已经下载好控制程序的器件也可以用ISP方式擦除或再编程。图3-5ISP下载电路ISP技术是未来发展方向。In-System Programming是一种无需将存储芯片(如EPROM)从设计的系统设备上取出就能对其进行可编程的过程,缩略为ISP5;在线系统编程需要在目标板上有额外的电路完成编程任务。ISP技术的优势是不需要编程器就可以进行单片机的实验和开发,单片机芯片可以直接焊接到电路板上,经过电路调试成功即可成为成品,免去了调试时由于频繁地插入取出芯片对芯片的管脚和电路板的可靠性带来的不可预知的损坏。ISP的工作原理ISP的功能实现相对要简单一些,一般通用的做法是将存储器的内部可以由上位机的软件通过串口来进行改写。对于单片机来讲可以通过SPI或其它的串行接口接收上位机传来的数据并写入存储器中。所以即使我们将芯片焊接在电路板上,只要留出和上位机接口的这个串口端口,就可以实现芯片内部存储器的改写,而无须再取下芯片。3.2.5电源电路7805系列集成稳压器的典型应用电路如下图所示,这是一个输出正5V直流电压的稳压电源电路。IC采用集成稳压器7805,C3、C4分别为输入端和输出端滤波电容,RL为负载电阻。当输出电较大时,7805应配上散热板。图3-6电源电路在电子设计中,常见的三端稳压集成电路有正电压输出的78 ×× 系列和负电压输出的79××系列。顾名思义,三端IC是指这种稳压用的集成电路,只有三条引脚,分别是输入端、接地端和输出端。它的样子象是普通的三极管。 用78/79系列三端稳压IC来组成稳压电源所需的外围元件极少,电路的内部还有过流、过热及调整管的保护电路,使用起来可靠、方便,而且价格便宜6;该系列集成稳压IC型号中的78或79后面的数字代表该三端集成稳压电路的输出电压,如7806表示输出电压为正6V,7909表示输出电压为负9V。因为三端固定集成稳压电路的使用方便,电子制作中经常采用。124 系统软件设计4.1 主函数日常生活中,要完成一件复杂的事情,我们可以将这个事情称之为功能,我们总是习惯把“大功能”分解为多个“小功能”来实现它的最终效果7;在系统的软件设计中,“功能”可以称呼为“函数”,而在系统的软件设计中,函数是实现特定的功能的一个个体,每个函数只实现它的一个特定的功能,因为要实现所有函数的功能的时候,不可以随意的调度,这就要求我们就需要一个总指挥来调度这些特定的功能函数,所以主函数是这个系统设计软件中的核心部分,它的主要功能是系统的复位,温度的实时显示,读出并处理热敏电阻对电容充电的时间,和查找到这个电阻阻值需要充电的时间所对应的温度值,归根到底就是调度那些具有特定功能的函数,让其有序的实现它们的功能,而本设计的最终结果是将测得的温度值显示在数码管上。Y N 开始初始化复位电路显示初始化电容充分放电电容充电初始化判断管脚电平继续充电查找时间显示温度值图4-1主函数流程图程序开始,单片机的PC口和PD口分别于数码管的段选端和片选端连接,首先要对这两组端口进行方向的设置,对于ATmega16来说,端口电平为高电平时即为输出,所以将这两个端口的电压值都设置为高电平:DDRC = 0xff;DDRD = 0xff;然后对电路中的电容进行充分的放电,放电结束之后对电容进行充电,充电的前提是将一个端口设为输入一个设为输出,而输入端口的方向变化就标志着充电时间的结束,首先设置一个变量p,当p=0时计时程序继续,当充电结束p=1,计时结束,然后将所记的时间与已知的表进行比对,找到当前的充电时间所对应的温度值,最终显示在数码管上。程序如下:int main( void )/主函数DDRC = 0xff;/设置C口高四位为输出DDRD = 0xff;/设置D口为输出while(1)discharge();/充分的放电charge();/充电程序if(p = 0)time+;if(PINB &(1 << 4)= 0x10)p=1;res();qbsg();display();4.2 延时子程序应用单片机的时候,经常会遇到需要短时间延时的情况8。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,这种情况下,用计时器来实现往往有点小题大做。而在极端的情况下,计时器甚至已经全部被派上了别的用途。这时就需要我们另想其他的可实现的办法了。对于延时的方法,有硬件延时和软件延时两种,以下是一个误差不是很大的延时一毫秒的软件延时方法:void delay(uint ms)/延时一微秒的程序uint i;for(i=0;i<ms;i+)_delay_loop_2(FRQ*250-1);这个程序是以毫秒为单位执行的延时任务。其中FRQ为系统震荡频率(以MHz为单位)。4.3 数码管显示程序4.3.1 数码管显示编程的原理LED数码管的ag再加上dp八个发光二极管9;加正电压的发光,加零电压的不能发光,不同亮暗的组合就能形成不同的字型,这种组合我们把它称之为字段码。共阳极和共阴极的字段码是互不相同的,对于同一个数字或字符,共阴极的连接方式和共阳极的连接方式的字段码也是不一样的,一般情况下共阴极和共阳极的字段码互为反码,常见的数字和字符的共阴极和共阳极的字段码如下表所示。表4-1数码管的字段显示段字符十六进制代码dpgfedcba共阴极共阳极0001111113FHC0H10000011006HF9H2010110115BHA4H3010011114FHB0H40110011066H99H 续表4-1显示段字符十六进制代码dpgfedcba共阴极共阳极5011011016DH92H6011111017DH82H70000011107HF8H8011111117FH80H9011011116FH90HA0111011177H88Hb011111007CH83HC0011100139HC6Hd010111105EHA1HE0111100179H86HF0111000171H8EHH0111011076H89HP01110011F3H8CH数码管显示可采用硬件译码输出字段码控制显示内容,如CD4511(共阴极)或CD4513(共阳极)。也可用单片机I/O口直接输出字段码控制数码管的显示内容。4.3.2 数码管显示的程序PORTD端口的高四位设为数码管的片选端口,并通过对这四个端口,每个端口单独的置为高电平,屏蔽掉其他端口,这样就可以实现数码管位的片选功能。程序的流程图如下所示:Y Y N N 开始系统初始化检测位选信号判断信号检测段选信号判断信号显示未检测到信号未检测到信号图4-2数码管显示流程图最高位控制千位,次高位控制百位,第三高位控制十位,第四高位控制个位。PORTD = 0x8f;/ 将最高位置为高电平PORTD = 0x4f;/ 将次高位置为高电平PORTD = 0x2f;/ 将第三高位置为高电平PORTD = 0x1f;/ 将第四高位置为高电平PORTC端口连接到数码管的段选位,并根据数码管的字段的表格来查找到相应的编码值。以下是数码管显示程序的编码:void display()/四位led显示程序 PORTD = 0x8f;/位选 PORTC = dtabqian;/段选 delay(100); PORTD = 0x4f;/位选 PORTC = dtabbai; delay(100); PORTD = 0x2f; PORTC = dtabshi; delay(100); PORTD = 0x1f; PORTC = dtabge; delay(100);数码管显示分为动态和静态2种方式,动态显示接线比较少10;相反,静态显示程序简单,却占用I/O口多。本文采用的是动态显示。4.3.3 数码管位的读取根据显示的需要,我们要将测到的数值显示在数码管上,这就需要我们通过编程计算,编写必要的程序来实现各个位的读取、计算和输出。qian=temp/1000;/对一千整除,得到的整数部分给千位输出bai=temp%1000/100;/对一千整除的余数在对一百整除,得到的整数部分给百位输出shi=temp%100/10;/对一百整除的余数在对十整除,得到的整数部分给十位ge=temp%10;/对十整除的余数给个位4.4 端口设置程序在对电容充电之前,我们要先对电容充分的放电,这样就保证了我们计算充电时间的准确性,并且能提高我们测量温度值的精确度,等充分放电结束后,将对电容进行充电11;本文的方案是将单片机的PB口的第一位与第五位管脚分别和热敏电阻和一标准电阻相连接,并将两个端口同时置为高电平,这是为了保证能把PB端口方向设置为输出。然后将两个端口的输出值都设为低电平,这是为了让电容两端的电压都为低,保证的充分的放电。并且要有相对较长时间的放电延时,这样也是为了保证电容的充分放电。Y N 开始对电容进行充分放电判断电平放电继续结束 图4-3判断端口放电ATmega16单片机的所有I/O端口均具有读 修改 写特性,为此,I/O端口及其他I/O寄存器的位操作应使用C语言运算符“|=”和“&=”实现。例如:DDRB |= (1 << 0);/第一位设为高电平,方向输出方向DDRB |= (1 << 4);/第五位设为高电平,方向输出方向PORTB &= 0x00;/输出为低电平放电结束后,端口要进行一个输入一个输出的设置,与热敏电阻连接的端口设为输出,与标准电阻连接的端口设为输入12;而前面已经提到,两个端口都设置为了输出,所以这里只要把需要输入的端口方向改为低电平,输入模式,并将输出端口的输出电平改为高电平,这样就可以实现充电的过程。在充电的过程启动的时候,主函数里的计时功能就已经开启了。开始将PORTB端口第五位设为输入将PORTB端口第一位输出低电平结束图4-4 充电前端口的设置void charge()/充电端口设置程序DDRB &= (1 << 4);/第五位设为输入PORTB |= (1 << 0);/第一位输出低电平对于ATmega16单片机的I/O端口设置的功能配置如下所示:表4-2I/O端口的功能配置DDRxnPORTxnI/O方向上拉电阻端口(PINxn)特性00输出关闭高阻状态01输入打开上拉电阻驱动的高电平,可从外部拉低10输出关闭推挽输出011输出关闭推挽输出1DDRx为端口方向配置寄存器,当DDRx的某位为1时,对应引脚为输出使用,输出的高低取决于PORTx寄存器中的相应位。要注意,不管输出1还是0,均属于推挽输出,有较大的驱动能力,此时不可直接连接到电源或地上。PINx并不是一个实际的寄存器,它是I/O引脚在内部总线上的地址,所以PINx是只读的,用于读取外部引脚上的实际电平。而PORTx是端口输出数据锁存器,不能将读入的PORTx值当做实际端口上的逻辑电平。4.5 温度信号采集程序对于电容充放电测温的精度,不但与标准电阻和电容的大小有关,还与热敏电阻的当前温度下的阻值,电容的充放电时间的检测,以及热敏电阻阻值对应温度的计算有关,因此要根据要测温度范围的大小,合理的选取标准电阻和电容的大小,以满足电容在放电时有一个较长的充电时间,以利于单片机对充电时间的准确检测,在对电容放时是不需要测量的,只要尽量将放电时间延长一些,保证电容的充分放电,这个才能使检测的电容充电时间更精确,但是要注意,计时的时间长时,在以后的运算中会相当麻烦,所以在保证精度的前提下,尽量缩小计时的时间大小,可以有效的控制程序复杂程度和测量时间的精确度。开始调用电容充电子程序检测电容通过标准电阻放电时间T1调用电容充电子程序检测电容通过热敏电阻放电时间T根据T1/R1=T/RT计算热敏电阻阻值查表求当前温度值结束图4-5温度的采集首先对测得的时间进行一个初步的比较,将计时的变量设为time温度的变量设为temp,当变量time>581时,显示的温度值temp=0,当变量time<65的时候,显示的温度值temp=59。if(time > 581)temp = 0;else if(time < 65)temp = 59;在进行细化的时间比较程序,如果时间在581>time>65之间的时候,我们建立一个表。这个表划分出12个区间。Volatile const unsigned shortTab13=581,470,381,311,257,212,177,148,124,104,89,76,65;温度值每隔五度进行一个区间定位,然后将获得的时间与当前的十二个区间进行循环比较,确定当前的温度值。子函数的程序代码如下:void res()int i;if(time > 581)temp = 0;else if(time < 65)temp = 59;else/查表for( i = 1; i < 13;i+)if(time > Tabi)break;temp = (Tabi-1-time)*5) / (Tabi-1- Tabi);temp += (i-1)*5; if(temp > 59)temp = 59;5 实物的调试与误差分析5.1 硬件的调试由于本次设计使用的是万能电路实验板,上面没有布线,并且所需元器件比较多,所以焊接起来相对比较麻烦,因此焊接时一定要小心,这是为了避免虚焊和短路。为了安全起见,每焊完一个元器件或者一条线路都要用万用表检查焊接是否成功。实物焊好之后,首先要进行硬件的调试。电路的调试过程是检验、修正设计方案的实践和检验的过程,也是需要应用理论知识来解决调试中各类问题的关键环节,这是电路设计者必须掌握的