单片机源程序如下:
/*********************************************************************************
本实验仅限学习交流 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; //释放总线
}
}
上一篇:单片机+L298直流电机驱动程序
下一篇:单片机89C52 控制ISD4004语音芯片,多段录放音源码
推荐阅读最新更新时间:2024-11-17 07:36
设计资源 培训 开发板 精华推荐
- LTC3633AIUFD 同步降压型稳压器的典型应用电路
- 可配置数字麦克风板
- 使用 MaxLinear, Inc 的 SPX385AS-1.2 的参考设计
- 数字电位器X9CXXX,封装规格:SOIC-8 芯片的验证板
- MC34074VDR2G 基本型反相放大器的典型应用
- DC814B-B,使用 LTC1799 1kHz 至 33MHz 固定频率硅振荡器的演示板
- LTC2293IUP 演示板,DeMUX 双路 ADC,+3.0V,65Msps 12 位 1MHz
- 使用基于 LTC4162EUFD-L40M USB PD(C 电缆)的电池充电器和电源路径的典型应用
- STM32迷你平衡车
- 使用 Analog Devices 的 LTC2862ACDD-1 的参考设计