基于物联网的无线温度监控系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安邮电大学
专业课程设计报告书
系部名称:光电子技术系
学生姓名:
专业名称:
班级:光电
实习时间:2013年6月3日至2013年6月14日
基于物联网的无线温度监控系统
【一】项目需求分析
承温度、湿度和人类的生产、生活有着密切的关系,同时也是工业生产中最常见最基本的工艺参数,例如机械、电子、石油、化工等各类工业中广泛需要对温度湿度的检测与控制。
并且随着人们生活水平的提高,人们对自己的生存环境越来越关注。
而空气中温湿度的变化与人体的舒适度和情绪都有直接的影响,所以对温度湿度的检测及控制就非常有必要了。
温度是物联系统中一个十分重要的物理量,对它的测量与控制有十分重要的意义。
随着各类物联网的监控日益改善,各类器件的温度控制有了更高的要求,为了满足人们对温度监控与控制,本文设计了物联网家居系统中基于单片机的无线温度监控系统。
随着信息科学与微电子技术的发展,温度的监控可以利用现代技术使其实现自动化和智能化。
本次设计要求利用单片机及zibbee无线传输模块实现无线温度监测系统,实现温控范围调节及其超温范围报警
【二】实施方案及本人担的工作
1 .系统总体方案描述
系统设计分为2个部分,第一个部分实现温度的检测、显示和发送,第二个部分为数据的接收和显示。
第一个设计模块中,利用单片机STC89C52控制温度传感器DS18B20定点检测和处理温度数据,并将当前温度显示在数码管上,接着单片机将采集的温度数据发送给单片机,再通过单片机控制,并将对接收到的温度数据进行一定的转换和处理,然后存放在寄存器中,等待下一步处理,再经过无线发送无线zigbee模块将显示的数据打包发送给第二个模块。
第二个设计模块中,同样利用STC89C52单片机作为控制主体,先控制zigbee无线接收模块接收第一个模块发送的数据,然后将接收到数据在上位机上显示,整个过程就是这样。
2. 系统硬件构成
系统硬件方面主要由单片机最小系统,温度传感器DS18B20,4位共阳极数码管,还有zigbee无线收发模块,上位机显示模块组成,目的在于实现温度的准确检测和无线收发所检测的温度数据。
3.单片机最小系统设计
单片机最小系统的设计主要有五个部分组成,电源电路,复位电路,晶振电路,串口电路和控制主体的STC89C52单片机。
电源电路由一个六脚的按键开关,一个1K的电阻,一个10uF的极性电容和一个显示电路供电状态的发光二极管组成。
开关为了适应各种情况下能够方便供电,开关外接有一个USB接口和一个DC-5V的标准电源接口作为供电设备使用。
除此之外还设计了一个外接电源接口。
电源电路如图2所示。
图2 电源电路
复位电路组成很简单,仅仅有4个小器件构成,一个是作为复位控制的四脚按键,一个10uF的极性电容,还有两个电阻,阻值分别为1K和10K。
电路与单片机的RST端口连接,电路上电后,按下按键控制系统复位。
具体电路如图3所示:
图3 复位电路
晶振电路更为简单,只有3个器件,一个11.0592Hz的晶振外加二个30PF的普通电容组成,晶振两端分别与单片机的XTAL1和XTAL2口相接。
电路如图4所示:
图4 晶振电路
串口电路主要利用MAX232来实现,MAX232是美信公司设计的一款单电源电平转换芯片,在本次设计中的使用的方法是在MAX232的1和3管脚之间,4和5管脚之间,2和16管脚之间,6和15管脚之间,还有16和16管脚之间全部加上一个0.1uF的电容,7和8管脚作为串口输入端,外接一个标准9孔串口母头,9和10管脚作为输出,分别与单片机的P3.0和P3.1连接。
这样就构成了与单片机连接,可以进行串口通信的串口电路。
具体电路图5所示:
图5 串口电路
单片机最小系统的主体部分使用的是STC89C52单片机,它是美国ATMEL公司生产的低电压,高性能的CMOS 8位单片机,片内寄存器可反复擦洗,含有32个可编程双向I/O口,3个16位定时/计数器,共8个中断源。
需要指出且注意的是,单片机在系统设计时,管脚EA要始终接高电平。
因为EA接高电平时,单片机读取内部程序存储器。
当扩展有外部ROM 时,读取完内部ROM后自动读取外部ROM,EA接低电平时,单片机直接读取外部ROM。
而设计中使用的STC89C52是有内部ROM的,所以此引脚始终接高电平。
一般在设计单片机最小系统时,大多会加上流水灯和独立键盘的设计,但是在我的毕业设计中把这些部分作了改进。
考虑到流水灯和独立键盘这些设计如果完整的加入就会造成一定的浪费,而且由于学校实验室的条件有限,PCB板的刻录存在很多问题,因此这些设备会大大增加硬件调试过程的难度,费时费力。
同时,在设计单片机最小系统时,考虑到不加入这些设备的话,以后又有可能需要用到。
所以中和上面各种因素,在最小系统的设计部分最后只是增加了二个独立键盘和二个LED发光二极管作为调试或需要时使用,同时,考虑到以后可能还会外接其它设备的介入,为了方便,特意留有两排20脚的单排插针外接端口,这样,设计的最小系统模块在需要时也可以控制其它外接装置。
使得设计模块更加灵活多用,不仅仅局限在本次毕业设计中使用,还可以留作以后的开发板学习。
最小系统的主体STC89C52如图6所示:
图6 STC89C52管脚接线图
4.数据显示模块设计
数据显示电路使用的是的4位共阳极数码管,其内部结构图如下面图7所示:
图7 数码管内部结构图
该数码管共有12个管脚,其中11,7,4,2,1,10,5,3管脚分别对应数码管的A,B,C,D,E,F,G,DP段选位,与单片机的P0口连接,对应单片机的P0.0-P0.7口,用来控制
数码管显示数值大小,6,8,9,12管脚控制数码管的位选,分别与单片机的P2.0-P2.4口连接,通过单片机指令选择需要显示数据的数码管位。
我们知道,在单片机的端口上电后会一直存在高电平,而数码管的位选正好是高电平有效,所以会导致在不需要使用数码管的时候,数码管依然会保持打开状态。
通常情况下会在单片机最小系统中使用锁存器与数码管连接,但是在这次设计中没有使用锁存器,而是改用在数码管与单片机端口连接之间加一个PNP三极管的方法,让三极管发射极接电源,基集与单片机端口连接,集电极与数码管连接,这样的设计就会导致单片机端口给低电平时才会选通数码管,不仅方便控制,而且电路设计简单。
设计原理图如图8所示:
图8 数码管电路
5. 信号采集模块设计
信号采集部分主要由温度传感器DS18B20进行。
1.DSl8B20基本信息
DSl8B20是美国DALLAS公司推出的智能化数字式温度传感器,全部传感组件及转换电路集成在一个三极管的集成电路中。
信息经过单线接口送入DSl8B20或从DSl8B20送出,因此从中央处理器到DSl8B20仅需连接一条线。
读,写和完成温度变换所需的电源可以由数据线本身提供,而不需要外部电源。
DSl8B20支持“一线总线”接口,测量温度范围为-55℃~+125℃,在-10~+85℃范围内,精度为±0.5℃。
现场温度直接以“单总线”的数字方式传输,大大提高了系统的抗干扰性。
DS1820温度传感器外观图和引脚图如图9所示,三个管脚定义如下:[10]
①引脚1接地;
②引脚2数字信号输入/输出;
③引脚3接高电平5V高电平。
1).特征:
(1)独特的单线接口。
只需1个接口引脚即可通信
(2)多个能力使分布式温度检测应用得以简化
(3)不需要外部组件
图9 DS18B20外观和引脚图(4)可用数据线供电
(5)不需备份电源
(6)测温范围从-55℃~+125℃,增量值为0.5℃
(7)以9位数字值方式读出温度
(8)用户可定义的,非易失性的温度告警设置
(9)告警搜索命令识别和寻址温度在编定的极限之外的器件(温度告警情况)
2).引脚定义:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
3)内部结构
DSl8B20内部有四个主要部分:①64位光刻ROM数据存储器②温度传感器③非易失性电可擦写温度报警触发器TH、TL ④非易失性电可擦写设置寄存器。
除此之外还有告诉缓存存储器。
器件只有3根外部引脚,其中VDD和GND为电源引脚,另一根DQ线则用作]/O总线,因此称为一线式数据总线。
与单片机接口的每个I/O口可挂接多个
DQ
VD
图3.7 DS18B20内部结构
(1)DS18B20内部4个主要的数据部件介绍:
①光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地
址序列码。
64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是
该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。
光刻ROM的作用是使每一个DS18B20序列号都各不相同,这样就可以实现一根总线上挂
接多个DS18B20的目的。
②DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩
展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。
表3.4 DS18B20的温度格式表
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 LS Byte 232221202--12-22-32-4 bit 15 bit 14 bit 13 bit 12 bit 11 bit 10 bit 9 bit 8 MS Byte S S S S S 262524
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中
的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625
即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625
即可得到实际温度。
DS18B20的温度格式如表3.4所示。
③DS18B20温度传感器的存储器
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦
除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
④配置寄存器
该字节各位的意义如表3.6:
表3.6 配置寄存器结构
TM R1 R0 1 1 1 1 1
低五位一直都是1 ,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。
在DS18B20出厂时该位被设置为0,用户不要去改动。
R1和R0用来设置分辨率,如表3.7所示:(DS18B20出厂时被设置为12位)
表3.7 温度值分辨率设置表
(2)高速暂存存储器
高速暂存存储器由9个字节组成,其分配如表2.6所示。
当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表1所示。
对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。
第九个字节是冗余检验字节。
表3.8 DS18B20暂存寄存器分布
根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,指令如表3.9,最后发送RAM指令,指令如表3.10。
这样才能对DS18B20进行预定的操作。
复位要求主CPU 将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
表3.9 ROM指令表
表3.10 RAM指令表
2.DS18B20温度采集模块设计[10]
此模块的设计中STC89C52单片机作为控制主体,温度传感器DS18B20采集温度,
温度传感器DS18B20是一种单线接口传感器,所以连接电路很简单,只要将其管脚DQ 接单片机的一个端口进行温度采集,VDD接高电平,GND接地即可。
设计中的DQ端被设计成连接单片机的P3.7端口。
根据DS18B20的工作原理、内部结构图、时序图,还有DS18B20的ROM指令操作码,编写DS18B20的操作代码,采集温度样本,将采集的样本数据存放在寄存器中等待下一步处理。
6.无线收发模块设计
Zigbee是一个由可多到65000个无线数传模块组成的一个无线数传网络平台,十分类似
现有的移动通信的CDMA网或GSM网,每一个Zigbee网络数传模块类似移动网络的一个基站,在整个网络范围内,它们之间可以进行相互通信;每个网络节点间的距离可以从标准的75米,到扩展后的几百米,甚至几公里;另外整个Zigbee网络还可以与现有的其它的各种网络连接。
【三】程序框图
1.系统的设计框图如图1所示:
第一模块
第二模块
图1 系统框图
2.程序流程图
监测点程序流程图
监测终端程序流程图【四】实验结果
【五】设计中遇到的问题及解决方法
经过一个星期的现代检测技术课程设计,我们小组成功地完成了无线温度检测系统的设计。
虽然整个设计中我们遇到了很多问题,但通过我们自己的分工,查找资料,调试、仿真,不断地调整设计思路,最终成功地完成了设计目标。
这次课程设计让我自己对于学习现代检测技术有了更深一步地了解,通过实际地操作,发现书上的理论知识与在实际运用中的还是有一定的出入的。
经过自己不断地摸索,改进,从中学到了很多实际知识。
整个设计制作中也培养了我的实际操作能力和团队合作能力,设计过程中感受最深的就是编写程序后的调试过程,调试中得出一个结论,要想完成一个工程,必须从基本模块调试开始,程序也是这样。
写程序时在没有接收成功的情况下,一开始就入手多位发送接收,致使程序难以调试,不知道问题出在哪里。
改从一位数据发送接收后,迅速实现了整个功能。
【六】总结
本系统采用以AT89S8252单片机为CPU,DS18B20温度采集模块及Zigbee无线收发模块等为主要元件构成的无线温度监控系统。
由于所学知识有限,虽然翻阅了不少的资料,另结合这段时间实习经历,才得以完成此设计。
在此还得特别感谢老师在本次论文设计中提供的一些宝贵资料,以及不断的教诲中,在此表示感谢。
当然系统还有许多待完善之处,如温度精度的提高,单片机外围电路的更合理设计等。
通过此次课程设计,我总结了几点:
①每一个系统的生成,都是经过层层周密的思考与测试而得到的,这需要团队的合作以
及个人优秀的素质。
②写程序过程中,切记戒骄戒躁,踏踏实实,一步一个脚印。
学会模块化编程,会让你少走很多弯路。
③当程序很多很复杂时,应该写一个模块就调试一个,这样下来会轻松的解决各个问题,而不像你一次性全写完,错了之后再来调就很复杂了。
④硬件电路的调试,也是需要极大的耐性,以及拥有良好的电子基础,这个需要多加练习。
总的来说,本系统在现今工业控制领域中还广泛使用中,在以后的道路中还将继续扮演着其角色。
在当今工业控制领域中,不仅仅温度是重要的检测对象,压力、电流、电压等也是重要的检测对象。
而本系统也可以进行稍加改造,以满足不同的需求,或把它们结合起来,进行多从监控等。
当然具体电路得结合实际使用用途及环境决定等。
附录1:电路原理图或PCB版图
附录2:主要源程序
(1)主程序:
#include"reg52.h"
#include"com.h"
#include"temp.h"
#include"display.h"
unsigned char tmp;
unsigned int cnt=100;
void init_i()
{
TMOD=(TMOD&0XF0)|0X00;
TL0=0X00;
TH0=0X00;
TR0=1;
ET0=1;
EA=1;
}
void timer0() interrupt 1
{
if(cnt)
{
cnt--;
display(tmp);
}
else
{
tmp=rd_temperature();
SendData(tmp);
}
}
void main()
{
init_ds18b20();
init();
init_i();
tmp=0x00;
while(1)
{
display(tmp);
}
}
(2)温度测量模块:
#include"reg52.h"
sbit DQ=P3^5;
//延时函数
void delay(unsigned int t)
{
while(t--);
}
//DS18B20初始化函数
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
delay(12);
DQ = 0;
delay(80); // 延时大于480us
DQ = 1;
delay(10); // 14
initflag = DQ; // initflag等于1初始化失败delay(5);
return initflag;
}
//通过单总线向从器件写一个字节
void wr_ds18b20(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = byt&0x01;
delay(5);
DQ = 1;
byt >>= 1;
}
delay(5);
}
//通过单总线从从器件读一个字节
unsigned char rd_ds18b20(void)
{
unsigned char i;
unsigned char byt;
for(i=0;i<8;i++)
{
DQ = 0;
byt >>= 1;
DQ = 1;
if(DQ)
{
byt |= 0x80;
}
delay(5);
}
return byt;
}
//温度转换、读取及数据处理器函数
unsigned char rd_temperature(void)
{
unsigned char low,high;
char temp;
init_ds18b20();
wr_ds18b20(0xCC);
wr_ds18b20(0x44); //启动温度转换
delay(1);
init_ds18b20();
wr_ds18b20(0xCC);
wr_ds18b20(0xBE); //读取寄存器
low =rd_ds18b20(); //低字节
high =rd_ds18b20(); //高字节
temp = high<<4;
temp |= (low>>4);
return temp;
}
(3)数码管显示模块
#include"reg52.h"
#define com P2
#define output P0
unsigned char table_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delays(unsigned char i)
{
while(i--);
}
void display(unsigned char temp)
{
com=0xef;
output=table_c[temp%10];
delays(150);
com=0xdf;
output=table_c[temp/10];
delays(150);
com=0xef;
output=table_c[temp%10];
delays(150);
com=0xdf;
output=table_c[temp/10];
delays(150);
}
(4)#include "reg52.h"
#include "intrins.h"
#define FOSC 11059743L //System frequency
#define BAUD 9600 //UART baudrate
bit busy;
void init()
{
SCON = 0x50; //8-bit variable UART
TMOD = 0x20; //Set Timer1 as 8-bit auto reload mode TH1 = TL1 =-(FOSC/12/32/BAUD); //Set auto-reload vaule
TR1 = 1; //Timer1 start run
EX0=1;//打开外部中断0
IT0=1;//跳变沿触发方式
ES = 1; //Enable UART interrupt EA = 1; //Open master interrupt switch
}
/*----------------------------
UART interrupt service routine
----------------------------*/
void Uart_Isr() interrupt 4
{
if (RI)
{
RI = 0; //Clear receive interrupt flag
//P0 = SBUF; //P0 show UART data
}
if (TI)
{
TI = 0; //Clear transmit interrupt flag
busy = 0; //Clear transmit busy flag
}
}
/*----------------------------
Send a byte data to UART
Input: dat (data to be sent)
Output:None
----------------------------*/
void SendData(unsigned char dat)
{
while (busy); //Wait for the completion of the previous data is sent busy = 1;
SBUF = dat; //Send data to UART buffer
}
/*----------------------------
Send a string to UART
Input: s (address of string)
Output:None
----------------------------*/
void SendString(char *s)
{
while (*s) //Check the end of the string
{
SendData(*s++); //Send current char and increment string ptr }
}。