×
单片机 > 单片机程序设计 > 详情

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

发布时间:2024-05-19 发布时间:
|

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

主要步骤:

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

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

3.熟悉KeilC51软件和STC-ISP软件;

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

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

6.调试并分析;


制作出来的实物图如下:

单片机源程序如下:

#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]
单片机NRF2401DHT11远程温湿度控制

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会