stm32项目之DHT11温湿度显示(LCD1602)

这篇具有很好参考价值的文章主要介绍了stm32项目之DHT11温湿度显示(LCD1602)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习目标:

  • 掌握LCD1602的使用
  • 掌握DHT11的原理及使用

学习内容:

  1. 看懂LCD1602和DHT11时序图
  2. 看懂DHT11的原理
  3. 掌握LCD1602的显示
  4. 编写程序用LCD1602显示温湿度

DHT11部分:

stm32项目之DHT11温湿度显示(LCD1602)

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次
通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数
部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据
+8bit校验和
数据传送正确时校验和数据等于“ 8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据” 所得结果的末8位。
通讯过程如图所示:

stm32项目之DHT11温湿度显示(LCD1602)

说明:总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必 须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后, 等待主机开始信号结束,然后80us低电平响应信号.主机发送开始信号结束 后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。

stm32项目之DHT11温湿度显示(LCD1602)

说明:总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉 高80us,准备送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定 了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有 响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线 50us,随后总线由上拉电阻拉高进入空闲状态。

 校验和 数据为前四个字节相加。
传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。如果,某次从传感器中读取如下5Byte数据:

stm32项目之DHT11温湿度显示(LCD1602)

 由以上数据就可得到湿度和温度的值,计算方法:
humi (湿度)= byte4 . byte3=45.0 (%RH)
temp (温度)= byte2 . byte1=28.0 ( ℃)
CHECK(校验)= R_H + R_L + T_H + T_L
注意:DHT11一次通讯时间最大3ms,主机连续采样间隔建议不小于100ms。

高电平的长短决定了数据位是0还是1.如果读取响应信号为高电平,则DHT11没有 响应,请检查线路是否连接正常.
数字0信号表示方法:

stm32项目之DHT11温湿度显示(LCD1602)

 数字1信号表示方法:

stm32项目之DHT11温湿度显示(LCD1602)

 

-------------------------------------------------------------------------------------------------------------------

遇到的问题:为什么在显示数据时,总有一句write_com(0x80);等之类的语句?

解:LCD1602的程序,每行16个显示字符,第一行地址从0x80~0x80+16,第二行0xc0+16;

当我们想在指定位置写入数据时,要先指定地址,如在第一行第一位写入,地址位是00H,再加上DB7的1,即80H(0010000000),第二行第一位是40H,再加上DB7的1,即C0H(0011000000),依次类推。

stm32项目之DHT11温湿度显示(LCD1602)

stm32项目之DHT11温湿度显示(LCD1602)


手册原话:DDRAM 位址设置指令设置 DDRAM 位址指针,它将 DDRAM 存储显示字符的字符码的首地址 ADD6 ~ ADD0 送入 AC 中,于是显示字符的字符 码就可以写入 DDRAM 中或者从 DDRAM 中读出;值得注意的是:在 LCD 显示屏一行显示方式下, DDRAM 的位址范围为:
00H ~ 4FH ;两行显示方式下, DDRAM 的位址范围为:第一行 00H ~ 27H
第二行 40H ~ 67H

 LCD1602时序:

写操作时序图:

stm32项目之DHT11温湿度显示(LCD1602)

读操作时序图:

 stm32项目之DHT11温湿度显示(LCD1602)

时序说明: 

stm32项目之DHT11温湿度显示(LCD1602)

---------------------------------------------------------------------------------------------------------------------------------文章来源地址https://www.toymoban.com/news/detail-430401.html

写相关代码:

/******LCD1602写命令函数********/
void write_com(unsigned char command)
{
//RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器
	RS = 0;  
	RW = 0; 	//高读低写
	LCD = command;
	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
	E = 1;		//使能拉高 
	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
	E = 0;
}

/******LCD1602写数据函数********/
void write_data(unsigned char dat)
{
//RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器
	RS = 1;
	RW = 0;
	LCD = dat;
	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
	E = 1;		//使能拉高 
	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
	E = 0;
}

DHT11相关代码:

sbit DATA = P2^0; //DHT11 数据引脚
unsigned char ret;
unsigned char DHTDATA[5] = {'\0'}; //存放40位 数据
unsigned char code array[] = {"humi:"}; //湿度
unsigned char code array1[] = {"temp:"}; //温度

/*DHT11接收数据函数*/
unsigned char DHT_receive_data()
{
	unsigned char i;
	unsigned char dat=0;  //0000 0000

		
	for(i=0;i<8;i++)
	{
		while(!DATA); //等待DHT 50us低电平信号过去
		delay30us(); //延时大概30us 如何还是高电平 则为1
		

		dat<<=1; //左移一位 因为数据是从高位开始传
		if(DATA == 1)
		{
			dat|=0x01;
		}
/*		else
		{
			dat|=0x00;
		}	 
*/
		while(DATA); //等待DHT 拉低 准备下一位开始

	}
	return dat;
	
}


/*DHT11读取函数*/
void DHT_receive()
{
	unsigned char R_H,R_L,T_H,T_L,CHECK;
	 //主机发送信号
	DATA = 1;
	delay30us();
	DATA = 0;
	delay20ms(); //延时大于18ms
	DATA=1;
	delay30us();	 //延时30us  20-40us 均可

	DATA=1;
	if(DATA == 0)   //判断DHT是否进入响应
	{

		while(!DATA);	   //等待从机80us低电平响应信号过去
		while(DATA); //等待从机80us高电平信号过去

	   	/*获取温湿度数据*/
		R_H = DHT_receive_data();	//湿度高位
		R_L = DHT_receive_data();
		T_H = DHT_receive_data();
		T_L = DHT_receive_data();

		CHECK = DHT_receive_data();

		DATA=0;
		delay55us();
		DATA=1;
	
		/*校验*/
		if((R_H + R_L + T_H + T_L) == CHECK)
		{
			DHTDATA[0] = R_H;
			DHTDATA[1] = R_L;
			DHTDATA[2] = T_H;
			DHTDATA[3] = T_L;

			DHTDATA[4] = CHECK;	
		}
			
	}
}

/*显示DHT11数据函数*/
void DHT_display()
{
	write_com(0x85);
	write_data(DHTDATA[0]/10 + 0x30);
	write_com(0x86);
	write_data(DHTDATA[0]%10 + 0x30);
	write_com(0x87);
	write_data('.');	
	write_com(0x88);
	write_data(DHTDATA[1]/10 + 0x30);
	write_com(0x89);
	write_data('%');
	write_com(0xC5);
	write_data(DHTDATA[2]/10 + 0x30);
	write_com(0xC6);
	write_data(DHTDATA[2]%10 + 0x30);
	write_com(0xc7);
	write_data('.');
	write_com(0xC8);
	write_data(DHTDATA[3]/10 + 0x30);
	write_com(0xC9);
	write_data(0xDF); //度
	write_com(0xca);		
	write_data('C');
}

main函数:

/*主函数入口*/
void main()
{
	unsigned char i;
	init_lcd(); //初始化1602
//1602的程序,每行16个显示单元,
//第一行地址从0x80~0x80+16,第二行0xc0~0xc0+16
	write_com(0x80);  //第一行第一个开始显示 humi:
	for(i=0;i<5;i++)
	{
		write_data(array[i]);
	}

	write_com(0xc0);  //第二行第一个开始显示 temp:
	for(i=0;i<5;i++)
	{
		write_data(array1[i]);
	}

	while(1)
	{
		delay1s(); //等待 1s 以越过不稳定状态
		DHT_receive();   //DHT11读取函数
		DHT_display();//1602显示温湿度
					
	}
}

到了这里,关于stm32项目之DHT11温湿度显示(LCD1602)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32+DHT11温湿度传感器

    DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次 通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数 部分用于以后扩展,现读出为零.操作流程如下: 一次完整的数据传输为40bit,高位先出。 数据格式:8bit湿度整数数据+8bit湿度小数数据

    2023年04月13日
    浏览(38)
  • STM32--DHT11温湿度传感器

    本文介绍基于STM32F103实现的DHT11温湿度传感器数据采集及显示,完整代码见文末链接 一、DHT11传感器简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期

    2024年02月16日
    浏览(42)
  • 基于STM32使用DHT11温湿度模块

    目录 前言 一、DHT11模块介绍 1、原理图 2、通信时序(单总线) 2.1、通信总过程 2.2、起始信号及DHT11应答 2.3、数字1信号的应答时序 2.4、数字0信号的应答时序 2.5、数据格式 二、使用步骤 1.使用CubeMX进行配置(基于stm32f407zgt6) 2.编写相关函数 ​编辑3、实验结果 三、代码分享

    2024年02月10日
    浏览(45)
  • STM32—DHT11温湿度传感器

    (1).下图一是DHT11总的时序图。 (2).图二对应图一的左边黑色部分,图三对应图一的绿色部分,图四的左部分图对应图一的红色部分,图四的右部分对应图一的黄色部分。 (3).首先图二部分是单片机向DHT11发送我要开始的信号,此时单片机IO口处于输出模式,输出低电平至少18MS,

    2024年02月19日
    浏览(44)
  • stm32读取DHT11温湿度传感器

    我们知道DHT11是单总线协议,只有一根数据线。 且内部有个上拉电路(下图)。那么数据线默认就是高电平那接下来就可以讲解主机如何和DHT11通讯的 读取DHT11的芯片手册,可以知道,DHT11一次完成的数据输出是40bit,高位先出。 格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温

    2024年02月09日
    浏览(38)
  • stm32连接DHT11温湿度传感器

    目录 1. DHT11简介 1.1. 连接电路  1.2. 串行接口 (单线双向)  2. cubeMX设置 3. 代码开发  3.1. 实现定时函数 3.2. 打开串口调试 3.4. 测试代码实现 4. 运行效果 信息如下: 建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使 用合适的上拉电阻  DHT11的供电电压为 3-5

    2023年04月16日
    浏览(37)
  • STM32+DHT11采集温湿度传感器数据

            DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够 实时的采集本地湿度和温度。 DHT11 与单片机之间能采用简单的单总线进行通信,仅

    2024年02月07日
    浏览(35)
  • 【STM32】DHT11温湿度模块传感器详解&代码

    DHT11是数字温湿度传感器,测量范围:湿度20%-95%,温度0-50℃,广泛应用于加湿器、温湿度计、空调、汽车等领域。 如上图DATA引脚用于MCU与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右(超时时间的判断)。一次完整的数据传输为40bit,高位先出(MSB最高

    2024年02月12日
    浏览(44)
  • STM32使用温湿度DHT11基于HAL库开发

    DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够 实时的采集本地湿度和温度。DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一 个

    2024年02月03日
    浏览(56)
  • STM32+DHT11温湿度传感器(含完整代码)

    前言 DHT11数字温湿度传感器是一种数字信号输出的温湿度传感器,具有高可靠性和长期稳定性。它采用专用的数字模块和温湿度传感技术,提供准确的温湿度数据。传感器内部包含感湿元件和测温元件,并与高性能单片机连接。因此,该传感器具有优异的品质、快速响应、抗

    2024年04月08日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包