温湿度检测系统设计Word文件下载.docx
《温湿度检测系统设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《温湿度检测系统设计Word文件下载.docx(33页珍藏版)》请在冰点文库上搜索。
1.课程设计任务书
2.目录
3.总体方案确定
4.各单元硬件电路设计及计算方法
5.软件设计与说明(包括流程图)
6.调试结果与必要的调试说明
7.总结
8、参考文献
9、附录
附录A系统原理图
附录B程序清单
10、课程设计成绩评分表。
进度安排
设计时间分为二周
第一周
星期一、上午:
布置课题任务,课题介绍及讲课。
下午:
借阅有关资料,总体方案讨论。
星期二、确定总体方案,学习与设计相关内容。
星期三、各部分方案设计,各部分设计。
星期四、设计及调试。
星期五、设计及调试。
星期六、设计及调试。
第二周
星期一:
设计及调试。
星期二:
星期三:
调试、写说明书。
星期四--星期五上午:
写说明书、完成电子版并打印成稿。
星期五下午:
答辩。
参考文献
[1]王迎旭等.单片机原理及及应用.机械工业出版社.2012年
[2]陈海晏编.51单片机原理与应用[M].北京航空航天大学出版社.2010
[3]XX百科
第1章总体方案设计
1.1设计内容
要求以单片机为核心,采用温湿度传感器DHT11设计一个对环境温度湿度的检测系统,要求用按键控制系统选择分别对温度或湿度的测试、复位、用四位LED数码管显示实时温度和温度。
1.2总体设计
本次设计主要设计了温湿度的测量与显示,硬件方面共分为7个模块,即单片机主控模块、按键模块、晶振电路、复位电路、LED显示模块、报警模块以及DHT11电路模块。
数字温湿度传感器DHT11送来数据,经单片机STC90C52RC处理后,并送入LED显示模块,按键电路主要用来完成单片机的启动操作和温湿度初始值的设定,需要4个按键,一个显示温度,一个显示湿度,一个用来设定初始温度和初始湿度的上限值和下限值一个,另外一个负责启动DHT11。
报警电路就是用一个蜂鸣器和一个指示灯来实现的,用来判断周围环境的温度或者湿度是否超出设定值了,超出设定值蜂鸣器就会报警。
系统总体框图如图1-1。
图1-1系统总体框图
第2章硬件设计
2.1DHT11温度湿度传感器电路设计
此次单片机课程设计采用的是DHT11数字温湿度传感器,而且是单总线(双向)结构,所以温湿度检测电路的结构比较简单。
此次课程设计温度测量范围:
0-50摄氏度;
湿度测量范围:
20%-90%RH。
DHT11只有一根数据线,一根电源线,一根地线,还有一根(NC)悬空。
直接将电源线与单片机的电源VCC相连,地线与单片机的GND相连。
数据线DATA与单片机的P1.0口相连,外加一个5K的上拉电阻。
所需要的温湿度数据便是由DATA引脚通过P1.0送入单片机的,在单片机内做出相应的处理之后得到相应的温湿度数据,原理图如图2-1所示。
图2-1温度检测原理图
2.2按键电路模块设计
此次课程设计采用的按键电路为独立按键电路。
按键电路就是四个按键分别与STC90C52RC的P1.1、P1.2、P1.3、P1.4口相连,分别与S1-S4相连。
当有按键按下时单片机收到有效的信号,S1键显示实际所测得的湿度,S2键显示实际所测得的温度和S3键的功能为
设置温湿度的上限值和下限值,S1键为加1,S2键为减1。
当S1键和S2键单独使用时用来切换显示温湿度的精确数据,S4为启动DHT11传感器的独立开关具体原理图如图2-2所示。
图2-2按键原理图
2.3晶振电路和复位电路设计
STC90C52内部有一个用于构成振荡器的高增益反相放大器,引脚RXD和TXD分别是此放大器的输入端和输出端。
时钟可以由内部方式产生或外部方式产生。
其晶振电路如图2-3所示。
图2-3晶振电路
复位电路是保证单片机正常运行的关键因素,所以可靠地复位电路设计是必要的。
将RST引脚连续输入2个机器周期(即24个时钟振荡期间)以上高电平,即可以完成单片机的初始化操作。
本设计采用按钮复位方式,其复位电路如图2-4所示。
图2-4复位电路
2.3LED数码显示模块设计
此次课程设计采用的共阳极LED动态数码显示,所谓动态显示,是采用动态扫描的方法逐个地循环点亮各位显示器。
虽然在任一时刻只有一位显示器被点亮,但由于人眼具有视觉残留效应看起来与全部显示器持续点亮效果是完全一样的。
为了实现LED显示器的动态扫描,除了要给显示器提供段码(字形代码)的输入外,还要对显示器进行位控制,这就是通常所说的段控和位控。
本次课程设计中段码控制为单片机的P1.0-P1.7分别与LED的A.B.C.D。
E.F.G.Dp相连,实现了字符的显示,单片机的P2.4-P2.7分别与四个LED(W1.W2.W3.W4)显示起相连,实现位控制。
其显示原理图如图2-5所示。
图2-5数码显示原理图
2.4报警模块设计
此次课程设计的报警模块采用一个LED显示灯、一个10K的限流电阻和一个扬声器。
当实测温度湿度在设定的范围内,LED灯熄灭,扬声器不会发出警报,工作正常!
如果实测温湿度不在设定的范围内,LED灯亮,扬声器发出警报,此时系统工作不正常!
应根据要求调节温湿度设定的上下阀值!
报警指示原理图如图2-6所示。
图2-6报警指示原理
第3章软件设计
3.1主程序设计
开机启动系统,进入主函数MAIN后延时0.1S等待启动,当按下启动键S4,然后调用温湿度子程序CWD读取温湿度,并用数组将实测的温湿度数据保存起来,分别将温湿度除十取整,将处理后的数据调用到温湿度范围检测函数temphumi_range判断实测的温湿度是否在设定的范围内并作出相应的处理(正常工作或警报)。
其主程序流程图如图3-1所示。
图3-1主程序流程图
3.2DHT11数据读取子程序设计
单片机通过I/O口P1.0向DHT11发送开始信号,DHT11接收到开始信号后进行处理。
过对P1.0的状态进行监测,判断DHT11是否准备就绪,若准备就绪则读取温湿度数据,如果未准备就绪,则继续等待,此时开始读取温湿度数据,然后进行数据保存、显示。
其数据读取流程图如图3-2所示。
图3-2数据读取流程图
3.3按键子程序设计
系统开始工作,按下功能键S3显示所测的温湿度(前两位为所测湿度,后两位为所测温度)。
此时如果按下功能键S1单独显示所测的湿度,具体显示到小数点后一位,再按下功能键S2单独显示所测的温度,精度同湿度显示一样,此刻按下功能键S3回到初始工作状态即同时显示温湿度。
在按下功能键S3可以分别对温湿度上下限进行设计,本次所用的温湿度传感器DHT11所测的范围是湿度测量范围:
20%-90%RH;
温度测量范围:
0-50摄氏度。
其按键流程图如图3-3所示。
图3-3按键流程图
在功能键S3按下的时候可以分别对上下限温湿度进行设定,当按下功能键S1或S2的时候,此时为+”键和“-”键分别用来设置温湿度上下限的数值,“+”键按下一次,相应数值加1,“-”键按下一次,相应数值减1。
当功能键按下次数为0,此时显示的是实际温湿度。
其温湿度上下限设定程序流程图如图3-4所示。
图3-4温湿度上下限设定程序流程图
3.4LED显示子程序设计
数码管显示主要用于同时显示温湿度和单独显示精确的温度和湿度,其显示流程图如图3-5所示
图3-5显示流程图
第4章系统安装与调试
4.1系统安装接线图
本设计是在KeilC环境下开发的,在编译完KeilC后,再运用STC_ISP_V48.8软件烧录到开发板上,实现实物与程序的连接。
如图4-1系统安装接线图。
图4-1系统安装接线图
4.2调试与结果
调试完成后,可进行温湿度的测量和上下限温湿度的设定。
当功能键按下时,可单独显示温湿度和温湿度上下限值。
鉴于调试图很多,本次设计以典型具有代表性调试图作为本次课程设计有力说明。
如图所示。
图4-2湿度的显示图4-3温度的显示
图4-4湿度上限值图4-5温度上限值
第5章总结
本次课程设计还算比较的成功,设计初期,老师要我们确定系统的主体设计,比如一些主流程图、按键显示模块等,我们这个小组也能按时完成李老师布置的任务,跟着李老师一步步的走过来,其实感觉起来这个课程设计不是那么的难,比我刚开始着手的时候要简单。
在设计的过程中,为了找到自己需要的资料我们一起去读书馆找一些单片机课程设计实例来看看,不过在南校区读书馆资源也是非常的有限,而且还是比较旧的资料,像关于本次用的温湿度传感器DHT11在南院的图书馆几乎没有,图书馆只有什么单个测温度或者湿度的传感器,不过这个对我们的课程设计帮助也挺大的,另外此次课程设计的程序来源与XX百科,不过并不是按部就班,我们在它的基础上把它弄懂、理解之后加入自己的设计想法,我想做课程设计无非是想让我们学到,在别人已有的基础上加入自己的设计方案,慢慢的变为自己的知识。
在此分别对李晓秀老师和我这组的同学表示感谢。
第6章参考文献
[1]王迎旭编.单片机原理与应用[M].机械工业出版社.2012
[3]黄仁欣编.单片机原理与应用技术[M].清华大学出版社.2010
[4]张中明编.单片计算机原理及接口技术[M].人民邮电出版社出版社.2009
[5]XX百科
第7章附录
附录A系统原路图
附录B程序清单
#include<
reg52.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
typedefucharU8;
/*无符号8位整型变量*/
typedefuintU16;
/*无符号16位整型变量*/
//----------------定义区--------------------//
U8U8FLAG;
U8U8count,U8temp;
U8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp;
U8U8comdata,U8RH_data_L_temp,U8checkdata_temp;
U8str[5]={"
DHT11"
};
sbitdht11=P1^0;
//定义传感器端口
sbitBuffer=P1^5;
//高电平有效蜂鸣器
Sbitkeyqd=1^4;
//按键定义
sbitkeyfun=P1^3;
sbitkeyadd=P1^1;
sbitkeysub=P1^2;
//报警上、下限温湿度
uchartup=50,tdown=0,hup=90,hdown=20;
//按键功能标识
ucharkeynum=0,warn_flag=0,count=0,differ=0;
//共阳极数码管0--9"
0-9"
10--小数点,11--负号,12--空,13--上限号,14--下限号;
ucharcodeLEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0xbf,0xff,0xfe,0xf7};
//低位选通,从右往左数1-4
ucharcodeLEDwei[]={0x7f,0xbf,0xdf,0xef};
voidkeyscan();
voidtemphumi_range(inttempr,inthumir);
voidCWD(void);
voidCOM(void);
voiddisplay_4f1(uinti,uintj,uintk,uintl);
voiddisplay_3w(uinti,uintj,uintk);
voiddisplay_4w(uinti,uintj,uintk,uintl);
voidshow11(ucharwei,ucharnum);
intBUFFER_ON();
intBUFFER_OFF();
voidDelay_10us(void);
voiddelay_ms(ucharxms);
voidmain()
{
uinttt,hh;
uchari;
delay_ms(0.1);
//延时0.1mS(12M晶振)
if(keyqd==0)//启动
while
(1)
{
i=120;
//调用温湿度读取子程序
CWD();
str[0]=U8RH_data_H;
str[1]=U8RH_data_L;
str[2]=U8T_data_H;
str[3]=U8T_data_L;
str[4]=U8checkdata;
tt=str[2]*10+str[3]/10;
hh=str[0]*10+str[1]/10;
temphumi_range(tt,hh);
//120次调用显示,消耗_2.12s_时间
while(i--)
{
if(keynum==0)
{
//前两位显示湿度,后两位显示温度
display_4w(str[0]/10,str[0]%10,str[2]/10,str[2]%10);
//传感器休息时间长,防止按键丢包
keyscan();
}
elseif(keynum==1)
{temphumi_range(tt,hh);
display_4f1(13,tup/10,tup%10,0);
keyscan();
}
elseif(keynum==2)
display_4f1(14,tdown/10,tdown%10,0);
elseif(keynum==3)
display_4f1(13,hup/10,hup%10,0);
elseif(keynum==4)
display_4f1(14,hdown/10,hdown%10,0);
}//Delay(20000);
//读取模块数据周期不易小于2S****
}
/**************延时子程序************/
voiddelay_ms(ucharxms)//1ms延时
{
charx,y;
for(x=xms;
x>
0;
x--)
for(y=110;
y>
y--);
//-----------延时函数---------//
voidDelay_10us(void)//延时__10us
U8i;
i--;
i--;
intBUFFER_OFF()
Buffer=0;
return-1;
intBUFFER_ON()
Buffer=1;
}
/********************显示子程序*******************/
voidshow11(ucharwei,ucharnum)
P2=0xff;
//消影
P0=LEDData[num];
P2=LEDwei[wei];
delay_ms
(1);
//执行整个函数时间17.675ms
voiddisplay_4w(uinti,uintj,uintk,uintl)
uintn;
for(n=0;
n<
90;
n++)
{
if(i==0)
show11(3,12);
}
elseshow11(3,i);
if(j==0)
if(i==0)
show11(2,12);
elseshow11(2,j);
elseshow11(2,j);
show11(2,10);
//小数点
show11(1,k);
show11(0,l);
}
//执行整个函数时间14.071ms
voiddisplay_3w(uinti,uintj,uintk)
show11(1,12);
elseshow11(2,i);
show11(1,j);
show11(1,10);
show11(0,k);
voiddisplay_4f1(uinti,uintj,uintk,uintl)
//----------主机接收DHT11数据--------//
voidCOM(void)
for(i=0;
i<
8;
i++)
U8FLAG=2;
while((!
dht11)&
&
U8FLAG++);
//dht11==0等待
//30us是个界限(26~28代表'
0'
;
50代表'
1'
=小于30是'
,
//大于30是'
(下一步用if判断))
Delay_10us();
U8temp=0;
//没过30us代表的就是'
if(dht11)U8temp=1;
//dht11==1,过了30us还是高电平,说明高电平持续时间代表的是'
while((dht11)&
//dht11==1,
//超时则跳出for循环
if(U8FLAG==1)break;
//上一步dht11一直是0,知道U8FLAG加到0(256)才执行到此,
//(跳出时又加了一次'
=U8FLAG==1)上一步执行了254次,这一步接的是上一个while语句
//判断数据位是0还是1
//如果高电平高过预定0高电平值则数据位为1
U8comdata<
<
=1;
//数据位左移
U8comdata|=U8temp;
//---------湿度读取子程序--------//
//----以下变量均为全局变量--------//
//----温度高8位==U8T_data_H------//
//----温度低8位==U8T_data_L------//
//----湿度高8位==U8RH_data_H-----//
//----湿度低8位==U8RH_data_L-----//
//----校验8位==U8checkdata-----//
voidCWD(void)
//主机拉低18ms
dht11=0;
//消耗18ms时间,防止闪屏
if(keynum==0)
display_4w(str[0]/10,str[0]%10,str[2]/10,str[2]%10);
//前两位显示湿度,后两位显示温度
elseif(keynum==1)display_4f1(13,tup/10,tup%10,0);
elseif(keynum==2)display_4f1(14,tdown/10,tdown%10,0);
elseif(keynum==3)display_4f1(13,hup/10,hup%10,0);
elseif(keynum==4)display_4f1(14,hdown/10,hdown%10,0);
//Delay(180);
dht11=1;
//总线由上拉电阻拉高主机延时30us
Delay_10us();
//主机设为输入判断从机响应信号
//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行
if(!
dht11)
//判断从机是否发出80us的低电平响应信号是否结束
//判断从机是否发出80us的高电平,如发出则进入数据接收状态
//数据