电子系统综合设计与仿真题目:数字温度计的设计1课程设计目的通过数字温度计的设计,使对温度传感器的应用有更深的理解,熟练protuse仿真软件的使用。加深对51单片机应用的理解。2课程设计的内容及要求2.1数字温度计的设计内容本设计要求设计一个测温范围为0℃到80℃的数字温度计,要求误差范围在1℃以内,并用LCD1602进行结果的显示。2.2数字温度计的设计要求本次设计要求使用protuse软件进行仿真,画出仿真电路并编写相应的仿真程序。设计报告书要求格式规范,层次合理,重点突出。并附上涉及原理图及相应的源程序。3总体设计方案本设计以检测温度并较为精确的显示为目的,按照系统设计要求功能的要求,确定由四个模块组成:主控器,测温电路,显示电路,开关电路。系统以温敏电阻作为温度敏感器件,经过一个分压电路和ADC0808模数转换芯片,将温度模拟量转化为电压数字量以总线传入单片机。以AT89C51为主芯片,在主芯片对ADC0808传入的温度值进行处理,由单片机程序控制,将处理后的温度由LCD1602显示屏进行显示。开关控制电路的断开与连通。3.1温度的检测ADC0808将模拟温度信号经过采集,数字处理,放大后输出。ADC0808采用八根数据端进行数据的并行输出,因此在单片机与ADC0808之间需要八根线链接。3.2数字信号的处理送入单片机内部的数字信号经过单片机的处理,将数据通过LCD1602显示出来。其处理过程主要由单片机控制程序进行控制。3.3温度显示电路使用LCD1602液晶显示屏进行显示。单片机将温度数据经处理后由P0.0~P0.7口输出到LCD。LCD1602具有微功耗、体积小、显示内容丰富。超薄轻巧等优点。4硬件系统设计4.1总体设计电路温度计电路设计原理控制器使用单片机AT89C51,温度数据的模数转换芯片采用ADC0808,用LCD1602实现温度的显示。电路还包括开关和单片机外设电路等。整个系统的原理图如下:4.2主控器AT89C51AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。4.3显示电路显示电路用LCD1602液晶进行显示。1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。其引脚图如下:4.4测温电路测温电路由一个分压电路和模数转换芯片组成。分压电路由一个标称47K的温敏电阻和一个标称6.2K的分压电阻组成。模数转换芯片选择的ADC0808。4.4.1温敏电阻热敏电阻器是敏感元件的一类,按照温度系数不同分为正温度系数热敏电阻器(PTC)和负温度系数热敏电阻器(NTC)。热敏电阻器的典型特点是对温度敏感,不同的温度下表现出不同的电阻值。正温度系数热敏电阻器(PTC)在温度越高时电阻值越大,负温度系数热敏电阻器(NTC)在温度越高时电阻值越低,它们同属于半导体器件。这里选择的是负温度系数额热敏电阻。4.4.2ADC0808模数转换芯片ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。ADC0808是ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。具体电路图如下:4.1电阻R2阻值的确定因为:v=5𝑅𝑇𝑅𝑇+𝑅2,所以,R2的取值对V的精度至关重要。在R2和温度T不同的情况下对应RT分得的电压值如下表𝑅2T0℃10℃20℃40℃60℃80℃90℃100℃125℃10k4.674.494.253.592.802.031.701.410.8815k4.524.273.953.152.301.571.291.050.6318k4.434.153.802.942.081.391.120.900.5320k4.384.073.702.811.951.281.030.830.49现对上表作如下处理,测得同一R2不同温度时的对应压差。RV125--0100--00--1010--2020--4040--6060--8080--9090--10010K3.793.260.180.240.660.790.770.330.2915K3.893.470.250.320.800.850.730.280.2418K3.903.530.280.350.860.860.690.270.2220K3.893.550.310.370.890.870.670.250.20从上表格很容易得到如下结论:1、T在0~100℃之间的电压差,在R2温度正值范围内的比例如下:∅10𝑘=3.263.79∗100%=86.0%∅15𝑘=3.473.89∗100%=89.2%∅18𝑘=3.533.90∗100%=90.5%∅20𝑘=3.553.89∗100%=91.3%从T=125℃时表格数据显示,电压跨度在R2≈18KΩ最大。即,当R2值超过18K后,电压所分布的范围减小,采样精度会降低。从温度有效值(0~100℃)所占比例来看,R2为15K或18K左右时,对有效值的精度影响较小。2.各阻值所对应各组数据的每10℃电压值跨度都是中间大,两边小。即是,中间每摄氏度温差变化所对应的电压变化差值比两边大,分辨效果更好。3.当R2为15KΩ时,T为0~20℃和80~100℃的电压值跨度基本相同,即是电压在这两区间分布均匀,其精度基本相当。而其他几项前后相差较大。电压精度不均匀。综上,我们选择R2≈15KΩ。4.2温敏电阻B值的计算温敏电阻的B值遵循公式RT=R*EXP(B(1/T1-1/T2))。RT:温敏电阻在温度T1下的阻值R:温敏电阻在T2常温下的标称阻值T1、T2:开尔文温度,K度273.15(绝对温度)+摄氏度。现测得如下数据:温度051015202530354045电压4.5194.4054.2734.1243.9563.7743.5783.3713.1572.940温度505565707580859095100电压2.7232.5092.3022.1031.9151.7391.5761.4261.2881.163根据表格,借助matlab计算B值为3641.8。截图如下:5软件系统设计系统程序采用单片机C语言编写。程序简洁,可靠性高,可维护性好。代码见附录。主程序流程图:模数转化流程图6数据测量与分析6.1数据测量环境温度(℃)051015202530354045测得温度(℃)0.494.769.9715.1919.8924.7430.2534.9940.0445.00环境温度(℃)50556065707580859095测得温度(℃)49.9655.0060.1965.1269.8074.7880.1684.7089.6495.086.2数据分析由上表数据表明,最大误差0.49℃,最小误差0,误差均值0.1695℃。温度范围内,0~20℃和80~100℃误差大于中间温度误差,这与上面得出的结论是一致的。温度产生误差原因在于信号电压输入端电压值的分辨率不高,采用电压源输入的方式,很难得到精确的温度值。6.3电路改进电路改进的方向就是提高输入电压精度。而电压源是很难满足这一要求的,所以,在这应考虑用恒流源来处理。假如给恒流源一个I=1MA的电流,然后再用1KΩ的热敏电阻加到恒流源上,这样电压就很好控制了。V=I*RT.则,当RT为𝑅𝑥KΩ时,其电压值就为𝑉𝑖𝑛=𝑅𝑥(𝑉),最大为1V,这大大提高了分辨率,使得到的温度值更加精确。7参考文献ADC0809用户手册LCD1602用户手册百度搜索引擎附录:1ADC0809.c#includereg52.h#includeintrins.h#includemath.h#includeADC0808.hunsignedlongdat_adc0808;uchardisplay_buffer[][16]={{CurrentTemp:},{(T)=00.00C}};voiddelay50us(uintm){uintn,k;for(n=m;n0;n--)for(k=25;k0;k--);}uintadc0808_init()//AD初始化{START=0;OE=0;START=1;START=0;while(EOC==0);OE=1;dat_adc0808=P1;OE=0;returndat_adc0808;}//计算温度floattemperature(){floatf,t,V;V=(dat_adc0808*5.0/255);f=0.003354016+0.0002745*log(0.32464*V/(5.0-V));t=1.0/f-273.15;returnt;}voidRefresh_show()//刷新显示{uintt;t=temperature()*100;display_buffer[1][7]=t/1000+'0';display_buffer[1][8]=t%1000/100+'0';//整数位display_buffer[1][10]=t%100/10+'0';//两个小数位display_buffer[1][11]=t%100%10+'0';}2.ADC0809.h#ifndef__ADC0808_H__#define__ADC0808_H__#includereg52.h#definedata_portP1#defineucharunsignedchar#defineuintunsignedintsbitSTART=P2^3;sbitEOC=P2^4;sbitOE=P2^5;voiddelay50us(uintm);//延时uintadc0808_init();//AD初始化voidRefresh_show();#endif3.LCD1602.C//液晶控制与显示驱动程序#includereg52.h#includeintrins.h#includestring.h#includeLCD1602.h#includeADC0808.h//---------------忙检查-------------------//ucharLCD_Busy_Check(){ucharLCD_Status;RS=0;RW=1;E=1;delay4us();LCD_Status=P0;E=0;returnLCD_Status;}//--------------向LCD写入命令--------------------//voidWrite_LCD_Command(ucharcmd){while((LCD_Busy_Check()&0x80)==0x80);//忙等待RS=0;RW=0;E=0;P0=cmd;delay4us();E=1;delay4us();E=0;}//-----------向