数字式自动温度控制仪设计毕业设计论文Word下载.docx
《数字式自动温度控制仪设计毕业设计论文Word下载.docx》由会员分享,可在线阅读,更多相关《数字式自动温度控制仪设计毕业设计论文Word下载.docx(26页珍藏版)》请在冰豆网上搜索。
1)第1天,查阅相关资料,学习设计原理。
2)第2~3天,方案选择和电路设计仿真。
3)第4天,设计说明书撰写。
4)第5天,上交报告,同时进行答辩。
指导教师签名:
年月日
系主任(或责任教师)签名:
目录
摘要I
AbstractII
1设计要求及原理1
1.1设计要求1
1.2电路的总体工作原理1
2系统电路设计2
2.1系统硬件电路图2
2.2具体电路模块分析3
2.2.1温度传感器模块(DS18B20)3
2.2.2DS1302时钟电路4
2.2.3加热电路5
2.2.4电机驱动电路5
2.2.5液晶显示电路(LCD1602)6
3软件设计流程图8
4仿真以及性能分析9
5心得体会11
6参考文献12
附录源程序13
摘要
本次课程设计主要研究的是数字式自动温度控制仪,利用单片机来控制温度以及电机的转动。
它的主要组成部分有:
AT89C52单片机、温度传感器、LCD显示电路、温度控制电路,系统时间显示电路。
温度传感器DS18B20用于环境温度的采集与转换,DS1302用于产生系统时间,LCD显示电路用于显示温度传感器采集到的温度和直流电机的转速及系统时间,温度控制电路用于控制电机的转速及时间,AT89C52为系统的核心部分,进行数据的接收和处理。
此系统可以实时的显示环境温度,并可以根据温度来控制电机的转速以及这种转速维持的时间,将转速显示在液晶屏上,同时还可以控制加热设备。
关键词:
AT89C52DS18B20LCD显示
Abstract
Thecourseisprimarilydesignedresearchisdigitalautomatictemperaturecontroldevice,usingSCMtocontrolthetemperatureandtherotationofthemotor.Itsmaincomponentsinclude:
AT89C52microcontroller,temperaturesensor,LCDdisplaycircuit,thetemperaturecontrolcircuit,thesystemtimedisplaycircuit.DS18B20temperaturesensorforambienttemperatureacquisitionandconversion,DS1302isusedtogeneratethesystemtime,LCDdisplayspeedandsystemtemperaturesensortothetemperatureandDCmotorcircuitisusedtodisplaythetime,temperaturecontrolcircuitforcontrollingthemotorspeedandtime,AT89C52asthecoreofthesystem,receivingandprocessingdata.Thissystemcandisplayreal-timeambienttemperatureandthetemperaturecanbecontrolledaccordingtothemotorspeedandthetimetomaintainthisspeed,thespeeddisplayedontheLCDscreen,butyoucanalsocontroltheheatingequipment.
Keywords:
AT89C52DS18B20LCD
1设计要求及原理
1.1设计要求
本课程设计的要求是以AT89系列单片机为核心,设计一个数字式自动温度控制仪。
测量温度范围:
设置2个模拟输出通道:
一个通道控制加热设备(输出0~5VDC,控制0~220VAC),另一个通道控制电机转速(输出0~10V,控制转速0~2000rps);
1℃;
应用液晶显示器实时显示当前的温度值、系统时间和电机转速;
1.2电路的总体工作原理
电路总体分为6个模块,分别是DS18B20温度控制模块,DS1302系统时间显示模块,继电器加上lamp模拟的加热设备模块,L298直流电机控制模块,LCD1602液晶显示模块,AT89C52微控制器。
其中DS18B20与DS1302用来显示当前温度与时钟,测量的值直接在LCD上面显示,另外DS18B20的温度值还将控制直流电机的转速以及加热设备的启动。
电机的控制为温度控制,将温度分为3个档,这3个档分别对应不同的电机转速。
当温度下降到30度以下时,加热设备开始工作。
AT89C52芯片与LCD就负责数据的处理与显示。
系统框图如图1:
图1系统框图
2系统电路设计
2.1系统硬件电路图
图2系统电路图
如图2,系统硬件电路主要由温度显示,时钟芯片,电机驱动模块,加热模块以及LCD显示组成。
另外51单片机来控制数据的处理与传输。
2.2具体电路模块分析
2.2.1温度传感器模块(DS18B20)
DS18B20原理与特性:
本系统采用了DS18B20单总线可编程温度传感器,来实现对温度的采集和转换,大大简化了电路的复杂度,以及算法的要求。
内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的外形及管脚排列如图2-2所示
GND为接地线,DQ为数据输入输出接口,通过一个较弱的上拉电阻与单片机相连。
VDD为电源接口,既可由数据线提供电源,又可由外部提供电源,范围3.O~5.5V。
本文使用外部电源供电。
主要特点有:
1.用户可自设定报警上下限温度值。
2.不需要外部组件,能测量-55~+125℃范围内的温度。
3.-10℃~+85℃范围内的测温准确度为±
0.5℃。
4.通过编程可实现9~l2位的数字读数方式,可在至多750ms内将温度转换成12位的数字,测温分辨率可达0.0625℃。
5.独特的单总线接口方式,与微处理器连接时仅需要一条线即可实现与微处理器双向通讯。
6.测量结果直接输出数字温度信号,以"
一线总线"
串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。
7.负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
8.DS18B20支持多点组网的功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温[2]。
DS18B20测温电路图如图3所示。
图3DS18B20
DS18B20在本次设计中用于模拟显示当前实时温度,同时控制电机转速以及加热设备,当温度低于30度时,加热设备开启,同时电机转速最低;
当温度大于30度且小于40度时,加热设备关闭,电机转速适当地提高;
当温度高于40度时,电机转速达到最大。
2.2.2DS1302时钟电路
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
DS1302的外部引脚分配如图1所示及内部结构如图2所示。
DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。
在系统电路中用DS1302芯片来显示系统时间,电路图如图4。
图4DS1302
2.2.3加热电路
在本次仿真当中,用电灯以及继电器来模拟加热设备,当温度低于30度时,单片机输出端输出低电平,同时继电器工作,线圈闭合,12V的电灯lamp点亮。
电路图如图5。
图5加热电路
2.2.4电机驱动电路
本次课设需要用一个模拟输出来控制电机的转动,于是用P2.0输出PWM波形来控制电机转动,PWM的占空比的不同控制不同的电机转速,设置了3种不同的占空比,分别对应温度不同时电机的转速。
由于单片机输出电流太小,无法驱动直流电机的转动,因此加上L298来驱动直流电机。
由于需要记录电机的转速,采用的是编码电机MOTOR—ENCODER,
该电机其中一脚当电机每转一圈会产生一个脉冲,利用该脉冲记录转速。
电路图如图6,
图6电机驱动电路
2.2.5液晶显示电路(LCD1602)
LCD1602的管脚图如图2-4所示。
图7LCD1602管脚图
◆各引脚功能为:
VSS-地电源
VDD-5V正电源
VL-液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
RS-寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器
R/W-读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据
E-使能端,当E端由高电平跳变成低电平时,液晶模块执行命令
D0~D7-8位双向数据线
BLA(15管脚)-背光源正极
BLK(16管脚)-背光源负极
◆LCD1602的基本操作时序
写指令输入:
RS=L,
=L,
=指令码,E=高脉冲输出
:
=数据
写数据输入:
RS=H,
=数据,E=高脉冲,输出:
无
◆LCD1602的写操作时序
1)通过RS确定是写数据还是写指令。
指令包括使液晶的光标显示/不显示,光标闪烁/不闪烁,需/不需移屏,在液晶的什么位置显示等等。
写数据是要显示什么内容。
2)读/写控制端设置为写模式,即低电平。
3)将数据或命令送达数据线上。
4)给E一个高脉冲将数据送入液晶控制器,完成写操作。
3软件设计流程图
按上述工作原理和硬件结构分析可知系统主程序流程图如下图8所示。
图8主程序工作流程图
4仿真以及性能分析
仿真开始时,当温度还为30度时,此时电灯熄灭,LCD上显示的转速为48r/min。
电路图如图9。
图9温度为30℃时
由图10可见,此时温度29℃,低于30度,右下角的加热设备电灯点亮,同时随着温度的下降,电机转速转速也随之下降,LCD显示屏上显示为36r/min,并显示了当前的温度以及系统时间。
图10温度低于30℃
当温度继续上升,因为没达到临界值,电灯开关状态并没有发生改变,但随着温度的上升,电机的转速随之升高,为54r/min。
如图11
图11
当温度升高到41度时,开关状态发生改变,电机转速也随温度升高而线性升高,为60r/min如图12
图12
当温度在不同的范围时,题目中要求电机的转速为800r/s和1500r/s,但由于proteus仿真的直流电机不能达到那么高的转速,因此,在仿真的过程当中,利用每分钟多少转来显示,通过仿真不同的温度范围,都能达到预定的转速。
而在实际当中,又通过修改pwm波的占空比,从而调节转速,测量电机转速的方法是测10秒内电机的转动圈数,然后乘上6就转换为电机每分钟的转速,这样简单但是必然会导致一定误差,但是不影响总体。
在程序中我只设置了3种不同温度控制电机转速,如果需要更加精确的温度控制,随时可以加上更加精细的温度档数。
5心得体会
正所谓“纸上得来终觉浅,觉知此事要躬行。
”学习任何知识,仅从理论上去求知,而不去实践、探索是不够的。
因此在学期末来临之际,我们迎来了单片机的课程设计,此次设计就是综合运用以前学过的C语言知识、Proteus仿真、keil软件、单片机的编程基础知识等来设计一个自动温度控制仪。
此次的课程设计我觉得最基础的应该是C语言知识。
作为一种入门语言,我们在大一就已经学过,并且还参加了计算机二级考试。
但当时学的时候就只了解一些语法知识,编一些简单的程序,至于具体地能应用到哪个方面,从来就没有去考虑。
以前也做过类似的课设,可当时也没怎么把它当回事,纯粹是打酱油,随便在网上搜几个程序就可以解决老师所布置下来的任务。
其时,当时也并不明白原理性,就连操作也是看了别人的解释才稍微地明白了那么一点,更不用说去探究各种不同的方法来完成相同的任务,以此比较它们的性能好坏。
这学期因为很闲,就了解了一下C语言的用法,因此经常跟它打交道,对于一些简单的芯片、开发板的电路结构都有了个基本的了解,因此这次跟上次比起来感觉还是顺手多了。
但问题还是会常出现的,我们书本上的知识都是零散的,这就必须得把它们串起来,然后用C语言把它们一一实现,因此少不了上网查阅各种资料,实在不懂的就跟同学们探讨,在这个过程中,大家都可以交流自己的想法,我们学会了如何去接受别人的观点,偿到了合作的甜头。
在设计之前我根本就没有考虑到电机的转速特性,认为只要我们人为控制,都可以达到预定的要求,因此就直接使用了步进电机,但不管怎样好像都无法实现目标,最后在同学的提醒下才使用直流电机来提速。
在整个设计过程中我懂得了许多东西,也培养了独立思考和设计的能力,树立了对知识应用的信心,相信会对今后的学习工作和生活有非常大的帮助,并且提高了自己的动手实践操作能力,使自己充分体会到了在设计过程中的成功喜悦。
虽然这个设计做的不怎么好,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富,使我终身受益。
在没有做课程设计以前,觉得课程设计只是对知识的单纯总结,但是通过这次课程设计发现自己的看法有点太片面,课程设计不仅是对前面所学知识的一种检验,也是对自己能力的一种提高,这次课程设计使我明白了原来的那点知识是非常欠缺的,要学习的东西还很多,我们要明白学习是一个长期积累的过程,在以后的工作和生活中都应该不断的学习,努力提高自己的知识和综合素质。
6参考文献
[1]郭天祥.51单片机C语言教程[M].北京:
电子工业出版社,2009
[2]楼然苗.51系列单片机设计实例[M]北京:
北京航空航天大学出版社,2006
[3]彭伟.单片机C语言程序设计实训100例—基于8051+Proteus仿真.北京:
电子工业出版社,2010
[4]史翔,张岳涛.基于AT89C51单片机微电阻测量系统[J].甘肃科技,2007年8月
[5]王东峰,王会良.单片机C语言应用100例[M].北京:
附录源程序
Main.c:
#include<
reg52.h>
#include"
LCD.h"
DS18B20.h"
DS1302.h"
sbitoutv=P2^0;
//电机转动时PWM输出口;
sbitctr=P2^3;
//控制加热设备输出
ucharflag2=1;
uchartflag=1;
uchartimeflag=0;
ucharper=10;
//PWM低电平所占时间
voidinitall();
voidchesu();
voidinitT0();
voidDispTemp(uinttem);
voidDispTime();
voidDispSP();
/*****************主函数**********************/
voidmain()
{
initall();
while
(1)
{
DispTemp(gettemp());
DispTime();
if(timeflag)
DispSP();
}
}
/******************温度显示函数*******************/
voidDispTemp(uinttem)
{
if(tflag)//第一次调用温度显示函数
{
tflag=0;
write_string(0,10,"
Tem:
"
);
}
if(tem<
300)//随着温度的改变,PWM的占空比发生变化,同时加热设备也发生变化
per=10;
ctr=0;
else
ctr=1;
if(tem>
=300&
&
tem<
=330)
per=5;
else
per=0;
write_com(0x80+14);
write_data(tem/100+48);
write_data(tem%100/10+48);
write_data('
.'
write_data(tem%10+48);
write_data(0);
//显示摄氏度
/***************DS1302时间显示函数*********************/
voidDispTime()
ucharj;
gettime();
write_com(0x80);
for(j=0;
j<
8;
j++)
write_data(buf[j]);
/*******************初始化****************************/
voidinitall()
initLCD();
if((read(0x83)==0x00)&
(read(0x81)==0x80))//判断1302的秒的第8位是否为1,即是否处于低功耗状态(振荡器停止)
write(0x8E,0x00);
//取消写保护
write(0x80,0x00);
write(0x8E,0x80);
//写保护
initT0();
outv=0;
write_string(1,0,"
Speed:
000r/min"
/**********************中断初始化**********************/
voidinitT0()
TMOD=0x51;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=0;
TL1=0;
EA=1;
ET0=1;
TR0=1;
TR1=1;
/*****************中断函数*********************/
voidT0_time()interrupt1
uchartimes;
times++;
if(times%20>
per)
outv=1;
outv=0;
if(times==200)
times=0;
timeflag=1;
/*******************电机转速显示函数*********************************/
voidDispSP()
uintcount=0;
timeflag=0;
write_com(0xc0+7);
count=TH1*256+TL1;
write_data(count*6/100+48);
write_data(count*6%100/10+48);
write_data(count*6%10+48);
}
LCD.c:
#include<
#include"
sbitRS=P1^0;
sbitEN=P1^1;
ucharPic[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};
//摄氏度的图案显示
voiddelayms(uintx)
uinti,j;
for(i=0;
i<
x;
i++)
for(j=0;
124;
j++);
voidwrite_com(ucharcom)
RS=0;
P0=com;
delayms(5);
EN=1;
EN=0;
voidwrite_data(ucharcom1)
RS=1;
P0=com1;
voidwrite_string(ucharcol,ucharline,uchar*table)//LCD中输出字符串
if(col==0)
write_com(0x80+line);
while(*table!
='
\0'
)
{
write_data(*table++);
}
elseif(col==1)
write_com(0xc0+line);
elsereturn;
voidinitLCD()
uchark;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
//清屏;
write_com(0x40);
for(k=0;
k<
k++)
write_data(Pic[k]);