1.DHT11的时序数据
a : dht = 1
b :dht = 0延时30ms
c: dht = 1
卡d点;while(dht1); 卡e点 while(!dht) 卡f点:while(dht) 卡g点:while(!dht) 有效数据都是高电平,持续时间不一样,50us读,低电平0 高电平
知识点:
在计算机中,数字和字符之间的转换通常是通过 ASCII 码或 Unicode 码来完成的。在 ASCII 码中,数字 4 的表示为 52,而字符 '4' 的表示也是 52。因此,将数字 4 和十六进制数 0x30(在 ASCII 码中表示数字 '0')相加得到的结果是字符 '4'。
思路:
main函数进来,先关灯,初始化串口,延迟两秒整个模块稳定,while()函数进去(一直)读取数据,延迟一秒稳定DHT11,开始从DHT11读取数据存入char datas[5]; 然后sendString() 发温度 ,分别发送以下图片数据
BUG:
在卡g点的时候给60us给的太多了,对于传0数据会跳到下一个节点去,给40us最合适
DH11传输0的时序分析
DH11传输1的时序分析
#include "reg52.h"
#include "intrins.h"
sbit ledOne = P3^7;
sbit dht = P3^3;
char datas[5];
sfr AUXR = 0x8E;
void UartInit(void)
{
AUXR = 0x01;
SCON = 0x40;
TMOD &= 0xF0;
TMOD |= 0x20;
TH1 =0xFD;
TL1 =0xFD;
TR1 = 1;
}
void sendByte(char data_msg)
{
SBUF = data_msg;
while(!TI); //(TI==0)
TI = 0;
}
void sendString(char *str)
{
while(*str != '\0'){
sendByte(*str);
str++;
}
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay30ms() //@11.0592MHz
{
unsigned char i, j;
i = 54;
j = 199;
do
{
while (--j);
} while (--i);
}
void Delay40us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 15;
while (--i);
}
void DHT11_Start()
{
//一开始是高电平VCC,
dht = 1;
//拉低
dht = 0;
//图片说18ms,我们延迟30ms,
Delay30ms();
//后,拉高
dht = 1;
//在60us后读开始读数据,D点,如果D点是低电平,模块被拉低,说明模块存在
//卡D点; while (dht); 卡e点while(!dht)里面是低电平; 卡g点:while(!dht)
//有效数据都是高电平,持续时间不一样而已,50us读,低电平0 高电平1
while(dht);
while(!dht);
while(dht);
}
void Read_Data_From_DHT()
{
int i; //轮
int j; // 每轮读多少次
char tmp;
char flag;
for(i = 0;i<5;i++){
//g
for(j = 0;j<8;j++){
while(!dht);
// 卡g点:while(!dht) 有效数据是高电平,持续时间不一样,50us读,低电平0,高电平1
Delay40us(); //BUG
if(dht==1){
flag = 1;
while(dht); // 维持高电平
}else{
flag = 0;
}
tmp = tmp << 1;
tmp |= flag; // 或上flag 获取温湿度数据
}
datas[i] = tmp;
}
}
void main()
{
ledOne = 1;
UartInit();
Delay1000ms();
Delay1000ms();
while(1){
Delay1000ms();
Read_Data_From_DHT();
//0123分别代表0123个字节
sendString("HU:");
//温度
//整数
sendByte(datas[0]/10 + 0x30); // 比如:把40拿出来变成字符'4';0变成字符'0'
sendByte(datas[0]%10 + 0x30);
sendByte('.');
//小数
sendByte(datas[1]/10 + 0x30); // 比如:把40拿出来变成字符'4';0变成字符'0'
sendByte(datas[1]%10 + 0x30);
sendString("\r\n");
sendString("TM:");
//湿度
//整数
sendByte(datas[2]/10 + 0x30); // 比如:把40拿出来变成字符'4';0变成字符'0'
sendByte(datas[2]%10 + 0x30);
sendByte('.');
//小数
sendByte(datas[3]/10 + 0x30); // 比如:把40拿出来变成字符'4';0变成字符'0'
sendByte(datas[3]%10 + 0x30);
sendString("\r\n");
}
}