温湿度传感器DHT11传感器应用
- 格式:doc
- 大小:3.12 MB
- 文档页数:6
温湿度传感器DHT11应用
学习C51单片机时做的第一个传感器就是DHT11,感觉学到了一点东西,以下是我自己的作品以及程序,希望可以帮到你...
DHT11主要是接收数据及处理的函数,根据它的时序图,一般会很容易写出函数,且不会出太大错误的。然后再使用LCD1602将数据显示出来,程序里都写得很清楚了。
程序原型如下:
#include
typedef unsigned char U8;
#define uchar unsigned char
#define uint unsigned int
sbit D=P0^3; //DHT11信号接收端
sbit lcden=P1^2; //1602使能端
sbit lcdrs=P1^0; //1602数据命令选择端
/************定义区************/
U8 FLAG;
U8 temp;
U8 TH,TL,RH,RL;
U8 TH_temp,TL_temp,RH_temp,RL_temp,check_temp;
U8 comdata;
/************延时函数************/
void delay(uint z) //毫秒级延长
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Delay_nms(unsigned char n) // 延时n ms
{
U8 i,j;
for(j=n;j>0;j--)
{
for(i=0;i<29;i++);
}
}
void Delay1s() // 延时n s
{
U8 i,j,k;
for(i=20;i>0;i--)
{
for(j=250;j>0;j--)
{
for(k=250;k>0;k--);
}
}
}
void Delay_40us(void) //延时40us
{
U8 i;
for(i=0;i<12;i++);
}
/************DHT11采集数据************/
void DATA_R(void)
{
U8 i;
for(i=0;i<8;i++) //每次采集8位数据
{
FLAG=2;
while((!D)&&FLAG++); //拉低50us 为接受一bit数据作准备
D=1; //电平已拉高,这句可不要
temp=0; //默认为低电平,即"0"
Delay_40us(); //延时40s后再测
if(D) temp=1; //如果40us后仍是高电平,是"1"
comdata<<=1;
comdata|=temp; //将值赋给U8comdata,每次赋一位
FLAG=2;
while((D)&&FLAG++); //延时等待电位降低进行下一次循环}
}
/************DHT11数据校验************/
void DATA_C(void)
{
D=0;
Delay_nms(180); //主机拉低电位180ms
D=1;
Delay_40us(); //主机拉高电位40us
D=1;
if(!P) //如果电位为低,表明从机响应信号已到达
{
FLAG=2;
while((!D)&&FLAG++); //判断从机拉低电位80us
FLAG=2;
while((D)&&FLAG++); //判断从机拉高电位80us,准备采集数据
DATA_R();
RH_temp=comdata; //湿度高8位
DATA_R();
RL_temp=comdata; //湿度低8位
DATA_R();
TH_temp=comdata; //温度高8位
DATA_R();
TL_temp=comdata; //温度低8位
DATA_R();
check_temp=comdata; //校验8位
D=1;
temp=(TH_temp+TL_temp+RH_temp+RL_temp);
if(temp==check_temp) //数据校验如果正确进行下一步
{
RH=RH_temp;
RL=RL_temp;
TH=TH_temp;
TL=TL_temp;
}
}
}
/************LCD1602部分************/
void write_data(uchar date) //1602写数据
{
lcdrs=1;
P3=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
// delay(200);
delay(5);
}
void write_com(uchar com) //1602写指令
{
lcdrs=0;
P3=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void LCD_init() //1602初始化
{
lcden=0;
write_com(0x38); //8位,2行
write_com(0x0c); //显示开,光标关,不闪烁
write_com(0x06); //读写字符指针加1,屏幕不移动write_com(0x01); //清屏
}
/************主函数************/
void main()
{
DATA_C();
P2=TL;
LCD_init();
while(1)
{
write_data('S'); // 第一行显示湿度
write_data('D');
write_data(':');
write_data(RH/10+0x30);