目录1 课程设计的目的 (1)2 课程设计的任务和要求 03 设计方案与论证 04 电路设计 (2)4.1 温度测量电路 (2)4.2 单片机最小系统 (6)4.3 LED数码显示电路 (8)5 系统软件设计 (8)6 系统调试 (9)7 总结 (11)参考文献 (12)附录1:总体电路原理图 (13)附录2:元器件清单 (15)附录3:实物图 (16)附录4:源程序 (17)1 课程设计的目的(1)掌握单片机原理及应用课程所学的理论知识;(2)了解使用单片机设计的基本思想和方法,学会科学分析和解决问题;(3)学习单片机仿真、调试、测试、故障查找和排除的方法、技巧;(4)培养认真严谨的工作作风和实事求是的工作态度;(5)锻炼自己的动手动脑能力,以提高理论联系实际的能力。
2 课程设计的任务和要求(1)采用LED数码管显示温度;(2)测量温度范围为-10℃~110℃;(3)测量精度误差小于0.5℃。
3 设计方案与论证方案一:本方案主要是在温度检测部分利用了一款新型的温度检测芯片DS18B20,这个芯片大大简化了温度检测模块的设计,它无需A/D 转换,可直接将测得的温度值以二进制形式输出。
该方案的原理框图如图3-1所示。
DS18B20是美国达拉斯半导体公司生产的新型温度检测器件,它是单片结构,无需外加A/D即可输出数字量,通讯采用单线制,同时该通讯线还可兼作电源线,即具有寄生电源模式。
它具有体积小、精度易保证、无需标定等特点,特别适合与单片机合用构成智能温度检测及控图3-1方案一系统框图方案二:温度检测部分采用传统的热敏电阻,热敏电阻的阻值随环境温度变化而变化,将热敏电阻与固定电阻串联后分压,经A/D转换器将其转换为单片机可识别得二进制数字量,然后根据程序查表得到温度值,单片机主要控制LED显示器显示正确的温度值,并根据设置的上下限控制继电器动作,从而控制外部负载。
该方案的原理框图如图3-2所示。
图3-2方案二系统框图方案一与方案二的主要区别在温度检测部分,方案一主要利用DS18B20这块芯片进行温度检测,并将采集到的模拟量转换为单片机识别的二进制数。
方案二是采用热敏电阻检测温度,然后利用A/D转换器将温度模拟量转换为二进制数供单片机处理。
它最大的特点就是它能检测的温度范围很大,热敏电阻的性能决定了整个设计的所能检测的温度范围。
方案一的温度检测范围已经由系统中的DS18B20的特性所决定,它能检测的温度范围为-55℃到120℃,其温度检测范围很宽,已能足够满足一般测量需要,方案一是利用现有的智能温度传感芯片DS18B20,无需A/D转换,直接输出数字量,从整体上来看方案二比方案一更具有实际的锻炼意义,所以本设计采用方案二。
4 电路设计系统硬件电路主要包括3个部分:(1)温度测量电路;(2)单片机最小系统;(3)LED 数码显示电路。
4.1 温度测量电路温度测量电路主要由ADC0809、TL431、热敏电阻和电阻组成。
TL431是一个由良好的热稳性能的三端可调分流基准电压源。
它的输出电压用两个电阻就可以任意设置到 2.5V 到36V 范围内的任何值。
该器件的典型动态阻抗为0.2Ω,在很多应用中可以用它代替齐纳二极管,例如数字电压表、运放电路、可调电压源、开关电源等等。
在此电路中,它用于给ADC0809和热敏电阻提供可调电压。
电路中的热敏电阻作为测温元件,它是利用感温元件(导体)的电阻随温度变化的性质,将电阻的变化值用显示仪表反映出来,从而达到测温的目的。
导体测温元件,它与热电阻的温阻特性刚好相反,即有很大负温度系数,也就是说温度升高时,其阻值降低。
它们的关系为011()B T T T T R R e-= (4-1)式(4-1)中 R T -在温度T(K)时的电阻值; R T0:在温度T 0(K)时的电阻值; E :自然对数的底数;B :与热敏电阻特性有关的系数; T :被测温度;T 0与热敏电阻有关的温度参数。
根据这一公式,如果能测得热敏电阻两端的电压,并知道参数T 0和B ,则可以计算出热敏电阻的环境温度,即:被测温度,就这样就把电阻随温度的变化关系转变为电压随温度变化的关系。
系统中的A/D转换电路,负责将的温度测量电路中输出的模拟电压信号转化为可供单片机识别的数字信号。
主要采用ADC0809串行模数转换器,使用开关电容逐次逼近技术完成A/D转换过程。
由于是串其管脚图如图引脚功能如下。
IN0~IN7:8路模拟量输入端。
OUT1~OUT8:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。
ALE:地址锁存允许信号,输入,高电平有效。
START:A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns 宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
EOC:A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:数据输出允许信号,输入,高电平有效。
当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLOCK:时钟脉冲输入端。
REF(+)、REF(-):基准电压。
VCC:电源,单一+5V。
GND:地。
ADC0809工作过程:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC 输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
转换数据的传送A/D转换后得到的数据应及时传送给单片机进行处理。
数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。
为此可采用下述三种方式。
(1)定时传送方式对于一种A/D转换器来说,转换时间作为一项技术指标是已知的和固定的。
例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。
可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。
(2)查询方式A/D转换芯片有表明转换完成的状态信号,例如ADC0809的EOC 端。
因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。
(3)中断方式把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。
不管使用上述哪种方式,只要一旦确定转换完成,即可通过指令进行数据传送。
首先,送出出口地址,并且在信号有效时,即OE信号有效,把转换数据送到数据总线,供单片机接收。
利用热敏电阻和电阻串联,用TL431制作4V电压用于A/D的参考电压和热敏电阻的供电,R7是分压电阻,R9是可调电位器,用于调节TL431的输出电压。
当温度升高时,R8热敏电阻的阻值变小,串联的30k的电阻两端的电压就会升高,ADC0809采集到电压信号经过转换后将数字量传输给单片机。
温度测量电路图如图4-2所示。
图4-2 温度测量电路4.2 单片机最小系统STC89C51是一种低功耗、高性能的CMOS8位微控制器,具有4K 可编程Flash,其引脚如图4-3所示。
图4-3 STC89C51的引脚图单片机的最小系统由时钟电路和复位电路组成。
时钟电路:此系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。
STC89C51内部有一个用于构成振荡器的高增益反相放大器。
引脚X1和X2分别是此放大器的输入端和输出端。
这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。
外接晶体谐振器以及电容C2和C3构成并联谐振电路,接在放大器的反馈回路中。
时钟电路图如图4-4所示。
333333331111111122222222图4-5 复位电路4. 3 LED数码显示电路该电路选用的数码管是四位八段共阳极的,数码管的扫描方式分为静态扫描和动态扫描两种,由于单片机资源有限,这里采用的是动态扫描的方法。
在该接法中,用到单片机的P0和P1口,其中P0作为输出口;电路中利用三极管驱动数码管,用电阻起到限流作用,使得数码管亮度适中,其电路图如图4-6所示。
图4-6 LED数码显示电路图5 系统软件设计系统程序主要包括初始化、温度采集、数据处理和显示温度四部分。
该电路设计的程序流程图如图5-1所示。
图5-1 程序流程图温度采集和数据处理部分主要由热敏电阻、数模转换器ADC0809、单片机及四位共阳数码管组成。
通过测得热敏电阻阻值,利用热敏电阻阻值与电压的对应关系,将热敏电阻阻值转化为输出电压,ADC0809采集输出的电压信号,并将采集的电压信号转换为数字信号,传送给单片机,由单片机P0口输出,最后由四位共阳数码管采用动态扫描方式显示温度。
6 系统调试在整个调试过程中首先应注意各个模块的供电问题,其中单片机和A/D等芯片使用5V电压供电。
由热敏电阻构成的测温部分和A/D的参考电压输入端则使用+4V电压供电,表6-1为系统的调试数据。
表6-1 系统调试数据调试结果如图6-1、图6-2、图6-3所示。
图6-1 调试结果一图6-2 调试结果二图6-3 调试结果三7 总结经过一周的课程设计,通过对热敏电阻的数字温度计系统的设计过程及计算得出如下结论。
设计电路关键在于对设计要求的理解分析以及对基本电路相关知识的熟练掌握。
设计电路时,将总体的功能分成若干个部分来实现,是简化电路设计思路的很好方法;且搞清各个模块的功能与实现要求操作的具体方法,对电路故障的检查也是很有帮助。
通过这次设计,学到了很多东西,如查找资料,设计比较,从各种图中提取所需。
焊接时学到了好多,如如何在一定大小的板子上正确摆放好芯片,如何布线等等,调试时也是,知道了用工具如万用表来检查、修复故障。
本设计对有限温度范围内的温度测量具有较高的精度,在这过程中,感谢老师和同学对我们的帮助,程序经过无数次地调试,实现了测量温度显示。
在做实物的过程中,我们在焊接时还是谨小慎微,但是由于焊接时引脚短路的问题导致实物没出来现象。
学会了用Proteus 软件的应用。
在以后的学习中更加地完善自己,努力提升自己。
参考文献[1]杨素行.模拟电子技术基础[第3版].北京:高等教育出版社,2006.[2] 阎石.数字电子技术基础[第5版].北京:高等教育出版社,2006.[3]赵茂泰.智能仪器原理及应用[第3版].北京:电子工业出版社,2009.[4]郭天祥.51单片机C语言教程.北京:电子工业出版社,2006.[5]张忠梅.单片机的C语言应用程序设计[第4版].北京:北京航空航天大学出版社,2006.[6]李朝青.单片机原理及接口技术[第3版].北京:北京航空航天大学出版社,2006.[7]孙有才.新型AT89S51系列单片机及其应用.北京:清华大学出版社,2001.[8]姚福安.电子电路设计与实践.济南:山东科学技术出版社,2009.[9] 李青.电路与电子技术基础.杭州:浙江科学技术出版社,2004.附录1:总体电路原理图附录2:元器件清单附录3:实物图附录4:源程序//程序头函数#include <reg52.h>//宏定义#define uint unsigned int#define uchar unsigned char#define Data_ADC0809 P1//管脚声明//ADC0809sbit ST=P3^3;sbit EOC=P3^4;sbit OE=P3^2;//显示数组0-9H, L, -ucharData_[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x76,0x38,0x40};uchar code Data_T[]={//AD数值对应的温度0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*0-11*///此范围内为无效值,读到的数据为---70x89,0x88,0x87,0x86,0x85,0x84,0x83,0x82,0x81,/*12-20*/ //此范围内为负温度值-9~-10,1,2,3,4,5,6,6,7,8, /*21-30*/ //以下为正温度0-1119,9,10,11,11,12,13,13,14,15, /*31-40*/15,16,17,17,18,18,19,19,20,21,/*41-50*/21,22,22,23,23,24,24,25,25,26, /*51-60*/26,27,27,28,28,29,29,30,30,30, /*61-70*/31,31,32,32,33,33,33,34,34,35, /*71-80*/35,36,36,36,37,37,38,38,39,39, /*81-90*/39,40,40,41,41,42,42,42,43,43, /*91-100*/44,44,44,45,45,46,46,47,47,47, /*101-110*/48,48,49,49,49,50,50,51,51,51, /*111-120*/52,52,53,53,54,54,54,55,55,56, /*121-130*/56,57,57,57,58,58,59,59,60,60, /*131-140*/60,61,61,62,62,63,63,64,64,65, /*141-150*/65,65,66,66,67,67,68,68,69,69, /*151-160*/70,70,71,71,72,72,73,73,74,74, /*161-170*/75,75,76,76,77,78,78,79,79,80, /*171-180*/80,81,82,82,83,83,84,85,85,86, /*181-190*/87,87,88,89,89,90,91,91,92,93, /*191-200*/94,94,95,96,97,98,99,99,100,101,/*201-210*/102,103,104,105,106,107,108,109,110,111 /*211-220*/ };sbit Wei1 = P2^7;sbit Wei2 = P2^6;sbit Wei3 = P2^5;sbit Wei4 = P2^4;//函数声明void Display(uchar Data);uint temp,temp1;uchar p;//ADC0809读取信息uchar ADC0809(){uchar temp_=0x00;//初始化高阻太OE=0;//转化初始化ST=0;//开始转换ST=1;ST=0;//外部中断等待AD转换结束while(EOC==0);//读取转换的AD值OE=1;temp_=Data_ADC0809;OE=0;return temp_;}//延时void delay(uint t){uint i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}void main(){uchar i;uint pp;while(1){for(i=0;i<50;i++){temp=ADC0809();pp=pp+temp;Display(temp1);}temp1=pp/50;pp=0;temp1=Data_T[temp1];for(p=0;p<50;p++)Display(temp1);}}//显示Data表示数据void Display(uchar Data){Wei1=1;Wei2=1;Wei3=1;Wei4=1;P0=0xff;if(Data>128){Data=Data-128;P0=~Data_[12];Wei1=0;Wei2=1;Wei3=1;Wei4=1;delay(10);Wei1=1;Wei2=1;Wei3=1;Wei4=1;P0=~Data_[Data/10];Wei1=1;Wei3=1;Wei4=1;delay(10);Wei1=1;Wei2=1;Wei3=1;Wei4=1;P0=~Data_[Data%10]; Wei1=1;Wei2=1;Wei3=0;Wei4=1;delay(10);Wei1=1;Wei2=1;Wei3=1;Wei4=1;P0=0xa7;Wei1=1;Wei2=1;Wei3=1;Wei4=0;delay(10);Wei1=1;Wei3=1;Wei4=1;}else if(Data<128){if(Data/100==0)P0=0xff;elseP0=~Data_[Data/100];Wei1=0;Wei2=1;Wei3=1;Wei4=1;delay(10);Wei1=1;Wei2=1;Wei3=1;Wei4=1;P0=~Data_[Data/10%10];Wei1=1;Wei2=0;Wei3=1;Wei4=1;delay(10);Wei2=1;Wei3=1;Wei4=1;P0=~Data_[Data%10]; Wei1=1;Wei2=1;Wei3=0;Wei4=1;delay(10);Wei1=1;Wei2=1;Wei3=1;Wei4=1;P0=0xa7;Wei1=1;Wei2=1;Wei3=1;Wei4=0;delay(10);Wei1=1;Wei2=1;Wei3=1;} }。