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

2020-01-09来源: 51hei关键字:单片机  DHT11  温度湿度采集系统

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,&#

[1] [2] [3] [4]
关键字:单片机  DHT11  温度湿度采集系统 编辑:什么鱼 引用地址:http://news.kanmaya.com/mcu/ic485124.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:单片机贪吃蛇程序Lcd12864显示
下一篇:点亮第一个LED灯

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

单片机贪吃蛇程序Lcd12864显示
贪吃蛇的单片机源程序如下:/***********************************************************功能说明:贪吃蛇编译环境:keil4MCU     :STC89C52RC时钟频率: 22.1184MHz注意:该例程中“过关”不能在keil4编译环境中正常显示************************************************************//*****************************************************************     
发表于 2020-01-09
51单片机+ULN2003驱动5V减速步进电机程序
51单片机      步进电机/*******************************************************ULN2003驱动5V减速步进电机程序Target:STC89C52RC-40CCrystal:12MHzAuthor:战神单片机工作室Platform:51&avr单片机最小系统板+ULN2003步进电机驱动套件*******************************************************接线方式:IN1 ---- P00IN2 ---- P01IN3 ---- P02IN4 ---- P03+   
发表于 2020-01-09
单片机16*16点阵汉字显示仿真加源码 用74hc595驱动芯片
单片机16*16点阵仿真原理图如下点阵由于电流比较大不能直接接单片机所以用74hc595驱动串转并芯片,还可以实现用很少的io口来控制.  单片机源程序如下:#include "reg51.h"#define uchar unsigned char#define uint  unsigned int#define Lie   P1sbit SHCP = P2^0;sbit  DS  = P2^1;sbit STCP = P2^2;uchar code led[ ] ={0x00
发表于 2020-01-09
单片机16*16点阵汉字显示仿真加源码 用74hc595驱动芯片
单片机与PC机的串口通信课程设计
www.f66.com_【官方首页】-永乐国际1.1设计目的单片机与PC机串行通信端口在系统控制的范畴中一直占据着及其重要的地位,它不仅没有因为时代的进步而遭淘汰,反而在规格上越来越完善,应用也越来越广泛。作为一种基本而又灵活方便的通信方式,串口通信被广泛应用于PC与PC或者PC与单片机之间的数据交换以及其他工业控制与自动控制中。如今,在很多场合中,要求单片机不仅能独立完成单机的控制任务,还要能与其他数据控制设备(单片机、PC机等)进行数据交换。因此如何实现PC机与单片机之间的通信具有非常重要的现实意义。1.2设计内容以单片机与PC机为核心,实现单片机与PC机机的串口通信。2系统硬件电路设计2.1系统设计框图图2-1 系统设计框图2.2串口通信基本原理所谓"串行通信
发表于 2020-01-09
单片机与PC机的串口通信课程设计
51单片机的ADC0808数字电压表设计
摘要近些年来,数字电压表逐渐进入人们的视线中,它主要采取数字化测量技术。www.f66.com_【官方首页】-永乐国际与传统的指针式仪表相比,它的功能有了进一步的完善,并且精度也有了很大的提高。数字电压表主要采用单片机和模/数转换模块,这样不仅提高了测量速度,而且抗干扰能力强、使用便捷、可扩展性强、测量准确。本文主要采用AT89C51单片机和ADC0808芯片制作的简易数字电压表,可以采集0~5V和5~10V的模拟直流电压进行测量,其测量结果在液晶LCD1602上显示。该设计硬件电路主要有三个模块组成:A/D转换模块、数据处理模块及输出显示模块。数据处理由单片机AT89C51来完成,它主要把ADC0808传送来的数值经一定的数据处理,然后送至显示模块进行显示,同时控制显示芯片
发表于 2020-01-09
51单片机的ADC0808数字电压表设计
DHT11驱动程序
前几天在某宝上看到DHT11,感觉蓝色的外壳做的很漂亮,然后就买了1个。www.f66.com_【官方首页】-永乐国际结果发现网上的程序都是给旧12T单片机用的,注释也没几句,用着很不顺手。所以就自己按照数据手册编了驱动程序。还是自己的程序用着顺手~~~~拿来和大家分享~~~~/*********************************************************************************************程序名:    DHT11驱动程序编写人:    王朗的诱惑编写时间:  2015年8月4日硬件支持:  STC12C5A60S2  DHT11接口说明:  DHT11:VCC GND DATA 
发表于 2020-01-08
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 kanmaya.com, Inc. All rights reserved

页面底部区域 foot.htm