基于51单片机的DHT11温湿度控制系统

2020-07-30来源: 51hei关键字:51单片机  DHT11  温湿度控制系统

单片机驱动DHT11获取环境温湿度并在1602显示,同时可以调整温湿度的各自的上下限,有提示降温除湿功能。程序实测可用

单片机源程序如下:

//http://www.51hei.com/bbs/dpj-51190-1.html

#include

#include

#define uchar unsigned char

#define uint unsigned int

typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable    无符号8位整型变量  */

typedef signed   char  S8;       /* defined for signed 8-bits integer variable    有符号8位整型变量  */

typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable    无符号16位整型变量 */


sbit speek  =P3^4;  //报警

sbit hh     =P2^1;        //高灯

sbit ll     =P2^2;        //高灯


sbit LCD_RS =P1^3;

sbit LCD_RW =P1^4;

sbit LCD_EN =P1^5;

//sbit LCD_RS =P2^4;

//sbit LCD_RW =P2^5;

//sbit LCD_EN =P2^6;


sbit setup  =P1^6;  //  设置+

sbit setdown=P1^7;  //  设置-

sbit set    =P3^0;    //  设置


sbit  P2_0  =P1^0;          //DHT11的DATE

sbit  P2_1  =P3^1;          //串行总线---不用


//----------------------------------------------//

//----------------定义区--------------------//

//----------------------------------------------//

U8  U8FLAG;

U8  U8count,U8temp;

U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;

U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

U8  U8comdata;   

U8  indata[5];

U8  count, count_r=0;

U16 U16temp1,U16temp2;

uchar settem_h,settem_l,sethum_h,sethum_l,con=0;

bit sethumbz_h=0,sethumbz_l=0,settembz_h=0,settembz_l=0,setkey;

uchar i;

bit BIAO;

void Delay_1(U16 j)           //100us延时

{   

U8 i;

for(;j>0;j--)

{  

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

}

}

//void elay(unsigned int num)//延时函数

//{

//  while( --num );

//}


void  Delay_10us(void)  //进入函数3us

{

U8 i;             //1us

i--;                   //1us

i--;

i--;

i--;

i--;

i--;

}



        


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

/*                                                                  */

/*检查LCD忙状态                                                     */

/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。       */

/*                                                                  */

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


bit lcd_busy()

{                          

    bit result;

    LCD_RS = 0;

    LCD_RW = 1;

    LCD_EN = 1;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

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

    LCD_EN = 0;

    return result;

}


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

/*                                                                  */

/*写指令数据到LCD                                                   */

/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                              */

/*                                                                  */

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


void lcd_wcmd(uchar cmd)


{                          

   while(lcd_busy());

    LCD_RS = 0;

    LCD_RW = 0;

    LCD_EN = 0;

    _nop_();

    _nop_();

    P0 = cmd;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    LCD_EN = 1;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    LCD_EN = 0;  

}


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

/*                                                                  */

/*写显示数据到LCD                                                   */

/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                                */

/*                                                                  */

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


void lcd_wdat(uchar dat)

{                          

   while(lcd_busy());

    LCD_RS = 1;

    LCD_RW = 0;

    LCD_EN = 0;

    P0 = dat;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    LCD_EN = 1;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    LCD_EN = 0;

}


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

/*                                                                  */

/*  LCD初始化设定                                                   */

/*                                                                  */

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


void lcd_init()

{                        

    lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据

    Delay_1(5);

    lcd_wcmd(0x38);         

    Delay_1(5);

    lcd_wcmd(0x38);         

    Delay_1(5);


    lcd_wcmd(0x0c);      //显示开,关光标

    Delay_1(5);

    lcd_wcmd(0x06);      //移动光标

    Delay_1(5);

    lcd_wcmd(0x01);      //清除LCD的显示内容

    Delay_1(5);

}


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

/*                                                                  */

/*  设定显示位置                                                    */

/*                                                                  */

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


void lcd_pos(uchar pos)

{                          

  lcd_wcmd(pos | 0x80);  //数据指针=80+地址变量

}


void LCD1602PutStr(char* s)

{

        uchar i = 0;

        while (*(i + s))

                {

                lcd_wdat(*(i + s));

                                Delay_1(200);

                i++;

        }

}




void COM(void)                 //串行读一个字节数据

{

U8 i;

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

{

  U8FLAG=2;

while((!P2_0)&&U8FLAG++); //自加254次 默认执行下面程序 50us低电平结

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

上一篇:单片机定时器的应用 具有清零,暂停,启动功能秒表源程序
下一篇:51单片机的蜂鸣器写歌的音阶

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

推荐阅读

51单片机的准备工作
。     第三,编译软件,KEIL C,全名是keil uvision,下载地址:http://www.51hei.com/keil%CF%C2%D4%D8.html  它是美国Keil Software公司研发的51系列兼容单片机的C语言软件开发系统,我这一代人学51用的都是它。在2005年的时候被ARM公司收购,所以,现在基于ARM内核的STM32单片机也可以用这个软件开发,但是要去官网下载相应的版本。启动界面如下:     另外说一句,现在国内用的基本都是破-解-版,使用上没有问题,也就不要大声嚷嚷了,仅做学习交流用,不要有商业
发表于 2020-07-23
学<font color='red'>51单片机</font>的准备工作
51单片机-KEIL的使用与程序的下载
      很多人学单片机的时候都会遇到的情况,程序写的漂漂亮亮,原理理解的通通透透,但是.......不会用编译软件,不知道怎么下载程序,貌似大学的时候我老师就没讲过,呵呵。所以今天主要讲一下这两个软件的应用。      注:单片机种类多种多样,编译环境自然也有很多种。学习一种编译软件肯定需要一定的时间,不过软件界面基本都是大同小异,会了一个再去学另一个会很快。还有个现象,很多人喜欢用汉化版,个人感觉没必要。首先,汉化的不一定标准;其次,工具英语就那么几个单词,记下来就OK了,汉化反而会增加不必要的麻烦。      好了
发表于 2020-07-23
学<font color='red'>51单片机</font>-KEIL的使用与程序的下载
51单片机-指令周期与LED闪烁
      之前讲了如何点亮LED,包括硬件电路和程序,今天说一下如何让LED闪烁。单片机控制LED闪烁有两种方法,一种是软件延时,另一种是定时器中断。因为涉及到单片机指令集的问题,还有一些简单的C语言,今天只讲第一种。      先说指令集,早期的51单片机都是复杂指令集,因为沿用的习惯现在用的STC89C52单片机也是复杂指令集,和复杂指令集对应的,就是精简指令集,常见的有AVR和430单片机。      这两种指令集的区别是啥?最明显的就是一条指令执行的时间,举个例子:51单片机和AVR单片机都外接一个12M的晶体
发表于 2020-07-22
学<font color='red'>51单片机</font>-指令周期与LED闪烁
51单片机-定时中断与LED闪烁
同时清零了中断标志;去付款,处理了中断子程序;付完款继续吃饭,回到了主程序。STC89C52RC单片机中的中断分为三种:外部中断,一般是IO口的高低电平触发;定时/计数器溢出中断,一般是内部定时/计数器溢出中断;UART口中断,收发数据时引发的中断。这次只说定时/计数器溢出中断。程序如下:/**********************51单片机学习例程************************  平台:Keil U4 + STC89C52*  名称:LED闪烁*  晶体:11.0592
发表于 2020-07-22
51单片机-按键的扫描检测与消抖
; 接下来说应用电路,如下图所示,这是常见的应用电路:     检测方式有两种,一种是扫描检测,另一种是中断检测。这次先说第一种,什么是扫描检测?     就是单片机每隔一段时间,就去检测一下IO口的状态,未触发的时候,该引脚是高电平,触发的时候是低电平。     有人会有疑问,这种方式会不会有遗漏?基本不会,因为单片机以微秒甚至纳秒的级别运行指令,而触发一次按键至少需要几十毫秒,汽车电子里面用到的触发按键,它的触发时间到了100毫秒。只要扫描次数足够,基本不会有遗漏。    
发表于 2020-07-22
学<font color='red'>51单片机</font>-按键的扫描检测与消抖
51单片机-按键的中断检测
      接着昨天,继续说按键的事。昨天说的是扫描检测,今个说一下中断检测。先插播一个小故事~~      当年我和凯凯学单片机的时候,我用扫描检测的方法做的项目,他用中断检测的方法做的项目。当我俩坐一起交流按键检测的方式时,他火了,直接跳起来跟我吼:你不用中断怎么检测?      当时我就意识到他可能陷入了只能用中断的误区,然后就乐呵呵的说:用扫描啊~      他继续吼,我继续乐,我俩就这样陷入了死循环。终于都累了,然后把程序和原理给他看,了解~   
发表于 2020-07-22
学<font color='red'>51单片机</font>-按键的中断检测
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved