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

单片机+DHT11温湿度检测程序

发布时间:2020-06-17 发布时间:
|

基于DHT11温湿度报警系统LCD1602显示操作说明

本设计系统是DHT11温湿度报警系统LCD1602显示,可设置温度的高温报警值和低温报警值、湿度的高湿度报警值和低温度报警值,当有报警时蜂鸣器会发出滴滴的报警声,同时绿色发光二极管闪烁,在LCD1602液晶上还能很直观的看到报警信息。并具有掉电保存功能,数据保存在单片机内部EEPOM中,进入设置界面后如果没有键按下系统会在30秒后自动退出设置界面,人性化的按键设置,按键还具有连加、减功能,当按下按键时有按键声即蜂鸣器叫一声,按键声可以进入菜单内设置,可设置按键声打开或关闭。系统还设有取消报警回差值,增加的系统的抗干扰性。

报警方式:声光报警    
蜂鸣器滴滴报警声、发光二极管闪烁。
DHT11温湿度检测

单片机电路原理图:

 

蜂鸣器    蜂鸣器    B1
10uF    电容    C1
20pF    电容    C2, C3
D    指示灯    D1, D2, D3, D4,
LCD1602    液晶    LCD1
9012    三极管    Q1
10K    电阻    R3, R4
2K    电阻    R1
2K    电阻    R2, R5
SW-PB    按键    S1, S2, S3, S4, S5
sw-灰色    电源开关    SW1
U1    单片机    U1
DHT11    温湿度传感器    U2
12M    晶振    Y1

单片机源程序如下:

#include                 //调用单片机头文件

#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255

#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535


sbit beep = P1^4;   //蜂鸣器


int flag_300ms ;


//  按键的IO变量的定义

uchar key_can;                 //按键值的变量


sbit wh_led = P2^2;  //温度报警指示灯IO口定义

sbit wl_led = P2^3;  //温度报警指示灯IO口定义

sbit sh_led = P2^1;  //湿度报警指示灯IO口定义

sbit sl_led = P2^0;  //湿度报警指示灯IO口定义


uchar flag_en = 1;


uchar menu_1;        //菜单设计的变量

uint t_high = 35,t_low = 10;        //温度报警参数

uint s_high = 80,s_low = 10;        //湿度报警参数


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

* 名称 : delay_1ms()

* 功能 : 延时1ms函数

* 输入 : q

* 输出 : 无

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

void delay_1ms(uint q)

{

        uint i,j;

        for(i=0;i

                for(j=0;j<120;j++);

}


sbit dht11=P1^5;         //温度传感器IO口定义

uchar table_dht11[5]={1,2,3,4,5};


uchar code table_num[]="0123456789abcdefg";


sbit rs=P1^0;         //寄存器选择信号 H:数据寄存器          L:指令寄存器

sbit rw=P1^1;         //寄存器选择信号 H:数据寄存器          L:指令寄存器

sbit e =P1^2;         //片选信号   下降沿触发


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

* 名称 : delay_uint()

* 功能 : 小延时。

* 输入 : 无

* 输出 : 无

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

void delay_uint(uint q)

{

        while(q--);

}


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

* 名称 : write_com(uchar com)

* 功能 : 1602命令函数

* 输入 : 输入的命令值

* 输出 : 无

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

void write_com(uchar com)

{

        e=0;

        rs=0;

        rw=0;

        P0=com;

        delay_uint(25);

        e=1;

        delay_uint(100);

        e=0;

}


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

* 名称 : write_data(uchar dat)

* 功能 : 1602写数据函数

* 输入 : 需要写入1602的数据

* 输出 : 无

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

void write_data(uchar dat)

{

        e=0;

        rs=1;

        rw=0;

        P0=dat;

        delay_uint(25);

        e=1;

        delay_uint(100);

        e=0;        

}



/***********************lcd1602上显示特定的字符****0XDF 度********************/

void write_zifu(uchar hang,uchar add,uchar date)

{

        if(hang==1)   

                write_com(0x80+add);

        else

                write_com(0x80+0x40+add);

        write_data(date);        

}


/***********************lcd1602上显示两位十进制数************************/

void write_sfm2(uchar hang,uchar add,uint date)

{

        if(hang==1)   

                write_com(0x80+add);

        else

                write_com(0x80+0x40+add);

        write_data(0x30+date/10%10);

        write_data(0x30+date%10);        

}


/***********************lcd1602上显示这字符函数************************/

void write_string(uchar hang,uchar add,uchar *p)

{

        if(hang==1)   

                write_com(0x80+add);

        else

                write_com(0x80+0x40+add);

                while(1)                                                                                                                 

                {

                        if(*p == '')  break;

                        write_data(*p);

                        p++;

                }        

}


/***********************lcd1602初始化设置************************/

void init_1602()        //lcd1602初始化

{

        write_com(0x38);        

        write_com(0x0c);

        write_com(0x06);

        delay_uint(1000);

        write_string(1,0,"Wd:00  H00  L00   ");        

        write_string(2,0,"Sd:00% H00% L00% ");        

        write_zifu(1,5,0xdf);        //显示度                

        write_zifu(1,10,0xdf);        //显示度        

        write_zifu(1,15,0xdf);        //显示度        

        write_sfm2(1,3,table_dht11[2]);           //显示温度

        write_sfm2(2,3,table_dht11[0]);   //显示湿度        

        write_sfm2(1,7,t_high);          //显示温度

        write_sfm2(2,7,s_high);   //显示湿度                

        write_sfm2(1,10,t_low);          //显示温度

        write_sfm2(2,10,s_low);   //显示湿度                

}


/********************独立按键程序*****************/

uchar key_can;         //按键值


void key()             //独立按键程序

{

        static uchar key_new;

        key_can = 20;               //按键值还原

        P3 |= 0xf0;

        if((P3 & 0xf0) != 0xf0)                //按键按下

        {

                delay_1ms(1);                     //按键消抖动

                if(((P3 & 0xf0) != 0xf0) && (key_new == 1))

                {                                                //确认是按键按下

                        key_new = 0;

switch(



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

热门文章 更多
如何为单片机选择合适的负载电容