单片机+NRF2401+DHT11远程温湿度控制程序

2020-11-21来源: 51hei关键字:单片机  NRF2401  DHT11  远程温湿度控制

本设计是基于 STC89C52 单片机和 DHT11 实现温湿度的测量。单片机在本系统中作为温湿度,时钟输入和显示控制器件,DHT11 被用作温湿度数据的采集和温湿度输出器件。最后采 nRF24L01 模块对采集到的温湿度时间 数据进行无线传输,在接收端通过 LCD1602 液晶显示模块显示接收的温湿度,从而实现温湿度的采集和无线传送。

主要步骤:

1.通过查阅资料,了解无线温湿度采集系统的研究背景、国内外发展状况;

2.熟悉 LCD1602,DHT11,NRF24L01,蜂鸣器 等模块的基本功能;

3.熟悉 Keil C51 软件和 STC-ISP 软件;

4.使用 Keil C51 软件编写应用程序;

5.使用 STC-ISP 软件将编译好的程序烧写进单片机;

6.调试并分析;


制作出来的实物图如下:
IMG_20180129_113002_1_副本.jpg IMG_20180129_113032_副本.jpg 1.png 2.png

单片机源程序如下:

#include ".\nRF24L01\nRF24L01.h"

#include "def.h"

typedef unsigned char unint8;

typedef unsigned char unint16;

#define uint unsigned int

unint8 com_data,untemp,temp;

uchar  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;

uchar  U8FLAG,U8comdata;

uchar  U8count,U8temp;

uchar  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

unint8 respond;

void Delay(unsigned int s)

{

        unsigned int i;

        for(i=0; i

        for(i=0; i

}


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

                                                                                                                                                                                DHT11相关命令            

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

void Delay1(uint j)

{  

        uchar i;

        for(;j>0;j--)

        {         

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

        }

}


void  Delay_10us(void)

{

        uchar i;

        i--;

        i--;

        i--;

        i--;

        i--;

        i--;

}





void  COM(void)

{

        uchar i;

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

        {

                U8FLAG=2;        

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

                Delay_10us();

                Delay_10us();

                Delay_10us();

                U8temp=0;

                if(DHT11)U8temp=0;

                U8FLAG=2;

                while((DHT11)&&U8FLAG++);

                //超时则跳出for循环                  

                if(U8FLAG==0)break;

                //判断数据位是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-----

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

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

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


void RH(void)

{

        //主机拉低18ms

        DHT11=0;

        Delay1(180);

        ET0 = 0;//关闭定时器0中断

        DHT11=1;

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

        Delay_10us();

        Delay_10us();

        Delay_10us();

        Delay_10us();

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

        DHT11=0;

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

        if(!DHT11)                 //T !         

        {

                U8FLAG=2;

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

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

                U8FLAG=2;

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

                while((DHT11)&&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;

                DHT11=0;

                ET0 = 1;//开启定时器0中断

                //数据校验


                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(void)

{

        unsigned char leng =0;

        unsigned char tf =0;

        unsigned char TxBuf[20]={0};         //

        unsigned char RxBuf[20]={0};        

        led=0;

    init_io() ;

        while(1)

        {           

               inerDelay_us(100);

                CE=0;   // chip enable

                CSN=0;   // Spi disable

                SCK=0;   

                                RH();//温湿度检测受定时器影响,故在驱动程序中关闭定时器中断,减小扫描频率才能更好的实现红外接收

                   TxBuf[0] =U8T_data_H;

                   TxBuf[2] =U8RH_data_H;

                   tf = 0 ;

           

            SPI_RW_Reg(WRITE_REG+STATUS, 0xff);      //

            CSN=0;

SPI_RW(FLUSH_RX

[1] [2]
关键字:单片机  NRF2401  DHT11  远程温湿度控制 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic517316.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:单片机电子密码锁仿真 可修改密码
下一篇:单片机OLED屏幕进行数字,字符,图片的显示程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于51单片机控温程序及电路原理图
所需要 ** 的温度值。并且能够稳定在你所设定的温度下。当 ** 实际温度超过你设定的温度,蜂鸣器报警 。 ** ** 包括各个模块及详细的注释 ** 方便 C51 单片机入门级别者阅读 *电路原理图如下:
发表于 2020-11-04
基于51<font color='red'>单片机</font>控温程序及电路原理图
单片机+LCD12864数字电压表设计
单片机源程序如下://---库函数声明及相关定义---//#include <reg51.h>#include <intrins.h>#define unint unsigned int#define unchar unsigned char#define Databus P1 /*液晶数据总线*/sbit RS=P3^3;      /*数据指令 选择*/sbit RW=P3^4;      /*读写 选择*/sbit EN=P3^2;      /*读写使能*/sbit cs1=P3^6;   
发表于 2020-11-04
<font color='red'>单片机</font>+LCD12864数字电压表设计
51单片机控制模拟交通信号灯
采用单片机的I/O口PO口通过上拉电阻和交通灯相连接,P3.0、P3.1口接到数码管控制位上,控制数码管的显示,程序放在STC89C52RC单片机的ROM中,在十字路口的四组红、黄、绿交通灯中,由单片机的 P1.0-P1.2 、P1.5-P1.7、P2.0-P2.2、P2.5-P2.7控制,由于交通灯为发光二极管且阳极通过限流电阻和电源正极相连,因此I/0口输出低电平时,与之相连的指示灯会亮,并通过数码管显示时间倒计时。I/0口输出高电平时,相应指示灯会灭。当交通出现障碍需要恢复到初始状态时,按下复位键即可,此键由单片机的9脚RST键控制。制作出来的实物图如下:Altium Designer画的原理图和PCB图如下:(51hei
发表于 2020-11-04
51<font color='red'>单片机</font>控制模拟交通信号灯
风速风向传感器在单片机上的应用
/*本风速传感器采用小型直流有刷电机与三杯式旋转风杯组装  而成,其工作原理为,当环境有水平流动风时,旋转风杯能够产生旋转,并带动小型电机产生电压,其电压与旋转速度基本成正比。利用此信号电压,可以对环境风速进行测量。这款风速传感器采用海洋军用的高精度测量风速传感器,与传统产品先别,具有更高精度;是建筑机械(起重机、履带吊、门吊、塔吊)、铁路、港口、码头、风力发电、光伏发电、电厂、气象、索道、环境、温室、养殖等领域不可缺少的风速检测装置。用它可以实现设备风速指示数字化及自动化,是相关设备不可缺少的风速检测设备。*///使用该程序和电路再搭配我们的风速风向传感器就可以实时显示风速风向数据#冠拓电子#include <
发表于 2020-11-04
风速风向传感器在<font color='red'>单片机</font>上的应用
51单片机中的ROM和RAM分别是什么?
众所周知,51 内部的存储器分为数据存储器 RAM 和程序存储器 ROM。以 AT89c51 为例,其中有 128 字节随机存储器(又称数据储存器 RAM)和 4K 字节的只读存 储器(又称程序存储器 ROM)。先说说这个 4K 字节的程序存储器或者说只读存储器,我们写的程序经过编译器 编译成机器码都是存在这个区域,所以称为程序存储器;但单片机上电执行的时 候,此区域内的数据只能读取而不能写入,他的只读存储器的名称从这而来。89c51 的 ROM 采用的是 FPEROM(Flash Programmable and Erasable Read OnlyMemory),具体工艺我也不太清楚,号称可以擦写 1000 次,也就是说你每天
发表于 2020-11-04
Proteus超声波测距仿真电路图+单片机源程序
大多数人感觉超声波测距proteus仿真是无法实现的,虽然proteus自带的库有GUR03和SRF04两种模型,但是却与实际传感器使用方法相差甚远,即使求助度娘也很难找到简单易懂的教程。之前很多人想做超声波测距仿真但都没有找到很好的办法去实现,在软件里没有这样的元件,有人用一个按键开关去模拟仿真,这样仿真出来的效果,非常不好。还有人用555时基电路产生一个延时信号(555电路作为超声波仿真的内部元件),来模拟超声波头发送后遇到回波返射回来的这阶段时间,来对单片机超声波测距单片机系统进行模拟,能完成对超声波测距模块大致仿真,但需要繁杂的设计。下面是一个超声波测距模块的proteus模型,能直接用于proteus仿真,且使用方法
发表于 2020-11-04
Proteus超声波测距仿真电路图+<font color='red'>单片机</font>源程序
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved