使用52单片机和DS18B20温度传感器设计温控系统.docx
《使用52单片机和DS18B20温度传感器设计温控系统.docx》由会员分享,可在线阅读,更多相关《使用52单片机和DS18B20温度传感器设计温控系统.docx(21页珍藏版)》请在冰豆网上搜索。
使用52单片机和DS18B20温度传感器设计温控系统
综合设计报告
单位:
自动化学院
学生:
罗泽瞄
专业:
测控技术与仪器
班级:
0821101
学号:
2011212823
指导老师:
锐
成绩:
设计时间:
2014年10月
邮电大学自动化学院制
储仓温度的测控与通信模块设计
指导老师:
锐
一、给定任务及条件
针对某存储仓在常压下对温度的要求,选用合适的监测方法和器件,进行温度一体化测控设计,要求采用LED或LCD显示各时刻多点的温度值,并具有语言报警及简单的控制功能(温度控制精度为0.2℃)和通信功能。
二、具体要求
1.确定总体方案
(1)了解存储仓在常压下对温度值的需求,理解对温度参数测量和控制的基本原理和方法,分析建立该测控模块需要的参数围。
(2)根据温度检测、控制及通信要求,给出设计总体方案。
2.温度测控器详细设计
基于前面的总体方案,选择合适的传感器,采用单片机开发板,设计信号处理电路、控制电路、通信模块、执行器,系统集成。
三、具体设计过程,设计结果验证与分析
(1)对该测控系统的基本输入输出、测试、控制、通信、显示及报警等环节能进行简单的设计和系统集成。
(2)说明所设计的温度测控模块是如何进行多点温度采集及控制的,交代其工作原理和工作过程。
(3)对设计结果进行必要的分析。
(4)按时完成设计报告。
四、心得体会
根据已有的理论知识和技能,结合设计方案及软硬件调试结果,对本次综合设计进行总结,给出设计的心得体会。
摘要
本系统是基于AT89C52单片机的智能测温及控制系统,集成温度传感器,报警器(蜂鸣器),显示数码管,散热电机,继电器,蓝牙模块等,能够实现智能温度检测,并监测温度是否在仓库适宜温度围,具有报警、显示温度、制冷炙热、发送数据的功能。
本系统采用的是STC89C52单片机,并以其最小系统为基础,利用DS18B20数字温度传感器完成对温度的测量,并将测量数据在LED数码管上显示出来,同时系统将测量数据进行处理,当温度超过适宜温度围时,蜂鸣器将以较高频率鸣笛报警,散热电机被驱动;当温度低于适宜温度围时,蜂鸣器则以较低频率鸣笛报警,加热电路启动。
其中,DS18B20灵敏度较高,测量准确,线路也很容易搭建,是本系统完成智能测温度关键。
本系统硬件实现简单,灵敏度高,性能可靠,能够完成仓库,车间等的温度检测及控制。
关键词:
单片机DS18B20数码管报警散热电机继电器蓝牙发送
一、引言..........................................................5
二、测量原理分析..................................................5
2.1测量对象分析...............................................5
2.2设计解决放案...............................................5
三、硬件设计及搭建................................................6
3.1单片机最小系统和复位电路...................................6
3.2DS18B20数字温度传感电路....................................7
3.3数码管显示电路.............................................7
3.4报警装置电路...............................................8
3.5散热电机驱动电路...........................................9
3.6加热控制驱动电路...........................................9
3.7蓝牙数据发送电路..........................................10
四、程序设计......................................................10
4.1程序总体设计..............................................10
4.2主程序流程设计............................................11
五、系统仿真实验..................................................12
5.1仿真电路图................................................12
5.2仿真实现..................................................12
六、硬件测试......................................................13
6.1硬件电路搭建和测试........................................13
七、实验总结及心得体会............................................15
附录..............................................................16
一、引言
温度的测量对于工业发展有着重大意义,在许多情况下,温度直接影响工业产品的质量及生产效率等,同时,适宜的温度是保障产品合格率和质量的重要因素。
温度的测量和控制应用于各行业中。
例如,在仓库管理日常工作中,要做到对温度的监测并实时控制才能保障存储物资的安全及其原有的工作可靠性和使用寿命。
再如,在各种基站及工作机房中,温度测量及控制是各个仪器元件正常工作的重要保障。
因此,测温系统的功能实现具有很大的实用意义。
本系统采用基于单片机的智能温度测量,可以对温度实现自动测量并显示,同时系统也可对测量数据进行处理,判断其是否超过警戒值,当温度超过警戒值,可实现自动报警提示,并驱动散热电机工作。
这些智能功能的实现为解决各类需要温度测量和控制的实际问题提供了可靠的方法,摒弃了传统测温利用温度计,试纸等人工测量方法的不足,实现了测量和控制的自动化和智能化。
二、测量原理分析
2.1测量对象分析
本系统需要完成对温度的自动测量,在仓库,基站或机房等环境中,温度的测量需要实时性,并且数据具有可视性。
当温度超过警戒值时,存储的货物或仪器装置与元件将不能正常工作甚至损坏,必须实时掌握温度数据并将温度控制在一定围。
因此,本系统所要解决的主要问题是用怎样的方法实现温度的自动测量和控制,将温度这个物理量转换为系统可识别可处理的信号。
在考虑到功能实现的同时,应尽量保证系统的稳定性,可实现性,以及可控性,并将系统尽量简化,实现小型化。
2.2设计解决方案
系统采用STC89C52单片机,集成测温模块,显示模块,报警模块,加热控制模块,散热模块及蓝牙发送数据模块。
选用温度传感器为DS18B20,可将其直接连接在单片机的IO口上。
其测温基本原理是:
DS18B20中带有振荡频率随温度线性变化的振荡器,为计数器提供频率随温度变化的脉冲,即将物理的温度信号转换为频率信号。
在报警功能实现上,选用蜂鸣器作为报警装置,设置报警警戒值,由程序控制,当温度超过设定的警戒值,蜂鸣器以较快频率响起,而当温度低于设定的警戒值时,蜂鸣器以较低频率响起。
在温度控制模块中,当温度超过设定的警戒值并报警后,散热电机即开始工作,当温度低于设定的警戒值时,加热电路开始工作。
由于单片机的IO输出的驱动能力较小,不足以驱动散热电机和加热控制电路(采用继电器控制),因此需要外加驱动电路驱动散热电机和继电器工作。
在蓝牙数据发送模块中,须实时向外发送实测的温度数据,采用安卓APK和必要的蓝牙模块实现向手机实时发送数据。
图1即为系统框图:
DS18B20
STC89C52
显示部分
蓝牙发送部分
蜂鸣示警
降温部分
加热部分
图1系统框图
三、硬件设计及搭建
3.1单片机最小系统和复位电路
本系统采用STC89C52最小系统,由复位电路,电源,晶振电路及52芯片组成,满足单片机正常工作的最少条件。
图2为复位电路和单片机的最小系统:
图2单片机最小系统和复位电路
3.2DS18B20数字温度传感器电路
图3即为DS18B20温度传感器电路:
图3DS18B20温度传感电路
3.3数码管显示电路连接
本系统采用八位数码管显示测量结果,其基本结构如图4:
图4数码管结构
选用6位共阴级数码管来作显示,为了避免过多的使用单片机的IO口,我们采用两片74HC573来控制数码管的段选和位选。
图5为6位共阴数码管与STC8952芯片的连接示图(D0-D7分对P0-P7):
图5数码管显示电路
3.4报警装置(蜂鸣器)电路
当温度超过系统设置的警戒值时,蜂鸣器响即报警,STC89C51的IO口不能直接驱动蜂鸣器,需要一个PNP8550三极管来驱动。
图6为蜂鸣器连接电路:
图6报警电路
3.5散热电机驱动电路
需要外加的驱动电路才能使散热电机正常工作,l298n是常用的电机驱动模块,IN1和IN2控制电机方向,ENA为使能端。
如图7所示为散热电机的驱动电路:
图7散热电机驱动电路
3.6加热控制电路
通过控制继电器的通断来控制外围加热电路的工作,我们采用NPN8050(也可以采用L298n来做驱动)来驱动继电器。
图8位继电器控制电路:
图8加热控制电路
3.7蓝牙数据发送电路
采用一枚HC05蓝牙发送模块发送DS18B20实时采集到的数据,用蓝牙接收软件进行接受和显示。
图9为蓝牙模块和STC89C52的连接示意图,横线表示可有可无,箭头线表示必须的连线。
图9蓝牙数据发送电路
四、程序设计
4.1程序总体设计
由于本系统集成测温模块,显示模块,报警模块和散热电机模块,加热模块和蓝牙数据发送模块,所以总体程序包括温度采集子程序,显示子程序,温度处理子程序(包括控制报警模块、散热模块、加热模块)和串口发送子程序。
程序组成框图如图10:
主程序
温度采集并转换
温度显示
串口数据发送
温度处理
图10程序组成框图
4.2主程序流程设计
程序流程图如图11:
开始
温度采集并转换
显示温度
串口数据发送
判断
初始化
降温
加热
超温低温
图11程序流程图
五、系统仿真实验
5.1仿真电路图
根据设计思路用protues画出仿真电路图,包括一个STC89C52芯片,构成单片机最小系统的晶振电路,复位电路及电源,六位的数码管显示电路,DS18B20温度传感器连接电路,蜂鸣器报警电路、加热控制电路以及散热驱动电路。
仿真电路图如图12:
图12仿真电路
5.2仿真实现
检查电路图是否有误,注意各IO接口的连接,确认后在调入程序进行仿真实验。
得到温度数据,如图12为其中一个温度数据,当温度为20摄氏度时,显示的实时温度。
图13仿真实现
六、硬件测试
6.1硬件搭建及测试
在搭建硬件电路时,一定要注意断开电源,按照原理图一步一步走,以一个模块为单位进行搭建,确认无误后在进行另一模块的搭建。
元件搭建好后,要仔细检查是否有短路和断路的情况,排除错误情况后才可通电调试。
图14是搭建好的实物图并成功的显示了温度,图16为手机APK接收到的温度数据。
图14低温时的温度显示
图15高温时的温度显示
图16手机APK接收的温度数据
七、实验总结及心得体会
本次课程设计是以STC89C52为和DS18B20为基础,进行仓储储仓温度与通信模块的设计,并要完成显示、报警、升温、串口数据发送等一系列设计,从零到有,我们逐渐摸清了所有模块的硬件设计和程序编写。
在基础为零的情况下,最为头疼的是仿真,程序和硬件粗看没有任何问题,但仿真一直不能成功,除却仿真软件本身问题外,一些细节也决定着仿真的成败,比如标号大小写不分,器件选型错误等等问题都会让整个仿真受到影响。
其次是硬件实物的选型,之前很少接触电子元器件,所以在选型上面无异于是盲人摸象,在查阅了大量资料后才逐一敲定了型号。
在搭建硬件时,加热控制电路的继电器始终不工作,多番尝试不得其果,请教了很多大神也无疾而终,最终未采用npn驱动的方式,而是采用L298驱动从而获得成功。
此次课程设计于我而言可以用受益匪浅来形容,不仅加深了我对单片机的熟悉程度,还进一步了解了学习和实践之间的差距,也懂得了唯有学以致用才是学习的最终目的。
参考文献
郭天祥,《新概念51单片机C语言教程》—电子工业,2009
向敏,程安宇等《微控制器原理及应用》—人民邮电,2012
王金辉,《基于51单片机的温度控制系统设计》—农业大学,2012
蔡泉权,《基于单片机的恒温控制系统》
齐磊,《基于AT89C52单片机温度控制系统的设计》—大学,2012卢思祺,《MCS-51单片机温度控制系统的设计》—信息工程大学
夏志华,《基于单片机的温度控制系统的研究与实现》—职业技术学校,2013
XX百科,《ATK-HC05主从一体蓝牙串口模块用户手册-V1.00》,wenku.baidu./link?
url=SDxzqIFTB767nQxhsRdN2iJkJ8RnwXUvrQLOG1a20Fk8rK5zlmFk_JjaX0iEvFOlky6uMKIxCxQ48IM8DI8r4UO29S0bVYHL3tRCKNYSsUa
附录
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitds=P2^2;//温度传感器信号线
sbitdula=P2^6;//数码管段选线
sbitwela=P2^7;//数码管位选线
sbitbeep=P2^3;//蜂鸣器
sbitjidianqi1=P1^2;
sbitjidianqi2=P1^3;
sbitdianji1=P1^4;
sbitdianji2=P1^5;
sbitdianji=P2^4;//电机
sbitheat=P2^5;//加热
uinttemp;//定义整形的温度数据
floatf_temp;//定义浮点型的温度数据
uintwarn_l=250;//定义温度下限值
uintwarn_h=270;//定义温度上限值
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,//不带小数点的0~9编码
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};//带小数点的0~9编码
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddsreset(void)//18B20复位,初始化函数
{
uinti;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bittempreadbit(void)//读1位函数
{
uinti;
bitdat;
ds=0;i++;//i++起延时作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchartempread(void)//读1个字节
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
voidtempwritebyte(uchardat)//向ds18B20写一个字节数据
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;//写0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
voidtempchange(void)//DS18B20开始获取温度并转换
{
dsreset();
delay
(1);
tempwritebyte(0xcc);//写跳过读ROM指令
tempwritebyte(0x44);//写温度转换指令
}
uintget_temp()//读取寄存器中存储的温度数据
{
uchara,b;
dsreset();
delay
(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();//读低8位
b=tempread();//读高8位
temp=b;
temp<<=8;//两个字节组合为1个字
temp=temp|a;
f_temp=temp*0.0625;//温度在寄存器中为12位分辨率位0.0625°
temp=f_temp*10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入
f_temp=f_temp+0.05;
returntemp;//temp是整型
}
voiddis_temp(uintt)//显示温度数值函数t传递的是整形的温度值
{
uinti;
if(t>warn_h)
{
P0=0x00;
dula=1;
P0=0x76;
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay
(1);
}
if(t{
P0=0x00;
dula=1;
P0=0x38;
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay
(1);
}
i=t/100;//除以100得到商,为温度的十位
P0=0x00;
dula=1;
P0=table[i];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay
(1);//在数码管第二位显示温度的十位
i=t%100/10;
P0=0x00;
dula=1;
P0=table[i+10];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay
(1);//在数码管第三位显示温度的个位
i=t%10;
P0=0x00;
dula=1;
P0=table[i];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay
(1);//在数码管的第四位显示温度的小数位
P0=0x00;
dula=1;
P0=0x39;
dula=0;
P0=0xdf;
wela=1;
wela=0;
delay
(1);//在数码管的最后一位显示C
}
voidwarn(uints)//蜂鸣器报警,灯闪烁
{
uchari;
i=s;//s控制音调
beep=0;//蜂鸣器响
while(i--)
{
dis_temp(get_temp());//用温度显示数据函数起到延时作用
}
beep=1;//蜂鸣器不响
i=s;
while(i--)
{
dis_temp(get_temp());//用温度显示函数起到延迟作用
}
}
voiddeal(uintt)//温度处理函数
{
uchari;
if(t>warn_h)//大于27度
{dianji1=1;
dianji2=0;
jidianqi1=0;
jidianqi2=0;
dianji=1;//打开电机
heat=0;//关闭继电器
warn(10);//蜂鸣器发出快"滴"声
}
elseif(t<=warn_l)//小于25度
{
dianji1=0;
dianji2=0;
jidianqi1=1;
jidianqi2=0;
dianji=0;//关闭电机
heat=1;//打开继电器
warn(40);//蜂鸣器发出慢"滴"声
}
else//在25度和27度之间时只是调用显示函数延时
{
dianji1=0;
dianji2=0;
jidianqi1=0;
jidianqi2=0;
dianji=0;//关闭电机
heat=0;//关闭继电器
beep=1;//关闭蜂鸣器
i=40;
while(i--)
{
dis_temp(get_temp());
}
}
}
voidinit_(void)//串口初始化函数
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xFd;//波特率9600
TL1=0xFd;
TR1=1;
}
voidcomm(char*parr)//串口数据发送函数
{
do
{
SBUF=*parr++;//发送数据
while(!
TI);//等待发送完成标志为1
T