51单片机温湿度传感器DHT11液晶显示屏显示LCE1602

主代码,还有个LCD1602的设置代码 

#include<reg51.h>
#include<intrins.h>
#include<LCD1602.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data=P3^6;   //定义数据线
sbit BUZZER=P2^4;
uchar rec_dat[9];   //用于显示的接收数据数组

int Tmax=40,Tmin=10;//设定最高温度40度,最低温度10度
int Rmax=80,Rmin=40;//设定最高湿度80%,最低湿度40%

bit fg=1;

//初始化函数
void DHT11_delay_us(uchar n)
{
    while(--n);
}

void DHT11_delay_ms(uint z)
{
   uint i,j;
   for(i=z;i>0;i--)
      for(j=110;j>0;j--);
}

void DHT11_start()
{
   Data=1;
   DHT11_delay_us(2);
   Data=0;
   DHT11_delay_ms(30);   //延时18ms以上
   Data=1;
   DHT11_delay_us(30);
}

uchar DHT11_rec_byte()      //接收一个字节
{
   uchar i,dat=0;
  for(i=0;i<8;i++)    //从高到低依次接收8位数据
   {         
      while(!Data);   等待50us低电平过去
      DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0
      dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位
      if(Data==1)    //数据为1时,使dat加1来接收数据1
         dat+=1;
      while(Data);  //等待数据线拉低   
    }  
    return dat;
}

void DHT11_receive()      //接收40位的数据
{
    uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
    DHT11_start();
    if(Data==0)
    {
        while(Data==0);   //等待拉高     
        DHT11_delay_us(40);  //拉高后延时80us
        R_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]='0'+(RH/10);
        rec_dat[1]='0'+(RH%10);
        rec_dat[2]='R';
        rec_dat[3]='H';
        rec_dat[4]=' ';
        rec_dat[5]=' ';
        rec_dat[6]='0'+(TH/10);
        rec_dat[7]='0'+(TH%10);
        rec_dat[8]='C';
    }
}
 
void Alarm()//警报函数
{  
  uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
    DHT11_start();
    if(Data==0)
    {
        while(Data==0);   //等待拉高     
        DHT11_delay_us(40);  //拉高后延时80us
        R_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;
        }
if(TH+TL<=Tmin||TH+TL>=Tmax||RH+RL<=Rmin||RH+RL>=Rmax)//低于下限,高于上限就会触发警报
    BUZZER=0;
else

    BUZZER=1;
}
}

void main()   
{  
  
	LCD_init();
	LCD_send(1,0,"Temperature:",12);

  DHT11_delay_ms(100);    //DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令
     
	while(1)   
	{   
		DHT11_receive();
		LCD_send(2,0,rec_dat,9);
		 Alarm();//警报函数
	}   
	
}   
   
                                       

LCD1602的代码

#include <LCD1602.h>
#include "reg51.h" 
	sbit RS = P2^6;
	sbit RW = P2^5;
	sbit EN = P2^7;
		
void LCD_send(unsigned char i,unsigned char j,unsigned char str[],unsigned char n)
{
	//输入:显示行数i,列数j,输出字符,输出字符长度n
	unsigned char x=0;
	if(i==1)
	{write_com(0x80+j);}
	else
	{write_com(0x80+0x40+j);}
    for(x=0;x<n;x++)
    {
				write_date(str[x]);
        delay(150);
    }
}
		
int LCD_init()//初始化函数体
{
    EN = 0;
    write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口
    write_com(0X0C);//设置开显示,不显示光标
    write_com(0X06);//写一个字符时,整屏右移
    write_com(0X01);//显示清零
    return 0;
}

int write_com(unsigned char com)//写命令的函数体
{
    RS = 0;
    RW = 0;
    P0 = com;
    delay(5);
    EN = 1;
    delay(5);
    EN = 0;
    return 0;
}

int write_date(unsigned char data1)//写数据的函数体
{
    RS = 1;
    RW = 0;
    P0 = data1;
    delay(5);
    EN = 1;
    delay(5);
    EN = 0;
    return 0;
}

int delay(unsigned char xms)
{
    unsigned char x,y;
    for(x=xms;x>0;x--)
        for(y=110;y>0;y--);
    return 0;
}

 仿真效果图如下

 

  • 1
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 要在LCD1602上显示51单片机DHT11的数据,需要先连接好DHT11和LCD1602,并编写相应的程序。以下是一个简单的示例程序: ``` #include <reg51.h> #include <stdio.h> #include <string.h> #define LCD_RS P2_0 #define LCD_RW P2_1 #define LCD_EN P2_2 #define LCD_DATA P0 sbit DHT11_PIN = P1^0; void delay_us(unsigned int us) { while(us--) { _nop_(); _nop_(); _nop_(); _nop_(); } } void delay_ms(unsigned int ms) { while(ms--) { delay_us(1000); } } void lcd_write_cmd(unsigned char cmd) { LCD_RS = 0; LCD_RW = 0; LCD_DATA = cmd; LCD_EN = 1; delay_us(1); LCD_EN = 0; delay_ms(2); } void lcd_write_data(unsigned char dat) { LCD_RS = 1; LCD_RW = 0; LCD_DATA = dat; LCD_EN = 1; delay_us(1); LCD_EN = 0; delay_ms(2); } void lcd_init() { lcd_write_cmd(0x38); lcd_write_cmd(0x0c); lcd_write_cmd(0x06); lcd_write_cmd(0x01); } void lcd_display_string(unsigned char x, unsigned char y, unsigned char *str) { unsigned char addr; if(y == 0) { addr = 0x80 + x; } else { addr = 0xc0 + x; } lcd_write_cmd(addr); while(*str) { lcd_write_data(*str++); } } void dht11_read_data(unsigned char *temp, unsigned char *humi) { unsigned char i, j, data[5]; for(i = 0; i < 5; i++) { data[i] = 0; } DHT11_PIN = 0; delay_ms(20); DHT11_PIN = 1; delay_us(30); if(!DHT11_PIN) { while(!DHT11_PIN); while(DHT11_PIN); for(i = 0; i < 5; i++) { for(j = 0; j < 8; j++) { while(!DHT11_PIN); delay_us(30); if(DHT11_PIN) { data[i] |= (1 << (7 - j)); } while(DHT11_PIN); } } if(data[0] + data[1] + data[2] + data[3] == data[4]) { *humi = data[0]; *temp = data[2]; } } } void main() { unsigned char temp, humi, str[16]; lcd_init(); while(1) { dht11_read_data(&temp, &humi); sprintf(str, "Temp:%dC Humi:%d%%", temp, humi); lcd_display_string(0, 0, str); delay_ms(1000); } } ``` 该程序使用了51单片机的P0口连接LCD1602的数据线,P2口连接LCD1602的控制线,P1.0口连接DHT11的数据线。程序中的lcd_init()函数用于初始化LCD1602,lcd_display_string()函数用于在LCD1602上显示字符串,dht11_read_data()函数用于读取DHT11湿度数据。在主函数中,程序不断读取DHT11的数据并将其显示在LCD1602上。 注意:该程序仅供参考,具体实现方式可能因硬件连接方式和编译器不同而有所差异。 ### 回答2: 51单片机是一款非常常用的嵌入式系统芯片,常用于物联网、智能家居等领域。而DHT11是一种数字湿度传感器,具有精度高、体积小、成本低等优点。LCD1602则是一种常见的液晶显示器,可以用于显示各种信息。下面我们来看一下如何在51单片机上通过DHT11获取湿度信息,并在LCD1602上显示。 首先,我们需要将DHT11和LCD1602连接到51单片机上。DHT11有3个引脚,分别是VCC、DATA和GND,其中VCC和GND分别连接到单片机的5V电源和地,DATA则连接到单片机的任意IO口。LCD1602也有16个引脚,其中8个连接到单片机的IO口,3个连接到5V电源和地,还有一个可选的背光控制引脚。具体的连接方式可以参考相关资料或者数据手册。 接下来,我们需要编写程序来获取DHT11的数据并将其显示到LCD1602上。这里我们可以使用51单片机的定时器来测量DHT11发送的脉冲,从而获取湿度值。具体步骤如下: 1. 定义LCD1602所需的常量和函数,包括初始化函数、清屏函数、写字符串函数等; 2. 定义DHT11所需的常量和函数,包括发送请求函数、接收数据函数等。在发送请求时,需要将单片机的输出模式切换为推挽输出,并在发送完请求之后切换回上拉输入模式; 3. 在主函数中初始化LCD1602和DHT11,并循环执行以下步骤: 4. 发送DHT11的请求信号,等待DHT11的响应; 5. 接收DHT11传输的数据,并计算得到湿度值; 6. 将湿度值转换为字符形式,并在LCD1602上显示。 以上就是在51单片机上通过DHT11获取湿度信息,并在LCD1602上显示的基本步骤。需要注意的是,这只是一个简单的示例程序,实际应用中需要考虑更多的因素,比如数据的精度、传输的稳定性、异常情况的处理等等。但是这个程序可以帮助我们初步了解如何使用51单片机和相关模块完成一些简单的任务,也为后续的开发和学习奠定了基础。 ### 回答3: 首先,51单片机是一款高性能、低功耗、容易编程的单片机系列。DHT11是一种数字式湿度传感器,可测量环境度和湿度。LCD1602是一种16列,2行字符液晶显示器。 通过连接51单片机上的引脚和DHT11传感器,我们可以读取环境度和湿度的数值。然后,我们可以将这些数据显示在LCD1602上,以便用户可以清晰地看到湿度的信息。 具体实现方法如下: 1. 首先,我们需要在51单片机上连接DHT11传感器。将DHT11的VCC引脚连接到单片机的正极引脚,将GND引脚连接到单片机的负极引脚,将DHT11的数据引脚连接到单片机的任意数字输入引脚(例如P1.0)。 2. 接下来,我们需要编写51单片机的程序,以便读取DHT11传感器的湿度数据并将其显示在LCD1602上。在程序中,我们需要包含DHT11传感器驱动和LCD1602显示屏驱动。具体代码如下: #include <reg51.h> #include <string.h> #define DHT11_PIN P1_0 #define LCD1602_DB P0 #define LCD1602_RS P2_6 #define LCD1602_RW P2_5 #define LCD1602_EN P2_7 // DHT11传感器驱动 void dht11_read_data(unsigned char *temp, unsigned char *humi) { unsigned char i, j, data[5]; memset(data, 0, sizeof(data)); // 清零数据数组 DHT11_PIN = 0; // 主机发送起始信号 delay_ms(18); DHT11_PIN = 1; delay_us(30); if (DHT11_PIN == 0) { // 等待DHT11响应 delay_us(80); if (DHT11_PIN == 1) { delay_us(40); for (i = 0; i < 5; i++) { // 读取数据 for (j = 0; j < 8; j++) { while(!DHT11_PIN); delay_us(30); if (DHT11_PIN == 0) { data[i] <<= 1; } else { data[i] <<= 1; data[i] |= 1; } while(DHT11_PIN); } } if (data[0] + data[1] + data[2] + data[3] == data[4]) { // 校验数据 *humi = data[0]; *temp = data[2]; } } } } // LCD1602显示屏驱动 void lcd1602_send_data(unsigned char data) { LCD1602_DB = data; LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_EN = 1; delay_us(5); LCD1602_EN = 0; } void lcd1602_send_command(unsigned char command) { LCD1602_DB = command; LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_EN = 1; delay_us(5); LCD1602_EN = 0; } void lcd1602_init() { lcd1602_send_command(0x38); // 初始化LCD1602 delay_ms(10); lcd1602_send_command(0x01); delay_ms(10); lcd1602_send_command(0x06); delay_ms(10); lcd1602_send_command(0x0c); delay_ms(10); } void lcd1602_display_temp_humi(unsigned char temp, unsigned char humi) { unsigned char i, buf[16]; memset(buf, 0, sizeof(buf)); // 清零缓存 sprintf(buf, "T:%dC H:%d%%RH", temp, humi); // 将湿度数据格式化到缓存 lcd1602_send_command(0x80 | 0x00); // 显示湿度数据 for (i = 0; i < strlen(buf); i++) { lcd1602_send_data(buf[i]); } } void main() { unsigned char temp = 0, humi = 0; lcd1602_init(); // 初始化LCD1602 dht11_read_data(&temp, &humi); // 读取湿度数据 lcd1602_display_temp_humi(temp, humi); // 显示湿度数据 while(1); // 无限循环 } 在上述代码中,我们首先定义了DHT11引脚、LCD1602引脚以及dht11_read_data、lcd1602_send_data等函数。在main函数中,我们初始化LCD1602,并从DHT11传感器读取湿度数据。然后,我们将湿度数据格式化到缓存中并将其显示在LCD1602上。 最后,我们可以将51单片机DHT11传感器和LCD1602显示器组合起来,以实现湿度数据的实时显示。这样,用户可以随时了解当前环境的度和湿度,为生活带来更多便利。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三目条件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值