接线:

代码:

main.c文件/*
使用DHT11模块,检测温湿度,在lcd1602上面显示,因为1602显示不是每次都能出来,所以加了串口打印,会更加直观。
*/
#include <reg51.h>
#include "lcd.h"
#include <intrins.h>
#include <stdio.h>sbit Temp_data=P3^6;    //信号引脚unsigned int rec_dat[4];
unsigned char rec_dat_lcd0[6];
unsigned char rec_dat_lcd1[6];
unsigned char rec_dat_lcd2[6];
unsigned char rec_dat_lcd3[6];void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned int z);
void DHT11_start();
unsigned char DHT11_rec_byte();
void DHT11_receive();
void InitUART(void);//主函数
void main()
{   InitUART(); //串口中断初始化P1=0xf0;InitLcd1602();LcdShowStr(0,0,"Shidu:");LcdShowStr(0,1,"Wendu:");while(1){DHT11_delay_ms(150);DHT11_receive();//这个函数是打印字符函数,应该是起到数值转化的作用。sprintf(rec_dat_lcd0,"%d",rec_dat[0]);sprintf(rec_dat_lcd1,"%d",rec_dat[1]);sprintf(rec_dat_lcd2,"%d",rec_dat[2]);sprintf(rec_dat_lcd3,"%d",rec_dat[3]);DHT11_delay_ms(100);//湿度LcdShowStr(7,0,rec_dat_lcd0);LcdShowStr(9,0,".");LcdShowStr(10,0,rec_dat_lcd1);LcdShowStr(11,0," %");//温度LcdShowStr(7,1,rec_dat_lcd2);LcdShowStr(9,1,".");LcdShowStr(10,1,rec_dat_lcd3);LcdShowStr(11,1," C");//下面通过串口助手打印温度//我也为什么他不用中断服务函数,就可以打印,那好需要这个中断干嘛,不是可以直接打印吗?这是我的疑问。printf("Humi:%d.%d \n",rec_dat[0],rec_dat[1]);printf("Temp:%d.%d °C\n",rec_dat[2],rec_dat[3]);           }
}//DHT11起始信号
void DHT11_start()
{Temp_data=1;DHT11_delay_us(2);Temp_data=0;DHT11_delay_ms(20);Temp_data=1;DHT11_delay_us(13);
}//接收一个字节
unsigned char DHT11_rec_byte()
{   unsigned char i,dat;    for(i=0;i<8;i++){while(!Temp_data);DHT11_delay_us(8);dat<<=1;if(Temp_data==1){dat+=1;}while(Temp_data);}return dat;
}//接收温湿度数据
void DHT11_receive()
{unsigned int R_H,R_L,T_H,T_L;unsigned char RH,RL,TH,TL,revise;DHT11_start();Temp_data=1;if(Temp_data==0){while(Temp_data==0);   //等待拉高     DHT11_delay_us(40);  //拉高后延时80usR_H=DHT11_rec_byte();    //接收湿度高八位  R_L=DHT11_rec_byte();    //接收湿度低八位  T_H=DHT11_rec_byte();    //接收温度高八位  T_L=DHT11_rec_byte();    //接收温度低八位revise=DHT11_rec_byte(); //接收校正位DHT11_delay_us(25);    //结束if((R_H+R_L+T_H+T_L)==revise)      //校正{RH=R_H;RL=R_L;TH=T_H;TL=T_L;} /*数据处理,方便显示*/rec_dat[0]=RH;rec_dat[1]=RL;rec_dat[2]=TH;rec_dat[3]=TL;}
}
//延时us   --2*n+5us
void DHT11_delay_us(unsigned char n)
{while(--n);
}//延时ms
void DHT11_delay_ms(unsigned int z)
{unsigned int i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);
}//使用定时器1作为串口波特率发生器
void InitUART(void)
{TMOD=0x20;                 //定时器1的工作方式2SCON=0x40;                  //串口通信工作方式1REN=1;                       //允许接收TH1=0xFD,TL1=0xFD;        //波特率=9600TI=1;                       //这里一定要注意TR1=1;   EA = 1;                  //开总中断
}
Lcd.c文件#include"lcd.h"void Lcd1602_Write_Cmd(unsigned char cmd)     //写命令
{//Read_Busy();LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DB = cmd;LCD_Delay10ms(1);LCD1602_EN = 1;LCD_Delay10ms(1);LCD1602_EN = 0;
}void Lcd1602_Write_Data(unsigned char dat)   //写数据
{//Read_Busy();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD_Delay10ms(1);LCD1602_EN = 1;LCD_Delay10ms(1);LCD1602_EN = 0;
}
//指定位置开始显示数据!
void LcdSetCursor(unsigned char x,unsigned char y)  //坐标显示
{unsigned char addr;if(y == 0)addr = 0x00 + x;//第一行开始,x表示一行的第x个elseaddr = 0x40 + x;//第二行开始,x表示一行的第x个Lcd1602_Write_Cmd(addr|0x80);
}void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str)     //显示字符串
{LcdSetCursor(x,y);      //当前字符的坐标while(*str != '\0'){Lcd1602_Write_Data(*str++);}
}void InitLcd1602()              //1602初始化
{Lcd1602_Write_Cmd(0x38);    //打开,5*8,8位数据Lcd1602_Write_Cmd(0x0c);Lcd1602_Write_Cmd(0x06);Lcd1602_Write_Cmd(0x01);    //清屏
}void LCD_Delay10ms(unsigned int c)   //误差 0us
{unsigned char a,b;for(;c>0;c--)for(b=38;b>0;b--)for(a=130;a>0;a--);
}
Lcd.h文件#ifndef __LCD_H_
#define __LCD_H_
/**********************************
当使用的是4位数据传输的时候定义,
使用8位取消这个定义
**********************************/
//#define LCD1602_4PINS/**********************************
包含头文件
**********************************/
#include<reg51.h>//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint unsigned int
#endif/**********************************
PIN口定义
**********************************/
#define LCD1602_DB  P0      //data bus 数据总线
sbit LCD1602_RS = P2^6;
sbit LCD1602_RW = P2^5;
sbit LCD1602_EN = P2^7;  /**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
//void Lcd1602_Delay1ms(uint c);   //误差 0usvo
void LCD_Delay10ms(unsigned int c);
//void Read_Busy();           //忙检测函数,判断bit7是0,允许执行;1禁止
void Lcd1602_Write_Cmd(unsigned char cmd);     //写命令
void Lcd1602_Write_Data(unsigned char dat);   //写数据
void LcdSetCursor(unsigned char x,unsigned char y);  //坐标显示
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);     //显示字符串
void InitLcd1602();              //1602初始化#endif

运行结果:

VID_20220410_172203

51单片机基础之DHT11温湿度传感器相关推荐

  1. 51单片机 DHT11温湿度传感器 MQ2传感器

    目录 前言 程序思路 DHT11 一.DHT11基础储备 二.接口说明 三.协议及数据格式 ​编辑 四.DHT11代码 MQ-2烟雾传感器 一.MQ-2烟雾传感器介绍 二.工作原理 三.时序配置 四. ...

  2. 51单片机控制DHT11温湿度传感器,并使用OLED屏幕显示

    目录 前言 一.MCU主控选型 二.DHT11温湿度传感器 1.模块介绍 2.软件实现 DHT11.c DHT11.h 三.OLED显示屏 1.模块介绍 2.软件实现 OLED.c OLED.h OL ...

  3. 传感器自学笔记第八章——DHT11温湿度传感器(附带自己写的很好用的51单片机DHT11代码模板,参数列表只有一个字符数组指针)

    作者:GWD 时间:2019.06.26 DHT11温湿度传感器(单总线类) 一. 学习要点: 1.(重要)单总线类传感器检测高电平while(DHT11 == 1) temp |=0x01;出错,因 ...

  4. 基于51单片机的LCD1602显示温湿度

    51单片机基础难点知识理解后,直接通过下面3个小项目可以更好理解51单片机.中断 定时器 串口甚至是基础的IO输入输出都有结合,再加上一些外设模块的学习(如1602显示屏,L298N电机驱动等) 项目 ...

  5. 基于51单片机esp8266 WIFI大棚温湿度光照带co2 LCD12864显示设计

    摘  要 随着社会经济的不断发展,现代农业生产离不开环境控制.本文在对国内外大棚智能控制进行深入分析的基础上,针对大棚智能化控制存在的诸多因子,将智能传感器监测和单片机控制相结合,提出了基于单片机的温 ...

  6. 62、基于51单片机LCD 12864WIFI大棚温湿度光照系统

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.程序 部分代码 七.资料包括 摘要 科技高速发展,人们的需求也在日益增长 ...

  7. ESP32 开发笔记(三)源码示例 8_DHT11_RMT 使用RMT实现读取DHT11温湿度传感器

    开发板购买链接 https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb2Ij1As&ft=t&id=62636 ...

  8. 【STM32Cube】学习笔记(六):DHT11温湿度传感器

    文章目录 摘要 一.简介 1.DHT11数字温湿度传感器 2.DHT11性能参数 2.DHT11数据结构 2.DHT11传输时序 二.硬件电路设计 1.模块内部电路 2.与单片机相连接电路 三.软件设 ...

  9. 树莓派+DHT11温湿度传感器+yeelink物联网云

    一.配置准备 1.DHT11简介 DHT11是一款有已校准数字信号输出的温湿度传感器. 精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃. DHT11有四个引脚,分别是 ...

最新文章

  1. 【C4D教程】Octane渲染大师班
  2. R语言ggplot2可视化分组的重叠图实战:grouped overlay plot
  3. 激光点云感知 voxnet本质
  4. Android文件系统的结构
  5. 语言 重量计算_R语言 第五章 高级绘图工具(4)
  6. Entity Framework查询,EF执行SQl
  7. 在聊Java中的equals方法
  8. 现代的时代精神是什么?
  9. 菜鸟教程python3 mysql_MySQL 教程
  10. Apollo进阶课程 ⑨ | 业界的高精地图产品
  11. 创业者自述:我的第一桶金是如何来的
  12. jquery版瀑布流
  13. 1小时教你理解HTTP,TCP,UDP,Socket,WebSocket
  14. 用反卷积(Deconvnet)可视化和理解卷积网络
  15. c语言的dll反编译,可怕的DLL反编译工具(DLL to C)
  16. u盘安全弹出有什么用?数据丢失还能恢复吗
  17. 黎曼传记资料(2010-04-22 22:17:06)
  18. 设置导航标题颜色以及导航条背景色
  19. @Value设置默认值
  20. Visual Studio+opencv报错合集

热门文章

  1. 【断路器型号字母含义解析】- 米思米机械设备知识分享
  2. yt-dlp 8k下载神器使用简介
  3. Vue3学习笔记(三)——计算/监听/样式/自定义指令
  4. postgresql源码学习(21)—— 事务日志②-日志初始化
  5. 【ORACLE】Oracle提高篇之WITH AS
  6. Gazebo機器人仿真學習探索筆記(一)安裝與使用
  7. 【Sentinel(一)】Sentinel介绍与使用
  8. 第二次结对编程之测试缤纷桌面
  9. 索尼高桥洋回应电视高定价:符合市场定位
  10. E. Gardener and Tree 树形DP