找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1794|回复: 0
打印 上一主题 下一主题
收起左侧

单片机DHT11温湿度检测器程序仿真 超阈值电阻丝模拟加热 水泵加湿 电机风扇降温

[复制链接]
跳转到指定楼层
楼主
AT89C52单片机作为数据处理器,DHT11采集温湿度数据,按键调整温湿度报警阈值,LCD12864来进行显示温湿度实时数据和报警阈值,当DHT11检测到的温度高于报警阈值的时候,电阻丝进行模拟加热,当检测到的温度低于报警阈值的时候,风扇开始进行降温;当检测到的DHT11湿度低于报警阈值的时候,水泵进行模拟加湿,当检测到的DHT11湿度高于报警阈值的时候,蜂鸣器进行鸣叫

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
#include "config.h"
#include "lcd12864.h"
#include "dht11.h"
#include "stdio.h"
#include "intrins.h"
#include "math.h"
#include "uart.h"
#include "key.h"

uint  t  = 20;
uint  z  = 40;


unsigned char tempH,tempL,humiH,humiL;


/*******************************************************************************
* 函 数 名       : Display
* 函数功能                 : 显示温湿度阈值
*******************************************************************************/


void Display(void)
{
        uchar t_Buffer[3];
        uchar z_Buffer[3];
        delay_ms(100);
        t_Buffer[0] = t/10+0x30;
        t_Buffer[1] = t%10+0x30;
        t_Buffer[2] = '\0';
        Write_String(2,72,0,t_Buffer);
        delay_ms(100);
        z_Buffer[0] = z/10+0x30;
        z_Buffer[1] = z%10+0x30;
        z_Buffer[2] = '\0';
        Write_String(6,72,0,z_Buffer);
}

/*******************************************************************************
* 函 数 名       : key_press
* 函数功能                 : 检测独立按键是否按下,按下则返回对应键值
* 输    入       : mode=0:单次扫描按键
                                   mode=1:连续扫描按键
* 输    出             :
                                         KEY1_PRESS:K1按下温度阈值加1
                                   KEY2_PRESS:K2按下温度阈值减1
                                   KEY3_PRESS:K3按下湿度阈值加1
                                   KEY4_PRESS:K4按下湿度阈值减1
                                   KEY_UNPRESS:未有按键按下
*******************************************************************************/
void key_press()
{
        uchar key = 0;
        key = key_scan(1);
        if (key==KEY1_PRESS)
        {
                if(t<100)
                        t++;
        }
        else if (key==KEY2_PRESS)
        {
                if (t>0)
                t--;
        }
        if (key==KEY3_PRESS)
        {
                if(z<100)
                        z++;
        }
        else if (key==KEY4_PRESS)
        {
                if (z>0)
                z--;
        }
}




void baojing(void)
{
        {

                if (tempH > t)
                {
                        Fengsan = 0;
                        Relay = 1;
                }
                else
                {
                        Fengsan = 1;
                        Relay = 0;
                }
        }
        {

                if (humiH > z)
                {
                        Suibeng = 1;
                        Beep = 1;
                }
                else
                {
                        Suibeng        = 0;
                        Beep = 0;
                }
        }
}
               
/*******************************************************************************
* 函 数 名       : 主函数
*******************************************************************************/
void main()
{
        uchar temp_buf[3],humi_buf[3];
        UartInit();
        dht11_rst();
        if(dht11_check()<0)
        {
                printf("DHT11 ERROR!\r\n");
        }
        else
        {
                printf("DHT11 OK\r\n");
        }
        
//        EA = 1;
        Init_12864();
        Qin();
        Write_String(0,0,0,"温度");
        Write_String(0,32,0,":");
        Write_String(0,60,0,"℃");
        Write_String(2,0,0,"温度阈值");
        Write_String(2,64,0,":");
        Write_String(2,90,0,"℃");

        Write_String(4,0,0,"湿度");
        Write_String(4,32,0,":");
        Write_String(4,60,0,"%RH");
        Write_String(6,0,0,"湿度阈值");
        Write_String(6,64,0,":");
        Write_String(6,90,0,"%RH");
        
        
        while(1)
        {
                Display();
                key_press();
                dht11_Read_Data(&tempH,&tempL,&humiH,&humiL);
                delay_ms(500);
//                Write_String(2,40,0,"&tempH");
                temp_buf[0]=tempH/10+0x30;
                temp_buf[1]=tempH%10+0x30;
                humi_buf[0]=humiH/10+0x30;
                humi_buf[1]=humiH%10+0x30;
                Write_String(0,40,0,temp_buf);
                Write_String(4,40,0,humi_buf);
                baojing();
//                printf("TEMP:%bu.%bu HUMI:%bu.%bu",tempH,tempL,humiH,humiL);
//                printf ("\r\n");
                printf(" 当前温度:%bu.%bu",tempH,tempL);
                delay_ms(5);
                printf ("\r\n");
                delay_ms(5);
            printf(" 当前湿度:%bu.%bu",humiH,humiL);
                delay_ms(5);
        printf ("\r\n");
                delay_ms(5);
        }
}

Keil5代码与Proteus8.13仿真下载:
温湿度检测(12864).zip (173.46 KB, 下载次数: 89)

评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表