AT89S52单片机的温湿度报警系统

该博客介绍了如何使用AT89S52单片机配合DHT11传感器搭建温湿度报警系统,包括DHT11的头文件和源代码,以及DS1302时钟、1602液晶显示屏的控制方法。通过读取DHT11数据,当温度或湿度超过预设阈值时,系统将触发蜂鸣器和LED报警。此外,还提供了设置和读取时间的函数,以及按键控制的详细流程。
摘要由CSDN通过智能技术生成


原理图:

dht11.h

#ifndef __dht11_H
#define __dht11_H

#include <reg51.h>

typedef unsigned char  U8;       /*    无符号8位整型变量  */
typedef signed   char  S8;       /*     有符号8位整型变量  */
typedef unsigned int   U16;      /*     无符号16位整型变量 */
typedef signed   int   S16;      /*    有符号16位整型变量 */
typedef unsigned long  U32;      /*    无符号32位整型变量 */
typedef signed   long  S32;      /*    有符号32位整型变量 */
typedef float          F32;      /*  单精度浮点数(32位长度) */
typedef double         F64;      /*  双精度浮点数(64位长度) */

extern U8  U8FLAG,k;
extern U8  U8count,U8temp;
extern U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
extern U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
extern U8  U8comdata;

sbit  P1_0  = P1^0 ;

void  Delay(U16 j);
void  Delay_10us(void);
void  COM(void);
void  RH(void);

#endif

dht11.c

#include "dht11.h"

 U8  U8FLAG,k;
 U8  U8count,U8temp;
 U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
 U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
 U8  U8comdata;

 void Delay(U16 j)
  {    
      U8 i;
     for(;j>0;j--)
   {  
  for(i=0;i<27;i++);

   }
  }
 void  Delay_10us(void)
{
        U8 i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
}
 
void  COM(void)
{
    
     U8 i;
       for(i=0;i<8;i++)   
     {
  
         U8FLAG=2; 
     while((!P1_0)&&U8FLAG++);
   Delay_10us();
   Delay_10us();
  // Delay_10us();
     U8temp=0;
      if(P1_0)U8temp=1;
      U8FLAG=2;
   while((P1_0)&&U8FLAG++);
    
     //超时则跳出for循环   
      if(U8FLAG==1)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
       P1_0=0;
    Delay(180);
    P1_0=1;
  //总线由上拉电阻拉高 主机延时20us
    Delay_10us();
    Delay_10us();
    Delay_10us();
    Delay_10us();
  //主机设为输入 判断从机响应信号
    P1_0=1;
  //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行  
    if(!P1_0)   //T !  
    {
    U8FLAG=2;
  //判断从机是否发出 80us 的低电平响应信号是否结束 
    while((!P1_0)&&U8FLAG++);
    U8FLAG=2;
  //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
    while((P1_0)&&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;
    P1_0=1;
  //数据校验
 
    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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值