无线温度遥测系统C题.docx
《无线温度遥测系统C题.docx》由会员分享,可在线阅读,更多相关《无线温度遥测系统C题.docx(46页珍藏版)》请在冰豆网上搜索。
无线温度遥测系统C题
合肥学院第七届电子设计竞赛报告
作品名称:
无线温度遥测系统
学校全称:
合肥学院
系别班级:
08级电子信息与电气工程系
队员姓名:
08电子<3>班胡光0805070240
08电子<3>班刘扬0805070244
08电子<3>班程坤0805070263
无线温度遥感系统
摘要:
本系统是基于80C52单片机和无线传输模块设计的无线温度遥测系统。
温度测量采用的是DS18B20温度传感器;无线数据传输是基于FSK调制解调,抗干扰能力强的NRF24L01无线收发芯片;系统为低功耗设计。
关键字:
无线通信DS18B20单片机
一、引言
在许多场合需要将传感器节点直接放置在目标地点进行现场的数据采集,这就要求传感器节点具有无线通信的能力。
同时,由于无线传感器通常使用电池作为能源,所以,它对能耗要求也比较高。
无线温度遥感系统可以实现主机端与传感器节点之间的通信,并且通过选用低功耗的芯片和对软件的低功耗设计,也可以实现低功耗的目标。
1.1.基本要求
(1)测温范围10℃~65℃,误差<0.5℃;
(2)显示位数3位,分辨率0.1℃;
(3)测温点到接收点距离>2米;
(4)可设置温度上限报警;
(5)接收点显示测温点数据及声光上限报警信号;
1.2.发挥部分
(1)遥测距离>5米;
(2)误差<0.2℃;具有温度补偿功能;
(3)具有特色与创新;
(4)测量温度速率小于1秒;
(5)多路测量;
二、系统设计
2.1系统方案选择
方案一:
用ATmega8单片机作处理器和相关温度检测、无线收发、液晶显示和上限报警电路组成无线温度遥测系统。
其中ATmega8单片机性能稳定,处理速度较快。
方案二:
用STC89C52单片机作处理器和相关温度检测、无线收发、液晶显示和上限报警电路组成无线温度遥测系统。
STC89C52单片机8k片内程序存储器(ROM),对于无线温度遥测系统足够,而且性能相对也比较稳定。
ATmega8单片机较之STC89C52单片机性能较为优越,针对所做无线温度遥测系统两者都够用,不过考虑到经济方面因素,STC89C52单片机相比之下比较便宜,经济适用。
所以最终系统方案选择方案二。
2.2系统总体设计
系统总设计结构图
所设计的无线温度遥测系统主要由以下几部分组成:
温度测量部分、无线发射部分、无线接收部分、LCD显示部分以及操控部分。
2.3器件选择方案
2.3.1温度传感器
方案一:
可以采用热敏电阻之类的器件利用其感温效应,再将随被测温度变化的电压或电流采集过来,进行A/D转换后,用单片机进行数据的处理,在显示电路上就可以将被测温度显示出来,这种设计需要用到A/D转换电路,电路比较麻烦。
方案二:
进而考虑到温度传感器,在单片机电路设计中,大多都是使用传感器,所以这比较容易想到,可以采用一只比较常用的温度传感器DS81B20,其工作电压范围:
3.0~5.5V,测温范围:
-55℃~+125℃,测温分辨率最高可达0.0625℃,此传感器可以很容易的直接读取被测温度值,进行转换,并且其价格比较便宜,符合设计要求。
从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,价格低廉,要求功能可完全实现,故采用方案二。
温度检测电路图
2.3.2无线收发芯片
方案一:
采用PTR2000,它的优点是工作频率稳定可靠、外围元件少、功耗低。
不过它的价格较为昂贵,相比不适用于实验的选用。
方案二:
选用NRF24L01,它采用FSK调制解调技术,抗干扰能力强,,频率稳定性好,工作电压在+3V~5V之间。
所需外围元件较少,并可直接接单片机串口。
而且价格较为便宜,符合要求。
相比较之下,NRF24L01可以实现要求,加之经济,所以选择NRF24L01更为适合。
无线收发电路图
NRF24L01收发模块
2.3.3LCD显示屏
方案一:
采用12864液晶显示屏,其价格不高,适用于各类仪器,小型设备的显示领域。
方案二:
采用1602液晶显示屏,其价格便宜,是比较常用的工业字符型液晶。
方案三:
采用四位一体数码管,其价格便宜,较为常用。
考虑到我们需要的用途是温度的显示,三者皆可以达到显示要求,12864相对而言贵,排除。
而数码管和1602显示屏两者相比基本相当,价格相差也不大,考虑到显示效果和价格,我们选用了一块1602显示屏作为接受端的温度数据显示;采用了一块四位共阴数码管作为发送端的温度显示。
1602液晶显示电路图与四位数码管(LED1、LED2、LED3、LED4)
2.3.4电源设计
电源需供给STC89C52单片机、1602液晶显示器、NRF24L01发射电路模块、NRF24L01接收电路模块所需的不同电压。
电源电路原理图如下所示,三端稳压芯片L7805CV、ASM11117—3.3起稳压作用,10uf电解电容和30pf瓷片电容起滤除纹波作用,输出分别为+5V,+3.3V的电压供给各所需单元电路。
电源设计原理图
三、系统软件设计
3.1单片机软件设计
单片机软件部分主要包括主程序、中断子程序、测温子程序、LCD的转换显示,蜂鸣器报警子程序,按键子程序以及SPI子程序等。
为了降低功耗,使用中断来唤醒单片机进行测温等工作,因此主程序部分比较简单,主要负责系统各部分初始化和中断的调用,在系统初始化完成后就直接进入睡眠模式,当中断到来时单片机退出睡眠模式,调用中断子程序实现测温、转换显示、温度数据的传输等功能。
单片机控制程序流程图如下图所示
Y
N
N
Y
四、系统测试
第1次检测:
选择检测晚上的室内温度。
第2次检测:
选择检测中午的室内温度。
第3次检测:
用铁制茶杯盛一杯开水,放在实验桌上,将温度计和系统采集温度芯片置于距离茶杯一厘米的同一位置,检测温度。
实验数据如下表:
温度计测量温度(℃)
系统测量温度(℃)
上限报警温度(℃)
是否报警
测量误差(℃)
第1次测量
23.2
23.5
22
是
+0.3
第2次测量
24.0
24.2
25
否
+0.2
第3次测量
30.4
30.6
30
是
-0.2
第4次测量
38.0
37.8
38
否
-0.2
第5次测量
由于条件限制,采用量程范围为0—250℃的水银温度计作为测量比较仪器,本身测量误差较大,结果并不精确。
在误差允许范围内,本系统符合设计要求。
其中,遥测距离可达五米,达到发挥部分遥测距离>5米的要求。
五、总结心得
经过我们的团结协作、不懈努力,终于我们的无线温度遥测系统完成了,这次电子设计竞赛让我们在付出的道路上收获了很多。
从选题开始一直到现在,我们感受着比赛带来的兴奋与快乐的同时,也体味到了付出的不易。
经过这些天的努力,我们也终于将这份艰苦却又充满乐趣的事情完成了。
本无线温度遥测系统中,温度传感器采用的是DS18B20,开始我们考虑的是PT100这种温度传感器件,但是由于DS18B20能够达到要求,相对又经济方便,最终选用了DS18B20。
不过对于无线收发芯片的选用,相比之下就没有这样顺利了,我们起初的考虑忽视了经济这一个重要方面,经过查阅资料,开始考虑的是PRT2000,它的性能很不错,不过后来才想到没有考虑它的价格,当了解到一块PRT2000无线收发模块价格在一百元左右的时候,我们意识到这是不可行的,应该选用其它的性能接近并且经济的芯片,经过了一番周折,最终确定了NRF401无线收发模块。
当最终完成的时候,大家很开心的松了一口气,甚至在实物测试看到温度发送接收成功时,我们兴奋地欢呼相拥。
作为大三的学生,第一次参加学校的电子设计竞赛,在为比赛努力付出的过程中,我们也有很多收获。
为了把作品做成功,我们查阅资料,检索文献,其间丰富了我们的知识,增加了些许经验。
我们常常是三个人在一起,通过分工协作和互相帮助,也让我们又一次体味了团队合作的重要。
在将实物做出来的过程中,我们感受到原来所有的一切都是那么的不易,都需要我们认真的思考,研究。
对于电路板的焊接,需要事先进行排版布线,然后将相应的元件连接起来,焊接中,我们仿佛回到了曾经,回到了那个为了心中的象牙塔拼搏奋斗的日子,静静地专注于你的目标,双手在万能板上忙忙碌碌,电烙铁在焊锡丝和元件之间反反复复。
偶尔会因某一个元件焊接的不够理想而眉头紧蹙,然后锡枪除去焊锡,再重新焊接,只是为了让电路焊接的更理想;时而也会因感觉到焊接的电路很不错而不由自主地啧啧赞叹。
就这样我们的实物电路焊接完成了,接着是程序的编写,查阅了大量的资料,参考了一些相关书籍,最终编写完成后,烧录到STC89C52单片机中,连接电路测试。
起初的测试,没有达到要求,接下来便是对程序的再编写,再调试,就这样反反复复,最终实现了。
尽管其间是枯燥的难熬的,不过,在测试成功,数据显示出来的那一瞬,心中的快乐难以言表,那种感觉多么的让人享受。
当我们聚在一起专心为之而战斗的时候,专心的投入进去后,终于在你迫切地需要缓一下劲而暂停了一下的时候,你会恍然惊叹:
大家居然忙了这么久!
是的,这是专心,这是态度,人们说态度决定高度!
兴奋着便又埋首于当前的工作之中了。
最终,我们终于可以开心地笑着说我们可以稍事休息一会儿了,此次的任务完成了。
我们默契的在心中共铭:
不能放弃!
这不仅仅是因为执著,也许还因为我们已骑虎难下,毕竟付出了很多,付出了好久。
为着它到了几近痴狂的程度,不只是对它所拥有着的浓厚兴趣,更是为了求得一个交待。
我们心中有着一个坚定的信念:
我们要彼此并肩齐首,走更远的路。
参考文献:
郭天祥《新概念51单片机C语言教程》
谭浩强《C程序设计(第三版)》
李岁劳杨鹏翔朱新颖《基于C8051单片机的多路温度无线遥测系统》
仪器仪表:
仪器仪表名称
型号
生产公司名称
三位半数字万用表
MY61
苏山仪器仪表公司
温度计
MC
不详(从电子系实验室借用)
附录
总电路设计原理图
基于单片机的温度采集与无线发送电路
基于单片机的无线接收及1602液晶显示电路
程序代码清单:
发射
Allhead.h
/*****************************************/
#ifndef_ALLHEAD_H_
#define_ALLHEAD_H_
/******************************************/
#include"pubile.h"
#include"Delay.h"
#include"NRF24L01.h"
#include"DS18N02.h"
/*****************************************/
#endif
Delay.h
/*****************************************/
#ifndef_DELAY_H_
#define_DELAY_H_
/*****************************************/
voidDelay(unintt);
voidDDelay(unintt);
/*******************************************/
#endif
DS18B20.h
/************************************************/
#ifndef_DS18B20_H_
#define_DS18B20_H_
/*****************************************/
externvoidReset();
externvoidWriteChar(unchardat);
externunintReadChar();
externunintReadTemperature();
/*****************************************/
#endif
NRF24L01.h
/*****************************************/
#ifndef_NRF24L01_H_
#define_NRF24L01_H_
/*******************************************************/
#defineTX_ADDR_WITDH5//发送地址宽度设置为5个字节
#defineRX_ADDR_WITDH5//接收地址宽度设置为5个字节
#defineTX_DATA_WITDH10//发送数据宽度1个字节
#defineRX_DATA_WITDH10//接收数据宽度1个字节
/*******************命令寄存器***************************/
#defineR_REGISTER0x00//读取配置寄存器
#defineW_REGISTER0x20//写配置寄存器
#defineR_RX_PAYLOAD0x61//读取RX有效数据
#defineW_TX_PAYLOAD0xa0//写TX有效数据
#defineFLUSH_TX0xe1//清除TXFIFO寄存器
#defineFLUSH_RX0xe2//清除RXFIFO寄存器
#defineREUSE_TX_PL0xe3//重新使用上一包有效数据
#defineNOP0xff//空操作
/******************寄存器地址****************************/
#defineCONFIG0x00//配置寄存器
#defineEN_AA0x01//使能自动应答
#defineEN_RXADDR0x02//接收通道使能0-5个通道
#defineSETUP_AW0x03//设置数据通道地址宽度3-5
#defineSETUP_RETR0x04//建立自动重发
#defineRF_CH0x05//射频通道设置
#defineRF_SETUP0x06//射频寄存器
#defineSTATUS0x07//状态寄存器
#defineOBSERVE_TX0x08//发送检测寄存器
#defineCD0x09//载波
#defineRX_ADDR_P00x0a//数据通道0接收地址
#defineRX_ADDR_P10x0b//数据通道1接收地址
#defineRX_ADDR_P20x0c//数据通道2接收地址
#defineRX_ADDR_P30x0d//数据通道3接收地址
#defineRX_ADDR_P40x0e//数据通道4接收地址
#defineRX_ADDR_P50x0f//数据通道5接收地址
#defineTX_ADDR0x10//发送地址
#defineRX_PW_P00x11//P0通道数据宽度设置
#defineRX_PW_P10x12//P1通道数据宽度设置
#defineRX_PW_P20x13//P2通道数据宽度设置
#defineRX_PW_P30x14//P3通道数据宽度设置
#defineRX_PW_P40x15//P4通道数据宽度设置
#defineRX_PW_P50x16//P5通道数据宽度设置
#defineFIFO_STATUS0x17//FIFO状态寄存器
/*******************相关函数声明**************************/
uncharNRFACK();
uncharNRFSPI(unchardate);
uncharNRFReadReg(uncharRegAddr);
uncharNRFWriteReg(uncharRegAddr,unchardate);
uncharNRFReadRxDate(uncharRegAddr,unchar*RxDate,uncharDateLen);
uncharNRFWriteTxDate(uncharRegAddr,unchar*TxDate,uncharDateLen);
uncharNRFRevDate(unchar*RevDate);
voidNRFSetTxMode(unchar*TxDate);
voidNRF24L01Int();
voidNRFSetRXMode();
uncharCheckACK();
externuncharbdatasta;
/*********************************************************/
#endif
Pubile.h
/*****************************************/
#ifndef_PUBILE_H_
#define_PUBILE_H_
/****************************************/
#defineuncharunsignedchar
#defineunintunsignedint
/*****************************************/
#endif
Delay.c
/*****************************************/
#include"reg52.h"
#include"Allhead.h"
/***************************延时函数****************/
voidDelay(unintt)
{
unintx,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
/**********************************************
DS18B20专用延时子函数
**********************************************/
voidDDelay(unintt)
{
unintn;
n=0;
while(n{
n++;
}
}
DS18B20.c
/***********************************************************/
#include"reg52.h"
#include"allhead.h"
sbitDQ=P2^2;//数据端
uninttempL,tempH;
/*********************************************************
DS18B20复位函数
**********************************************************/
voidReset()
{
DQ=1;
DDelay(8);
DQ=0;
DDelay(85);
DQ=1;
DDelay(14);
}
/***********************************************************
DS18B20写一个字节函数
*********************************************************/
voidWriteChar(unchardat)
{
uninti;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
DDelay(5);
DQ=1;
dat>>=1;
}
DDelay(4);
}
/****************************************************
DS18B20读一个字节函数
****************************************************/
unintReadChar()
{
unchari,dat=0;
for(i=8;i>0;i--)
{
DQ=1;
DDelay
(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat=dat|0x80;
DDelay(4);
}
return(dat);
}
/***************************************************
/*****************SPI时序函数******************************************/
uncharNRFSPI(unchardate)
{
unchari;
for(i=0;i<8;i++)//循环8次
{
if(date&0x80)
MOSI=1;
else
MOSI=0;//byte最高位输出到MOSI
date<<=1;//低一位移位到最高位
SCLK=1;
if(MISO)//拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
date|=0x01;//读MISO到byte最低位
SCLK=0;//SCK置低
}
return(date);//返回读出的一字节
}
/**********************NRF24L01初始化函数*******************************/
voidNRF24L01Int()
{
Delay
(2);//让系统什么都不干
CE=0;//待机模式1
CSN=1;
SCLK=0;
IRQ=1;
}
/*****************SPI读寄存器一字节函数*********************************/
uncharNRFReadReg(uncharRegAddr)
{
uncharBackDate;
CSN=0;//启动时序
NRFSPI(RegAddr);//写寄存器地址
BackDate=NRFSPI(0x00);//写入读寄存器指令
CSN=1;
return(BackDate);//返回状态
}
/*****************SPI写寄存器一字节函数*********************************/
uncharNRFWriteReg(uncharRegAddr,unchardate)
{
uncharBackDate;
CSN=0;//启动时序
BackDate=NRFSPI(RegAddr);//写入地