本设计是基于 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 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);//用于清空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;
}
上一篇:单片机电子密码锁仿真 可修改密码
下一篇:单片机OLED屏幕进行数字,字符,图片的显示程序
推荐阅读最新更新时间:2024-11-09 08:44
设计资源 培训 开发板 精华推荐
- LM27402S-20A大电流降压模块
- DI-197 - 65W 笔记本适配器
- 使用 Nextion HMI Display_MainBoard 的无线家庭自动化(控制和监控)
- SIP79L12AC 三端小电流负电压稳压器典型应用
- ADP1053DC-EVALZ,用于 ADP1053 数字电源控制器的子卡评估板
- AN11996 - QN9083 与 DC-DC 转换器
- SI5319-EVB,使用 SI5319 的评估板,0.002 至 710 MHz 时钟发生器
- 基于BLE的语音解决方案
- AM6TW-4803DH35Z ±3.3V 6 瓦单输出 DC-DC 转换器的典型应用
- 2022年中国计量大学立创杯A题信号混合传输系统