目录
1.产品介绍
只有一个数据传输线,用 DATA 时序传输。
数据传送逻辑
只有一根数据线DATA,上官一号发送序列指令给DHT11模块,模块一次完整的数据传输为40bit,高位先出
数据格式
8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验
通讯过程时序图
检测模块是否存在
数字0信号表示方法如图所示
数字1信号表示方法.如图所示
2.实现效果
在串口种可以显示温湿度数据
3.代码分文件实现
分文件的个人理解,
Source Group1文件下的C文件都被编译了,你的所有函数都可以被Source找到,但是不同的C文件不能跨文件找C,所以你需要添加头文件就可以调用了。
3.1主函数代码
#include "reg52.h"
#include "intrins.h"
char data1[5];
char humidity[10];
char tempreture[10];
void init_usb(void);
void sendmesege(char *p);
void Delay2000ms();
void disp_data(void);
void DH11_to_data1(char data1[]);
void main(void)
{
init_usb(); //´®¿Úuart³õʼ»¯
while(1){
DH11_to_data1(data1); // DH11_to_data1
Delay2000ms();
//½ÓÏÂÀ´ÏÔʾÊý¾Ý´®¿Ú
disp_data(); //ʪ¶ÈÊý¾Ý¸øhumidity ζÈÊý¾Ý¸øtmpreture
sendmesege(humidity);
sendmesege("\r\n");
sendmesege(tempreture);
sendmesege("\r\n");
}
}
void disp_data(void)
{
humidity[0]='H';
humidity[1]=':';
humidity[2]=data1[0]/10+0x30;
humidity[3]=data1[0]%10+0x30;
humidity[4]='.';
humidity[5]=data1[1]/10+0x30;
humidity[6]=data1[1]%10+0x30;
tempreture[0]='T';
tempreture[1]=':';
tempreture[2]=data1[2]/10+0x30;
tempreture[3]=data1[2]%10+0x30;
tempreture[4]='.';
tempreture[5]=data1[3]/10+0x30;
tempreture[6]=data1[3]%10+0x30;
}
3.2延迟函数代码
#include "intrins.h"
void Delay35us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 13;
while (--i);
}
void Delay25ms() //@11.0592MHz
{
unsigned char i, j;
i = 45;
j = 208;
do
{
while (--j);
} while (--i);
}
void Delay30us() //@11.0592MHz
{
unsigned char i;
i = 11;
while (--i);
}
void Delay2000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
3.3 DH11温湿度模块代码
#include "reg52.h"
sbit tp_data=P3^3;
void Delay25ms();
void Delay30us();
void Delay35us();
void Delay2000ms();
void init_DHT(void)
{
tp_data = 1;
tp_data=0;
Delay25ms(); //µÍµÄ½×¶Î
tp_data=1;
Delay30us();
Delay30us(); //¿ªÊ¼ÏìÓ¦½×¶Î µã¿¨
while(!tp_data); //¿¨DHTΪµÍ ×ßÍê
while(tp_data); //¿¨DHTÀ¸ß ×ßÍê ºóÃæÊÇÊý¾Ý½ÓÊÜ
}
void DH11_to_data1(char data1[])
{
int i,j; //i±íʾ8bitµÄÊý¾Ý j±íʾÿ¸öbitµÄÖµ
char tmp,flag;
init_DHT(); //³õʼ»¯ºó½ÓÊÜ8λÊý¾Ý+8λ +8λ+8λ +8λ
for(i=0;i<5;i++){
for(j=0;j<8;j++){
while(!tp_data); //ÀµÍ×ßÍê
Delay35us();
if(tp_data==1){
flag=1;
while(tp_data); //×ßÍê¸ßµçƽ
}else{
flag=0;
}
tmp=tmp<<1; //tmp±íʾ½ÓÊܵÄÒ»¸ö8λÊý¾Ý
tmp |=flag;
}
data1[i]=tmp;
}
}
3.4串口初始化代码
#include "reg52.h"
sfr AUXR=0x8e;
void sendmesege(char *p)
{
char *data1=p;
while(*data1 != '\0'){
SBUF= *(data1++); //·¢ËÍÍê³Éºó²úÉúÖÐ¶Ï ½øÈëinterrupt 4
while(!TI);
TI=0;
}
}
void UART_Pountine(void) interrupt 4
{
if(TI){
}
if(RI){
}
}
void init_usb(void)
{
SCON=0x50;//²ÉÓù¤×÷·½Ê½1½øÐÐͨѶ
PCON &= 0x7F; //ÒªÇå0¾Í &ÉÏ0
ET1=0;//´®¿ÚÓõĶ¨Ê±Æ÷1£¬¹Ø±ÕÖжϡ£ÅäÖÃÏàͬµÄ²¨ÌØÂÊ
//TCON ¶¨Ê±Æ÷¿ØÖƼĴæÆ÷
TR1=1; //´ò¿ª¶¨Ê±Æ÷1
//TMOD? ¶¨Ê±Æ÷ģʽ¼Ä´æÆ÷
TMOD &=0x0F; //&0¾ÍÇå0
TMOD |=0x20; // |1¾Í±ä1
TH1=0xFD; //¸ßλ? ? ? ×Ô¶¯ÖØװʱTH1½«×Ô¶¯×°ÈëTL1
TL1=0xFD; //µÍλ
//TI ÖжÏÇëÇó±ê־λ RIÖжÏÇëÇó±ê־λ
EA=1;ES=1; //×ÜÖжÏÔÊÐíλ ´®¿ÚÖжÏÔÊÐíλ
}