DHT11温湿度检测器 基于51单片机的proteus仿真

发布者:时光如梦最新更新时间:2020-09-17 来源: 51hei关键字:DHT11  温湿度检测器  51单片机 手机看文章 扫描二维码
随时随地手机看文章

单片机源程序如下:

#include           /////////////头文件

////////////////////////////////////////////////////////////////////////////

void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);

void ConfigTimer0(unsigned int ms);

unsigned char IntToString(unsigned char *str, int dat);

extern bit Start18B20();

extern bit Get18B20Temp(int *temp);

extern void InitLcd1602();         

bit DHT_Start();        

void aj (void);

bit DHT_ByteRead(unsigned char *dat);

/////////////////////////////////////////////////////////////////////

sbit K1=P1^4;           ///引脚声明

sbit K2=P1^5;

sbit K3=P1^6;

sbit K4=P1^7;

sbit M1=P1^0;

sbit M2=P1^1;

sbit M3=P1^2;

sbit M4=P1^3;


sbit D1=P2^7;

sbit D2=P2^6;


sbit KD1=P2^3;

sbit KD2=P2^4;


/////////////////


/////////////////////////////  数组命名

int SD,WD,x,xx,SDC,WDC,PWM1,PWM2;

int KK1,KK2;

int wdg=40,wdd=20,sdg=80,sdd=60;

bit SZ,JB;

bit flag1s = 0;          //1s定时标志

unsigned char T0RH = 0;  //T0重载值的高字节

unsigned char T0RL = 0;  //T0重载值的低字节

  /////////////////////////////////        延时子程序

void delay ()

{

x=99999;

while(x--);

}

   /////////////////////////////////

void main()          ////////////////主程序

{                 


    bit tmp;

    unsigned char str[12];

         unsigned char DHT[5];

  ////初始化///////////////////////

    EA = 1;            //开总中断

    ConfigTimer0(10);  //T0定时10ms

    InitLcd1602();     //初始化液晶

        M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;

////////////////////////////////////

  DHT_Start();

  delay();

  delay();

    delay();


  delay();


    while (1)

    {

        LcdShowStr(0, 0, "WD");        //显示到液晶屏上

        LcdShowStr(0, 1, "SD");        //显示到液晶屏上


    LcdShowStr(5, 0, "H");        //显示到液晶屏上

        LcdShowStr(5, 1, "H");        //显示到液晶屏上


        

        LcdShowStr(9, 0, "L");        //显示到液晶屏上

        LcdShowStr(9, 1, "L");        //显示到液晶屏上

        if (flag1s)  //每秒更新一次温度

        {

           

                        

               str[0] = (wdg/10)%10 + '0';  //十位转为ASCII码

           str[1] = (wdg%10) + '0';  //个位转为ASCII

           str[2] = '';

               LcdShowStr(6, 0, str);


                   str[0] = (wdd/10)%10 + '0';  //十位转为ASCII码

           str[1] = (wdd%10) + '0';  //个位转为ASCII

           str[2] = '';

               LcdShowStr(10,0, str);


                   str[0] = (sdg/10)%10 + '0';  //十位转为ASCII码

           str[1] = (sdg%10) + '0';  //个位转为ASCII

           str[2] = '';

               LcdShowStr(6, 1, str);


                   str[0] = (sdd/10)%10 + '0';  //十位转为ASCII码

           str[1] = (sdd%10) + '0';  //个位转为ASCII

           str[2] = '';

               LcdShowStr(10, 1, str);


                DHT_Start();

                        tmp=DHT_ByteRead(&DHT);

                   if(tmp==1)

                   {

                   str[0] = (DHT[0]/10)%10 + '0';  //十位转为ASCII码

           str[1] = (DHT[0]%10) + '0';  //个位转为ASCII

               LcdShowStr(2, 1, str);


                   str[0] = (DHT[2]/10)%10 + '0';  //十位转为ASCII码

           str[1] = (DHT[2]%10) + '0';  //个位转为ASCII

           str[2] = '';

               LcdShowStr(2,0, str);


                   WD= DHT[2];

                   SD=DHT[0];

                   }

        }



                ////////////////////超热警报

                if(wdg<=WD)

                {

                WDC=WD-wdg+2;

                 M1=1;

                }

                else M1=0;


                if(wdd>=WD)

                {

                WDC=wdd-WD+2;

                 M2=1;

                }

                else M2=0;


                if(sdg<=SD)

                {

                SDC=SD-sdg+2;

                 M3=1;

                }

                else M3=0;


                if(sdd>=SD)

                {

                SDC=sdd-SD+2;

                 M4=1;

                }

                else M4=0;


                if(wdg<=WD||wdd>=WD)

                {

                  PWM1++;

                  if(PWM1                  D1=1;

                  if(PWM1>=WDC)

                   D1=0;

                  if(PWM1==10)

                  PWM1=0;

                }

      if(wdg>WD&&wdd            D1=0;


                if(sdg<=SD||sdd>=SD)

                {

                  PWM2++;

                  if(PWM2                  D2=1;

                  if(PWM2>=SDC)

                   D2=0;

                  if(PWM2==10)

                  PWM2=0;

                }

                if(sdg>SD&&sdd         D2=0;

                /////////////////////////////按键设置

                 aj();

                  //////////////////////////////////////////////

         }

}


void aj (void)

{


if(KD1==0)

{

  delay();

  KK1++;

  if(KK1==1)

   D1=1;

   if(KK1>=2)

   {

    D1=0;

        KK1=0;

   }

}



if(KD2==0)

{

  delay();

  KK2++;

  if(KK2==1)

   D2=1;

   if(KK2>=2)

   {

    D2=0;

        KK2=0;

   }

}

                 if(K1==0)

                {

                   xx++;

                  delay();

                  if(xx==1)

                    LcdShowStr(12, 0, "WDH");        //显示到液晶屏上

                  if(xx==2)

                    LcdShowStr(12, 0, "WDL");        //显示到液晶屏上  

[1] [2]
关键字:DHT11  温湿度检测器  51单片机 引用地址:DHT11温湿度检测器 基于51单片机的proteus仿真

上一篇:1602.c和1602.h头文件,完美版的51单片机1602液晶驱动
下一篇:51单片机水温控制LCD显示加VB上位机温度曲线绘制

推荐阅读最新更新时间:2024-11-18 19:56

51单片机串口通信(字符串接收和发送)
#include reg52.h //------------------串口通信协议-----------------// /* 客户端数据包格式解释(长度恒为15): 例如:A01_fmq_01Off___# A--------数据包的开始标记(可以为A到Z,意味着数据包可以有26种) 01-----设备代号 fmq_01Off___--------指令(长度恒为10),指令的前4个人字符是指令头部,指令的后6个字符是指令尾部 #---------数据包的结束标记 服务器端数据包格式解释(长度恒为15): 例如:A02_SenT010250# A--------数据包的开始标记(可以为
[单片机]
51单片机的静态和动态数码管的显示
一、数码管显示原理: 数码管其实就是有8个LED构成,分为a、b、c、d、e、f、g、dp,而数码管又分为共阴极(左边,高电平点亮)和共阳极(右边,低电平点亮),点亮对应的LED即可显示对应的数字,共阴极编码表如下: 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d 、0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c,0x39 , 0x5e , 0x79 , 0x71 , 0x00 分别对应0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,而0x00则不显示。 注意:比如显示0,则要abcdef都为1,即是0011 1111,转为16进制就是
[单片机]
<font color='red'>51</font><font color='red'>单片机</font>的静态和动态数码管的显示
89c51单片机和89s51单片机的区别,89s51单片机新增功能汇总
  AT89S51 是一个低功耗,高性能CMOS 8位 单片机 ,片内含8k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统供给高性价比的解决方案。   AT89S51具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先
[单片机]
89c51单片机控制数码管显示0和1的程序
在单片机系统中动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一。其接口电路是把所有显示器的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以我们就能自行决定何时显示哪一位了。而所谓动态扫描就是指我们采用分时的办法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。 在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一
[单片机]
如何用AT89C2051单片机自制一个倒计时器
倒计时器在生活非常有用,用单片机自制,不但电路简单,而且功能可根据需要自行设计。由74系列、40系列小规模数字芯片设计的倒计时器非常多,但有显示不直观(无LED数码管);调整参数不灵活;计时精度低(采用RC振荡)等缺点。 一、功能介绍 1. 独立的三路倒计时。均可独立设置启动、关闭。 2. 范围:0~20小时,可任意设定。关机后数据不丢失。计时精度高:《0.1S 3.。独立的三路输出: a:第1路 蜂鸣器输出: 15S b:第2路PNP晶体管输出:5S c:第3路 PNP晶体管输出:直致关机 二、工作原理 电路见上图整机由89c2051、三位LED数码管、K1-K4、R、T等元器件组成。89C2051内部T1定时器完成1
[单片机]
如何用AT89C2051<font color='red'>单片机</font>自制一个倒计时器
基于C8051F340单片机实现低频超声波促透皮系统的应用方案
经皮给药系统在医疗领域已成为一种新兴和重要的手段。经皮给药是药物通过皮肤并经毛细血管吸收进入体循环产生药效的一种方法,它可避免肝脏的首过效应,延长半衰期较短药物的治疗效果,能较长时间维持恒定的速率给药等,因此正受到广泛的关注。实际上早在1954年Fellinger。和Schmidt就通过超声导入氢化可的松药膏成功地治疗了手指多发性关节炎。最初对超声增透效应的研究开始于中频治疗用超声(0.7~3.0 MHz),但后来发现低频超声的增透效应最好。研究表明不同频率和强度超声波对机体的作用是不同的,其次,温度对于经皮给药也有一定的影响,如一定的温度可以提高渗透率,但太高的温度会引起皮肤的烫伤,因为超声也有热效应;因此,如何把各个因素综合考
[单片机]
基于C8051F340<font color='red'>单片机</font>实现低频超声波促透皮系统的应用方案
玩转51单片机(1):点亮led灯
01 新建工程与点亮LED小灯,LED小灯即发光二极管,它具有单向导电性,对于发光二极管而言,需要根据它的压降与额定电流来选择合适的限流电阻,打开Keil4软件,选择Project,New uVision Project 选定工程的保存路径,并给工程命名,保存类型默认.uvproj,点击保存 出现如下对话框,点击下拉按钮,选择STC MCU Database,点击OK 选择STC89C52RC,点击OK 选择否 点击New,生成一个Text1文件 点击 File, Save, 出现如下对话框,将文件命名为后缀为.c的文件,默认保存类型,点击保存 点击Target 1前面的加号,在Source Group
[单片机]
玩转<font color='red'>51</font><font color='red'>单片机</font>(1):点亮led灯
基于LM331和51单片机的压力数据采集
l 引言 A/D转换器广泛应用于单片机控制数据采集的模拟信号转换。而对于长距离数据传输,高精确度应用,使用一般A/D转换器则存在诸多缺点,可使用V/F转换器代替A/D转换器。V/F转换器与单片机的接口只需一个I/O端口,输入频率信号,且接口简单,占用硬件资源少。以单片机和V/F转换器为核心的数据采集系统,能够实时测量由传感器检测的压力,并满足系统测量精度要求。 2 系统基本原理结构 压力传感器将被测压力转换为电压信号,通过V/F转换器把传感器输出的电压信号转换成相对应的频率信号,采用光电耦合器将频率信号传输到单片机,利用单片机内部的定时/计数器测量信号频率,采用单片机强运算功能,根据电压与频率的线性关系计算压
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved