微型计算机控制 技术大作业
设计题目: 基于热敏电阻的数字温度计 院 系:计算机科学与信息工程学院 学生姓名: *** 学 号: ************ 专业班级: 计算机科学与技术(嵌入式方向)11-1 指导教师: **
2014.06.07
目录
1、 概述 ................................................. 1 2、 设计要求 ............................................. 1 3、课程设计目的: ........................................ 2 4、性能指标: ............................................ 2 5、原理框图 .............................................. 2 6.1热敏电阻温度转换原理 ............................... 3 6.2 热敏电阻仿真电路图: .............................. 4 6.3 热敏电阻程序代码: ............................... 4 7、 实验总结及心得体会 .................................. 10 6、参考文献 ............................................. 11
基于热敏电阻的数字温度计 1、概述
随着以知识经济为特征的信息化时代的到来人们对仪器仪表的认识更加深
入,温度作为一个重要的物理量,是工业生产过程中最普遍,最重要的工艺参数之一。随着工业的不断发展,对温度的测量的要求也越来越高,而且测量的范围也越来越广,对温度的检测技术的要求也越来越高,因此,温度测量及其测量技术的研究也是一个很重要的课题。目前温度计按测使用的温度计种类繁多,应用范围也比较广泛,大致可以包括以下几种方法:1,利用物体热胀冷缩原理制成的温度计2,利用热电效应技术制成的温度检测元件3,利用热阻效应技术制成的温度计4,利用热辐射原理制成的高温计5,利用声学原理进行温度测量本系统的温度测量采用的就是热阻效应。温度测量模块主要为温度测量电桥,当温度发生变化时,电桥失去平衡,从而在电桥输出端有电压输出,但该电压很小。将输出的微弱电压信号通过OP07放大,将放大后的信号输入AD转换芯片,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来。
2、设计要求
使用热敏电阻类的温度传感器件利用其感温效应,将随被测温度变化的电压或电流用单片机采集下来,将被测温度在显示器上显示出来: 测量温度范围−50℃~110℃。 精度误差小于0.5℃。 LED数码直读显示。
本题目使用铂热电阻PT100,其阻值会随着温度的变化而改变。PT后的100即表示它在0℃时阻值为100欧姆,在100℃时它的阻值约为138.5欧姆。厂家提供有PT100在各温度下电阻值值的分度表,在此可以近似取电阻变化率为 0.385Ω/℃。向PT100输入稳恒电流,再通过A/D转换后测PT100两端电压,即得到PT100的电阻值,进而算出当前的温度值。
采用2.55mA的电流源对PT100进行供电,然后用运算放大器LM324搭建的同相放大电路将其电压信号放大10倍后输入到AD0804中。利用电阻变化率0.385Ω/℃的特性,计算出当前温度值。
1
3、课程设计目的:
1. 通过课程设计实践,树立正确的设计思想,培养综合运用专业课程和其他选修课程的理论与生产实际知识来分析和解决电子设计问题的能力。
2. 学习电子设计的一般方法、步骤,掌握电子设计的一般规律。 3. 进行电子设计基本技能的训练,培养查阅资料的技能、掌握Protel 2004的工作流程和调试方法。
4. 学习掌握单片机设计原理和设计思路。
4、性能指标:
设计温度测量电路,量程为0-100摄氏度,精度为0.5摄氏度,实现温度的数字显示。
5、原理框图
传感器
信号放大电路
A/D转换电路
单片机系统
数码管显示
测量部分可以采用热敏电阻,热电偶及温度传感器。由于精度要求不高,故我们通过热敏电阻实现温度的测量功能。
2
信号放大部分为使信号不失真,就得保证电路的对称性,所以我们采用单端输入双端输出的差动放大电路进行信号的变换,同时用高精度,低漂移的运放来代替晶体三极管。
A/D转换部分CPU8051通过P0口P0.0-P0.2向A/D发送模拟的地址编码信息,并通过地址线P2.0和写控制线 控制地址编码信号的锁存。选通相应的模拟输入通道,然后启动A/D转换。当转换结束后,A/D经过EOC发出标志信号,经反相后送入8051的 向8051发出中断请求,当8051响应请求后,通过P2.0的读控制端 使A/D的OE端变为高电平,从而控制转换器的三态数据输出,锁存器通过P0口P0.0-P0.7向8051输出。
数码显示部分用74LS164驱动显示,另外我们用一个PNP型的三极管来控制数码管的电源,是因为164没有数据锁存端,数据在传送过程中,对输出端来说是透明的,这样,数据在传送过程中,数码管上有闪动现象,驱动的位数越多,闪动现象越明显。为了消除这种现象,在数据传送过程中,关闭三极管使数码管没电不显示,数据传送完后立刻使三极管导通,这样就实现锁存功能。
6、电路实现
6.1热敏电阻温度转换原理
热敏电阻是近年来发展起来的一种新型半导体感温元件,由于它具有灵敏度高,体积小,重量轻,热惯性小,寿命长,以及价格便宜等优点,因此应用非常广泛。热敏电阻具有负的温度特性,当温度升高时,电阻值减小。热敏电阻的阻值――温度特性曲线是一条指数曲线,非线性度较大,因此在使用时要进行线性化处理。
热敏电阻的温度特性曲线
热敏电阻的使用是为了感知温度,为此给热敏电阻通以恒定的电流,测量电阻两端就得到一个电压,然后即可通过下列公式求得温度值:
其中的参数如下: T:被测温度
T0:与热敏电阻特性有关的温度参数
3
K:与热敏电阻特性有关的系数 :热敏电阻两端的电压
根据这一公式,如果能测得热敏电阻两端的电压并知道参数T0和K,则可以计算出热敏电阻的环境温度,即:被测温度,这样就把电阻随温度的变化关系转化为电压随温度变化的关系。数字式热敏电阻温度计设计工作的主要内容就是把热敏电阻两端电压值经A/D转换为数字量,通过软件方法计算得到温度值,然后进行显示处理。
6.2 热敏电阻仿真电路图:
6.3 热敏电阻程序代码:
#include 4 #include #define uchar unsigned char sbit STAR=P2^4; sbit EOC=P2^6; sbit CLOCK=P2^5; sbit OE =P2^7; sbit P20=P2^0; sbit P21=P2^1; sbit P22=P2^2; sbit P23=P2^3; uchar dispbuf[6]; uchar code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xdf}; void TimeInitial() { TMOD=0x10; TH1=(65536-200)/256; TL1=(65536-200)%256; EA=1; 5 ET1=1; TR1=1; } void Delay(uchar i) { unsigned int j; for(;i>0;i--) { for(j=0;j<125;j++) {;} } } void t1(void) interrupt 3 using 0 { TH1=(65536-200)/256; TL1=(65536-200)%256; CLOCK=~CLOCK; } void Display()// { 6 P0=table1[dispbuf[1]]; P20=0; P21=1; P22=1; P23=1; Delay(10); P0=0x00; P0=table2[dispbuf[2]]; P20=1; P21=0; P22=1; P23=1; Delay(10); P0=0x00; P0=table1[dispbuf[1]]; P20=1; P21=1; P22=0; P23=1; Delay(10); P0=0x00; 7 P0=table1[dispbuf[0]]; P20=1; P21=1; P22=1; P23=0; Delay(10); P0=0x00; } void main()//主函数 { uchar getdata,temp; uchar count=0; uchar i=0; TimeInitial(); while(1) { STAR=0;//关闭转换 8 } } OE=0;//关闭输出 STAR=1;//开启转换 STAR=0;//关闭转换 while(EOC==0) { OE=1;//开启数据输出允许 Delay(10); getdata=P1; OE=0; temp=getdata*1.0/255*500; dispbuf[0]=temp%10; dispbuf[1]=temp/10%10; dispbuf[2]=temp/100%10; Display(); } 9 7、 实验总结及心得体会 在这次课程设计中,感受很多,收获很很多,主要在一下几个方面: (1)由于时间紧迫,因此指导老师布置课题后,我就开始制定整个课程设计的时间安排表。在计划表中,我确定了整个课程设计的步骤和时间安排,这也使我在接下来的设计过程中更有效率,忙而不乱。 (2)在设计过程中,需要用到keil和protues这两款软件进行调试和仿真,通过这次课程设计,我从不了解这两款软件到对他们的基本功能有了掌握,这对我以后对这两种软件的使用有很大帮助。 (3)课程设计过程中,程序的调试和仿真并不是很顺利,但是经过多次调试和修改后,程序满足了设计要求,后来经过不断的改进,程序终于更加简洁明了。这个过程也让我明白,软件设计过程并不是一次就能成功的,需要不断调试、改进,使程序有条理,简洁易读。 (4)当遇到自己不懂的问题时,我会查阅相关的资料。在现在信息高速发展的时代,各种信息资料充斥,我们不能全盘接受,需要我们仔细甄别和筛选,找到对自己有用的信息,而不是盲目接受。这个过程中也锻炼了我对信息的辨别和搜索能力,对我以后的自学至关重要。 (5)在设计过程中,遇到了自己无法解决的问题,我就向指导老师请教或者和同学们互相讨论,在这个过程中不仅使问题得到解决,有时还会产生一些新的想法和灵感,更重要的是,在讨论的过程中,我学会了团队协作,知道了团队精神的重要性,这对我以后的工作有着重要的意义。 (6)虽然这是个看似简单的课程设计,但是它包含了在设计过程中的完整步骤,我们也要对它重视,以严谨的态度来对待,熟悉产品的开发和生产过程。当进行多次尝试仍然没有得到预期的效果时,不能失去信心,更不能轻易放弃。 10 总而言之,这次课程设计将理论知识和实际应用联系在一起,使我们不仅巩固了课堂上学的理论知识,而且熟悉了产品的开发和生产过程,更重要的是,它使我们各方面都得到了锻炼,对我们以后的生活和学习都有极其重要的作用。 6、参考文献 [1]《单片机原理及应用(第二版)》 张毅刚 彭喜元 彭宇 高等教育出版社 [2]余发山.单片机原理及应用技术.中国矿业大学出版社,2003.21-45,98-118,185-198 [3]刘和平. 单片机编程与入门.重庆大学出版社,2002.68-99,111-122 [4]陈明荧. 89C51单片机课程设计实训教材.清华大学出版社,2003.38-67,102-118 1、 #include #define uchar unsigned char 11 sbit STAR=P2^4; sbit EOC=P2^6; sbit CLOCK=P2^5; sbit OE =P2^7; sbit P20=P2^0; sbit P21=P2^1; sbit P22=P2^2; sbit P23=P2^3; uchar dispbuf[6]; uchar code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xdf}; void TimeInitial() { TMOD=0x10; TH1=(65536-200)/256; TL1=(65536-200)%256; EA=1; ET1=1; TR1=1; } void Delay(uchar i) { unsigned int j; for(;i>0;i--) { for(j=0;j<125;j++) {;} } } void t1(void) interrupt 3 using 0 { TH1=(65536-200)/256; TL1=(65536-200)%256; CLOCK=~CLOCK; } void Display()// { P0=table1[dispbuf[1]]; 12 P20=0; P21=1; P22=1; P23=1; Delay(10); P0=0x00; P0=table2[dispbuf[2]]; P20=1; P21=0; P22=1; P23=1; Delay(10); P0=0x00; P0=table1[dispbuf[1]]; P20=1; P21=1; P22=0; P23=1; Delay(10); P0=0x00; P0=table1[dispbuf[0]]; P20=1; P21=1; P22=1; P23=0; Delay(10); P0=0x00; } void main()//主函数 { uchar getdata,temp; uchar count=0; uchar i=0; TimeInitial(); while(1) { STAR=0;//关闭转换 13 OE=0;//关闭输出 STAR=1;//开启转换 STAR=0;//关闭转换 while(EOC==0) { OE=1;//开启数据输出允许 Delay(10); getdata=P1; OE=0; temp=getdata*1.0/255*500; dispbuf[0]=temp%10; dispbuf[1]=temp/10%10; dispbuf[2]=temp/100%10; Display(); } } } 14 因篇幅问题不能全部显示,请点此查看更多更全内容