基于DHT11的温湿度检测报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
一、设计目的 (2)
二、设计要求 (2)
三、DHT11介绍 (2)
1、基本参数 (2)
2、引脚说明 (3)
3、工作原理 (3)
四、方案说明及相关功能电路接线图 (5)
4.1整体框架图 (5)
4.2控制中心—— AT89C52单片机 (5)
4.3采集装置一一DHT11传感器 (5)
4.4输入装置一一按键 (6)
4.5显示装置一一数码管 (6)
4.6报警装置一一蜂鸣器 (7)
五、主要程序流程图 (8)
六、调试结果:.................................................................... 1.1 ...........
6.1总体显示:................................................................... 1.1 ..........
6.2按键调试:................................................................... 11 ...........
6.3报警调试..................................................................... 11 ...........
七、调试过程遇到的问题 ............................................................. 1.1 ........
7.1问题:单片机始终未接收到DHT11的信号。
.................................... 12....
7.2问题:数码管动态扫描不稳定。
................................................ 12.......
7.3问题:数码管显示位数太少,要显示的东西太多。
................................ 12...
7.4问题:报警太单一,无法区分是湿度报警,还是温度报警。
........................ 12.
八、实验总结 ........................................................................ 13 ............
九、程序清单 ........................................................................ 13 ............
十、效果图........................................................................... 2.1 ...........
引言
由于对生态环境的破坏,导致近几年气候极其不稳定。
有时昨天还短衣短裤,过着夏天的生活,一觉醒来,一朝回到寒冷冬季。
由于没注意到温、湿度的变化,及时添衣补水,导致感冒频发,所以对温湿度的检测及控制就非常有必要了。
51系列单片机由于价格低廉,便于控制,时常用于小型程序的控制。
本文便采用
AT89C52来进行对DHT11采集到的信号进行分析、控制,使其能实时采集当前温度、湿度, 并可通过对应来按键来进行温湿度上下限的设置,若当前温度超过设定的上下限时,产生报
警、提醒。
将采集信号置于室外,可提醒人们出门需添衣补水;将采集信号置于大棚种植中,可提醒农夫对大棚进行调温、对农作物进行补水,防止农作物死亡。
一、设计目的
1、掌握AT89C52的控制
2、掌握DHT11的控制原理
3、掌握数码管的动态扫描
4、掌握按键的输入
二、设计要求
1、温、湿度实时检测及显示:通过4位数码管实时显示传感器DHT11检测到的温度和湿度,并可通过固定时间切换显示温度和湿度。
2、温、湿度上下限设置按钮:分配按键,通过对应的按键,可实现对温度上、下限的设置;湿度上、下限的控制。
3、自动报警:当温度或湿度超过其上、下限时,蜂鸣器会通过不同的报警对象来产生不同的报警方式。
三、DHT11介绍
1、基本参数
图一:DHT11实物图
2、
第一根引脚 第二根引脚 第三根引脚 第四根引脚
止面从左向右数
VDD 供电 3 — 5.5VDC
串行数据 单总线
空脚,请悬空
GND 接地,电源负极
3、工作原理
3.1数据传输格式
单片机发送一次开始信号后,
DHT11从低功耗模式转换到高速模式,等待单片机开始
信号结束后,DHT11发送40bit 的数据,高位先出。
数据格式:8bit 湿度整数数据+8bit 湿度小数数据
+8bit 温度整数数据+8bit 温度小数数据+8bit 校验和
数据传输正确时,校验和数据等于“ 8bit 湿度整数数据+8bit 湿度小数数据
+8bit 温度整数数据+8bit 温度小数数据”所得结果的末八 位
如果没有接收到单片机发送的开始信号,
DHT11不会主动进行温湿度采集,转换到低
3.2米集开始方式
DHT11空闲时为高电平,单片机把总线拉低等待
DHT11响应,拉低时间需大于 18ms,
保证DHT11能检测到起始信号。
DHT11接收到主机的开始信号后,等待单片机开始信号结
12mrr ------- 1 I ----- 12 m n
|5.5rnm|
T I*— 2.54mm
T 卜-2 54ME
正面
背面
图二:DHT11封装尺寸图
伽面
单点续 __ _
瑚mh 底信号
信号tiifl■:
主机信号
DHTft 号
图四:DHT11启动时序图
信号线说明:
■ ■
主机信号
DHT 信号
图五:’0”信号表示时序图
图六:1’信号表示时序图
I bit 开始I
SOus ,
下一 bit 开始
主机信号
DHT 信号
束,然后发送80us 低电平响应信号。
单片机发送开始信号结束后,延时等待 20~40us 后,
读取DHT11的响应信号,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉
3.3DHT11信号发送方式
表示'(V
GNI> ........
单总统
T —岫开始
GND
5开始
单总线
信号线说明:
?Ous
如果总线为低电平,说明 DHT11发送响应信号,DHT11发送响应信号后,会再把总线 拉高80us ,开始准备数据,每一 bit 数据都以50us 低电平开始,通过判断高电平的时间,来 决定采集到的数是“ 0”还是1" 当高电平时间为26us~28us 时,则采集到的数为“0”,如图四 所示;当高电平时间大于 28us 时,贝U 采集到的数
1”,如图五所示。
当最后1bit 数据传输
完毕后,DHT11拉低总线50us ,随后由上拉电阻拉高进入空闲状态。
如果总线为高电平,说明 DHT11没有响应,有可能是线路没插好。
四、方案说明及相关功能电路接线图
4.1整体框架图
采集装置
DHT11
图七:
该系统的控制中心,是由一片
由复位电路、晶振电路,I\O 口电路,完成其它功能的元器件均接在该片单片机的 由该单片机控制。
4.2控制中心
AT89C52单片机
复位
2
P31
3
Fk J
TT?
p]5
"T~ i
pie
7 3
VI I E
MT
9
PID VCC Pll p|l
i>i j
PO1 PH
P0> PI 5 HK PIS P04
Pl 7
冲 RST mi
P3D Ks D EA
P51 Tx 口 ALE
PN LU P 乃ND P34.1TI
PJ5 T1 PU P?4 THT P2S P'7 E
P25
XTAL2 E STALL P22
P21 GND
JP20
VCC JE
POO L
TT
■
3 'J
34 P01 J
打 FS
~IW
ru 「
31 K2
4 "Tin~~
s
15" 时9
7
lw7
LUK'S
vcc L
F ]04
AT89C52单片机的最小系统电路图
AT89C52单片机来控制、分析。
该款单片机的最小系统
I\O 口上,
4.3采集装置 DHT11传感器 单总线数字温湿度
VCC
DHT11信号端接单片机的 P2.1 口,外加上 拉电阻。
DHT11与单片机之间的数据传输都是从 该P2.1 口上传输。
电路接法如图八所示。
VCC DQ
NC GND
t
JT J I 7K
5
1 P21
5
4
51单片机最小系
TTATJ
*CFI
q 』|叩 Lc
BUTTON 士 I
是振
CL
■FT
T
P10 U1
21; F27 20
XTAL2 1:B
77T
T&~PIT F 2 3 -I 4
T2""7
71~~y L
4.5显示装置 ----- 数码管
显示部分由四位数码管构成的, 用户可根据数码管的显示,看到的温、 湿度,以及其当 前设置的上、下限。
接线图如图十所示。
每位数码管的功能如下: 首位:当首位灭时,为显示状态;亮时为设置状态
当显示“U”时,表示设置当前对象的上限 当显示为“n”时,表示设置当前对象的下限
末尾:用于判别对象:当显示“ E”时,则表示湿度
当显示“C “时,则表示温度
中间两位数:用于显示数值
4.4输入装置——按键
按键由一个光电开关和 4个普通按键组成。
用户可根据固定的按键来设置温湿度报警的 上限线,电路解法如图九所示。
各个按键的作用如下: P3.3 口的光电开关:用于切换进入设置界面
还是显示界面
P3.4 口的普通按键:当前设定对象值减一 P3.5 口的普通按键:当前设定对象值加一 P3.6 口的普通按键:切换设置对象的上、下限 P3.7 口的普通按键:切换设置对象(温 一一湿度)
图八:DHT11接线图
图九:按键接线图
图十: 4.6报警装置一一蜂鸣器
当温湿度的其中一项超过其设定的上下 限,蜂鸣器就会产生报警,用户可根据不同 的报警方式,判断是温度超过界限,还是湿 度超过界限。
温度报警:急促的响声 湿度报警:缓慢的响声 二则同时报警:响停时间一样
数愣管
iOVl COM? g 口 g 口
LEWIV
4
图十一:蜂鸣器接线 图
数码管接线图
VCC
蜂鸣器
五、主要程序流程图
中断程序
数码管显示判断程序
首位符号出现
显示湿度最小值
末位符号出现
首位符号出现
显示温度最小值一►
末位符号出现
首位符号出现
显示湿度最大值
末位符号出现
返回
六、调试结果:
6.1总体显示:
开机上电后,数码管能正常显示当前温度、湿度,并且每隔一段时间会温湿度自动切换。
6.2按键调试:
1、进入设置界面(光电开关P3.3),后,数码管会自动显示成当前对应对象所设的对应
值,再按一次,则又退出设置界面。
例如:数码管显示“U40C”,则表示当前设置的温度上
限为40 C ;显示“D50E”则表示当前湿度下限设置值为50%
2、进入设置界面后(光电开关P3.3),按温湿度切换按钮(普通按键P3.7),数码管会
自动切换对应对象,并且出现前对应对象所设的对应值。
例如:数码管本来显示“口50E”,
按下按钮后,变成“口20C”,则表示数码管本来显示的是湿度下限设置为50%按下按钮后,
则数码管变成显示温度下限当前设置值位20 C。
3、进入设置界面后(光电开关P3.3),按上下限切换按钮(普通按键P3.6),数码管会
自动切换显示当前对象所设的对应值。
例如:数码管本来显示“U 40C”,按下该按钮后,数码管会变成“D20C”,则表示数码管本来显示的是温度上限为40 C,按下该按钮后,则数码
管会变成显示温度下限当前设置值位20 C。
4、进入设置界面后(光电开关P3.3),按加一按钮(普通按键P3.5),会把当前对象的设置值加一,数码管显示的值也会对应加一。
例如:数码管本来显示“口20C”,按下该按钮后,数码管显示“口21C”。
即表示本来当前的温度下限设置值为20 C,按下该按钮后,温度下限的设置值变为21 C。
5、进入设置界面后(光电开关P3.3),按减一按钮(普通按键P3.4),会把当前对象的
设置值减一,数码管显示的值也会对应减一。
例如:数码管本来显示“口50E”,按下该按钮后,数码管显示“口49E”。
即表示湿度下限本来设置值为50%,按下该按钮后,湿度下限设
置值变49%
6、没有进入设置界面,按其它四个按键无反应。
6.3报警调试
1、将温度的报警下限调到超过当前温度或者报警上限调低于当前温度时,蜂鸣器会发出急促的报警声。
2、将湿度的报警下限调到超过当前湿度或者报警上限调低于当前湿度时,蜂鸣器会发出缓慢的报警声。
3、当温湿度同时都报警时,蜂鸣器会发出响停一致的报警声。
4、当正处于报警时,进入设置界面,报警声会停止,用户可重新设置上下限,让报警取消,以免扰民。
七、调试过程遇到的问题
7.1问题:单片机始终未接收到DHT11的信号。
现象:运行程序后,数码管始终显示00。
分析:硬件原因,1、DHT11坏了,信号未采集,导致单片机无信号。
软件原因,1、采集步骤出错,未理解透DHT11采集原理,导致信号未采集。
2、显示程序错误,未正确赋值显示,以至于DHT11已采集到信号,但未能正确
显示,以至于误以为是DHT11未采集信号。
问题解决:硬件问题排除,买了几个全新的DHT11,分别接上单片机,发现全都不能使用,所以初步排除了硬件原因。
软件原因,最有可能的就是未能正确理解DHT11采集过程,所以特地跟组员规定,
先不探讨,各自去看DHT11采集原理,之后再探讨各自认为DHT11如何采集,
然后再按各自的理解,一个一个实验,看那个能采集到信号,确定出DHT11正确的采
集过程。
7.2问题:数码管动态扫描不稳定
现象:本来在主程序调用数码管显示程序,使4位数码管逐个给值、显示,4位数码管都能正常稳定的显示,但经过一次数据采集之后,数码管会有一段时间的晃动,甚至全灭,之后再变稳定。
分析:未采集信号前,数码管能正常显示,遇到采集信号时,数码管不能正常显示,推测是DHT11采集时耗时太久,所以数码管更新显示时间边长,所以数码管动态扫描不稳定。
问题解决:采用定时器中断,每隔一段时间,中断发生时,扫描数码管的一位,下次扫描时,自动切换到扫描数码管下一位。
这样能保证数码管稳定显示。
但用中断时,DHT11 采集前时,
需把中断关掉,防止采集过程中,信号丢失。
7.3问题:数码管显示位数太少,要显示的东西太多。
现象:数码管只有四位,不仅要显示温度、湿度,还要显示湿度与温度各自的最大值与最小值,数据较多。
分析:由于没有标志,不知道当前显示的是什么数,显示是否正确。
问题解决:经小组统一决定将四位数码管的中间两位来显示数值,首尾两个数码管用来确定当前显示的是什么数。
具体的格式如前面数码管的介绍中所说。
在程序中,建立
bianliang=1并且bianliang1和bianliang2都为0,则数码管显示的湿度的最小值。
PS:只有讲入设置界面.才能看到温湿度所设置的最大值和最小值。
________
7.4问题:报警太单一,无法区分是湿度报警,还是温度报警
现象:报警时,蜂鸣器产生长鸣,想把上下限调到合适的位置,让报警取消以免扰民,却不知道要跳那个界限。
分析:报警只有单一的长鸣,不能辨别
解决方案:将报警方式分为,温度报警、湿度报警、两则同时报警三种情况。
通过判断响停时间长短来判断报警形式,具体报警形式如前面蜂鸣器中所说。
若停止报警,只
需进入设置界面,将改报警对象的上下限合适调整即可。
八、实验总结
经过了这两周的实训,使我收获颇多。
首先,使我懂得了DHT11传感器的工作原理,理解其工作时序图。
DHT1内部有测温
元件和测湿元件,当单片机发送采集信号给DHT11后,DHT11会将采集到的温度、湿度转
换成40bit的数据给单片机。
其次,让我懂得用定时器中断来实现数码管的动态显示。
数码管显示的程序本来是放在
主程序里,当扫描到数码管程序时才能显示,最后发现要是主程序程序太多的话,数码管显
示出来的数字就会不稳定。
经过研究后,发现可以用定时器中断,让每隔一段时间,中断产
生时,扫描数码管的其中一位。
这样就可以让数码管稳定显示了。
最后,使我深刻的意识到了自己在汇编上的不足。
该程序本来是打算用汇编语言写的,由于事先没有安排好变量的存储地址,后来一写才发现自己被汇编语言的跳转指令,跳得自
己都晕了。
不像C语言那样,会自动分配变量的存储地址。
两周时间,说长也不算长,却让我对控制有了兴趣。
当自己所写的程序,如自己所想的那般执行时,那种喜悦是不可言语的。
实训虽结束了,但激情还在。
之后还应以这次的经历,多多研究控制其它元器件。
九、程序清单
/***************** 实验目标 ********************
采用DHT11实现温湿度的采集,并在4位数码管上显示
通过对应的按键,可实现设置温湿度的上下限
当温湿度超过上下限时,会产生报警
**********************************************/
/****************** 定义区 ********************* *********** 地址、变量定义
*********************
**********************************************/ #include<at89x52.h> // 头文件
#define uint unsigned int
#define uchar unsigned char
sfr smg=0x80; //数码管显示值,当前定义为P0 口
sfr esmg=0xa0;//数码管位选地址,当前定义为P2 口
sbit dht11=0xa1;//DHT11 信号端,当前定义为P2_1
sbit moshi=0xb7;//设置温度 ------- 湿度切换按钮,当前定义为 P3_7 sbit qiehuan=0xb6;//切换上限 ------ 下限切换按钮,当前定义为 P3_6
sbit add=0xb5; //设置值加1按钮,当前定义为 P3_5 sbit sub=0xb4; //设置值减一按钮,当前定义为 P3_4 sbit shezhi=0xb3; //设置界面 ------ 显示界面切换按钮
sbit fengming=0x93;// 蜂鸣器地址,当前定义为 P1_3
bit bianliang=0; bit bianliang1=0; bit bianliang2=0; bit bianliang3=1; bit baojing1=0; bit baojing2=0; uint bj,bj1,bj2;
uint xs; 〃四
位数码管中间两位显示的值 uint ds,cj,qh;//定时次数变量,ds:用于数码管显示频率 cj:用于温湿度采集频率 qh,温湿度显
示切换频率
uchar max_R=80,min_R=20,max_T=50,min_T=10; 〃用于设置湿度上限、下限;温度上限、
下限
uchar shou=0xff,mo=0xff; //数码管首位和末位显示
uchar byte,RH,RL,TH,TL; 〃采集到的 字节、湿度整数、湿度小数;温度整数,温度小数 int a[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; // 数码管字段码 /**********************************************************************
************************** 延时程序区 *********************************** **********************************************************************/ unsigned char i, j; i = 36; j = 217; do {
while (--j); } while (--i); }
void Delay8ms() {
unsigned char i, j; i = 15; j = 84; do {
while (--j);
//设置与显示的标志位
//设置 -------- 温度与湿度的标志位 //设置 -------- 最大值与最小值的标志位 //显示 -------- 温度与湿度测定值标志位 //温度报警标志位 //湿度报警标志位
〃报警蜂鸣器低电平时间*50us ,周期时间*50us
void Delay20ms() {
//11.0592MHz //11.0592MHz
unsigned char i; i = 10; while (--i);
/***************************************************** ***************** 定时中断设置区 *********************** *****************************************************/
//设置定时器模式 //设置定时器模式 //设置定时初值 //设置定时重载值 /********************************************************
****************** 数码管显示区 *************************** ********************************************************/
void xianshi (int num) {
int i;
switch (i)
{ case 0:esmg=0xf0|esmg;smg=shou;esmg=0xef&esmg;i++;break;
case 1:esmg=0xf0|esmg;smg=a[num%100/10];esmg=0xdf&esmg;i++;break; case 2:esmg=0xf0|esmg;smg=a[num%10/1];esmg=0xbf&esmg;i++;break; case 3:esmg=0xf0|esmg;smg=mo;esmg=0x7f&esmg;i++;break; default:i=0;break; }
/******************************************************** ******************** 报警处理区 *************************** ********************************************************/ void baojing()
{
if(TH>=max_T||TH<=min_T)baojing1=1;//
温度超极限,温度报警标志位置一
else baojing1=0; //否则,温度报警标志位清零
if(RH>=max_R||RH<=min_R)baojing2=1;// 湿度超极限,湿度报警标志位置一 else baojing2=0; //否则,湿度报警标志位清零 } void baojingchuli()
void Delay28us()
{
//11.0592MHz
void Timer0Init(void) {
//50 微秒 11.0592 MHz
TMOD &= 0xF0; TMOD |= 0x02; TL0 = 0xD2; TH0 = 0xD2; TF0 = 0; TR0 = 1;
//清除TF0标志 //定时器0开始计时
( if(baojing1==1&&baojing2==1) ( 〃温湿度同时报警bj1=5000; // 响时间bj2=10000; // 周期} else //都无报警(//温湿度都无报警bj1=0;//响时间bj2=0;// 周期if(baojing1)
( //只有温度报警
bj1=1000;// 响时间bj2=5000;// 周期} if(baojing2) ( 〃只有湿度报警bj1=9000;// 响时间bj2=30000;// 周期}
}
//如果计数<bj1,响;bj1<计数<bj2,停;计数>bj2,计数清零if(bj<bj1)fengming=0;
else if(bj<bj2) fengming=1;
else bj=0;
}
/*********************************************************
******************* 数码管显示判断区 ************************
*********************************************************/
void panduan()
(
if(!bianliang)
( //进入显示界面
shou=0xff;//数码管首位灭
baojing(); //判断是否报警if(!bianliang3)
( //显示界面,显示湿度
xs=RH; //当前湿度给数码管显示mo=0x86;//数码管末尾出现
“ E” }
else
( //显示界面,显示温度
xs=TH;//当前温度给数码管显示
mo=0xC6; //数码管末尾出现"C” }
}
else
(//设置界面
if(bianliang1==0&&bianliang2==0)
( //设置湿度最小值
shou=0xC8; //数码管首位出现最小值符号mo=0x86; //数码
管末尾出现湿度符号xs=min_R;//把当前的湿度最小值给数
码管显示}
else if(bianliang1==1&&bianliang2==0)
( // 设置温度最小值
shou=0xC8;//数码管首位出现最小值符号mo=0xc6; //数码
管末尾出现温度符号xs=min_T;//把当前的温度最小值给数
码管显示}
else if(bianliang1==0&&bianliang2==1)
{〃设置湿度最大值
shou=0xc1;//数码管首位出现最大值符号mo=0x86; //数码管
末尾出现湿度符号xs=max_R; //把当前的湿度最大值给数码
管显示}
else
( //设置温度最大值
shou=0xC1;//数码管首位出现最大值符号
mo=0xC6; //数码管末尾出现温度符号
xs=max_T; //把当前的温度最大值给数码显示}
}
/********************************************
*************** 中断程序 **********************
********************************************/
void zhongduan() interrupt 1
(
ds++ ;
cj++;
bj++;
if(ds>=10)//判断是否该显示数码管,改变数字,可改频率
(
panduan(); xianshi(xs); ds=0; }
}
/******************************************* ***********DHT11 采集区 *********************** ********************************************/
//***************DHT11 启动程序 *************** void qidong()
{
dht11=0; //DHT11 拉低电平
Delay20ms(); 〃延时20ms ,等待响应,需大于18ms dht11=1; 〃拉高电平 Delay28us();// 延时 28us ,延时范围:20us~40us }
//******** 读取 DHT11 一个字节的数 ******************** uchar duqu()
{
uchar i,temp; for(i=0;i<8;i++)
{
while(!dht11); //等待50us 低电平开始信号结束 Delay28us(); //高电平时间为 28us temp=0; //则读到的数据为"0” if(dht11)temp=1;//28us
后仍为高电平,则读到的数据为“1
while(dht11);//等待高电平信号结束
byte<<=1; //数据高位先输出,所以需右移 byte|=temp;//读到的数串在一起
}
return byte; //返回读到的一个字节的数 }
〃************* 京 住 /士**********************
//
木果伯亏
void jieshou()
{
uchar T_H,T_L,R_H,R_L,check,check1;
qidong();
dht11=1; // if(!dht11) // {
while(!dht11);//等待DHT11,低电平显示是否结束 while(dht11);//等待DHT11,高电平显示是否结束
//接收8bit 的数据
//DHT11启动子程序
主机设为输入模式
判断DHT11有无低电平响应
R_H=duqu(); //湿度整数位 R_L=duqu();
〃湿度小数位
T_H=duqu(); //温度整数位
T_L=duqu(); //温度小数位 check=duqu();// 校验位 dht11=0;
//读取完毕,DHT11拉低电平
Delay28us(); // 需延时约 50us Delay28us();
dht11=1; //DHT11 拉高,进入空闲状态
check1=R_H+R_L+T_H+T_L;//计算读到的四个数据的校验码 if(check1==check) //判断计算结果与读到的结果是否一样
{ //结果一致时,把对应的数,存在对应的位置 RH=R_H; RL=R_L; TH=T_H; TL=T_L;
check=check1; }
}
}
***********************************************************
***********************************************************
void anjian(void)
{ if( shezhi==0)
〃判断是显示状态,还是设置状态 {
Delay8ms(); while(shezhi==0); Delay8ms();
bianliang=~bianliang;
}
if(bianliang)//如果是设置状态
{
if(!moshi)//判断温湿度切换按钮是否按下
{
Delay8ms(); while(!moshi); Delay8ms();
bianliang1=~bianliang1;
}
if(!qiehuan)//判断上下限切换按钮是否按下
Delay8ms(); while(!qiehuan); Delay8ms();
bianliang2=~bianliang2;
}
if(!add)// /**
***********************
按键处理程序 ***************************
**/
判断值加一按钮是否按下
Delay8ms();
while(!add);
Delay8ms();
//以下为判断设置的对象
if(bianliang1==0&&bianliang2==0) min_R++;
else if(bianliang1==1&&bianliang2==0) min_T++;
else if(bianliang1==0&&bianliang2==1)max_R++;
else max_T++;
}
if(!sub)//判断值减一按钮是否按下
{
Delay8ms();
while(!sub);
Delay8ms();
//以下为判断设置的对象
if(bianliang1==0&&bianliang2==0) min_R--;
else if(bianliang1==1&&bianliang2==0) min_T--;
else if(bianliang1==0&&bianliang2==1)max_R--;
else max_T--;
}
/***********************************************
************** 主程序 ****************************
***********************************************/
void main(void)
{ Timer0Init();//调用中断设置子程序
jieshou();//调用DHT11信号采集程序
EA=1; 〃开启总中断
ET0=1; 〃开启定时器T0中断
while(1)
{
anjian(); //调用按键处理程序if(!bianliang)baojingchuli();
else fengming=1;//如果进入设置界面,则蜂鸣器不响
if(cj>=20000)//判断是否采集信号,改变数字,可改变采集频率
{
EA=0; 〃采集前,断掉总中断,防止信号打断
jieshou();//调用DHT11信号采集程序
ds=1000;//保证采集完后,立马可以显示
EA=1;
cj=0;//采集频率清零
qh++;// 温湿度切换显示频率加一
}
if(qh>=5) //判断是否温湿度显示切换,改变数字,可改变频率
{
bianliang3=~bianliang3; // 温------ 湿度显示切换标志位取反
qh=0; //次数清零}
}
}
十、效果图
1、STC89C52
2、烧写口
3、总电源
4、光电开关P3.3 (用于切换设置界面与显示界面)
5、普通按键P3.7 (用于切换设置温一湿度)7、普通按键P3.5(用于将设置值加一)
9、DHT11插口10、数码管5
1
8 3
4 L
LJ
6、普通按键P3.6 (用于切换设置上一下限)
8、普通按键P3.4 (用于将设置值减一)
11、蜂鸣器
全灭为显示界面U”为上限值“C”为温度
“E”为湿度
响声报警对象
急促的声为温度报警
口”为下限值缓慢的声为湿度报警
温湿度同时报警,响停一致
上图数码管显示的是当前温度为24 C 上图显示的是当前湿度为59%
上图表示的是当前设置的对象为温度上限,当前设置值为50 C
上图表示的是当前设置对象为温度下限,当前设置值为10 C
上图表示的为当前的设置对象为湿度下限,该值当前设为20%
上图表示当前的设置对象为湿度上限,当前设置值为80%。