当前位置:文档之家› 单片机温度传感器论文

单片机温度传感器论文

怀化职业技术学院

高职生毕业论文(设计)

题目:基于半导体集成温度传感器的单片机测温控制系统

学生姓名:陈像

专业:电气自动化

班级: 08电气自动化

指导教师:谷玉玲

完成日期: 12月1号

教务处印制

毕业设计(论文)任务书

毕业设计(论文)课题:基于半导体集成温度传感器的单片机测温控制

系统

学生姓名:陈像

指导教师:谷玉玲

设计(论文)要求:

1、学生独立完成设计,在毕业设计的硬件设计过程中必须附有电路原理图或硬件结构框图;在软件设计部分,必须附有软件流程图和关键部分的程序清单,设计具有一定的科学性、实用性和新颖性。

2、论文撰写:毕业论文的撰写应遵照《2008届高职毕业生《毕业设计(论文)课题》的规定执行。论文的质量满足技术性、深度性和先进性的要求,综合体现了学生的知识结构和运用科学理论、方法及解决电气技术实际问题的能力。

3、论文指导与检查:毕业论文由自动控制教研室具有“双师”资质的教师指导。毕业论文应在教师指导下独立完成,用于论文的时间为2008年4月前完成毕业设计,在论文期间应至少安排一次中期检查,检查课题是否按计划进度进行,并填写《毕业论文中期报告》。

4、论文题目可以自拟,内容要与所学专业相关,与生产实习相关;

5、字数不少于4000字;不得抄袭,否则责任自负,而且作不及格处理;

6、全部用电脑打印,设计好封面,并装订成册;

7、毕业论文、或毕业设计都要求在毕业前进行答辩。学生可以参考一些专业性的杂

志,掌握论文格式;

8、毕业论文、或毕业设计具体要求见学院教务处网站。

9、时间要求:

1)、于2008年4月前完成毕业设计;

2)、答辩时间:2008年4月8日。

毕业设计(论文)规范化要求

一、论文的要求

1、书写格式要求:必须用钢笔书写(或打印),应含下列内容,并符合下列次序:

(1)论文题目;

(2)目录;

(3)内容提要(200字左右,用中文和英文各写一份);

(4)引言;

(5)正文;

(6)参考文献(或资料);

(7)附录。

装订要求:首页为封面、第2页为毕业设计(论文)任务书及毕业设计(论文)规范化要求、然后是上述规定的7项内容(封面必须用淡色专用纸按规定格式输出,装订)。

2、文字要求:文字通顺,语言流畅,书写工整,无错别字,不允许他人代写。文后要

注明参考文献和附录,参考文献要写明作者,书名(或文章题目及报刊名)、版次(初版

不注版次),出版地、出版者、出版年、页码。序号使用[1],[2],[3]……。

3、图纸要求:图面整洁,线条粗细均匀,圆弧连接光滑,尺寸标注规范,文字注释必

须使用工程字书写。

4、曲线图表要求,所有曲线、图表、线路图、程序框图、示意图等不准用徒手画,

必须按国家规定的标准或工程要求绘制。

5、译文内容必须与课题(或专业)内容有联系,并说明出处。

6、份量要求:工科专业毕业设计的论文字数不少于4千字。文科专业,其中外语专业

毕业论文的字数不少于4千字(单词),其他文科专业毕业设计(论文)的字数不少于6千字,

毕业论文也可以是实习调研报告,但字数不少于4千字。

二、各系(部)必须组成毕业设计(论文)资格审查小组,根据上述规范化要求负责组

织本单位毕业设计(论文)的资格审查工作。

三、毕业设计(论文)的资格审查应在毕业设计(论文)答辩前完成,资格审查合格的学

生由审查小组签字后,方能参加答辩。

四、凡资格审查不合格的学生,应令其返工,直到达到要求为止。

五、在校外进行毕业设计(论文)的学生,其毕业设计(论文)资格的审查一律返校进行。

目录

摘要 (5)

1、引言 (5)

2、设计要求 (5)

2.1、单片机温度控制器具体要求 (5)

3、DS18B20温度传感器 (5)

3.1温度传感器的介绍 (6)

3.2 温度传感器的工作原理 (6)

3.3温度传感器的工作时序图 (7)

4、单片机介绍 (8)

5 控制部分的设计 (9)

5.1、温度控制及超温和超温警报部分 (9)

5.2、数码管显示 (10)

5.3、串口通信 (11)

6、程序设计 (12)

6.1、程序结构分析 (12)

6.2、主程序 (13)

7、测设分析 (14)

8、结论 (14)

9、参考文献 (15)

10、附录 (15)

基于半导体集成温度传感器的

单片机测温控制系统

摘要:本设计以AT89C52单片机为核心的温度控制系统的工作原理和设计方法。温度信号由温度芯片DS18B20采集,并以数字信号的方式传送给单片机。文中介绍了该控制系统的硬件部分,包括:温度检测控制电路、单片机与PC机串口通信和简单的接口电路。单片机通过对温度采集信号进行相应处理,从而实现温度控制的目的。文中还着重介绍了软件设计部分,在这里采用模块化结构,主要模块有:数码管显示程序、温度信号处理程序、继电器控制程序、超温报警程序。

关键词:AT89C52单片机 DS18B20温度芯片温度控制串口通信

1、引言

温度控制系统广泛应用于社会生活的各个领域 ,如家电、汽车、材料、电力电子等 ,常用的控制电路根据应用场合和所要求的性能指标有所不同。数字温度传感器DS18B20,因其内部集成了A/D转换器,使得电路结构更加简单,而且减少了温度测量转换时的精度损失,使得测量温度更加精确。数字温度传感器DS18B20只用一个引脚即可与单片机进行通信,大大减少了接线的麻烦,使得单片机更加具有扩展性。由于DS18B20芯片的小型化,更加可以通过单跳数据线就可以和主电路连接,故可以把数字温度传感器DS18B20做成探头,探入到狭小的地方,增加了实用性。更能串接多个数字温度传感器DS18B20进行范围的温度检测。

2、设计要求

2.1设计基于单片机的温度控制器,用于控制温度。具体要求如下:

1. 测温范围为-55℃~+125℃。

2. 温度误差≤±0.5℃。

3. 人-机对话方便。

4. 用数码管显示测量数值。

3、DS18B20温度传感器

3.1 温度传感器的介绍

DS18B20是DALLAS公司生产的一线式数字温度传感器,它具有微型化、低功耗、高性能抗干扰能力、强易配处理器等优点,特别适合用于构成多点温度测控系统,可直接将温度转化成串行数字信号(按9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片,它具有三引脚TO-92小体积封装形式,温度测量范围-55~+125℃,可编程为9~12位A/D转换精度,测温分辨率可达0.0625℃,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。在本系统中我采用温度芯片DS18B20测量温度。该芯片的物理化学性很稳定,它能用做工业测温元件,且此元件线形较好。在0—100摄氏度时,最大线形偏差小于1摄氏度。该芯片直接向单片机传输数字信号,便于单片机处理及控制。

图3-1温度芯片DS18B20

3.2 温度传感器工作原理

温度传感器 DS18B20 从设备环境的不同位置采集温度,单片机 AT89S51 获取采集的温度值,经处理后得到当前环境中一个比较稳定的温度值,再根据当前设定的温度上下限值,通过加热和降温对当前温度进行调整。当采集的温度经处理后超过设定温度的上限值和下限值时,单片机就会通过三极管驱动扬声器发出警笛声。

系统中将通过串口通讯连接PC机存储温度变化时的历史数据,以便观察整个温度的控制过程及监控温度的变化全过程。见下图3-4。

3-4工作原理图

3.3 工作时序图

(1)初始化:

1.先将数据线置高电平1。

2.延时(该时间要求不是很严格,但是要尽可能短一点)。

3.数据线拉到低电平0。

4.延时750us(该时间范围可以在480~960us)。

5.数据线拉到高电平1。

6.延时等待。如果初始化成功则在15~60us内产生一个由DS18B20返回的低电平0,据

该状态可以确定它的存在。但是应注意,不能无限等待,不然会使程序进入死循环,所以要进行超时判断。

7.若CPU读到数据线上的低电平0后,还要进行延时,其延时的时间从发出高电平算起

(第5步的时间算起)最少要480us。

8.讲数据线再次拉到高电平1后结束。

(2)写数据:

1.数据线先置低电平0。

2.延时确定的时间为15us。

3.按从低位到高位的顺序发送数据(一次只发送一位)。

4.延时时间为45us。

5.将数据线拉到高电平1。

6.重复1-5步骤,直到发送完整个字节。

7.最后将数据线拉高到1。

(3)读数据:

1.将数据线拉高到1。

2. 延时2us。

3.将数据线拉低到0。

4.延时6us。

5.将数据线拉高到1。

6.延时4us。

7.读数据线的状态得到一个状态位,并进行数据处理。8.延时30us。

9.重复1-7步骤,直到读完一个字节。

4 单片机介绍

AT89C52 是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,AT89C52具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,2个16位可编程定时计数器,1个全双工串行通信口。

由于系统控制方案简单 ,数据量也不大 ,考虑到电路的简单和成本等因素 ,因此在本设计中选用 ATMEL 公司的 AT89C52单片机作为主控芯片。主控模块采用单片机最小系统是由于 AT89C52芯片内含有4 kB的 E2PROM ,无需外扩存储器 ,电路简单可靠 ,其时钟频率为 12 MHz。

图4为AT89C52单片机引脚图

5 控制部分的设计

5.1温度控制及超温和超温警报部分

本设计采用日常室内温度为标准:正常设定温度范围为17℃~30℃。当采集的温度经处理后超过规定温度上限时,单片机通过 P1 输出控制信号驱动二极管 D1.D2.D3.D4,同时单片机通过P3.1输出一个信号给三极管Q1,使继电器K1开启(制冷压缩机);经过一段时间后,采集回来的温度超过程序设计的温度下限值时,单片机通过 P1输出控制信号驱动二极管 D5.D6.D7.D8,同时单片机通过P3.0输出一个信号给三极管Q2,使继电器K2开启(加热器);在此同时单片机通过三极管驱动扬声器发出警笛声。具体电路连接如图5-1.所示

图5-1 实际电路连接图

5.2数码管显示

本电路主要使用七段数码管和锁存器芯片74HC573。图5-2-1采用共阴极的数码管,6个数码管的断码全部连接在一起由U1锁存器控制输出,数码管的位码分别连接在U2锁存器各个I/O端口。当我们给数码管的任一个阳极加一个高电平时,对应的这个发光二极管就点亮了。照图5-2-2分别介绍各引脚的作用.0E为三态允许控制端,通常称输出使能端,1D~8D为数据输入端;1Q~8Q为数据输出端;LE为锁存控制端。图5-2-3真值表表示74HC573芯片工作状态的直观特性,本设计是用锁存器来控制数码管的,因此在设计电路中始终将0E端接低电平。图中实际连线是由两个锁存器来控制数码管的显示。锁存器U1控制数码管的段码,锁存器U2控制位码具体控制数码管的显示位置。数码管显示时单片机端口应接上拉电阻,由于单片机I/O端口作数据输出时电流较小,而数码管的显示需要5mA以上的电流。所以数码管与单片机连接时需要加驱动电路,可以用上拉电阻的方法或使用专门的数码管驱动芯

片。本设计采用74HC573锁存器,其输出电流较大,电路接口简单。

具体见实际连线图如下图:

图5-2-1:7段数码管实际连接图

图5-2-2 74HC573引脚图图5-2-3 74HC573真值表

5.3串口通讯

max232资料简介:

该产品是由德州仪器公司(TI)推出的一款兼容RS232标准的芯片。由于电脑串口rs232电平是-10v +10v,而一般的单片机应用系统的信号电压是TTL电平0 +5v,52单

片机有一个全双工的串行通讯口,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。

在本设计中采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接,串口通讯具体如图5-3

图5-3 通讯接口连线图

6 程序设计

6.1 程序结构分析

主程序调用了3个子程序,分别是数码管显示程序、温度信号处理程序、单片机与PC机串口通讯程序。

温度信号处理程序:对温度芯片送过来的数据进行处理,进行判断和显示。

数码管显示程序:向数码的显示送数,控制系统的显示部分。

串口通讯程序:实现PC机与单片机通讯,将温度数据传送给PC机。

图7-1程序结构图6.2主程序

1.流程图。

图7-2主程序流程图

程序运行初始化,实时读取寄存器中的温度数据同时发送给PC机,执行温度处理函数当前的温度数据与设定的上下限温度值进行比较,显示当前温度函数。

2. 程序代码(详见附录程序清单)。

7. 测设分析

1、测试环境

环境温度28摄氏度,室内面积20平方米

测试仪器:温度计0----100摄氏度

2、测试方法

使系统运行,采用温度计同时测量室内度变化情况,得出系统测量的温度。

3、测试结果

设定温度由17摄氏度到30摄氏度

标定温差<=1摄氏度

静态误差<=0.5摄氏度

4、通过测试分析,对于实际室内的温度控制,可以再提出以下方法:

增加传感器个数,对各个温度传感器采集的数据进行求算术平均,可得到较为准确

温度值。对实际室内的温度控制,可采用功率较大的电炉,并且通过风扇对箱内温度进行充分搅和,降温设备可采用空气压缩机等制冷设备。

5、通过实验测试和分析,发现传感器的温度采集精度最高可得到 0.06 ℃,但测试得到的数据最小间隔为 0.03 ℃。

结论

在工业生产和日常生活中,对温度控制系统的要求,主要是保证温度在一定温度范围内变化,稳定性好,不振荡,对系统的快速性要求不高。在论文中简单分析了单片机温度控制系统设计过程及实现方法。本系统的测温范围为17℃~30℃,温度检测系统根据用户设定的温度范围完成一定范围的温度控制。

89C52的时钟最高可达12M,I/O口可达32个,高的时钟频率和丰富的I/O,都为我们实现电路功能提供了非常有利的条件。同时也因为开发环境友好,易用,方便,大大加快本系统设计开发。

本设计仅只对室内温度检测做了些实验数据论证,它还支持更多的扩展,应用范围非常广。由于本人的学识有限仅只做出简单的数据论证。

参考文献

[1]郭天祥主编 51单片机C语言教程[M]北京电子工业出版社出版 2009

[2]谭浩强主编 C程序设计(第三版)[M]北京清华大学出版社出版 2009

[3] 赵娜,赵刚,于珍珠等.基于51 单片机的温度测量系统[J]. 微计算机信息,2007,1-2:146-148。

[4]黄鸿、吴石增主编. 传感器技术及其应用技术.北京理工大学出版社,2002

附录:程序清单

主程序:

#include

#include

#include //机器周期头文件

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P2^2; //DS18B20数据端口

sbit dula=P2^6;

sbit wela=P2^7;

sbit sw=P3^0;

sbit jw=P3^1;

sbit beep=P2^3;

float temper1;

#define DQ_GAO() DQ=1 //宏定义

#define DQ_LOW() DQ=0

const uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; const uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点的数字

uint temper;

uchar a1,a2,a3,a4;

void disp(uchar,uchar,uchar,uchar); //显示函数

void delay(uint z)

{

uint t1,y;

for(t1=z;t1>0;t1--)

for(y=110;y>0;y--);

}

void delayus(uint x,uchar y) //微秒延时函数

{

uint i;uchar j;

for(i=x;i>0;i--);

for(j=y;j>0;j--);

}

/*void reset()

{

uint i;

DQ=0;

i=103;

while(i>0)i--;

DQ=1;

i=4;while(i>0)i--;

}*/

void reset()//复位初始化

{

uchar st=1;

DQ_GAO();

_nop_(); _nop_();

while(st)

{

DQ_LOW();

delayus(70,30); // 750us

DQ_GAO();

delayus(4,4); //70us

if(DQ==1)

st=1; //初始化不成功继续while循环

else

st=0;//初始化成功

}

delayus(50,10);//500us

}

void write_byte(uchar date) //写数据一般从低位写

{

uchar i,temp;

DQ_GAO(); //错误所在!!!写数据必须先拉高延时再拉低 _nop_(); _nop_();

for(i=8;i>0;i--) //发完八位数据

{

temp=date&0x01;//0000 0001

DQ_LOW();

delayus(0,0); //15us

if(temp==1)

DQ_GAO();//数据总线拉高表示数据已发出去

delayus(2,2);//45us

DQ_GAO();

date=date>>1; //0010 1010

}

}

uchar read_byte()// 读数据

{

uchar i,date;

static bit j;//状态位,又称“静态局部变量在下次条用该函数时,该变量已有值;

就是上一次函数调用结束时的值”

for(i=8;i>0;i--)

{

date=date>>1;

DQ_GAO();

_nop_(); _nop_();

DQ_LOW();

_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();

DQ_GAO();

_nop_(); _nop_();_nop_(); _nop_();

j=DQ;

if(j==1)

date=date|0x80; //1000 0000 一般从低位读只有放到字节的最好高位通过右移的方式才能做到

delayus(1,1);// 30us

}

return(date);

}

void get_tem()//读取寄存器中存储的温度数据

{

uchar tem1,tem2,num;

reset();//复位

write_byte(0xcc);//跳过ROM

write_byte(0x44);//温度转换

for(num=70;num>0;num--)

disp(a1,a2,a3,a4);//延时加显示 A/D转换也类似

reset(); // 初始化

write_byte(0xcc);//跳过ROM

write_byte(0xbe);//读暂存器内部RAM中9字节的温度数据

tem1=read_byte();//单片机读数据时一般会读2个字节共16位低字节

tem2=read_byte();//单片机读数据时一般会读2个字节共16位高字节

temper=(tem2*256.0+tem1)*6.2500;//温度系数转换成16位的温度数据再乘以0.0625就成为实际值了

temper1=temper/100.0;

a1=temper/1000;

a2=temper%1000/100;

a3=temper%100/10;

a4=temper%10;

}

void disp(uchar num1,uchar num2,uchar num3,uchar num4)//显示函数{

P0=table[num1];

dula=1;

dula=0;

P0=0xff;

P0=0xfe;

wela=1;

wela=0;

delay(5);

P0=table1[num2];

dula=1;

dula=0;

P0=0xff;

P0=0xfd;

wela=1;

wela=0;

delay(5);

P0=table[num3];

dula=1;

dula=0;

P0=0xff;

P0=0xfb;

wela=1;

wela=0;

delay(5);

P0=table[num4];

dula=1;

dula=0;

P0=0xff;

P0=0xf7;

wela=1;

wela=0;

delay(5);

}

void beep1(uint s,uchar led)//蜂鸣器设置函数

{

uchar i;

i=s;

P1=led;//二极管亮的位置

beep=0;//蜂鸣器响

while(i--)

{

disp(a1,a2,a3,a4);//利用温度显示函数延时

}

beep=1;//关

P1=0xff;// 同上

i=s;

while(i--)

{

disp(a1,a2,a3,a4);

}

}

void wenduchuli(uint t)//温度处理函数

{

uchar i;

if((t>2800)&&(t<=3100))//大于28度小于31度放大倍数为100

{

beep1(20,0xf0);//蜂鸣器响二极管1.3.5.7亮

}

else if(t<=2200)//小于等于22度

{

beep1(10,0x0f);//蜂鸣器响后面四个二极管灯亮

}

else

{

i=40;

while(i--)

{

disp(a1,a2,a3,a4);

}

}

}

void init_comm(void) //串口初始化

{

TMOD=0x20; //工作方式2

PCON=0x00; //波特率正常

SCON=0x50; //串口方式1波特率由T1溢出率决定10位异步收发 TH1=0xfd; //9600

TL1=0xfd;

TR1=1;

REN=1; //允许串口接收位

}

void comm(char *parr) //串口接收

{

// uint i;

do

{

ES=0;

TI=1;

//for(i=6000;i>0;i--)

// {

//SBUF=*parr++;

printf("实时检测%f°C\n",temper1); //输出函数//}

while(!TI); //等待发送完毕

TI=0;

ES=1;

}while(*parr); //先执行后判断

}

void main()

{ uchar buff[4],i;

init_comm();

while(1)

{

get_tem();//实时读取寄存器中的温度数据

wenduchuli(temper);// 温度处理函数

//sprintf(buff,"%f\n",temper1);

for(i=20;i>0;i--)

{

disp(a1,a2,a3,a4);

}

comm(buff);//串口接收函数

for(i=20;i>0;i--)

{

disp(a1,a2,a3,a4);

}

}

}

相关主题
文本预览
相关文档 最新文档