2014年使用52单片机和DS18B20温度传感器设计温控系统 - 图文

更新时间:2024-03-22 17:59:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

综合设计报告

单 位: 自动化学院 学生姓名: 罗泽瞄 专 业: 测控技术与仪器 班 级: 0821101 学 号: 2011212823 指导老师: 李锐

成 绩:

设计时间:2014年 10月 重庆邮电大学自动化学院制

1

储仓温度的测控与通信模块设计

指导老师:李锐 一、给定任务及条件

针对某存储仓在常压下对温度的要求,选用合适的监测方法和器件,进行温度一体化测控设计,要求采用LED或LCD显示各时刻多点的温度值,并具有语言报警及简单的控制功能(温度控制精度为0.2℃)和通信功能。

二、具体要求

1.确定总体方案

(1)了解存储仓在常压下对温度值的需求,理解对温度参数测量和控制的基本原理和方法,分析建立该测控模块需要的参数范围。

(2)根据温度检测、控制及通信要求,给出设计总体方案。 2.温度测控器详细设计

基于前面的总体方案,选择合适的传感器,采用单片机开发板,设计信号处理电路、控制电路、通信模块、执行器,系统集成。

三、具体设计过程,设计结果验证与分析

(1)对该测控系统的基本输入输出、测试、控制、通信、显示及报警等环节能进行简单的设计和系统集成。

(2)说明所设计的温度测控模块是如何进行多点温度采集及控制的,交代其工作原理和工作过程。

(3)对设计结果进行必要的分析。 (4)按时完成设计报告。

四、心得体会

根据已有的理论知识和技能,结合设计方案及软硬件调试结果,对本次综合

设计进行总结,给出设计的心得体会。

2

摘要

本系统是基于AT89C52单片机的智能测温及控制系统,集成温度传感器,报警器(蜂鸣器),显示数码管,散热电机,继电器,蓝牙模块等,能够实现智能温度检测,并监测温度是否在仓库适宜温度范围内,具有报警、显示温度、制冷炙热、发送数据的功能。本系统采用的是STC89C52单片机,并以其最小系统为基础,利用DS18B20数字温度传感器完成对温度的测量,并将测量数据在LED数码管上显示出来,同时系统将测量数据进行处理,当温度超过适宜温度范围时,蜂鸣器将以较高频率鸣笛报警,散热电机被驱动;当温度低于适宜温度范围时,蜂鸣器则以较低频率鸣笛报警,加热电路启动。其中,DS18B20灵敏度较高,测量准确,线路也很容易搭建,是本系统完成智能测温度关键。

本系统硬件实现简单,灵敏度高,性能可靠,能够完成仓库,车间等的温度检测及控制。

关键词:单片机 DS18B20 数码管 报警 散热电机 继电器 蓝牙发送

3

目录

一、引言..........................................................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

4

一、引言

温度的测量对于工业发展有着重大意义,在许多情况下,温度直接影

响工业产品的质量及生产效率等,同时,适宜的温度是保障产品合格率和质量的重要因素。温度的测量和控制应用于各行业中。例如,在仓库管理日常工作中,要做到对温度的监测并实时控制才能保障存储物资的安全及其原有的工作可靠性和使用寿命。再如,在各种基站及工作机房中,温度测量及控制是各个仪器元件正常工作的重要保障。因此,测温系统的功能实现具有很大的实用意义。本系统采用基于单片机的智能温度测量,可以对温度实现自动测量并显示,同时系统也可对测量数据进行处理,判断其是否超过警戒值,当温度超过警戒值,可实现自动报警提示,并驱动散热电机工作。这些智能功能的实现为解决各类需要温度测量和控制的实际问题提供了可靠的方法,摒弃了传统测温利用温度计,试纸等人工测量方法的不足,实现了测量和控制的自动化和智能化。

二、测量原理分析

2.1测量对象分析

本系统需要完成对温度的自动测量,在仓库,基站或机房等环境中,温度的测量需要实时性,并且数据具有可视性。当温度超过警戒值时,存储的货物或仪器装置与元件将不能正常工作甚至损坏,必须实时掌握温度数据并将温度控制在一定范围内。因此,本系统所要解决的主要问题是用怎样的方法实现温度的自动测量和控制,将温度这个物理量转换为系统可识别可处理的信号。

在考虑到功能实现的同时,应尽量保证系统的稳定性,可实现性,以及可控性,并将系统尽量简化,实现小型化。

2.2 设计解决方案

系统采用STC89C52单片机,集成测温模块,显示模块,报警模块,加热控制模块,散热模块及蓝牙发送数据模块。选用温度传感器为DS18B20,可将其直接连接在单片机的IO口上。其测温基本原理是:DS18B20中带有振荡频率随温度线性变化的振荡器,为计数器提供频率随温度变化的脉冲,即将物理的温度信

5

号转换为频率信号。在报警功能实现上,选用蜂鸣器作为报警装置,设置报警警戒值,由程序控制,当温度超过设定的警戒值,蜂鸣器以较快频率响起,而当温度低于设定的警戒值时,蜂鸣器以较低频率响起。在温度控制模块中,当温度超过设定的警戒值并报警后,散热电机即开始工作,当温度低于设定的警戒值时,加热电路开始工作。由于单片机的IO输出的驱动能力较小,不足以驱动散热电机和加热控制电路(采用继电器控制),因此需要外加驱动电路驱动散热电机和继电器工作。在蓝牙数据发送模块中,须实时向外发送实测的温度数据,采用安卓APK和必要的蓝牙模块实现向手机实时发送数据。图1即为系统框图: 图1 系统框图

DS18B20 蜂鸣示警 加热部分 显示部分 STC89C52 降温部分 蓝牙发送部分

三、硬件设计及搭建

3.1单片机最小系统和复位电路

本系统采用STC89C52最小系统,由复位电路,电源,晶振电路及52芯片组

成,满足单片机正常工作的最少条件。图2为复位电路和单片机的最小系统:

6

图2 单片机最小系统和复位电路

3.2 DS18B20数字温度传感器电路

图3即为DS18B20温度传感器电路:

图3 DS18B20温度传感电路

3.3数码管显示电路连接

本系统采用八位数码管显示测量结果,其基本结构如图4:

7

图4 数码管结构

选用6位共阴级数码管来作显示,为了避免过多的使用单片机的IO口,我们采用两片74HC573来控制数码管的段选和位选。图5为6位共阴数码管与STC8952芯片的连接示图(D0-D7分对P0-P7):

图5 数码管显示电路

3.4报警装置(蜂鸣器)电路

当温度超过系统设置的警戒值时,蜂鸣器响即报警,STC89C51的IO口不能直接驱动蜂鸣器,需要一个PNP8550三极管来驱动。图6为蜂鸣器连接电路:

图6 报警电路

8

3.5 散热电机驱动电路

需要外加的驱动电路才能使散热电机正常工作,l298n是常用的电机驱动模块,IN1和IN2控制电机方向,ENA为使能端。如图7所示为散热电机的驱动电路:

图7 散热电机驱动电路

3.6加热控制电路

通过控制继电器的通断来控制外围加热电路的工作,我们采用NPN8050(也可以采用L298n来做驱动)来驱动继电器。图8位继电器控制电路:

图8 加热控制电路

9

3.7蓝牙数据发送电路

采用一枚HC05蓝牙发送模块发送DS18B20实时采集到的数据,用蓝牙接收软件进行接受和显示。图9为蓝牙模块和STC89C52的连接示意图,横线表示可有可无,箭头线表示必须的连线。

LED KEY RXD TXD GND VCC IO1 IO2 TXD AT89C52 RXD GND VCC HC05模块 图9 蓝牙数据发送电路

四、程序设计

4.1程序总体设计

由于本系统集成测温模块,显示模块,报警模块和散热电机模块,加热模块和蓝牙数据发送模块,所以总体程序包括温度采集子程序,显示子程序,温度处理子程序(包括控制报警模块、散热模块、加热模块)和串口发送子程序。程序组成框图如图10:

图10 程序组成框图

温度采集并转换温度显示串口数据发送温度处理 主程序 4.2 主程序流程设计

10

程序流程图如图11:

超温 低温 判断

图11 程序流程图

温度采集并转换 初始化 开始 降温显示温度 加热五、系统仿真实验

5.1 仿真电路图

根据设计思路用protues画出仿真电路图,包括一个STC89C52芯片,构成单片机最小系统的晶振电路,复位电路及电源,六位的数码管显示电路,DS18B20温度传感器连接电路,蜂鸣器报警电路、加热控制电路以及散热驱动电路。

仿真电路图如图12:

串口数据发送 11

图12 仿真电路

5.2 仿真实现

检查电路图是否有误,注意各IO接口的连接,确认后在调入程序进行仿真实验。得到温度数据,如图12为其中一个温度数据,当温度为20摄氏度时,显示的实时温度。

图13 仿真实现

12

六、硬件测试

6.1硬件搭建及测试

在搭建硬件电路时,一定要注意断开电源,按照原理图一步一步走,以一个模块为单位进行搭建,确认无误后在进行另一模块的搭建。元件搭建好后,要仔细检查是否有短路和断路的情况,排除错误情况后才可通电调试。图14是搭建好的实物图并成功的显示了温度,图16为手机APK接收到的温度数据。

图14 低温时的温度显示

图15 高温时的温度显示

13

图16 手机APK接收的温度数据

七、实验总结及心得体会

本次课程设计是以STC89C52为和DS18B20为基础,进行仓储储仓温度与通信模块的设计,并要完成显示、报警、升温、串口数据发送等一系列设计,从零到有,我们逐渐摸清了所有模块的硬件设计和程序编写。在基础为零的情况下,最为头疼的是仿真,程序和硬件粗看没有任何问题,但仿真一直不能成功,除却仿真软件本身问题外,一些细节也决定着仿真的成败,比如标号大小写不分,器件选型错误等等问题都会让整个仿真受到影响。其次是硬件实物的选型,之前很少接触电子元器件,所以在选型上面无异于是盲人摸象,在查阅了大量资料后才逐一敲定了型号。在搭建硬件时,加热控制电路的继电器始终不工作,多番尝试不得其果,请教了很多大神也无疾而终,最终未采用npn驱动的方式,而是采用L298驱动从而获得成功。

此次课程设计于我而言可以用受益匪浅来形容,不仅加深了我对单片机的熟

14

悉程度,还进一步了解了学习和实践之间的差距,也懂得了唯有学以致用才是学习的最终目的。

参考文献

郭天祥,《新概念51单片机C语言教程》—电子工业出版社,2009 向敏,程安宇等《微控制器原理及应用》—人民邮电出版社,2012 王金辉,《基于51单片机的温度控制系统设计》—南京农业大学,2012 蔡泉权,《基于单片机的恒温控制系统》

齐磊,《基于AT89C52单片机温度控制系统的设计》—内蒙古大学,2012卢思祺,《MCS-51单片机温度控制系统的设计》—南京信息工程大学 夏志华,《基于单片机的温度控制系统的研究与实现》—保定职业技术学校,2013

百度百科,《ATK-HC05主从一体蓝牙串口模块用户手册-V1.00》,http://wenku.http://www.wodefanwen.com//link?url=SDxzqIFTB767nQxhsRdN2iJkJ8RnwXUvrQLOG1a20Fk8rK5zlmFk_JjaX0iEvFOlky6uMKIxCxQ48IM8DI8r4UO29S0bVYHL3tRCKNYSsUa

附录

#include sbit dianji=P2^4; #include //电机 #define uchar unsigned char sbit heat=P2^5; #define uint unsigned int //加热 sbit ds=P2^2; uint temp; //温度传感器信号线 //定义整形的温度数据 sbit dula=P2^6; float f_temp; //数码管段选线 //定义浮点型的温度数据 sbit wela=P2^7; uint warn_l=250; //数码管位选线 //定义温度下限值 sbit beep=P2^3; uint warn_h=270; //蜂鸣器 //定义温度上限值 sbit jidianqi1=P1^2; unsigned char code sbit jidianqi2=P1^3; table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6 sbit dianji1=P1^4; d,0x7d, sbit dianji2=P1^5;

15

0x07,0x7f,0x6f,//不带小数点的0~9编 for(i=1;i<=8;i++) 码 { j=tempreadbit(); 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, dat=(j<<7)|(dat>>1); // 读出的数据最低位在最前面,这样刚 0x87,0xff,0xef};//带小数点的0~9编好一个字节在DAT里 码 } void delay(uint z) return(dat); //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void dsreset(void) 复位,初始化函数 { uint i; ds=0; i=103; while(i>0)i--; ds=1; i=4; while(i>0)i--; } bit tempreadbit(void) 位函数 { uint i; bit dat; ds=0;i++; 起延时作用 ds=1;i++;i++; dat=ds; i=8;while(i>0)i--; return (dat); } uchar tempread(void) 个字节 { uchar i,j,dat; dat=0;

} void tempwritebyte(uchar dat) //向ds18B20写一个字节数据 { uint i; //18B20 uchar j; bit testb; 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--; //读1 } else { ds=0; //写 0 i=8;while(i>0)i--; //i++ ds=1; i++;i++; } } } void tempchange(void) //读1//DS18B20 开始获取温度并转换 { dsreset(); delay(1); tempwritebyte(0xcc); // 写

16

跳过读ROM指令 wela=1; tempwritebyte(0x44); // 写 P0=0xfe; 温度转换指令 wela=0; } delay(1); } uint get_temp() //读 if(twarn_h) P0=0xfb; { wela=0; P0=0x00; delay(1); dula=1; //在数码管第三位显示温度的个位 P0=0x76; dula=0; i=t; P0=0xff; P0=0x00;

17

dula=1; //温度处理函数 P0=table[i]; { dula=0; uchar i; P0=0xff; if(t>warn_h) wela=1; //大于27度 P0=0xf7; { dianji1=1; wela=0; dianji2=0; delay(1); jidianqi1=0; //在数码管的第四位显示温度的小数 jidianqi2=0; 位 dianji=1; //打开电机 P0=0x00; heat=0; dula=1; //关闭继电器 P0=0x39; warn(10); dula=0; //蜂鸣器发出快\滴\声 P0=0xdf; } wela=1; else if(t<=warn_l) wela=0; //小于25度 delay(1); { //在数码管的最后一位显示C dianji1=0; } dianji2=0; void warn(uint s) jidianqi1=1; //蜂鸣器报警,灯闪烁 jidianqi2=0; { dianji=0; uchar i; //关闭电机 i=s; //s heat=1; 控制音调 //打开继电器 beep=0; warn(40); //蜂鸣器响 //蜂鸣器发出慢\滴\声 while(i--) { } dis_temp(get_temp()); else //用温度显示数据函数起到延时作用 //在25度和27度之间时只是调用显示 } 函数延时 beep=1; { //蜂鸣器不响 dianji1=0; i=s; dianji2=0; while(i--) jidianqi1=0; { jidianqi2=0; dis_temp(get_temp()); dianji=0; //用温度 显示函数起到延迟作用 //关闭电机 } heat=0; } //关闭继电器 void deal(uint t ) beep=1;

18

//关闭蜂鸣器 //温度转换函数 i=40; for(i=10;i>0;i--) while(i--) { { dis_temp(get_temp()); dis_temp(get_temp()); //获取温度并显示 } } } deal(get_temp()); } sprintf(buff,\ void init_com(void) // 将浮点型温度格式化为字符型 //串口初始化函数 for(i=10;i>0;i--) { { TMOD=0x20; dis_temp(get_temp()); PCON=0x00; //温度显示 SCON=0x50; } TH1=0xFd; comm(buff); //波特率9600 //串口发送数据 TL1=0xFd; for(i=10;i>0;i--) TR1=1; { } dis_temp(get_temp()); void comm(char *parr) // 温度显示 //串口数据发送函数 } { } do } { SBUF=*parr++; //发送数据 while(!TI); //等待发送完成标志为1 TI=0; //标志清0 }while(*parr); //保持循环直到字符为'\\0' } void main() //主函数 { //串口初始化函数 uchar buff[4],i; dula=0; wela=0; init_com(); while(1) { tempchange();

19

本文来源:https://www.bwwdw.com/article/7b88.html

Top