dh11.c
#include<reg52.h> #include<intrins.h> #include"dh11.h" sbit Temp_data=P3^6; extern unsigned int rec_dat[4]; //DHT11起始信号 void DHT11_start() {
Temp_data=1; DHT11_delay_us(2); Temp_data=0; DHT11_delay_ms(20); 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_delay_us(8); dat<<=1; if(Temp_data==1) {
dat =1; } while(Temp_data); } return dat; }
//接收温湿度数据
void
DHT11_receive
(
)
{
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
)
{
while
(Temp_data
==
0
)
;
//等待拉高
DHT11_delay_us
(
40
)
;
//拉高后延时80us 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
;
}
}
//延时us --2*n+5us
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
--
)
;
}
dh11.h
#ifndef __DH11_H_
#define __DH11_H_
#include <reg52.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_receive();
#endif
main.c
/******************************************************************************* * 实验名 :温度显示实验 * 使用的IO : * 实验效果 :1602显示温度 * 注意 : *******************************************************************************/
#include<reg52.h>
#include"lcd.h"
#include<intrins.h>
#include<stdio.h>
#include"dh11.h"
sbit Temp_data=P3^6;
/******************************************************************************* * 函数名 : main * 函数功能 : 主函数 * 输入 : 无 * 输出 : 无 *******************************************************************************/
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];
//主函数
void main()
{
//unsigned char i,j;
LcdInit();
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);
//湿度
ShowString(0x00,"Humi:");
ShowString(0x05,rec_dat_lcd0);
ShowString(0x07,".");
ShowString(0x08,rec_dat_lcd1);
ShowString(0x09,"%");
//温度
ShowString(0x10,"Temp:");
ShowString(0x15,rec_dat_lcd2);
ShowString(0x17,".");
ShowString(0x18,rec_dat_lcd3);
ShowString(0x19,"C");
}
}