单片机 > 单片机程序设计 > 详情

单片机+DHT11+1602显示屏

发布时间:2021-12-20 发布时间:
|

单片机源程序如下:

/*********************************************************************************

本实验仅限学习交流 AT89C52 12Mhz DHT11 LCD1602

接线如下

DHT11_DQ = P2^0

LCD1602_E= P2^7

LCD1602_RW=P2^5

LCD1602_RS=P2^6

D0—D7接到P0口

本实验没有用到DHT的校验位Check_Init,想使用校验位,定义一个变量t,t=HUMI_Buffer_Int+HUMI_Low_Int+TEM_Buffer_Int+TEM_Low_Int;

判断t与Check_Init是否相等。

本实验只显示了整数部分,小数部分没显示,小数部分显示和整数部分显示一样,类别进行。

*********************************************************************************/

#include"dht11.h"

#include"reg52.h"

#include"lcd.h"

unsigned char dis[]="RH:"; //湿度字符串

unsigned char dis1[]="TEMP:"; //温度字符串

unsigned char i;

int main()

{ LcdInit(); //1602初始化

DHT11_Init(); //DHT11初始化

while(1)

{

DHT11_Read(); //DHT11数值读取

LcdWriteCom(0x80);//第一列第一个字符

for(i=0;i<3;i++)

{

LcdWriteData(dis[i]); //显示“RH:”

}

LcdWriteData(HUMI_Buffer_Int/10+0x30); //显示湿度的十位

LcdWriteData(HUMI_Buffer_Int%10+0x30); //显示湿度的个位

LcdWriteData(0x25); //显示字符“%”

LcdWriteCom(0x80+0x40); //第二行第一个

for(i=0;i<5;i++)

{

LcdWriteData(dis1[i]); //显示字符“TEMP”

}

LcdWriteData(TEM_Buffer_Int/10+0x30); //显示温度的十位

LcdWriteData(TEM_Buffer_Int%10+0x30); //显示温度的个位

LcdWriteData(0xDF);

LcdWriteData(0x43); //显示字符“%”

}



}


#include "DHT11.h"


//定义变量

unsigned char HUMI_Buffer_Int = 0; //湿度高位

unsigned char HUMI_Low_Int=0; //湿度低位

unsigned char TEM_Buffer_Int = 0; //温度高位

unsigned char TEM_Low_Int=0; //温度低位

unsigned char Check_Init=0; //检验位

//****************************************************

//MS延时函数(12M晶振下测试)

//****************************************************

void DHT11_delay_ms(unsigned int n)

{

unsigned int i,j;

for(i=n;i>0;i--)

{

for(j=112;j>0;j--);

}

}

//****************************************************

//延时函数

//****************************************************

void DHT11_Delay( unsigned int n )

{

unsigned int i;

for(i = 0 ; i < n ; i++ );

}


//****************************************************

//初始化DHT11

//****************************************************

bit DHT11_Init()

{

bit Flag_DHT11 = 1;

DHT11_DQ = 0;

DHT11_delay_ms(25); //延时>18ms


DHT11_DQ = 1;

DHT11_Delay(2); //延时20~40us


DHT11_Delay(2);

Flag_DHT11 = DHT11_DQ;

DHT11_Delay(2); //DHT11响应总时间80us


DHT11_Delay(4); //DHT11拉高信号80us


return Flag_DHT11;

}


//****************************************************

//读一个字节DHT11数据

//****************************************************

unsigned char DHT11_Read_Byte()

{

unsigned char i,dat,j;

while( DHT11_DQ == 1 );

for( i = 0 ; i < 8 ; i++ )

{

while( DHT11_DQ == 0 );

dat <<= 1;

for( j = 0 ; DHT11_DQ == 1 ; j++);

if( j < 10 )

dat &= 0xfe; //低位清零

else

dat |= 0x01; //低位置一

}

return dat;

}


//****************************************************

//读取温湿度值,存放在TEM_Buffer和HUMI_Buffer

//****************************************************

void DHT11_Read()

{

if( DHT11_Init() == 0 )

{

HUMI_Buffer_Int = DHT11_Read_Byte(); //读取湿度的整数值

HUMI_Low_Int=DHT11_Read_Byte(); //读取湿度的小数值

TEM_Buffer_Int = DHT11_Read_Byte(); //读取温度的整数值

TEM_Low_Int=DHT11_Read_Byte(); //读取温度的小数值

Check_Init=DHT11_Read_Byte(); //读取校验和

DHT11_Delay(3); //DHT11拉低总线50us


DHT11_DQ = 1; //释放总线

}

}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PIC单片机基础知识之二