课程设计电加热水温控制系统文档格式.docx
《课程设计电加热水温控制系统文档格式.docx》由会员分享,可在线阅读,更多相关《课程设计电加热水温控制系统文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
1、原理图………………………………..………………………………….……..18
2、源程序……………………………….……………………………….…….…..19
摘要:
在现代工业生产中,温度是常用的测量被控因素。
本设计是基于51单片机控制,将DS18b20温度传感器实时温度转化,并通过1602液晶对温度实行实时显示,并通过加热片(PWM波,改变其占空比)加热与步进电机降温逐次逼近的方式,将温度保持在设定温度,通过按键调节温度报警区域,实现对温度在0℃-99℃控制的自动化。
实验结果表明此结构完全可行,温度偏差可达0.1℃以内。
关键字:
单片机;
传感器;
温控;
DS18b20
Abstract:
Inmodernindustrialproduction,thetemperatureiscommonlymeasuredcontrolledfactors.Thedesignisbasedonthe51SCMcontrol,theDS18b20temperaturesensorrealtimetemperaturetransformation,andthroughthe1602LCDonthetemperatureofthereal-timedisplay,andbyheatingthesheet(PWMwave,changingitsdutycycle)heatingandsteppermotorcoolingsuccessiveapproximationapproach,keepingthetemperatureatthesettemperature,throughthebuttonsadjusttemperaturealarmarea,thetemperatureat0℃-99℃controlautomation.Theexperimentalresultsshowthatthisstructureiscompletelyfeasible,thedeviationoftemperaturecanreach0.1DEGC.
Keyword:
monolithicintegratedcircuit;
Sensors;
Temperaturecontrol;
DS18b20
第一章系统设计
1.1项目概要
温度控制系统无论是工业生产过程,还是日常生活都起着非常重要的作用,过低或过高的温度环境不仅是一种资源的浪费,同时也会对机器和工作人员的寿命产生严重影响,极有可能造成严重的经济财产损失,给生活生产带来许多利的因素,基于AT89S52的单片机温度控制系统与传统的温度控制相比具有操作方便、价价格便宜、精确度高和开展容易等优点,因此市场前景好。
1.2设计任务和要求:
1、采用DS18B20作为温度传感器进行温度检测。
2、对采集温度进行显示(显示温度分辨率0.1℃);
3、采集温度数值应采用数字滤波措施,保证显示数据稳定。
4、设计相应的温度控制电路,根据测得的温度情况对加热器进行控制,将温度保持在设定温度。
5、通过按键设置温度上下限,超限通过LED、蜂鸣器报警。
第二章硬件设计
2.1硬件设计概要
根据需求,我们将系统分为五个模块,信息处理模块,温度采集模块、控制调节模块、报警电路模块,显示模块。
2.2信息处理模块
AT89C52是ATMEL公司的以8031核构成的8位Flash单片机系列。
这个系列单片机的最大特点就是在片内含有Flash存储器,AT89S52单片机是一种低功耗高性能的CMOS8位微控制器,内置8KB可在线编程闪存。
该器件采用Atmel公司的高密度非易失性存储技术生产,其指令与工业标准的80C51指令集兼容。
片内程序存储器允许重复在线编程,允许程序存储器在系统内通过SPI串行口改写或用同用的非易失性存储器改写。
通过把通用的8位CPU与可在线下载的Flash集成在一个芯片上,AT89S52便成为一个高效的微型计算机。
它的应用范围广,可用于解决复杂的控制问题,且成本较低。
单片机模块如图
(1)所示。
图
(1)单片机模块
2.3温度采集模块
2.3.1传感器DS18b20简介
DALLAS最新单线数字温度传感器DS18b20简介新的“一线器件”,体积更小、适用电压更宽、更经济。
Dallas半导体公司的数字化温度传感器DS18b20是世界上第一片支持“一线总线”接口温度传感器。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新的概念。
DS18b20、DS1822“一线总线”数字化温度传感器同DS1820一样,DS18b20也支持“一线总线”接口,测量温度范围为-55℃~+125℃,在-10℃~+85℃范围内,精度为
0.5℃。
DS18b20的精度较差为
2℃。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:
环境控制、设备或过程控制、测量类消费电子产品等。
与前一代产品不同,新的产品支持3V~5V的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18b20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18b20的实验板原理接线图如图
(2):
图
(2)DS18b20的实验板接线图
其中:
DQ为数字信号输入/输出端;
GND为电源地;
VDD为外接供电电源输入端(在寄生电源接线方式时接地)
2.3.2实验模拟电路图
温度检测控制模拟电路图ds18b20原件及其连线如图(3)温度此传感器上显示的温度同步显示到LED显示器上,并有加温,减温按钮。
图(3)温度检测控制模拟电路图
2.3.3程序流程图
图(4)主程序流程图
图(5)初始化子程序流程图
图(6)读按键的程序流程图
2.4控制调节模块
2.4.1升温调节系统
通过继电器的开合来控制加热片电路的通断,来达到设温效果,我们预设温度为25度,当温度低于25度时,单片机P3.6引脚输出高电平,继电器导通,对温度传感器加热,加热模块如图(7)所示。
图(7)加温控制电路
2.4.2温度上下限调节系统
通过按键控制键选着调节对象,通过上升下降调节值大小,模拟电路图如图(78主控电路:
我们设定温度为0--30度,为表示方便,这里让,控制开关,升温开关,降温开关分别为,k1,k2,k3,开始显示的是当前温度,K1主控开关,用来控制进入的是当前温度,温度上限,下限的调节界面。
按k1,一次进入三个界面。
按K2为加1开关,按一下,加1,k3减1开关,按一下,减1.
例如:
开始时显示的是当前温度界面,按下k1进入高温设定界面,显示器上显示当前温度和温度上限,按k2,上限加1,按k3,上限减1,再按k1进入显现设定界面,显示器显示当前温度,和温度下限,按k2,下限加1,按k3,下限减1,再按k1,进入显示当前温度界面。
如图(8)
2.4.3报警电路系统
通过led灯的闪烁以及蜂鸣器的鸣叫实现报警,如果温度超过上限灯D4亮,蜂鸣器鸣叫,低于下限灯D2亮,蜂鸣器鸣叫。
常温D1亮如图(9)(10)。
图(8)温度设定开关
图(9)报警模块
图(10)P3.7接蜂鸣器
2.5显示模块
通过采集ds18b20的温度,同步显示到LED显示器上,精确到小数点后第一位。
如下图
图(11)显示电路
第三章仿真显示成果
3.1运用proteus仿真
图(12)开始启动时,显示学号
图(13)显示当前温度
图(14)温度低于低温下限,低温报警灯亮,蜂鸣器鸣叫
图(15)温度高于温度上限,高温报警灯亮,蜂鸣器鸣叫
实习总结
刚开始接触到题目,一头雾水,第一周,我从网上下载了,《基于8051+PROTEUS仿真100实例》这个文档,从最简单的点亮一个流水灯,让数码管显示数字开始,第一周就做了这些简单的例子,100例做了20多个。
刚开始很慢,仿真模型里的原器件都不会找,编的程序编译时总出现报警、错误。
一遇到错误我们就慌了神了,所以起步很难。
后来在老师和同学的帮助下,慢慢积累,知道了常见的报警和错误的解决方法,编完调试成功20个例子后,算是对单片机有了一定的基础。
但这时一周已经过去了,别的小组已经仿真通过,开始实际运行了,而我们这组才开始。
第二周开始了,第一天我们没做设计,把各个小组的程序,电路图都拿来看,不懂得就请他们帮忙讲解。
由于前面有了知识,一些模块都看得懂,学得很快了。
发现主要是把各个模块融合到一起,头文件写到最前面,通过函数的调用!
给单片机接口高低电平,来实现功能。
这正好是我们的强项,一星期20个例子的功劳。
第二天我们开始自己编程,但是融合的过程中总出现错误,要嘛是变量没定义,要嘛是头文件重复!
还有一个,报警电路的数码管总是不亮,但单片机对应的接口有高低电平的变化,实际电路板上也成功,这个问题困扰了我们很久,怎么办都不亮,当时有想砸电脑的冲动,后来还是解决了,原来,是标号标错了位置,一点小问题,困扰了我们2天。
当解决这个问题时,那心灵的喜悦是这辈子都忘不了的!
通过两周的实习,我们从一个小白成长为一个对单片机入了门,并能实现简单的编程,还能解决实际问题的小人物了!
虽然过程很苦,每天对着电脑,就吃饭和上洗手间离开板凳!
一直盯着屏幕看!
不过2周熬过来了,收获蛮大的!
例如后来我又在我们的程序中加入了降温程序!
温度高,调动电动机吹风降温!
感觉无论做什么事都要吃得了苦受得了罪,天下没有什么事是难的,只有懒惰的人,只要用心去做,什么事都能成功!
致谢
两周的实习中,我遇到了许许多多的困难,但我能走过来,这和我组成员共同研究,共同讨论问题的辛勤是分不开的,灰心时我们相互鼓励,相互打气,。
感谢同组成员。
开始接触单片机,我是一个小白级人物,谢谢把我领入门的同班同学们,当我有问题请教时,他们会放下手头的工作,倾心为我解答,程序编译错误时,他们会帮我一起看提示,该错误!
谢谢同班同学们!
当然,我们实习时,老师一直陪伴着我们,尽管我没有问过老师问题,老师也没有帮我调试程序,但还是要谢谢刘老师,吕老师,你和我们在一起,无形中给了我们莫大的动力!
同时也起到了监督我们的作用,使我们不能够偷懒,不会出现有一组同学完成了,那么全班都完成了的情况!
正由于你们的严格的要求,我们这次实习才能圆满的完成,同学们都做出了想要的结果。
参考文献
[1]郭天祥.新概念51单片机C语音教程——入门提高开发拓展攻略[M].北京:
北京:
电子工业出版社,2009.
[2]韩广兴.电子元器件与实用电路基础[M].北京:
电子工业出版社,2005.
[3]方大千,朱丽.电子控制系统装置制作入门[M].北京:
国防出版社,2006.
[4]刘向举,刘丽娜.基于单片机的智能温度测控系统的设计[J].齐齐哈尔大学学报(自然科学版).2012(03)
[5]黄文力,邓小磊.DS18B20数字温度传感器接口程序的时序[J].仪器仪表用户.2011(06)
[6]黄晓林.一种实用型智能恒温控制系统设计[J].自动化技术与应用.
2011(11)
[7]王文,王直.基于ARM和DS18B20的温度监测系统[J].电子设计工程.2011(20)
[8]陈锡华,贾磊磊.温度传感器DS18B20序列号批量搜索算法[J].单片机与嵌入式系统应用.2011(09)
附录:
Proteus系统原理图:
图(16)系统原理图
源程序:
#include<
reg52.h>
#include<
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^3;
//ds18b20与单片机连接口
sbitRS=P2^0;
sbitRW=P2^1;
sbitEN=P2^2;
sbitkeyadd=P1^4;
sbitkeydel=P1^5;
sbitkeyok=P1^6;
sbitled_green=P2^3;
sbitled_yellow=P2^4;
sbitled_red=P2^5;
sbitshengwen=P3^6;
sbitjiangwen=P3^5;
sbitBEEP=P3^7;
ucharcodestr1[]={"
Temperatureis"
};
ucharcodestr2[]={"
"
ucharcodestr3[]={"
set_hightemp:
"
ucharcodestr4[]={"
set_lowtemp:
ucharcodestr5[]={"
studentN0:
ucharcodestr6[]={"
32209104"
uchardatadisdata[5];
ucharset_hightemp=33,set_lowtemp=0;
ucharp=0;
ucharaa[2];
uinttvalue;
//温度值
uchartflag;
//温度正负标志
//*************************lcd1602程序**************************/
voiddelay1ms(uintms)//延时1毫秒
{
uinti,j;
for(i=0;
i<
ms;
i++)
for(j=0;
j<
114;
j++);
}
voiddelay1s(uints)
uinti;
s;
delay1ms(1000);
//////////////////////111111*********1111111111111111111111报警程序
voidbaojing(void)
unsignedintj;
for(j=49;
j>
0;
j--)//响30ms
{
BEEP=~BEEP;
//输出频率800HzP0=0x7E;
//点亮D00和D07
delay1ms(10);
//延时310us
}
/////////////////////1111111111111111111111111111111111111报警程序
voidwr_com(ucharcom)//写指令//
{
delay1ms
(1);
RS=0;
RW=0;
EN=0;
P0=com;
//
EN=1;
voidwr_dat(uchardat)//写数据//
RS=1;
P0=dat;
voidlcd_init()//初始化设置//
delay1ms(15);
wr_com(0x38);
delay1ms(5);
wr_com(0x08);
wr_com(0x01);
wr_com(0x06);
wr_com(0x0c);
voiddisplay(uchar*p)//显示//
while(*p!
='
\0'
)
wr_dat(*p);
p++;
delay1ms
(1);
}
voidinit_play()//初始化显示
lcd_init();
wr_com(0x80);
display(str5);
wr_com(0xc0);
display(str6);
delay1s(3);
display(str1);
display(str2);
/***************************ds18b20程序****************************/
voiddelay_18B20(uinti)//延时1微秒
while(i--);
voidds1820rst()/*ds1820复位*/
ucharx=0;
DQ=1;
//DQ复位
delay_18B20(4);
//延时
DQ=0;
//DQ拉低
delay_18B20(100);
//精确延时大于480us
//拉高
delay_18B20(40);
uchards1820rd()/*读数据*/
uchari=0;
uchardat=0;
for(i=8;
i>
0;
i--)
{
DQ=0;
//给脉冲信号
dat>
>
=1;
if(DQ)
dat|=0x80;
delay_18B20(10);
return(dat);
voidds1820wr(ucharwdata)/*写数据*/
i>
i--)
DQ=wdata&
0x01;
delay_18B20(10);
DQ=1;
wdata>
read_temp()/*读取温度值并转换*/
uchara,b;
ds1820rst();
ds1820wr(0xcc);
//*跳过读序列号*/
ds1820wr(0x44);
//*启动温度转换*/
ds1820wr(0xbe);
//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<
<
=8;
tvalue=tvalue|a;
if(tvalue<
0x0fff)
tflag=0;
else
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);
//温度值扩大10倍,精确到1位小数
return(tvalue);
/*******************************************************************/
voidds1820disp()//温度值显示
ucharflagdat;
disdata[0]=tvalue/1000+0x30;
//百位数
disdata[1]=tvalue%1000/100+0x30;
//十位数
disdata[2]=tvalue%100/10+0x30;
//个位数
disdata[3]=tvalue%10+0x30;
//小数位
if(tflag==0)
flagdat=0x20;
//正温度不显示符号
flagdat=0x2d;
//负温度显示负号:
-
if(disdata[0]==0x30)
disdata[0]=0x20;
//如果百位为0,不显示
if(disdata[1]==0x30)
{
disdata[1]=0x20;
//如果百位为0,十位为0也不显示
}
wr_com(0xc0+4);
wr_dat(flagdat);
//显示符号位
wr_com(0xc1+4);
wr_dat(disdata[0]);
//显示百位
wr_com(0xc2+4);
wr_dat(disdata[1]);
//显示十位
wr_com(0xc3+4);
wr_dat(disdata[2]);
//显示个位
wr_com(0xc4+4);
wr_dat(0x2e);
//显示小数点
wr_com(0xc5+4);
wr_dat(disdata[3]);
//显示小数位
voidkey_count(uintok)
if(ok==1)display(str3);
elsedisplay(str4);
wr_com(0x8d);
wr_dat(aa[0]);
wr_com(0x8