IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> C51 温湿度显示 -> 正文阅读

[嵌入式]C51 温湿度显示

温湿度传感器介绍

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用于专用数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能八位单片机相连接。采用单线制串口行接口,信号传输距离可达20M以上。

应用于通暖空调,汽车,自动控制设备,气象站家电
湿度调节器,医疗,除湿器等等。
在这里插入图片描述

温湿度传感器介绍

供电电压:3.3 - 5.5V直流电
输出为单总线数字信号
温度测量范围0-50度(精度正负2度,分辨率1度)
湿度测量范围为20-90%RH(精度为正负5%,分辨率1%)

模块的+ 接单片机的5V
模块的- 接单片机的GND
模块的OUT 接单片机定义的引脚
vcc和gnd之间可以加一个电容,用于去耦滤波
在这里插入图片描述
采用单总线双向串行通信协议,每次采集都要由单片机发起开始信号,然后DHT11会向单片机发送响应并开始传输40位数据帧,高位在前。

数据格式为:

第一二个字节: 8bit湿度整数数据+8bit湿度小数数据
第三四个字节: 8bit温度整数数据+8bit温度小数数据
第五个字节 : 8bit校验位(它是前四个数据相加后八位的数值)
温湿度小数部分默认为0,即单片机采集的数据都是整数,校验位为4个字节的数据相加取结果的低8位数据作为校验和;

示例一:
湿度高八位:0011 0101
湿度低八位:0000 0000
温度高八位:0011 1000
温度低八位:0000 0000
检验位:0110 1101

计算 :
0011 0101 (相加)
0011 1000
结果: 01101101
湿度为0011 0101 = 35H = 53%RH
温度为0011 1000 = 18H = 24°

示例二:
湿度高八位:0011 0101
湿度低八位:0000 0000
温度高八位:0001 1000
温度低八位:0000 0000
检验位:0110 1001

计算 :
0011 0101 (相加)
0001 1000
结果: 0100 1101 不等于 01101001 本次接收数据不正确,重新接收数据

温湿度传感器时序介绍

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

代码

main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "DHT11.h"
#include <stdio.h>

extern unsigned int rec_dat[4];
extern unsigned char rec_dat_lcd0[6];
extern unsigned char rec_dat_lcd1[6];
extern unsigned char rec_dat_lcd2[6];
extern unsigned char rec_dat_lcd3[6];

/**
 *1|?ü£o?óê±500ms
 *2?êy£ovoid
 *·μ???μ£ovoid
 */
void Delay500ms(void)		//@11.0592MHz
{
	unsigned char i, j, k;
	
	_nop_();
	_nop_();
	i = 22;
	j = 3;
	k = 227;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

int main()
{
		LCD_Init();
		InitUART();

		LCD_ShowString(1,0,"Humi:");
		LCD_ShowString(2,1,"Temp:");


		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);
			
				//??ê?êa?è
				LCD_ShowString(1,6,rec_dat_lcd0);
				LCD_ShowString(1,8,".");
				LCD_ShowString(1,9,rec_dat_lcd1);
				LCD_ShowString(1,10,"%");

				//??ê????è
				LCD_ShowString(2,6,rec_dat_lcd2);
				LCD_ShowString(2,8,".");
				LCD_ShowString(2,9,rec_dat_lcd3);
				LCD_ShowString(2,10,"C");
		}
}


DHT11.h

#ifndef _DHT11_H_
#define _DHT11_H_

void DHT11_START();
unsigned char DHT11_rec_byte();
void DHT11_receive();
void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned int z);
void InitUART(void);

#endif

DHT11.c

#include <REG52.H>
#include "DHT11.h"

sbit Temp_data = P2^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?eê?D?o?
void DHT11_START()
{
		Temp_data = 1;     //??μ???
		DHT11_delay_us(2); //??μ?????3?2us
	
		Temp_data = 0;     //μíμ???
		DHT11_delay_ms(20);//?áéù??18ms
	
		Temp_data = 1;     //??μ???
	  DHT11_delay_us(13); //??μ?????3?13us
}

//?óê?ò???×??úoˉêy
unsigned char DHT11_rec_byte()
{
		unsigned char i,dat;
		for(i=0;i<8;i++)
		{
				while(!Temp_data);//μè′ydht11 μíμ???1yè¥
				DHT11_delay_us(8);//?óê±′ó??8us£?è?o??1ê???μ????ò?a1
				dat<<=1;
				
				if(Temp_data == 1)
				{
						dat += 1;	
				}
				
				while(Temp_data); //μè′ydht11à-μí£?×?±???ò???
		}
		
		return dat;
}

//?óê???êa?èêy?Y
void DHT11_receive()
{
		unsigned int R_H,R_L,T_H,T_L;
		unsigned char RH,RL,TH,TL,revise;
		DHT11_START();//?÷?ú·¢?aê?D?o?
		Temp_data = 1;
		if(Temp_data == 0)//?D??DHT11 ê?·???è??ìó|
		{
				while(Temp_data == 0);//μè′y??μ????ìó|D?o?
				DHT11_delay_us(40);   //à-??oó?óê±40us
			
				R_H = DHT11_rec_byte();//?óê?êa?è??°???
				R_L = DHT11_rec_byte();//?óê?êa?èμí°???
				T_H = DHT11_rec_byte();//?óê????è??°???
				T_L = DHT11_rec_byte();//?óê????èμí°???
				revise = DHT11_rec_byte();//?óê?D£?é??
				DHT11_delay_us(25);
		
				if((R_H+R_L+T_H+T_L) == revise)//D£?é??êy?Yê?·??yè·
				{
						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
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--);


}

void InitUART(void)//ê1ó??¨ê±?÷1 ×÷?a′??ú2¨ì??ê·¢éú?÷
{
		SCON = 0X40;//′??úí¨D?1¤×÷·?ê?ò?
		REN  = 1;   //?êDí′??ú?óê?
		
		TMOD = 0X20;//?¨ê±?÷1μ?1¤×÷·?ê?
		TH1  = 0XF3;//????′??úμ?2¨ì??ê
		TL1  = 0XF3;

		TI   = 1;		//?D??
		TR1  = 1;
	
}

LCD1602.h

#ifndef _LCD1602_H_
#define _LCD1602_H_

void LCD_WriteCommand(unsigned char Command);
void LCD_WriteDate(unsigned char Date);
void LCD_Init(void);
void LCD_SetCursor(unsigned char Line,unsigned char Columu);
void LCD_Showchar(unsigned char Line,unsigned char Columu,unsigned char Char);
void LCD_ShowString(unsigned char Line,unsigned char Columu,unsigned char *String);
int LCD_Pow(int x,int y);
int LCD_getNumberSize(int Number);
void LCD_ShowNumber(unsigned char Line,unsigned char Columu,unsigned int Number);


#endif

LCD1602.c

#include <REGX52.h>
#include "LCD1602.h"
#include <INTRINS.H>

sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_E  = P2^7;

#define LCD_DataPort P0

/**
 *1|?ü£o?óê±1ms
 *2?êy£ovoid
 *·μ???μ£ovoid
 */
void LCD_Delay1ms(void)		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

/**
 *1|?ü£oD′??á?oˉêy
 *2?êy£oCommand ??á?
 *·μ???μ£ovoid
 *2???£oD′2ù×÷ê±Dòí?
 */
void LCD_WriteCommand(unsigned char Command)
{
		LCD_RS = 0;							//éè????á??£ê?
		LCD_RW = 0;							//éè??D′?£ê? 
		LCD_DataPort = Command; //D′??á?
	  LCD_E  = 1;
		LCD_Delay1ms();
		LCD_E  = 0;
		LCD_Delay1ms();

}

/**
 *1|?ü£oD′êy?Yoˉêy
 *2?êy£oDate êy?Y
 *·μ???μ£ovoid
 *2???£oD′2ù×÷ê±Dòí?
 */
void LCD_WriteDate(unsigned char Date)
{
		LCD_RS = 1;							//éè??êy?Y?£ê?
		LCD_RW = 0;							//éè??D′?£ê? 
		LCD_DataPort = Date;    //D′??á?
	  LCD_E  = 1;
		LCD_Delay1ms();
		LCD_E  = 0;
		LCD_Delay1ms();

}

/**
 *1|?ü£oLCD3?ê??ˉoˉêy
 *2?êy£ovoid
 *·μ???μ£ovoid
 */
void LCD_Init(void)
{
		LCD_WriteCommand(0X38);//????°???êy?Y?ó?ú
		LCD_WriteCommand(0X0c);//??ê??a£?1a±ê1?£?éá???a
		LCD_WriteCommand(0X06);//1a±ê+1£??-??2??ˉ
		LCD_WriteCommand(0X01);//???á

}

/**
 *1|?ü£o??ê?1a±ê
 *2?êy£oLine DD £?Columu áD
 *·μ???μ£ovoid
 */
void LCD_SetCursor(unsigned char Line,unsigned char Columu)
{
		if(Line == 1){
				//μúò?DDμ??·
				LCD_WriteCommand(0x80 | (Columu - 1));
		
		}else{
				//μú?tDDμ??·
				LCD_WriteCommand(0x80 | (Columu - 1) + 0x40);

		}

}

/**
 *1|?ü£o??ê?×?·?oˉêy
 *2?êy£oLine DD £?Columu áD £?Char òa??ê?μ?×?·?
 *·μ???μ£ovoid
 */
void LCD_Showchar(unsigned char Line,unsigned char Columu,unsigned char Char)
{
		LCD_SetCursor(Line,Columu);
	
		LCD_WriteDate(Char);

}

/**
 *1|?ü£o??ê?×?·?′?oˉêy
 *2?êy£oLine DD £?Columu áD £?String òa??ê?μ?×?·?′?
 *·μ???μ£ovoid
 */
void LCD_ShowString(unsigned char Line,unsigned char Columu,unsigned char *String)
{
		unsigned char i;
	
		LCD_SetCursor(Line,Columu);
	
		for(i=0;String[i]!='\0';i++)
		{
			LCD_WriteDate(String[i]);
		}

}

/**
 *1|?ü£o??ê?′?·?oˉêy(xμ?y′?·?)
 *2?êy£ox μ×êy y ′?·?
 *·μ???μ£oResult  xμ?y′?·??á1?
 */
int LCD_Pow(int x,int y)
{
		unsigned char i;
		int Result = 1;
	
		for(i=0;i<y;i++)
		{
				Result *=x;
		
		}
		return Result;

}

/**
 *1|?ü£o??è?êy×?3¤?è
 *2?êy£oNumber Dèòa??è?3¤?èμ?êy×?
 *·μ???μ£oSize êy×?Numberμ?3¤?è
 */
int LCD_getNumberSize(int Number)
{
		unsigned int Size = 0;
	
		while(Number > 0)
		{
				Number /= 10;
				Size++;
		}
		return Size;
}

/**
 *1|?ü£o??ê?êy×?oˉêy
 *2?êy£oLine DD £?Columu áD £?Number òa??ê?μ?êy×?
 *·μ???μ£ovoid
 */
void LCD_ShowNumber(unsigned char Line,unsigned char Columu,unsigned int Number)
{
		unsigned int i;
		LCD_SetCursor(Line,Columu);

		for(i=LCD_getNumberSize(Number);i>0;i--)
		{
				LCD_WriteDate('0'+Number/LCD_Pow(10,i-1)%10);
		}

}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-08 11:29:42  更:2021-08-08 11:31:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:49:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码