基于单片机的温度控制系统设计资料Word文档下载推荐.docx
《基于单片机的温度控制系统设计资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于单片机的温度控制系统设计资料Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
本系统组成主要有以下部分:
温度采集部分、数据运算处理部分、温度显示部分以及相应的提示信号部分。
温度采集
DS18B20
STC89C52
温度显示
与设定值进行运算比较
根据比较结果CPU执行相应指令
图1总体结构图
1.3系统原理组成和系统结构
这个智能温度控制系统由温度采集模块、温度显示模块、温度比较模块、处理模块等四大模块组成。
系统具体运行过程如下:
首先由智能温度传感器DS18B20从外界环境中采集到被测温度信号,将此信号发送到STC89C52单片机,然后单片机执行相应的指令,使继电器,发光二级管,蜂鸣器做出相应的动作。
2硬件设计
此系统的硬件电路包括以下部分,STC89C52单片机、LCD1602液晶显示屏、DS18B20、蜂鸣器、发光二极管、电磁继电器、加热装置、电阻、直流电压源、贴片按键以及晶振、导线等部分组成。
系统总体来说由四大部分构成:
温度范围设定,温度采集,数据处理,温度显示,处理机构等。
最初温度范围设定在软件中,但是可以通过按键对其进行调整。
温度采集采用的是温度智能传感器(DS18B20),这个智能传感器和单片机接口只需要一个I/O口,硬件电路连接比较方便,并且具有极强的抗干扰纠错能力。
数据处理采用的是STC89C52单片机,当温度低于设定温度时,绿灯会闪烁,并且蜂鸣器发出响声,继电器会闭合,进行加热;
当温度高于设定温度时,红灯会闪烁,蜂鸣器发出警报;
当温度在设定范围内时,黄灯亮。
温度显示采用的是1602液晶显示器。
显示器上会显示出当前温度、最高温度、最低温度。
图2晶振电路:
为单片机提供时钟信号
图3复位电路
图4继电器电路
原理:
当单片机P2.4引脚输出低电平时,三极管导通,则继电器线圈中会有电流流过,电流会产生电磁场,在电磁场的作用下,开关会被吸合。
当P2.4为高电平时,三极管处于截止状态,则线圈中没有电流流过,因此开关因失去磁场的吸合力而断开。
继电器电路中二极管的作用:
由于当P2.4由低电平突然变为高电平时,继电器线圈中的电流会突然消失,根据电磁感应原理以及楞次定理,线圈两边会产生一个瞬时的反向高压,为了防止线圈产生的瞬时高电压形成闭合回路,产生大电流,因此,在中间加一个反向二极管,起到抑制反向电流的作用。
图5温度范围指示灯依次为绿、红、黄
图6蜂鸣器电路图
当P1.0为低电平时,三极管导通,则蜂鸣器中有电流流过,因此蜂鸣器发声。
当P1.0为高电平时,三极管截止,蜂鸣器由于没有电流通过,因此停止发声。
图7温度传感器电路
DS18B20在出厂时默认配置为十二位,其中最高位是符号位,因此温度值共11位,单片机在读取数据时,一次会读2字节共十六位,读完后将低11位的二进制数转换成十进制数再乘以0.0625便为所测的真实值。
另外,还需要判断温度的正负。
前五位数字是符号位,这五位同时变化,我们只需要判断11位就可以了。
前五位为1时,读取温度为负值,则测量到的数值需要求出补码(求反加一),再乘以0.0625才得到实际温度值。
前五位为0时,读取温度为正值,只要将测得数值乘以0.0625即可得到实际温度值。
图8显示部分
此温控系统的显示采用的是LCD1602液晶显示器,各个引脚的功能和作用如下:
VSS连接电源地,VDD连接电源正极,VO是液晶显示对比度调节端,RS是数据/命令选择端,RW是读写选择端,E是使能信号端。
D0~D7是数据端。
通过RS确定是写数据还是写命令。
写命令包括液晶光标显示不显示、光标闪烁不闪烁、需不需要移屏、在液晶的什么位置显示,等等。
写数据是指要显示什么内容。
读/写控制端设置为写模式,即低电平。
将数据或命令送达数据线上。
给E一个高脉冲将数据送入液晶显示器,完成写操作。
图9按键电路图
由电路图可知某个按键被按下的标志是这个按键所对应的引脚的电平由高电平变为低电平。
因此,微处理器只需要检测P1.2、P1.3以及P1.4的电平变化
然后经过去抖动后,若对应的引脚依然为低电平,则表示此键被按下。
若电平由低变成高,则表示按键弹起。
3软件设计
4系统仿真及调试
我的程序是在KeilC软件中编写的,经过在软件中不断地调试,修改,最终终于编译通过。
编译通过后,生成hex文件。
然后打开Proteus软件,将生成的hex文件下载到单片机中,液晶显示屏上就显示出了如图所示的效果。
由于测到的温度是四十五度,而设定的范围是四十度到九十度,因此实际检测到的温度在设定温度范围之内,自己期望的效果是液晶屏上显示最高温度、最低温度、测到的实际温度,并且黄色的发光二极管发光。
从仿真结果来看,实际效果达到了自己所期望的效果。
图10系统仿真结果
总结
本次单片机课程设计一共是两周的时间,在这忙碌的两周时间,我学到了很多东西。
现在依然记得很清楚当时刚刚拿到题目时的那种茫然,感觉题目有一定的难度,而自己却无从下手,不知道从什么地方开始做起。
在高老师的带领和指导下,我那种消极的情绪渐渐的消失了,渐渐的明白了应该去做哪些准备工作,应该去查阅哪方面的资料。
就这样我又重新找回了自己的自信心,开始通过网络和书籍查找自己所需元件的特性和使用方法。
查清楚所需要的元件资料大概花费了四天的时间,我便开始设计自己的电路图,搭建电路图可不是一件容易的事,不过在同学和老师的帮助以及自己的努力下,大概花了一天的时间,我的电路设计图就完成了。
接下来的主要任务就是根据自己的电路编写程序,如果说设计电路不容易,那么编写程序我就只能用“非常难”这三个字来形容了。
由于我们上学期学的是汇编语言单片机,而我自己之前自学过C语言单片机,对于我自己来说,我感觉用C语言来编写比较方便一些,于是,我便开始了自己的编程。
编程需要耐心,因为我们编写出来的程序难免会有错误之处,在编译时不能通过,因此需要不断地去调试,直到编译通过为止。
经过几天反复的编写,在软件中编译,调试,纠错,最终编译结果终于通过。
接下来就是仿真了,需要在Proteus中将自己的硬件电路和软件结合起来,看能不能达到自己预期的效果。
第一次仿真时,非常期待结果马上就能出现,并且能够达到预期的效果。
可是现实和期待值总是存在一定的差距。
电路图难免会出现连接失误,连接不完全等等之类的问题,经过我的努力修改,最终我的电路终于达到了我预的期望值,当我看到液晶显示屏上的结果,发光二级管闪烁,以及继电器,蜂鸣器按照我的要求动作时,我的心中有说不出的高兴和愉悦。
通过这次的课程设计,我懂得了如何将自己学过的东西用于实践,即理论和实践相结合。
增强了我和同学之间的互动能力,使我能够更好地和各个班的同学相互交流,相互学习共同进步。
在以后的学习中,我会更加努力,坚持理论和实践相结合的思想,去探索,去追求。
参考文献
[1]王振红.综合电子技术与实践[M].北京:
清华大学出版社,2005.2:
28-33.
[2]梅丽凤.单片机原理及接口技术[M].北京:
清华大学出版社,2006.8:
63-72.
[3]徐爱华.单片机应用技术教程[M].机械工业出版社,2003.7:
128-156.
[4]谢宜仁,谢东辰.单片机实用技术问答[M].人民邮电出版社,2003.2:
235-269.
[5]何立民.单片机应用技术选编[M].北京:
北京航空航天大学出版社,1997.10:
20-35.
[6]郭天祥.51单片机C语言教程[M].电子工业出版社,2009.1:
343-349.
附录
源程序代码:
#include<
reg52.h>
intrins.h>
#include<
stdio.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitcgq=P3^7;
//18B20接口
sbitd1=P2^0;
//高于上限时,红灯闪烁
sbitd2=P2^1;
//低于下限温度时,绿灯闪烁
sbitd3=P2^2;
//黄灯正常时发光
sbitfeng=P1^0;
//不在正常范围内时蜂鸣器响
sbitsw=P2^4;
//当低于下限时,继电器吸合,升温开始工作
sbitrs=P2^6;
//1602控制位选择
sbitrw=P2^5;
sbiten=P2^7;
bitflag;
bitflag_f;
chartemph,templ;
//上限温度下线温度变量定义
ucharcodetable1[]={"
CT:
C"
};
ucharcodetable2[]={"
H:
+90.0L:
+40.0"
charhf='
+'
hs=9,hg=0,hd=0,lf='
ls=4,lg=0,ld=0;
//温度调整全局变量
voiddelayus(uintus)//延长时间为11*us+3微秒
{
while(--us)_nop_();
}
voiddelayms(uintms)//延时函数1秒
{uintx,y;
for(x=ms;
x>
0;
x--)
for(y=0;
y<
110;
y++);
//*************LCD1602控制函数*****************//
voidlcd_write_com(ucharcom)//写指令
delayms(5);
//维持信号稳定
rs=0;
rw=0;
en=0;
delayms
(1);
en=1;
P0=com;
voidlcd_write_date(uchardate)//写数据
delayms(5);
rs=1;
P0=date;
voidlcd_init()//液晶初始化
uchari;
delayms(15);
lcd_write_com(0x38);
lcd_write_com(0x01);
lcd_write_com(0x06);
lcd_write_com(0x0f);
lcd_write_com(0x80);
for(i=0;
i<
14;
i++)
{lcd_write_date(table1[i]);
delayms
(1);
lcd_write_com(0x80+0x40);
17;
{lcd_write_date(table2[i]);
/***************温度控制函数******************/
voidds18b20_init()//18B20初始化
{ucharx;
cgq=1;
delayus(8);
cgq=0;
delayus(50);
delayus(20);
x=cgq;
delayus(5);
voidds18b20_write_date(uchardate)//向DS18B20中写入一个字节
8;
{cgq=0;
cgq=date&
0x01;
delayus(5);
cgq=1;
date>
>
=1;
}
uchards18b20_read_date(void)//从18B20中读出一个字节
{uchari,date;
TR0=0;
{cgq=0;
if(cgq)
date|=0x80;
}TR0=1;
returndate;
voidds18b20_start()//启动温度转换
{ds18b20_init();
ds18b20_write_date(0xcc);
//跳过读取序列号
ds18b20_write_date(0x44);
//启动温度转换
delayus(200);
uintds18b20_temperature(void)//读取温度
{uchara;
uintb,t;
ds18b20_init();
ds18b20_init();
ds18b20_write_date(0xbe);
//读取温度寄存器,共九个节
a=ds18b20_read_date();
b=ds18b20_read_date();
b<
<
=8;
t=a+b;
returnt;
}
/****************按键调整******************/
sbitk1=P1^2;
sbitk2=P1^3;
sbitk3=P1^4;
uchark;
voidkey_scan()
{if(k1==0)
{delayms(10);
if(k1==0)
{while(!
k1);
delayms(10);
k++;
if(k==9)k=0;
switch(k)
{case0:
{flag=1;
lcd_write_com(0x0c);
lcd_write_com(0x80);
}break;
case1:
{flag=0;
d1=1;
d2=1;
d3=1;
feng=1;
lcd_write_com(0x0f);
lcd_write_com(0x80+0x40+2);
case2:
lcd_write_com(0x80+0x40+3);
case3:
{lcd_write_com(0x80+0x40+4);
case4:
{lcd_write_com(0x80+0x40+6);
case5:
{lcd_write_com(0x80+0x40+11);
case6:
{lcd_write_com(0x80+0x40+12);
case7:
{lcd_write_com(0x80+0x40+13);
case8:
{lcd_write_com(0x80+0x40+16);
if(k)
{
if(k2==0)
{delayms(10);
if(k2==0)
{while(!
k2);
delayms(10);
if(k==1)
{if(hf=='
)hf='
-'
;
elsehf='
lcd_write_date(hf);
lcd_write_com(0x80+0x40+2);
if(k==2)
{hs++;
if(hs>
=10)hs=0;
lcd_write_date(hs+0x30);
lcd_write_com(0x80+0x40+3);
if(k==3)
{hg++;
if(hg>
=10)hg=0;
lcd_write_date(hg+0x30);
lcd_write_com(0x80+0x40+4);
if(k==4)
{hd++;
if(hd>
=10)hd=0;
lcd_write_date(hd+0x30);
lcd_write_com(0x80+0x40+6);
if(k==5)
{if(lf=='
)lf='
elself='
lcd_write_date(lf);
lcd_write_com(0x80+0x40+11);
if(k==6)
{ls++;
if(ls>
=10)ls=0;
lcd_write_date(ls+0x30);
lcd_write_com(0x80+0x40+12);
if(k==7)
{lg++;
if(lg>
=10)lg=0;
lcd_write_date(lg+0x30);
lcd_write_com(0x80+0x40+13);
if(k==8)
{ld++;
if(ld>
=10)ld=0;
lcd_write_date(ld+0x30);
lcd_write_com(0x80+0x40+16);
}
}
if(k3==0)
if(k3==0)
k3);
{if(lf=='
lcd_write_com(0x80+0x40+2);
{hs--;
if(hs<
0)hs=9;
lcd_write_date(h