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

单片机的DHT11温度湿度采集系统

发布时间:2021-01-19 发布时间:
|

DHT11温度湿度采集原理图:

DHT11的单片机源程序:

***************************************************************/

#include

#define uint unsigned int 

#define uchar unsigned char

#include


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

    {

                  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;

        }

        }

}



void showw()   // 问候语函数

{      

           lcd_init(); //初始化

            delay(10);

        

     display(0x05,'W');

     display(0x06,'e');

                 display(0x07,'l');

                 display(0x08,'c');

                 display(0x09,'o');

                 display(0x0a,'m');

     display(0x0b,'e');

           delay(250); //短暂延时

           delay(250);

           delay(250);

           


/*********************************/

/*

           display(0x40,' ') ;

display(0x41,



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

热门文章 更多
8051单片机的函数发生器的设计