单片机
返回首页

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

2020-11-21 来源:51hei

本设计是基于 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

            SPI_RW(FLUSH_RX);//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大家记住!!

            CSN=1;                 

           if (tf==0)

       {        

                led=0;

                        nRF24L01_TxPacket(TxBuf);        // Transmit Tx buffer data

                        TxBuf[0] = 0x00;

                        TxBuf[2] = 0x00;

                        tf=0;

                        Delay(60000);

                        led=0;

           }


……………………


进入单片机查看更多内容>>
相关视频
  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • HVI系列 - USB type C PD 协议设计考量

  • Simplelink Academy:传感器控制器简介

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 新唐 8051单片机教程

    相关电子头条文章