本设计是基于 STC89C52 单片机和 DHT11 实现温湿度的测量。单片机在本系统中作为温湿度,时钟输入和显示控制器件,DHT11 被用作温湿度数据的采集和温湿度输出器件。最后采 nRF24L01 模块对采集到的温湿度时间 数据进行无线传输,在接收端通过 LCD1602 液晶显示模块显示接收的温湿度,从而实现温湿度的采集和无线传送。 主要步骤: 1.通过查阅资料,了解无线温湿度采集系统的研究背景、国内外发展状况; 2.熟悉 LCD1602,DHT11,NRF24L01,蜂鸣器 等模块的基本功能; 3.熟悉 Keil C51 软件和 STC-ISP 软件; 4.使用 Keil C51 软件编写应用程序; 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<s; i++);
- for(i=0; i<s; 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);//用于清空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;
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有程序51hei提供下载:
程序源码与参考资料.7z
(1.93 MB, 下载次数: 81)
|