C51——整合DHT11&LCD1602(温湿度控制继电器闭合)

lcd1602屏幕显示温度和湿度,
用温度湿度来控制继电器运行(图片显示为湿度大于35%控制继电器闭合),
继电器可以控制灯或风扇等负载
 

#include "reg52.h"
#include "intrins.h"

#define databuffer P0
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^4;
sbit led1=P3^7;
sbit DHT=P3^3;
sbit FS=P3^4;
char datas[5];
char temp[10];
char hum[11];
sfr AUXR=0x8E;

void UartInit(void)  //9600bps@11.0592MHz
{
 AUXR=0x01;
 SCON=0x40;
 TMOD&=0x0F;
 TMOD|=0x20;
 TH1=0xFD;
 TL1=0xFD;
 TR1=1;
}
void senddata(char c)
{
 SBUF=c;

  while(!TI);//当t1=1,表示发送完数据
  TI=0;
}
void sendstring(char*str)
{
  while(*str!='\0'){
    senddata(*str);
  str++;
  }
} 
void Delay1000ms()  //@11.0592MHz
{
 unsigned char i, j, k;

 _nop_();
 i = 8;
 j = 1;
 k = 243;
 do
 {
  do
  {
   while (--k);
  } while (--j);
 } while (--i);
}

void Delay30ms()  //@11.0592MHz
{
 unsigned ch
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是基于C51单片机的DHT11温湿度传感器并通过LCD1602显示的编程步骤: 1. 定义端口:将DHT11的数据线连接到C51单片机的I/O端口上,定义该端口为输入端口;将LCD1602的数据线和控制线连接到C51单片机的I/O端口上,分别定义为输出端口。 2. 初始化LCD1602:发送一系列指令,完成LCD1602的初始化,包括设置显示模式、清屏、光标归位等。 3. 发送起始信号:将数据线拉低至少18ms,然后将数据线拉高20~40us,等待DHT11响应。 4. 接收响应信号:DHT11会通过数据线发送一个80us低电平的响应信号,然后再发送一个80us的高电平信号。 5. 接收数据:DHT11会发送40位的数据,每一位数据都是50us的低电平,或者26~28us的高电平,高电平的时间长短表示0或1。 6. 解析数据:将接收到的40位数据解析,分别得到温度和湿度的数值,并计算出校验和。 7. 显示数据:将温度和湿度的数值显示在LCD1602上。 以下是示例代码: ``` #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit DHT11=P1^4; //将DHT11数据线连接到P1.4口上 sbit RS=P2^0; //将LCD1602的RS端口连接到P2.0口上 sbit RW=P2^1; //将LCD1602的RW端口连接到P2.1口上 sbit EN=P2^2; //将LCD1602的EN端口连接到P2.2口上 void DHT11_delay(uint i) //延时函数 { while(i--); } void LCD1602_delay(uint i) //LCD1602延时函数 { while(i--); } void LCD1602_write_cmd(uchar cmd) //向LCD1602发送命令 { RS=0; RW=0; P0=cmd; EN=1; LCD1602_delay(5); EN=0; } void LCD1602_write_data(uchar dat) //向LCD1602发送数据 { RS=1; RW=0; P0=dat; EN=1; LCD1602_delay(5); EN=0; } void LCD1602_init() //初始化LCD1602 { LCD1602_write_cmd(0x38); //设置显示模式为16×2,5×7点阵,8位数据 LCD1602_delay(100); LCD1602_write_cmd(0x0c); //开启显示,关闭光标,关闭闪烁 LCD1602_delay(100); LCD1602_write_cmd(0x06); //光标右移,字符不移动 LCD1602_delay(100); LCD1602_write_cmd(0x01); //清屏,光标归位 LCD1602_delay(100); } void DHT11_start() //发送起始信号 { DHT11=0; DHT11_delay(18000); DHT11=1; DHT11_delay(40); while(DHT11==1); while(DHT11==0); while(DHT11==1); } uchar DHT11_read_byte() //读取一个字节的数据 { uchar i,j; uchar dat=0; for(j=0;j<8;j++) { while(DHT11==0); DHT11_delay(30); if(DHT11==1) { i=1; while(DHT11==1); } else { i=0; } dat=(dat<<1)|i; } return dat; } void DHT11_read_data(uchar *buf) //读取温湿度数据 { uchar R_data_H,R_data_L,T_data_H,T_data_L,checkdata; DHT11_start(); R_data_H=DHT11_read_byte(); R_data_L=DHT11_read_byte(); T_data_H=DHT11_read_byte(); T_data_L=DHT11_read_byte(); checkdata=DHT11_read_byte(); if(R_data_H+R_data_L+T_data_H+T_data_L==checkdata) //校验数据是否正确 { buf[0]=T_data_H/10+'0'; buf[1]=T_data_H%10+'0'; buf[2]='.'; buf[3]=T_data_L/10+'0'; buf[4]=T_data_L%10+'0'; buf[5]='C'; buf[6]=' '; buf[7]=R_data_H/10+'0'; buf[8]=R_data_H%10+'0'; buf[9]='.'; buf[10]=R_data_L/10+'0'; buf[11]=R_data_L%10+'0'; buf[12]='%'; buf[13]='\0'; //将温湿度数据存储到数组中 //依次为:温度整数部分、小数点、温度小数部分、温度单位、湿度整数部分、小数点、湿度小数部分、湿度单位、结束符 } } void LCD1602_display(uchar *buf) //在LCD1602上显示温湿度数据 { uchar i; LCD1602_write_cmd(0x80); //将光标移动到第一行第一列 for(i=0;i<14;i++) { LCD1602_write_data(buf[i]); //依次发送14个字符 } } void main() { uchar buf[14]; //定义一个数组,用于存放温湿度数据 LCD1602_init(); //初始化LCD1602 while(1) { DHT11_read_data(buf); //读取温湿度数据 LCD1602_display(buf); //将温湿度数据显示在LCD1602上 } } ``` 以上是一个基于C51单片机的DHT11温湿度传感器并通过LCD1602显示的编程示例,供您参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值