怀化职业技术学院
高职生毕业论文(设计)
题目:基于半导体集成温度传感器的单片机测温控制系统
学生姓名:陈像
专业:电气自动化
班级: 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);
}
}
}