设计与开发

湿度传感器单片机 51单片机实现温湿度传感器实时监控并LCD显示的解决方案

小编 2024-10-06 设计与开发 23 0

51单片机实现温湿度传感器实时监控并LCD显示的解决方案

简介:

51单片机STC89C52RC是本方案的选用芯片,以其8位处理和极低的价格来看,是很适合进行本次实验。LCD显示屏本次选用的型号是1602A。

在实现51单片机实现温湿度传感器实时监控并LCD显示的基础功能后,还可以通过单片机的串口通信和WIFI模块或者Zigbee模块进行物联网连接,使设备连接互联网,再通过TCP连接进行物联网的一整套方案,包括手机APP实时监控数据,也可以是手机APP远程开启风扇来调节温度或者湿度,但这些不在本次方案中细说,本人已经实现上述功能,只是技术不完善,所以不在此公布。

Protues8仿真图:

51单片机完整程序(代码很长,但是完整,可以直接复制使用):

//****************************************************************//

//

//

//

//

//

//****************************************************************//

#include <reg52.h>

#include <intrins.h>

#include <lcd.c>

#include <string.h>

#include <stdlib.h>

#include <stdio.h>

//

typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */

typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */

typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */

typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */

typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */

typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */

typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */

typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */

//

#define uchar unsigned char

#define uint unsigned int

#define Data_0_time 4

//----------------------------------------------//

//----------------IO口定义区--------------------//

//----------------------------------------------//

sbit P2_0 = P2^0 ;

//----------------------------------------------//

//----------------定义区--------------------//

//----------------------------------------------//

U8 U8FLAG,k;

U8 U8count,U8temp;

U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;

U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

U8 U8comdata;

U8 outdata[5]; //定义发送的字节数

U8 indata[5];

U8 count, count_r=0;

U8 str[5]={"RS232"};

U16 U16temp1,U16temp2;

U8 a[]={"Temperature: "};

U8 b[]={"Humidity: "};

U8 wd_sw,wd_gw,sd_sw,sd_gw;

void Delay(U16 j)

{

U8 i;

for(;j>0;j--)

{

for(i=0;i<27;i++);

}

}

void Delay_10us(void)

{

U8 i;

i--;

i--;

i--;

i--;

i--;

i--;

}

void COM(void)

{

U8 i;

for(i=0;i<8;i++)

{

U8FLAG=2;

while((!P2_0)&&U8FLAG++);

Delay_10us();

Delay_10us();

Delay_10us();

U8temp=0;

if(P2_0)U8temp=1;

U8FLAG=2;

while((P2_0)&&U8FLAG++);

//超时则跳出for循环

if(U8FLAG==1)break;

//判断数据位是0还是1

// 如果高电平高过预定0高电平值则数据位为 1

U8comdata<<=1;

U8comdata|=U8temp; //0

}//rof

}

//--------------------------------

//-----湿度读取子程序 ------------

//--------------------------------

//----以下变量均为全局变量--------

//----温度高8位== U8T_data_H------

//----温度低8位== U8T_data_L------

//----湿度高8位== U8RH_data_H-----

//----湿度低8位== U8RH_data_L-----

//----校验 8位 == U8checkdata-----

//----调用相关子程序如下----------

//---- Delay();, Delay_10us();,COM();

//--------------------------------

void RH(void)

{

//主机拉低18ms

P2_0=0;

Delay(180);

P2_0=1;

//总线由上拉电阻拉高 主机延时20us

Delay_10us();

Delay_10us();

Delay_10us();

Delay_10us();

//主机设为输入 判断从机响应信号

P2_0=1;

//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行

if(!P2_0) //T !

{

U8FLAG=2;

//判断从机是否发出 80us 的低电平响应信号是否结束

while((!P2_0)&&U8FLAG++);

U8FLAG=2;

//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态

while((P2_0)&&U8FLAG++);

//数据接收状态

COM();

U8RH_data_H_temp=U8comdata;

COM();

U8RH_data_L_temp=U8comdata;

COM();

U8T_data_H_temp=U8comdata;

COM();

U8T_data_L_temp=U8comdata;

COM();

U8checkdata_temp=U8comdata;

P2_0=1;

//数据校验

U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);

if(U8temp==U8checkdata_temp)

{

U8RH_data_H=U8RH_data_H_temp;

U8RH_data_L=U8RH_data_L_temp;

U8T_data_H=U8T_data_H_temp;

U8T_data_L=U8T_data_L_temp;

U8checkdata=U8checkdata_temp;

}//fi

}//fi

}

void main()

{

U8 i,j;

LcdInit();

Delay(1); //延时100US(12M晶振)

while(1)

{

RH();//调用温湿度读取子程序

str[0]=U8T_data_H;

str[1]=U8T_data_L;

str[2]=U8RH_data_H;

str[3]=U8RH_data_L;

str[4]=U8checkdata;

wd_sw=U8T_data_H/10%10+0x30;

wd_gw=U8T_data_H%10+0x30;

sd_sw=U8RH_data_H/10%10+0x30;

sd_gw=U8RH_data_H%10+0x30;

a[12]=wd_sw;

a[13]=wd_gw;

a[14]=0xdf;

a[15]='C';

a[16]='\0';

LcdWriteCom(0x00+0x80);

for(i=0;i<16;i++)

{

LcdWriteData(a[i]);

}

b[9]=sd_sw;

b[10]=sd_gw;

b[11]='\%';

b[12]='\0';

LcdWriteCom(0x42+0x80);

for(i=0;i<12;i++)

{

LcdWriteData(b[i]);

}

//读取模块数据周期不易小于 2S

Delay(30000);

}

}

玩转Arduino手机编程——打造最简单实用的家用温湿度计

随着科技的发展和人们生活水平的提高,温湿度成为人们普遍关注的问题之一。 据研究表明,室内最适合温度应保持在室温达 18℃ 时,相对湿度应保持在30—40%,室温达 25℃ 时,相对湿度应保持在 40—50% 为最宜。家庭有宝宝的家庭,一般情况下,室内温度以20℃左右为宜,湿度宜保持在50%~60%。可根据小儿怕冷、怕热的特点适当调节。

今天我们就借助DHT11最常见的温湿度传感器,用蜗牛控制器做一个最简单实用的家用温湿计。

一、所需器件

蜗牛控制器DHT11传感器

二、DHT11温湿度传感器介绍

DHT11是一款有已校准数字信号输出的温湿度传感器,内部包括一个电阻式感湿元件和一个NTC测温元件, 其湿度精度为±5%RH, 温度精度为±2℃,湿度量程为5~95%RH, 温度量程为-20~+60℃。

DHT11体积小、功耗低,信号传输距离长(可达20米以上),而且最最关键的是价格便宜,从而使其成为各类应用场合的最佳选择。三、电路连接

DHT11传感器的电源VDD管脚接至蜗牛控制器的5V引脚,GND管脚接至控制器的接地引脚,数据管脚DATA接至控制器的D2引脚,同时串联一个5000欧姆的电阻上拉至5V电源。

四、编程实现

1.打开串口

在“串口”积木组中选择“打开串口”积木,将其拖放到右侧的“初始化区”,完成后的代码如下。

注意:蜗牛控制器的波特率必须设置为115200

2.DHT11获取温湿度

DHT11利用单总线协议控制,时序严格而且复杂。但好在Arduino的开发者们为它开发了一整套的开发函数,创客们只需调用几条函数语句即可。蜗牛控制器对DHT11的使用更胜一筹,因为全程只需要一个积木。

温湿度传感器积木位于“传感器”积木组中。将其拖放至程序区后,只需指定它的连接引脚(DATA管脚连在蜗牛控制器的IO端口编号)即可,这里选择2。

因为我们要同时显示温度和湿度,所以就拖放了两次,当然你也可以采取复制的方式进行,具体方法是手指长按该积木块,松开后选择“复制积木”。

3.温湿度显示

蜗牛端通过串口将读取到的温湿度值发送出去,手机端通过蓝牙接收后,在“交互”窗口进行显示。

串口发送温湿度值用到了“串口打印”和“串口打印(换行)”两种串口发送积木。

前者输出后不换行,保证下一次输出内容在同一行;后者输出后换行,下一次输出内容显示在下一行。

这些积木组合后拼接成如下的样式。

4.延迟等待

因为单片机执行速度很快,执行上述语句大概只需要几十微秒,为防止串口堵塞,必须加一个延迟等待,同时温湿度也不需要特别快的显示频率。

延时等待积木位于左侧的“控制”积木组。

注意:延时等待积木的时间单位是毫秒,1秒=1000毫秒。

最终的程序积木形式如下。

五、程序下载

1.蜗牛控制器供电

供电后,其上的蓝色指示灯会处于闪烁状态,表明蜗牛控制器正常工作了。

2.手机环境配置

使用蜗牛手机APP时,需要打开手机的蓝牙和GPS定位功能,同时保证蓝牙未被其它设备连接。

3.连接蜗牛控制器

点击左上角的“连接”按钮,按钮由灰底“连接”切换为黄底“断开”,表明连接成功。

点击“下载”按钮开始程序编绎和下载,可以看到“下载”按钮切换为百分号数字进度条,指示着下载进度。六、温湿度显示

程序下载完成后,点击APP最上面的“交互”按钮,打开手机与蜗牛控制器的交互窗口。可以看到,每隔1秒钟左右,蜗牛控制器上传一次环境温湿度值到手机上。

点击手机屏幕黄色以外的灰度区域,可立即退出交互窗口。

七、拓展

1.关于精度说明

DHT11的湿度精度为±5%RH, 温度精度为±2℃,在要求不高的场合可以使用,如果对精度要求高,可以选择DHT22等型号。

值得一提的是,蜗牛的温湿度传感器同时支持DHT11、DHT21、DHT22、DHT33和DHT44,使用时在积木的类型下拉菜单中进行修改就可以了。

2.程序改进

上面的程序只是简单地重复测量和上传,并不智能;可以改进成问答式的方式,即手机发送测量命令后再进行温湿度测量和发送,参考代码如下。

欢迎有能力的小伙伴们使用蜗牛控制器开发出更好玩、更实用的温湿度计。[比心]

相关问答

你好啊,能否教我如何把 温湿度传感器 连接到电脑,我在网上看到...

温湿度传感器是和单片机连接的,它们采集的数据都是先传给单片机,再由单片机控制传给电脑的,单片机与电脑之间的数据传输需要使用串口,然后才能进行数据传送,而且...

dht11 温湿度传感器 电路原理是什么?_住范儿家装官网

暖通空调、电信基站、粮食...应用领域:暖通空调、电信基站、粮食仓储、精密机房、电子工业、粮食加工、图书档案保管、纺织工业、仓库管理。DHT11...

温湿度 显示仪多少钱?急!急!急!

[回答]电容传感器湿度传感器是湿度传感器中常见的一种仪器设备,它是以高分子材料湿度湿敏电力电容器为基础感湿元器件,运用单片机设计对测量結果开展剖析...

温湿度 监测仪的用途?

[回答]湿度传感器测量的种类更为普遍,依据测量的指标值开展区别,湿度传感器能够分成相对湿度、肯定湿度与漏点这三种。。苏盈传感器专营是一家集生产,研发...

aci 温湿度传感器 质量怎么样?- 一起装修网

一起装修网问答平台为您提供aci温湿度传感器质量怎么样?的相关答案,并为您推荐了关于aci温湿度传感器质量怎么样?的相关问题,一起装修网问答平台:装修问题,因我...

RS485 温湿度传感器 多少钱?RS485温湿度传感器好不好?RS485温...

RS485温湿度传感器怎么用?举报主板盈通盈通RS4859人讨论6368次围观关注问题写回答讨论回答(9)wangguan87768864RS-485传输的温湿度传感器可以方便的...

什么是机房 温湿度 控制器?_土巴兔装修问答

概述本仪表以先进的单片机为控制核心,采用进口高性能温湿度传感器,可同时对温度、湿度信号进行测量控制,并实现液晶数字显示,还可通过按键对温、湿...

python可以 单片机 编程吗,怎么样?

支持北斗&GPS双模定位、GPRS通信、短信、蓝牙、电话等功能。板载重力传感、温湿度、加速度传感器、蜂鸣器、LCD5110显示屏灯。以上就是python可以单片机编程...

iic 温湿度传感器 价格是多少- 一起装修网

一起装修网问答平台为您提供iic温湿度传感器价格是多少的相关答案,并为您推荐了关于iic温湿度传感器价格是多少的相关问题,一起装修网问答平台:装修问题,因我而...

数字温度计为什么采用 单片机 作为设计的核心?

数字温度计需要采集温度数据和显示温度数据数字温度计主要的功能是把采集到的温度数据显示出来。功能虽然很简单,但是采集温度数据和驱动显示器显示温度都需要...

猜你喜欢