开发手册分析
代码模块
DHT11.c
#include <REG52.H>
#include "DHT11.h"
sbit Temp_data = P3^6;
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];
//延时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 DHT11_START()
{
Temp_data = 1;//空闲状态高电平
DHT11_delay_us(2);//延时2us
Temp_data=0;//拉低电平
DHT11_delay_ms(20);//至少给18ms
Temp_data = 1;
DHT11_delay_us(13);
}
//接收一个字节函数
unsigned char DHT11_rec_byte()
{
unsigned char i,dat;
for(i=0;i<8;i++)
{
while(!Temp_data);//等待DHT11低电平过去
DHT11_delay_us(8);//延时8us(实际是28us,加上后面程序执行时间总共28us)
dat<<1;
if(Temp_data==1)
{
dat+=1;
}
while(Temp_data); //等待DHT11拉低
}
return dat;
}
//接收温度数据
void DHT11_receice()
{
unsigned int R_H,R_L,T_H,T_L;
unsigned char RH,RL,TH,TL,revise;
DHT11_START();//主机发送信号
Temp_data=1;
if(Temp_data==0)//判断DHT11是否进入响应
{
while(Temp_data==0);//等待低电平响应信号
DHT11_delay_us(40);//拉高后延时40ms
R_H=DHT11_rec_byte();//接收湿度高八位,后面类似
R_L=DHT11_rec_byte();
T_H=DHT11_rec_byte();
T_L=DHT11_rec_byte();
revise=DHT11_rec_byte();//接收校验位
DHT11_delay_us(25);
if((R_H+R_L+T_H+T_L)==revise);//校验校验位是否正确
{
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;
}
}
//温湿度模块使用串口发送数据
void InitUART()//使用定时器1,作为串口波特率发生器
{
SCON=0X40;//串口通信工作方式1
REN=1;//允许串口一接收
TMOD=0X20;//定时器1工作方式
TH1=0XF3;//配置串口波特率
TL1=0XF3;
TI=1;
TR1=1;
}
DHT11.H
#ifndef _DHT11_H_
#define _DHT11_H_
void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned int z);
void DHT11_START();
unsigned char DHT11_rec_byte();
void DHT11_receice();
void InitUART();
#endif
main.c
#include "regx52.h"
#include "intrins.h"
#include "LCD1602.h"
#include "stdio.h"
#include "DHT11.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];
void main()
{
LCD_Init();
InitUART();
LCD_Showstring(1,1,"Humi:");
LCD_Showstring(2,1,"Temp:");
while(1)
{
DHT11_delay_ms(150);
DHT11_receice();
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);
//显示湿度
LCD_Showstring(1,6,rec_dat_lcd0);
LCD_Showstring(1,8,".");
LCD_Showstring(1,9,rec_dat_lcd1);
LCD_Showstring(1,11,"%");
//显示温度
LCD_Showstring(2,6,rec_dat_lcd2);
LCD_Showstring(2,8,".");
LCD_Showstring(2,9,rec_dat_lcd3);
LCD_Showstring(2,13,"C");
}
}