基于51单片机的温度湿度采集系统

实现功能:

1、对温度、湿度进行采集
2、可以警报提示、修改温度、湿度上下限值
3、lcd显示相关信息

原理图:

 部分程序:

#include <reg52.h>

#define uint unsigned int

#define uchar unsigned char

#include <intrins.h>

typedef bit BOOL  ;

sbit io = P1^1 ;//(口线定义)

sbit bee=P1^0;

sbit rs = P2^5 ;

sbit rw = P2^6 ;

sbit ep = P2^7 ;

bit flag_300ms ;

sbit K1=P1^2;

sbit K2=P1^3;

sbit K3=P1^4;

uchar yemian=0;//(定义变量)

uchar flat=1;

uchar data_byte;

uchar RH,RL,TH,TL;

uchar WenDu,ShiDu;//报警的温度和湿度

#include "eeprom52.h"

/****************************延时程序****************************/

void delay(uchar ms)

{       // 延时子程序

          uchar i ;

          while(ms--)

          {

               for(i = 0 ; i<250;i++) ;

          }

}

void delay1()//延时10us

{

         uchar i;

         i--;

         i--;

         i--;

         i--;

         i--;

         i--;

}

void longdelay(uchar s) //长延时

{

          while(s--)

          {

               delay(20) ;

          }

}

/******************把数据保存到单片机内部eeprom中******************/

void write_eeprom()

{

         SectorErase(0x2000);

        byte_write(0x2000, WenDu);

         byte_write(0x2001, ShiDu);

         byte_write(0x2060, a_a);      

}

/******************把数据从单片机内部eeprom中读出来*****************/

void read_eeprom()

{

         WenDu   = byte_read(0x2000);

  ShiDu = byte_read(0x2001);

         a_a      = byte_read(0x2060);

}

/**************开机自检eeprom初始化*****************/

void init_eeprom()

{

         read_eeprom();               //先读

         if(a_a != 2)               //新的单片机初始单片机内问eeprom

         {

         WenDu   = 30;

         ShiDu   = 80;

                  a_a = 2;

                  write_eeprom();

         }      

}

/********************报警程序部分*******************/

void warn()  //报警函数

{

        

  if(TH>=WenDu)  //检测的温度高于设定温度报警值

                                              

     {

      bee=0; //报警

                         

     }     

                   

         if(RH>=ShiDu)  //检测的湿度高于设定的湿度值

                                              

     {

      bee=0; //报警

     }     

                   

         if( TH<WenDu  &&  RH<ShiDu )

    {

                    bee=1; //停止报警

                  }

                   

}

/************************LCD模块******************************************/

BOOL lcd_bz()//测试LCD忙碌状态

{     

          BOOL result ;

          rs = 0 ;

          rw = 1 ;

          ep = 1 ;

          result = (BOOL)(P0 & 0x80) ;

          ep = 0 ;

          return result ;

}

void write_cmd(uchar cmd)// 写指令

{      

        while(lcd_bz()) ;

         rs = 0 ;

         rw = 0 ;

         ep = 0 ;

         P0 = cmd ;

         ep = 1 ;

         ep = 0 ; 

}

void write_addr(uchar addr)//写地址

{      

        write_cmd(addr|0x80) ;

}

void write_byte(uchar dat)//写字节

{     

        while(lcd_bz()) ;

      rs = 1 ;

      rw = 0 ;

      ep = 0 ;

      P0 = dat ;

      ep = 1 ;

      ep = 0 ;

}

void lcd_init()// 初始化

{      

          write_cmd(0x38) ;

          delay(1);

          write_cmd(0x08) ; 

          delay(1);

          write_cmd(0x01) ;

          delay(1);

          write_cmd(0x06) ;

          delay(1);

          write_cmd(0x0c) ;

          delay(1);

}

void display(uchar addr, uchar q)//在某一地址上显示一字节

{       

          delay(1) ;

          write_addr(addr) ;

   write_byte(q) ;

          delay(1) ;

          

}

/*********************** DHT11测试模块***************************************/

void start()//开始信号

{

         io=1;

         delay1();

         io=0;

         delay(20);//>18ms

         io=1;

         delay1();//20-40us

         delay1();

         delay1();

         delay1();

         delay1();

}

uchar receive_byte()//接收一个字节

{

         uchar i,temp,count;

         for(i=0;i<8;i++)

         {

        temp=0;

                  delay1();delay1();delay1();delay1();

                  if(io==1)temp=1;

                  count=2;

                  while((io)&&count++);

                  if(count==1)break;

                  data_byte<<=1;     

                  data_byte|=temp;

         }

         return data_byte;

}

void receive()//接收数据

{

         uchar T_H,T_L,R_H,R_L,check,num_check;

         uchar count;

         start();//开始信号

         io=1;

         if(!io)//读取DHT11响应信号

         {

        

         while((io)&&count++);

         R_H=receive_byte();

         R_L=receive_byte();

         T_H=receive_byte();

         T_L=receive_byte();

         check=receive_byte();

         io=0;//拉低延时50us

         delay1();delay1();delay1();delay1();delay1();

         io=1;

         num_check=R_H+R_L+T_H+T_L;

         if(num_check=check)

         {

                  RH=R_H;

                  RL=R_L;

                  TH=T_H;

                  TL=T_L;

                  check=num_check;

         }

         }

}

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值