无线温度遥测系统(C题)

更新时间:2023-10-28 15:17:01 阅读量: 综合文库 文档下载

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

合肥学院第七届电子设计竞赛报告

作品名称:无 线 温 度 遥 测 系 统 学校全称: 合 肥 学 院

系别班级: 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系统总体设计

STC89C52 单片机2 无线收发芯片无线收发芯片 1 NRF24L01 2 NRF24L01 系统总设计结构图 所设计的无线温度遥测系统主要由以下几部分组成:温度测量部分、无线发射部分、无线接收部分、LCD显示部分以及操控部分。 2.3器件选择方案 2.3.1温度传感器 方案一:可以采用热敏电阻之类的器件利用其感温效应,再将随被测温度变化的电压或电流采集过来,进行A/D转换后,用单片机进行数据的处理,在显示电路上就可以将被测温度显示出来,这种设计需要用到A/D转换电路,电路比较麻烦。

方案二:进而考虑到温度传感器,在单片机电路设计中,大多都是使用传感器,所以这比较容易想到,可以采用一只比较常用的温度传感器DS81B20,其工作电压范围:3.0~5.5V,测温范围:-55℃~+125℃,测温分辨率最高可达0.062 5℃,此传感器可以很容易的直接读取被测温度值,进行转换,并且其价格比较便宜,符合设计要求。

从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,价格低廉,要求功能可完全实现,故采用方案二。 温度检测电路图

温度传感器DS18B20 STC89C52 单片机1 LCD显示及上限报警

2.3.2无线收发芯片

方案一:采用PTR2000,它的优点是工作频率稳定可靠、外围元件少、功耗低。不过它的价格较为昂贵,相比不适用于实验的选用。

方案二:选用NRF24L01,它采用FSK调制解调技术,抗干扰能力强,,频率稳定性好,工作电压在+3V~5 V之间。所需外围元件较少,并可直接接单片机串口。而且价格较为便宜,符合要求。

相比较之下,NRF24L01可以实现要求,加之经济,所以选择NRF24L01更为适合。 无线收发电路图

NRF24L01收发模块 2.3.3 LCD显示屏

方案一:采用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子程序等。为了降低功耗,使用中断来唤醒单片机进行测温等工作,因此主程序部分比较简单,主要负责系统各部分初始化和中断的调用,在系统初始化完成后就直接进入睡眠模式,当中断到来时单片机退出睡眠模式,调用中断子程序实现测温、转换显示、温度数据的传输等功能。 单片机控制程序流程图如下图所示

开始

系统初始化 温度采集 NRF24L01发射采集的数据 显示数 据并继 续采集 Y 是否发送成 N 功? NRF24L01接收数据

显示数据是否超过上限温度? N 并继续采集

Y 报警

四、系统测试

第1次检测:选择检测晚上的室内温度。 第2次检测:选择检测中午的室内温度。

第3次检测:用铁制茶杯盛一杯开水,放在实验桌上,将温度计和系统采集温度芯片置于距离茶杯一厘米的同一位置,检测温度。 实验数据如下表: 第1次测量 第2次测量 第3次测量 第4次测量 第5次测量 温度计测量温度(℃) 23.2 24.0 30.4 38.0 系统测量温度(℃) 23.5 24.2 30.6 37.8 上限报警是否报警 温度(℃) 22 25 30 38 是 否 是 否 测量误差(℃) +0.3 +0.2 -0.2 -0.2

由于条件限制,采用量程范围为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\#include\#include\#include\

/*****************************************/ #endif Delay.h

/*****************************************/ #ifndef _DELAY_H_ #define _DELAY_H_

/*****************************************/ void Delay(unint t); void DDelay(unint t);

/*******************************************/ #endif

DS18B20.h

/************************************************/ #ifndef _DS18B20_H_ #define _DS18B20_H_

/*****************************************/ extern void Reset();

extern void WriteChar(unchar dat); extern unint ReadChar(); extern unint ReadTemperature();

/*****************************************/ #endif

NRF24L01.h

/*****************************************/ #ifndef _NRF24L01_H_ #define _NRF24L01_H_

/*******************************************************/ #define TX_ADDR_WITDH 5 //发送地址宽度设置为5个字节 #define RX_ADDR_WITDH 5//接收地址宽度设置为5个字节 #define TX_DATA_WITDH 10//发送数据宽度1个字节

#define RX_DATA_WITDH 10//接收数据宽度1个字节 /*******************命令寄存器***************************/ #define R_REGISTER 0x00//读取配置寄存器 #define W_REGISTER 0x20//写配置寄存器 #define R_RX_PAYLOAD #define W_TX_PAYLOAD #define FLUSH_TX #define FLUSH_RX

0x61//读取RX有效数据 0xa0//写TX有效数据

0xe1//清除TXFIFO寄存器 0xe2//清除RXFIFO寄存器

#define REUSE_TX_PL 0xe3//重新使用上一包有效数据 #define NOP 0xff//空操作

/******************寄存器地址****************************/ #define CONFIG 0x00//配置寄存器 #define EN_AA

0x01//使能自动应答

#define EN_RXADDR 0x02//接收通道使能0-5个通道 #define SETUP_AW 0x03//设置数据通道地址宽度3-5 #define SETUP_RETR 0x04//建立自动重发 #define RF_CH 0x05//射频通道设置 #define RF_SETUP 0x06//射频寄存器 #define STATUS 0x07//状态寄存器 #define OBSERVE_TX 0x08//发送检测寄存器 #define CD 0x09//载波

#define RX_ADDR_P0 0x0a//数据通道0接收地址 #define RX_ADDR_P1 0x0b//数据通道1接收地址 #define RX_ADDR_P2 0x0c//数据通道2接收地址 #define RX_ADDR_P3 0x0d//数据通道3接收地址 #define RX_ADDR_P4 0x0e//数据通道4接收地址 #define RX_ADDR_P5 0x0f//数据通道5接收地址 #define TX_ADDR 0x10//发送地址

#define RX_PW_P0 0x11//P0通道数据宽度设置 #define RX_PW_P1 0x12//P1通道数据宽度设置 #define RX_PW_P2 0x13//P2通道数据宽度设置 #define RX_PW_P3 0x14//P3通道数据宽度设置 #define RX_PW_P4 0x15//P4通道数据宽度设置 #define RX_PW_P5 0x16//P5通道数据宽度设置 #define FIFO_STATUS 0x17//FIFO状态寄存器

/*******************相关函数声明**************************/ unchar NRFACK();

unchar NRFSPI(unchar date);

unchar NRFReadReg(unchar RegAddr);

unchar NRFWriteReg(unchar RegAddr,unchar date);

unchar NRFReadRxDate(unchar RegAddr,unchar *RxDate,unchar DateLen); unchar NRFWriteTxDate(unchar RegAddr,unchar *TxDate,unchar DateLen); unchar NRFRevDate(unchar *RevDate); void NRFSetTxMode(unchar *TxDate);

CSN=0;

NRFSPI(FLUSH_TX);//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大

家记住!! CSN=1; }

/******************判断是否接收收到数据,接到就从RX取出*********************/ //用于接收模式

unchar NRFRevDate(unchar *RevDate) {

unchar RevFlags=0; }

void main() {

unint i;

unint ReadTempDate;//读取温度 char TxDate[6]; NRF24L01Int(); while(1) {

ReadTempDate=ReadTemperature(); TxDate[0]=ReadTempDate/100+'0'; TxDate[1]=ReadTempDate0/10+'0'; TxDate[2]='.';

TxDate[3]=ReadTempDate0+'0'; TxDate[4]=ReadTempDate/100; TxDate[5]=ReadTempDate0/10; NRFSetTxMode(TxDate);//发送温度 while(CheckACK()); //检测是否发送完毕

sta=NRFReadReg(R_REGISTER+STATUS);//发送数据后读取状态寄存器

// 判断是否接收到数据

{

CE=0; }

NRFWriteReg(W_REGISTER+STATUS,0xff); return(RevFlags);

//

//SPI使能

NRFReadRxDate(R_RX_PAYLOAD,RevDate,RX_DATA_WITDH);// 从RXFIFORevFlags=1; //读取数据完成标志

if(RX_DR)

return(0); } else

return(1);

读取数据

RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标

}

}

for(i=70;i>0;i--)

{ dis_temp(ReadTemperature());}

接收 Allhead.h

/*****************************************/ #ifndef _ALLHEAD_H_ #define _ALLHEAD_H_

/*************************************************/ #include\#include\#include\#include\

/*************************************************/ #endif

LCD1602.h

/*****************************************/ #ifndef _LCD1602_H_ #define _LCD1602_H_

/*********************************************/ extern void LCDWriteCmd(unchar cmd); void LCDWriteDate(unchar date);

void LcdShow(unchar x,unchar y,unchar *str); void SetXY(unchar x,unchar y); extern void LCD1602Int();

void xianshi(unchar add,unint date);

/********************************************/ #endif

NRF24L01.h

/*****************************************/ #ifndef _NRF24L01_H_ #define _NRF24L01_H_

/*******************************************************/ #define TX_ADDR_WITDH 5 //发送地址宽度设置为5个字节 #define RX_ADDR_WITDH 5 //接收地址宽度设置为5个字节 #define TX_DATA_WITDH 10//发送数据宽度1个字节 #define RX_DATA_WITDH 10//接收数据宽度1个字节 /*******************命令寄存器***************************/ #define R_REGISTER 0x00//读取配置寄存器 #define W_REGISTER 0x20//写配置寄存器

#define R_RX_PAYLOAD #define W_TX_PAYLOAD #define FLUSH_TX #define FLUSH_RX

0x61//读取RX有效数据 0xa0//写TX有效数据

0xe1//清除TXFIFO寄存器 0xe2//清除RXFIFO寄存器

#define REUSE_TX_PL 0xe3//重新使用上一包有效数据 #define NOP 0xff//空操作

/******************寄存器地址****************************/ #define CONFIG 0x00//配置寄存器 #define EN_AA

0x01//使能自动应答

#define EN_RXADDR 0x02//接收通道使能0-5个通道 #define SETUP_AW 0x03//设置数据通道地址宽度3-5 #define SETUP_RETR 0x04//建立自动重发 #define RF_CH 0x05//射频通道设置 #define RF_SETUP 0x06//射频寄存器 #define STATUS 0x07//状态寄存器 #define OBSERVE_TX 0x08//发送检测寄存器 #define CD 0x09//载波

#define RX_ADDR_P0 0x0a//数据通道0接收地址 #define RX_ADDR_P1 0x0b//数据通道1接收地址 #define RX_ADDR_P2 0x0c//数据通道2接收地址 #define RX_ADDR_P3 0x0d//数据通道3接收地址 #define RX_ADDR_P4 0x0e//数据通道4接收地址 #define RX_ADDR_P5 0x0f//数据通道5接收地址 #define TX_ADDR 0x10//发送地址

#define RX_PW_P0 0x11//P0通道数据宽度设置 #define RX_PW_P1 0x12//P1通道数据宽度设置 #define RX_PW_P2 0x13//P2通道数据宽度设置 #define RX_PW_P3 0x14//P3通道数据宽度设置 #define RX_PW_P4 0x15//P4通道数据宽度设置 #define RX_PW_P5 0x16//P5通道数据宽度设置 #define FIFO_STATUS 0x17//FIFO状态寄存器

/*******************相关函数声明**************************/ unchar NRFACK();

unchar NRFSPI(unchar date);

unchar NRFReadReg(unchar RegAddr);

unchar NRFWriteReg(unchar RegAddr,unchar date);

unchar NRFReadRxDate(unchar RegAddr,unchar *RxDate,unchar DateLen); unchar NRFWriteTxDate(unchar RegAddr,unchar *TxDate,unchar DateLen);

void NRFSetTxMode(unchar *TxDate); void NRF24L01Int(); void NRFSetRXMode(); void CheckACK(); void keyscan();

extern void GetDate();

extern unchar RevTempDate[7];

/*********************************************************/ #endif Pubile.h

/*****************************************/ #ifndef _PUBILE_H_ #define _PUBILE_H_

/****************************************/ #define unchar unsigned char #define unint unsigned int

/*****************************************/ #endif Delay.c

/*****************************************/ #include\#include\

/***************************延时函数*********************/ void LCDDelay(unchar t) {

unchar x,y; for(x=t;x>0;x--) for(y=110;y>0;y--); }

/**********************延时函数**************************/ void NRFDelay(unint t) {

unint x,y; for(x=t;x>0;x--) for(y=110;y>0;y--); }

LCD1602.c

/*****************************************/ #include\#include\sbit lcdrs=P3^5; sbit lcden=P3^4;

#define uchar unsigned char #define uint unsigned int void delay(uint z)

/***************************LCD写命令函数********************/

{ }

void LCDWriteCmd(unchar cmd) {

lcdrs=0; }

/************************LCD写数据函数**************************/ void LCDWriteDate(unchar date) {

lcdrs=1; }

/***************************定位函数************************/ void xianshi(unchar add,unint date) { }

void SetXY(unchar x,unchar y) {

if(x==0)

LCDWriteCmd(0x80+y);

//第一行

else

LCDWriteCmd(0x80+0x40+y); //第二行 }

/***********************显示函数****************************/ void LcdShow(unchar x,unchar y,unchar *str) {

SetXY(x,y); while(*str!='\\0') {

LCDWriteDate(*str);

LCDWriteCmd(0x80+0x40+add); LCDWriteDate(0x30+date); P0=date; delay(5); lcden=1; delay(5); lcden=0; P0=cmd; delay(5); lcden=1; delay(5); lcden=0; uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

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

Top