资源描述
无线传感网络技术
课程实训
温湿度检测系统设计和实现
院(系)名称
电子和信息工程学院
专业班级
学号
学生姓名
指导老师
起 止 时 间: .6.26—.7.14
课程设计(论文)任务及评语
院(系):电子和信息工程学院 教研室:软件工程
学 号
xxxx
学生姓名
Xx
专业班级
物xxxx1
课程设计(论文)题目
温湿度检测系统设计和实现
课程设计(论文)任务
任务要求:
对室内温度进行采集,并将采集结果实时显示到LED显示器中
技术要求:
1 购置51单片机最小系统套件,独立焊接(也能够购置空白开发板独立设计并焊接)
2 采取温度传感器进行温度采集;
3 采取无线通信协议(WIFI,蓝牙,ZIGBEE均可)将温度传输至51单片机;
4 采取51单片机进行数据分析和处理;
5 将处理结果在LED液晶屏上显示;
6 将相关信息传输至手机上(选做)。
指导老师评语及成绩
平时成绩: 答辩成绩: 论文成绩:
总成绩: 指导老师签字:
年 月 日
注:平时成绩占20%,答辩成绩占40%,论文成绩占40%。
目 录
第1章 绪论 1
1.1系统开发背景 1
1.2开发工具 1
第2章 需求分析 2
2.1调研情况 2
2.2 模块划分 2
2.3 系统原理图 3
2.4 系统性能需求 3
第3章 系统概要设计 4
3.1系统总体结构设计 4
3.2模块创建 4
第4章 硬件设计 5
4.1 DHT11温度湿度传感器电路设计 5
4.2 晶振电路和复位电路设计 6
4.3 LED数码显示模块设计 7
4.4 报警模块设计 7
4.5 主程序设计 8
4.6 LED显示子程序设计 9
第5章 系统测试 10
5.1 系统安装接线图 10
5.2 调试和结果 10
第6章 总结 12
参考文件 13
附录 程序 14
第1章 绪论
1.1系统开发背景
伴随科学技术快速发展,人类社会已取得了巨大进步!在居家生活、工农业生产、环境保护、气象、国防、科研、航天等部门,常常需要对环境中湿度和温度进行测量及控制。传统方法是用温度表、毛发湿度表、双金属式测量计和湿度试纸等测试器材,经过人工进行检测,对不符合温度和湿度要求场所进行换气、降温和去湿等工作。这种人工测试方法费时费力、效率低,且测试温度及湿度误差大,随机性相对较大。伴随生产发展急需一个含有微型计算机或微处理器测量仪器,因为它拥有对数据存放,运算逻辑判定及自动化功效,有着智能作用等优点,一个低成本和含有较高精度温度湿度检测器将在很多领域替换人工操作,自动不间断检测环境温度和湿度。现在市场上普遍存在温湿度检测仪器大全部是单点测量,而且温湿度信息传输不立即,精度达不到要求,不利于控制者依据温度、湿度改变立即做出决定。为此,本设计开发了一个能够同时测量多点,并实时性高、精度高,经过显示器显示温湿度信息,并能进行温湿度超限报警测控产品。
本文设计是基于单片机室内温湿度检测和报警系统,利用温湿度传感器进行温度和湿度检测,该仪器含有测量精度较高、硬件电路简单、并能很好进行显示,可测试一定范围室内环境温湿度特点。省去了人工检测繁琐、耗时过程,随时经过检测器显示器进行读数,既方便,又快捷。
1.2开发工具
STC89C52是一个低功耗、高性能CMOS八位微控制器,含有8K在系统可编程Flash存放器,使用ATMEL企业高密度非易失性存放器技术制造,和工业80C51产品指令和引脚完全兼容。
LED数码管是现在电子设计中使用相当普遍一个显示设备,每个数码管由7个发光二极管根据一定排列结构组成,依据七个发光二极管正负极连接不一样,又分为共阴极数码管和共阳极数码管两种,选择数码管不一样,程序设计上也有一定差异。
编程采取Keil C 软件,使用C语音。
注:页脚字体为Times New Roman,字号为小五号,居中。
第2章 需求分析
2.1调研情况
在需求分析阶段,本设计采取STC89C52RC 单片机做为嵌入式控制关键,处理温度和湿度信号,基于设计目标对于信号采集数字滤波考虑,本设计采取模拟量输出温湿度传感器,采取TLC254312位串行A/D转换器进行模数转换,非信号原因采取专用硬件看门狗芯片X25045等多项软硬件抗干扰方法,降低额外干扰对于试验设计影响,并基于产品性功耗考虑,显示器件采取字符液晶。设计充足利用端口资源,考虑整体性,显示正确性和功耗要求,很好完成了设计目标。
2.2 模块划分
经过网上查询、翻阅图书了解空调系统原理,借鉴前人经验;传感器使用方法;用数码管显示可实现系统设计。
关键内容有
⑴学习强化单片机知识
⑵掌握智能温湿度检测系统,提出硬件电路设计方案
⑶画出原理图
⑷编写单片机控制软件
⑸完成系统整体功效调
2.3 系统原理图
DHT11传感器模块
按键电路模块
STC90C52RC
单片机
LED数码显示模块
报警模块
晶振电路
复位电路
图2.1 系统原理图
2.4 系统性能需求
设计中包含硬件电路设计和系统程序设计。其硬件电路关键由电源电路、主控制器和显示电路等组成。其中单片机是关键部分,负责对温度信号进行接收、检验并传输处理。
第3章 系统概要设计
3.1系统总体结构设计
要求以单片机为关键,采取温湿度传感器 DHT11设计一个对环境温度湿度检测系统,要求用按键控制系统选择分别对温度或湿度测试、复位、用四位LED数码管显示实时温度和温度。
3.模块创建
DHT11传感器模块
按键电路模块
STC89C52RC
单片机
LED数码显示模块
报警模块
晶振电路
复位电路
此次设计关键设计了温湿度测量和显示,硬件方面共分为7个模块,即单片机主控模块、按键模块、晶振电路、复位电路、LED显示模块、报警模块和DHT11电路模块。数字温湿度传感器DHT11送来数据,经单片机STC89C52RC处理后,并送入LED显示模块,一个显示温度,一个显示湿度,另外一个负责开启DHT11。。系统总体框图图3.1。
图3.1 系统总体框图
第4章 硬件设计
4.1 DHT11温度湿度传感器电路设计
此次单片机课程设计采取是DHT11数字温湿度传感器,而且是单总线(双向)结构,所以温湿度检测电路结构比较简单。此次课程设计温度测量范围:0-50摄氏度;湿度测量范围:20%-90%RH。DHT11只有一根数据线,一根电源线,一根地线,还有一根(NC)悬空。直接将电源线和单片机电源VCC相连,地线和单片机GND相连。数据线DATA和单片机P30口相连,外加一个5K上拉电阻。所需要温湿度数据便是由DATA引脚经过P30送入单片机,在单片机内做出对应处理以后得到对应温湿度数据,原理图图4.1所表示。
悬空
DATA
DHT11
VCC
STC89C52RC
P30
图4.1 温度检测原理图
4.2 晶振电路和复位电路设计
STC89C52内部有一个用于组成振荡器高增益反相放大器,引脚RXD和TXD分别是此放大器输入端和输出端。时钟能够由内部方法产生或外部方法产生。其晶振电路图4.2所表示。
图4.2晶振电路
复位电路是确保单片机正常运行关键原因,所以可靠地复位电路设计是必需。将RST引脚连续输入2个机器周期(即24个时钟振荡期间)以上高电平,即能够完成单片机初始化操作。本设计采取按钮复位方法,其复位电路图4.3所表示。
图4.3 复位电路
4.3 LED数码显示模块设计
此次课程设计采取共阳极LED动态数码显示,所谓动态显示,是采取动态扫描方法逐一地循环点亮各位显示器。即使在任一时刻只有一位显示器被点亮,但因为人眼含有视觉残留效应看起来和全部显示器连续点亮效果是完全一样。为了实现LED显示器动态扫描,除了要给显示器提供段码(字形代码)输入外,还要对显示器进行位控制,这就是通常所说段控和位控。此次课程设计中段码控制为单片机P01-P07分别和LEDA.B.C.D。E.F.G.Dp相连,实现了字符显示,单片机P02-P07分别和四个LED显示起相连,实现位控制。
4.4 报警模块设计
此次课程设计报警模块采取一个LED显示灯、一个10K限流电阻和一个扬声器。当实测温度湿度在设定范围内,LED灯熄灭,扬声器不会发出警报,工作正常!假如实测温湿度不在设定范围内,LED灯亮,扬声器发出警报,此时系统工作不正常!应依据要求调整温湿度设定上下阀值!报警指示原理图图4.4所表示。
图4.4 报警指示原理
4.5 主程序设计
开机开启系统,进入主函数MAIN后延时0.1S等候开启,当按下开启键S4,然后调用温湿度子程序CWD读取温湿度,并用数组将实测温湿度数据保留起来,分别将温湿度除十取整,将处理后数据调用到温湿度范围检测函数temphumi_range判定实测温湿度是否在设定范围内并作出对应处理。其主程序步骤图图4.5所表示。
开机
延时、开启
读取温湿度、处理、存放
N
温湿度越限?
Y
按键是否按下?
报警
N
Y
结束
显示实测温、湿度
图4.5 主程序步骤图
4.6 LED显示子程序设计
数码管显示关键用于同时显示温湿度和单独显示正确温度和湿度,其显示步骤图图4.6所表示
开始
段码送入P30
位码送入P02-P07
显示
结束
图4.6 显示步骤图
第5章 系统测试
5.1 系统安装接线图
本设计是在Keil C环境下开发,在编译完Keil C后,再利用STC_ISP_V48.8软件烧录到开发板上,实现实物和程序连接。图5.1系统安装接线图。
图5.1 系统安装接线图
5.2 调试和结果
调试完成后,可进行温湿度测量。图5.2 所表示。
图5.2 调试结果
第6章 总结
时间一点点迫近了,耗时3周课程设计立即结束,在老师指导和自己努力下我毕业设计也完成了。经过这段时间里学习,我了解到了很多知识,也对软件开发过程有了一个更深了解,而且对程序基础设计思绪有了较深认识。
此次课程设计还算比较成功,设计早期,老师要我们确定系统主体设计,比如部分主步骤图、按键显示模块等,我们这个小组也能按时完成李老师部署任务,跟着李老师一步步走过来,其实感觉起来这个课程设计不是那么难,比我刚开始着手时候要简单。在设计过程中,为了找到自己需要资料我们一起去读书馆找部分单片机课程设计实例来看看,不过在南校区读书馆资源也是很有限,而且还是比较旧资料,像相关此次用温湿度传感器DHT11在南院图书馆几乎没有,图书馆只有什么单个测温度或湿度传感器,不过这个对我们课程设计帮助也挺大,另外此次课程设计程序起源和baidu百科,不过并不是按部就班,我们在它基础上把它弄懂、了解以后加入自己设计想法,我想做课程设计无非是想让我们学到,在她人已经有基础上加入自己设计方案,慢慢变为自己知识。在此分别对李晓秀老师和我这组同学表示感谢。
本人签字:
参考文件
[1] 王迎旭编.单片机原理和应用[M].机械工业出版社.
[2] 陈海晏编.51单片机原理和应用[M].北京航空航天大学出版社.
[3] 黄仁欣编.单片机原理和应用技术[M].清华大学出版社.
[4] 张中明编.单片计算机原理及接口技术[M].人民邮电出版社出版社.
[5] 赛奎春.MySql数据库开发实例解析[M].北京:机械工业出版社,
附录 程序
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar num,z,dat,a,c,d,f;
uint b;
sbit JDQ=P3^7; //管脚定义 类似于起名字
//用JDQ来替换P1.4控制继电器工作
unsigned int tempL; //设全局变量
unsigned int tempH;
unsigned int sdata;
unsigned int s;
code unsigned char seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xff}; //不带小数点共阳数码管段码
code unsigned char seg7codeB[]={0x40,0x79,0x24,0x30,0x19,0x12,
0x02,0x78,0x00,0x10,0xff}; //带小数点共阳数码管段码
bit fg=1; //正负标志
//******************延时子程序 *******************************
//这个延时程序具体延时时间是time=i*8+10,适适用于小于2ms延时
//************************************************************
void delay(unsigned char i)
{
for(i;i>0;i--);
}
//***********************************************************
// 延时子程序
//************************************************************
void delay1ms()
{
unsigned char i;
for(i=124;i>0;i--); //延时124*8+10=1002us
}
//读值(低位放tempL;高位放tempH;)
ReadTemperature(void)
{
tempH=c;
tempL=d;
s = (tempH*256+tempL); //整数部分
sdata=s/100;
}
//控制继电器
//********************显示函数****************
void Led(unsigned int date)
{
if(fg==1)
{
P2=0xfe; //P1.0=0,选通第一位
P0=seg7code[date/10]; //十位数,查表,输出
delay1ms();
P0=0xff; //消隐
P2=0xfd; //P1.1=0,选通第二位,个位数
P0=seg7codeB[date%10];
delay1ms();
P0=0xff; //消隐
P2=0xfb; //P1.3=0,选通第三位,小数点第一位
P0=seg7code[s%100/10];
delay1ms();
P0=0xff; //消隐
P2=0xf7; //P1.3=0,选通第四位,小数点第二位
P0=seg7code[s%10];
delay1ms();
P0=0xff; //消隐
}
if(fg==0) //温度为负时显示数据
{
P2=0xfe; //P1.0=0,选通第一位
P0=seg7code[11]; //显示负号
delay1ms();
P0=0xff; //消隐
P2=0xfd; //P1.1=0,选通第二位,十位数
P0=seg7code[date/10];
delay1ms();
P0=0xff; //消隐
P2=0xfb; //P1.3=0,选通第三位,个位数
P0=seg7codeB[date%10];
delay1ms();
P0=0xff; //消隐
P2=0xf7; //P1.3=0,选通第四位,小数点第一位
P0=seg7code[date];
delay1ms();
P0=0xff; //消隐
}
}
//主函数,C语言入口函数:
void Relay()
{ if(sdata<10)
JDQ=0; //P1.4引脚控制三极管再由三极管控制继电器,
if(sdata>11)
JDQ=1; //输出0三极管导通继电器得电吸合,输出1三极管截止继电器失电断开
delay1ms();
P0=0xff; //消隐
while(1){Led(sdata);
if(num==1)
{
num=0;break; }
}; //主程序循环,即程序要停止在这里,很多初学者忘记了这点,只输入了上面一行,结果程序跑飞,找不出问题
}
void main()
{
TMOD=0x20; //用定时器设置串口波特率9600
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1; //串口初始化
SM0=0;
SM1=1;
EA=1; //开启总中止
ES=1;
while(1)
{ if(z==1) //判定是否有串口数据传送
{
ES=0;
z=0;
SBUF=1; //发送数据a到SBUF,立即单片机数据发送到计算机
while(!TI);
TI=0;
ES=1;
}
ReadTemperature();
Relay();
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
if(a==238)b=0; //接收数据SBUF,立即计算机数据接收。
z=1;
b++;
if(b==5)f=a;
if(f==0x01)
{ num=1;
if(b==6)c=a;
if(b==7)
{d=a;}
}
}
展开阅读全文