单片机DHT11温湿度检测器

发布者:王岚枫最新更新时间:2020-12-01 来源: 51hei关键字:单片机  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                                    // 头文件包含

#include


#define uchar unsigned char        // 以后unsigned char就可以用uchar代替

#define uint  unsigned int        // 以后unsigned int 就可以用uint 代替


sfr ISP_DATA  = 0xe2;                        // 数据寄存器

sfr ISP_ADDRH = 0xe3;                        // 地址寄存器高八位

sfr ISP_ADDRL = 0xe4;                        // 地址寄存器低八位

sfr ISP_CMD   = 0xe5;                        // 命令寄存器

sfr ISP_TRIG  = 0xe6;                        // 命令触发寄存器

sfr ISP_CONTR = 0xe7;                        // 命令寄存器


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

sbit DHT11_P   = P1^5;                 // 温湿度传感器DHT11数据接入

sbit LcdRs_P   = P1^0;    // 1602液晶的RS管脚      

sbit LcdRw_P   = P1^1;    // 1602液晶的RW管脚

sbit LcdEn_P   = P1^2;    // 1602液晶的EN管脚

sbit KeySet_P  = P3^5;                // “设置”按键的管脚

sbit KeyDown_P = P3^6;                // “减”按键的管脚

sbit KeyUp_P   = P3^7;                // “加”按键的管脚

sbit LedTL_P   = P2^0;                // 温度过低报警指示灯

sbit LedTH_P   = P2^1;                // 温度过高报警指示灯

sbit LedHL_P   = P2^2;                // 湿度过低报警指示灯

sbit LedHH_P   = P2^3;                // 湿度过高报警指示灯


uchar temp;                                        // 保存温度

uchar humi;                                        // 保存湿度


uchar AlarmTL;                        // 温度下限报警值

uchar AlarmTH;                        // 温度上限报警值

uchar AlarmHL;                        // 湿度下限报警值

uchar AlarmHH;                        // 湿度上限报警值




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

// 单片机内部EEPROM不使能

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

void ISP_Disable()

{

        ISP_CONTR = 0;

        ISP_ADDRH = 0;

        ISP_ADDRL = 0;

}



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

// 从单片机内部EEPROM读一个字节,从0x2000地址开始

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

unsigned char EEPROM_Read(unsigned int add)

{

        ISP_DATA  = 0x00;

        ISP_CONTR = 0x83;

        ISP_CMD   = 0x01;

        ISP_ADDRH = (unsigned char)(add>>8);

        ISP_ADDRL = (unsigned char)(add&0xff);

        // 对STC89C51系列来说,每次要写入0x46,再写入0xB9,ISP/IAP才会生效

        ISP_TRIG  = 0x46;          

        ISP_TRIG  = 0xB9;

        _nop_();

        ISP_Disable();

        return (ISP_DATA);

}



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

// 往单片机内部EEPROM写一个字节,从0x2000地址开始

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

void EEPROM_Write(unsigned int add,unsigned char ch)

{

        ISP_CONTR = 0x83;

        ISP_CMD   = 0x02;

        ISP_ADDRH = (unsigned char)(add>>8);

        ISP_ADDRL = (unsigned char)(add&0xff);

        ISP_DATA  = ch;

        ISP_TRIG  = 0x46;

        ISP_TRIG  = 0xB9;

        _nop_();

        ISP_Disable();

}



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

// 擦除单片机内部EEPROM的一个扇区

// 写8个扇区中随便一个的地址,便擦除该扇区,写入前要先擦除

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

void Sector_Erase(unsigned int add)          

{

        ISP_CONTR = 0x83;

        ISP_CMD   = 0x03;

        ISP_ADDRH = (unsigned char)(add>>8);

        ISP_ADDRL = (unsigned char)(add&0xff);

        ISP_TRIG  = 0x46;

        ISP_TRIG  = 0xB9;

        _nop_();

        ISP_Disable();

}



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

// 毫秒级的延时函数,time是要延时的毫秒数

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

void DelayMs(uint time)

{

        uint i,j;

        for(i=0;i                for(j=0;j<112;j++);

}



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

// 1602液晶写命令函数,cmd就是要写入的命令

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

void LcdWriteCmd(uchar cmd)

{

        LcdRs_P = 0;

        LcdRw_P = 0;

        LcdEn_P = 0;

        P0=cmd;

        DelayMs(2);

        LcdEn_P = 1;   

        DelayMs(2);

        LcdEn_P = 0;       

}



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

// 1602液晶写数据函数,dat就是要写入的数据

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

void LcdWriteData(uchar dat)

{

        LcdRs_P = 1;

        LcdRw_P = 0;

        LcdEn_P = 0;

        P0=dat;

        DelayMs(2);

        LcdEn_P = 1;   

        DelayMs(2);

        LcdEn_P = 0;

}



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

// 1602液晶初始化函数

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

void LcdInit()

{

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

        LcdWriteCmd(0x0C);        // 开显示,不显示光标

        LcdWriteCmd(0x06);        // 地址加1,当写入数据后光标右移

        LcdWriteCmd(0x01);        // 清屏

}



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

// 液晶光标定位函数

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

void LcdGotoXY(uchar line,uchar column)

{

        // 第一行

        if(line==0)        

                LcdWriteCmd(0x80+column);

        // 第二行

        if(line==1)        

                LcdWriteCmd(0x80+0x40+column);

}



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

// 液晶输出字符串函数

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

void LcdPrintStr(uchar *str)

{

        while(*str!='')                         // 判断是否到字符串的尽头了

                LcdWriteData(*str++);

}



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

// 液晶输出数字

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

void LcdPrintNum(uchar num)

{

        LcdWriteData(num/10+48);        // 十位

        LcdWriteData(num%10+48);         // 个位

}



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

// 液晶显示内容的初始化

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

void LcdShowInit()

{

        LcdGotoXY(0,0);                                                                // 第0行的显示内容

        LcdPrintStr("  DHT11 System  ");

        LcdGotoXY(1,0);                                                           // 第1行的显示内容

        LcdPrintStr("T:   C   H:   %");

        LcdGotoXY(1,4);                                                                // 温度单位摄氏度上面的圆圈符号

[1] [2] [3] [4] [5]
关键字:单片机  DHT11  温湿度检测器 引用地址:单片机DHT11温湿度检测器

上一篇:单片机修改底层函数putchar()实现printf()在LCD上输出
下一篇:52单片机的timer2时钟输出500KHz频率的源程序

推荐阅读最新更新时间:2024-11-17 02:54

基于STC8A8K MCU的简单示波器设计
谈到为什么很多人选择成为一名“伟大”的嵌入式软件工程师,一部分人是读过相关的专业,顺理成章的干着相关的工作;而有另外一部分人他们目的非常的简单,就是想从0到1的DIY一些专属的小型的电子作品来获得内心对技术的好奇,也就是常说的这个人真爱 捣鼓 。 那么今天这里就分享一下B站up主“老刘爱捣鼓”的一个DIY作品,挺有意思的,有种 麻雀虽小五脏俱全 之感,对于那些刚入门嵌入式、MCU缺少一些实战经验的朋友,把他作为一个实战项目来学习还是不错的。 好了,下面是这款开源作品的一些信息: 这是一款采用STC8A8K MCU制造的简单示波器,只有零星组件,易于成型。这些功能可以涵盖简单的测量: 该作品主要的规格如下: 单片机:STC8
[测试测量]
基于STC8A8K <font color='red'>MCU</font>的简单示波器设计
如何使用网络单片机W7100A实现TCP通信
今天给大家介绍的是以太网控制网络单片机 W7100A 的应用笔记之如何实现TCP通信。 TCP(传输控制协议)是用于控制网络间数据通信的协议。作为组成互联网的主要协议之一,更多的详细内容已经写入IETF(互联网工程任务组)的RFC 793中。TCP是运行于IP层上的协议,它保证了数据的有效传输并且可以按照数据的发送顺序依次进行接收。 因为W7100A单片机支持传输层的TCP协议,所以用户不需要做任何整合就可以直接使用TCP/IP协议。 下面一一给大家做阐述。 1 TCP SOCKET 用户可以在W7100A提供的所有8个SOCKET中使用TCP协议,但是必须首先创建要使用的SOCKET。在创建SOCKET时,需要用到
[单片机]
如何使用网络<font color='red'>单片机</font>W7100A实现TCP通信
DSP/MCU会给未来手机带来怎样的惊喜?
1.DSP/MCU给未来手机带来憧憬 如今,智能手机的普及率越来越高,人们对手机的需求量也越来越大。但对于手机厂商来说,竞争却越来越激烈。制造一款同质化的产品并不难,但想要自己的产品能长久地在市场中存活并不是一件简单的事情。对于理智的消费者来说,价格和硬件配置已经不再是决定他们购买手机的最主要的因素,同等价格能够获得更好的使用体验的产品才是真正能在市场中站住脚的产品。   DSP/MCU会给未来手机带来怎样的惊喜? 在前面的几篇文章中,我们从原理以及实际应用角度和大家聊了智能手机DSP(数字信号处理器)和MCU(微型控制单元)的话题,相信大家对自己手机中的硬件应该有了一个新的认识。 通过DSP和MCU的
[单片机]
DSP/<font color='red'>MCU</font>会给未来手机带来怎样的惊喜?
AVR单片机IIC实验
//芯片ATMEGA16 晶振8mhz #include iom16.h #include intrinsics.h #define uchar unsigned char #define uint unsigned int //----------------------------- uchar str1 ={ IIC TEST }; //--------------------------- void delay(uint k) //延时函数 { uint i,j; for(i=0;i k;i++) for(j=0;j 1140;j++); } #include 16
[单片机]
AVR<font color='red'>单片机</font>IIC实验
89c51单片机编程环境布置
第一步,使用Professional 的isis7连接模拟电路 第二步,根据电路引脚的使用情况,用keil uVision4编写调试源程序 第三步,代码调试无误,回到isis7中,将代码下载到模拟硬件中。运行查看。 具体做法:右击单片机AT89c51,选择最底下的Add/Remove source files,出现下图: 其中Code Generation Tool从下拉列表选择ASEM51,source code filename调整目录选择自己的源码,点击ok即可完成软件下载到硬件。 第四步:运行,查看效果。单击左下角三角图标:
[单片机]
基于51单片机的温控风扇-数码管显示-风扇人体感应
一.硬件方案 系统采用51单片机作为控制平台对风扇转速进行控制。可由用户设置高、低温度值,测得温度值在高低温度之间时打开风扇弱风档,当温度升高超过所设定的温度时自动切换到大风档,当温度小于所设定的温度时自动关闭风扇。风扇控制状态随外界温度而定,并通过PWM的方式控制风扇的转速。 主要由51单片机+最小系统+数码管显示模块+数码管驱动模块+温度采集模块+人体感应模块+风扇模块+按键模块等构成: 二.设计功能 (1)采用DS18B20温度传感器测温,三级管驱动数码管显示温度和风扇的档位,人体感应模块检测是否有人。 (2)共3个按键:1设置、2键加、3键减。按一下设置可以设置上限值,再按下设置下限,均可以按键加减调整; (3)利
[单片机]
基于51<font color='red'>单片机</font>的温控风扇-数码管显示-风扇人体感应
单片机在退火炉炉温模糊控制中的应用
    摘要: 讨论了利用模糊控制技术设计的单片机模糊炉温控制系统,并将其应用于退火炉炉温控制上。试验表明,这种控制系统比传统的PID调节控制系统精度高、速度快     关键词: 模糊控制  单片机  退火炉  炉温     模糊控制技术是以模糊数学为基础发展起来的一种新的控制技术。模糊控制方式是一种非线性控制方式,对无法取得数学模型或数学模型相当粗糙的系统可以取得令人满意的控制效果。退火炉炉温控制是一种非线性的时变的复杂过程,炉温控制直接影响着工件的退火质量。本文讨论了利用模糊控制技术设计的单片机模糊炉温控制系统,实验表明该系统比传的PID炉温控制系统精度高、速度快。 1 单片机模糊炉温控制系统的工作
[应用]
基于PICl6F628A单片机来人探测装置方案设计
   介绍一种来人探测装置的原理及特点。该装置基于PICl6F628A单片机,采用一对收发独立的超声波换能器,利用多普勒效应,在一定空间内能够有效地探测到是否有人进入,并且能够输出信号控制照明设备的开关。 使用超声波可以很方便的对一定空间内的运动物体进行有效的探测,具有安装方便,探测效果好的特点。本文介绍一种利用超声波多普勒效应设计的来人探测装置。该设计使用了PICl6F628A单片机,对以往用到的超声波探测硬件电路进行改进,利用软件编程对来人情况进行有效地探测,继而输出控制信号控制照明装置的开关。 1 工作原理及特点   当声源与声波接收器之间存在有相对运动时,声波接收器所接收到的信号频率将与传播的声波频率有
[单片机]
基于PICl6F628A<font color='red'>单片机</font>来人探测装置方案设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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