C51(DHT11)温湿度+LCD1602

前言:软件延时真的很坑,校园网真的很烂

直接上码

LCD1602部分

(1).LCD1602.C

#include  <reg52.h>
#include  <LCD1602.h>
#include  <INTRINS.h>
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DatrPort P0
//指令函数
void LCD_WeitrCommand(unsigned char Command)
{
LCD_RS=0;//0写指令,1写数据
LCD_RW=0;//write mode
LCD_DatrPort=Command;
LCD_E=1;	
LCD_Delay();
LCD_E=0;
LCD_Delay();
}
void LCD_Delay()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
//数据函数
void LCD_WriteData(unsigned char Data)
{
LCD_RS=1;//0写指令,1写数据
LCD_RW=0;//write mode
LCD_DatrPort=Data;
LCD_E=1;	
LCD_Delay();
LCD_E=0;
LCD_Delay();
}
void LCD_Init()
{
LCD_WeitrCommand(0x38);//八位数据接口,两行显示,5x7点阵
LCD_WeitrCommand(0x0c);//显示开,光标关,闪烁关
LCD_WeitrCommand(0x06);//读写后光标加1
LCD_WeitrCommand(0x01);//清屏
}
//显示字符函数
void LCD_Showchar(unsigned char Line,unsigned char Columu,unsigned char Char)
{
  LCD_SetCursor(Line,Columu);

 LCD_WriteData(Char);
}
//显示字符串
void LCD_Showstr(unsigned char Line,unsigned char Columu,unsigned char *str)
{
 unsigned char i;
 LCD_SetCursor(Line,Columu);
 for(i=0;str[i]!='\0';i++)
 {
 LCD_WriteData(str[i]);
 }
}
//设置光标
void LCD_SetCursor(unsigned char Line,unsigned char Columu)
{

if(Line==1)
  {
   LCD_WeitrCommand(0x80|(Columu-1));
  } 
 else
 {
  LCD_WeitrCommand(0x80|(Columu-1)+0x40);
 }

}
//显示DHT11返回的数字
void LCD_ShowNum(unsigned char Line,unsigned char Columu,unsigned int Number,unsigned int Lenth)
{
unsigned int i;
LCD_SetCursor(Line,Columu);
for(i=Lenth;i>0;i--){
LCD_WriteData(0x30+Number/LCD_Pow(10,i-1)%10);
}
}
//显示次方函数 x^y
int LCD_Pow(int x,int y)
{
  unsigned char i;
	int Result=1;
	for(i=0;i<y;i++)
	{
	Result *=x;
	
	}
  return Result;
}

(2)LCD1602.H

#ifndef _LCD1602_H_
#define _LCD1602_H_
#include  <reg52.h>

void LCD_WeitrCommand(unsigned char Command);
void LCD_Delay();
void LCD_WriteData(unsigned char Data);
void LCD_Init();
void LCD_Showchar(unsigned char Line,unsigned char Columu,unsigned char Char);
void LCD_Showstr(unsigned char Line,unsigned char Columu,unsigned char *str);
void LCD_SetCursor(unsigned char Line,unsigned char Columu);
int LCD_Pow(int x,int y);
void LCD_ShowNum(unsigned char Line,unsigned char Columu,unsigned int Number,unsigned int Lenth);
#endif

(3)DHT11.C

#include  <reg52.h>
#include  <DHT11.h>
#include  <usart.h>
sbit Temp_data= P1^0;

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];


//DHT11开始信号
void DHT11_START()
{
  Temp_data=1;
  DHT11_delay_us(100);
  Temp_data=0;      //拉低总线
  DHT11_delay_ms(20);//至少18ms
  Temp_data=1;
	DHT11_delay_us(30);
}

//接收字节函数
unsigned char DHT11_rec_byte()
{
	unsigned char i;
	unsigned char dat;
	dat=0;
	
	for(i=0;i<8;i++){
		while(!Temp_data);//等待低电平时间过去
		
		DHT11_delay_us(10);//若仍为高电平则为数据1  
		dat <<= 1;
		if(Temp_data == 1)
		{
		dat|=0x01;
		}
		
		while(Temp_data) ;//等待拉低,准备下一位
	
}
	return dat;	
}
//接收温湿度数据
void DHT11_recive()
{
   unsigned int R_H,R_L,T_H,T_L;
   unsigned char RH,RL,TH,TL,revise;
   DHT11_START();//DHT11开始信号
	
	 while(!Temp_data);//等待从机80us低电平响应信号过去
	 while(Temp_data);
		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]=RH;
		rec_dat[1]=RL;
		rec_dat[2]=TH;
		rec_dat[3]=TL;
	
}
//us delay
/**************************************************************************/
//  us延时函数有三个汇编指令实际时间和所需时间差相差大概三倍                //
//  reporter:LYQ                                                         //
//  date:2022/4/20                                                       //
//  建议用定时器延时                                                       //
//                                                                        //
/**************************************************************************/
void DHT11_delay_us(unsigned char n)
{
while(--n);
}
//ms delay
void DHT11_delay_ms(unsigned int z)
{
unsigned int i,j;
for(i=z;i>0;i--)
for(j=114;j>0;j--);
}

(4)DHT11.H

#ifndef _DHT11_H_
#define _DHT11_H_
#include  <reg52.h>
void DHT11_START();
unsigned char DHT11_rec_byte();
void DHT11_recive();
void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned int z);

#endif

(5)正常的采集(用一个io口做检测采集的信号,当其采集一次就反转一次电平)

(6)不正常采集,由于延时函数不对,30ms延时实际搞到90ms导致后面几次无法采集8次,会卡死在while(Temp_data);里面出不来(看了一下汇编,他一次n--执行三次指令所以这个软件延时有问题,整个经验值算了)

(7)显示效果(桌面好乱,算是做完作业了)

 

 

 

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要实现温湿度传感器DHT11的I2C LCD显示,需要进行以下步骤: 1. 首先,需要连接DHT11传感器和I2C LCD显示屏到嵌入式系统上,并确保他们能够正常工作。这里需要使用I2C总线连接LCD显示屏,而非直接连接。 2. 接下来,需要编写一个程序来读取DHT11传感器的温湿度数据,并将其存储到变量中。 3. 接着,需要编写一个程序来将这些数据显示在I2C LCD屏幕上。这可以使用I2C LCD显示屏的库函数来完成。 4. 最后,需要将这些程序编译、烧录到嵌入式系统中,并启动程序来显示温湿度数据。 以下是一个简单的示例代码: ```c #include <stdio.h> #include "dht11.h" #include "lcd_i2c.h" int main(void) { int temperature, humidity; char temp_str[16], hum_str[16]; // 初始化DHT11传感器和I2C LCD显示dht11_init(); lcd_i2c_init(); while (1) { // 读取DHT11传感器的温湿度数据 dht11_read(&temperature, &humidity); // 将温湿度数据转换为字符串 sprintf(temp_str, "Temp: %dC", temperature); sprintf(hum_str, "Hum: %d%%", humidity); // 在I2C LCD显示屏上显示温湿度数据 lcd_i2c_write_string(temp_str, 0, 0); lcd_i2c_write_string(hum_str, 1, 0); } return 0; } ``` 这段代码可以不断地从DHT11传感器读取温湿度数据,并将其显示在I2C LCD屏幕上。当温湿度数据发生变化时,LCD屏幕上的数据也会相应地更新。注意,在使用I2C LCD显示屏时,需要对其进行初始化,并使用相应的库函数来进行显示

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值