DHT11温湿度传感器串口显示技术详解
#include <REGX52.H>
#include "intrins.h"
sfr AUXR = 0x8E;
sbit DHT = P3^3;
char dates[5]; //8位为一个数据 8+8+8+8+8
void Delay30ms(void) //@11.0592MHz
{
unsigned char data i, j;
i = 54;
j = 199;
do
{
while (–j);
} while (–i);
}
void Delay40us(void) //@11.0592MHz
{
unsigned char data i;
_nop_();
i = 15;
while (–i);
}
void Delay60us(void) //@11.0592MHz
{
unsigned char data i;
i = 25;
while (–i);
}
void Delay1000ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (–k);
} while (–j);
} while (–i);
}
void Uart1_Init() //串口初始化
{ AUXR = 0x01; //让波特率更加稳定,防止掉帧
SCON = 0x50; //配置串口工作模式,REN为1则接收数据
TMOD &= 0x0F;
TMOD |= 0x20; //配置定时器为8位自动重装模式
TL1 = 0xFD;
TH1 = 0xFD; //8位自动重装模式TH1存放的值自动存入TL1
TR1 = 1; //启动定时器
}
void senddate(char date) //串口发出一个个数据函数
{
SBUF = date;
while(!TI); //直到等于1时发送成功,TI为0时变1发送成功;为1变0时不循环
TI = 0; //无时差
}
void sendstring(char* str) //传入字符串
{
while(*str != '\0')
{
senddate(*str); //将字符串打印出来
str++; //地址偏移
}
}串口部分
void check_DHT_start() //DHT信号
{
DHT = 1;
DHT = 0;
Delay30ms();
DHT = 1;
Delay60us();
while(DHT); //DHT拉低时才会往下走
while(!DHT);
while(DHT); //到f点了
}
void Read_date_form()
{
char flag; //标志位
char tmp; //数据 40bit 8位 需要5次
int i,j;
check_DHT_start(); //送出数据前发出信号
for(i=0;i<5;i++)
{ while(!DHT); //卡g点
for(j=0;j<8;j++)
{DHT = 1; //拉高
if(DHT == 1)
Delay40us();
{
flag = 1;
while(DHT); //如果是1先卡一会
}else{
flag = 0;
}tmp = tmp << 1; //8个bit为一个数据,每次左移更新数据
tmp |= flag; //有1则1
}dates[i] = tmp; //8+8+8+8+8
}
}DHT11读数据
void main()
{
LED1 = 1;
Uart1_Init();
Delay1000ms();
Delay1000ms(); //上电先抖至少1s
while(1)
{ Delay1000ms();
Read_date_form(); //一下40bit
sendstring("H:"); //目的将来自DHT传感器dates显示在串口
senddate(dates[0]/10+0x30); //字符与ASCll相差30
senddate(dates[0]%10+0x30); //列如43
senddate('.');
senddate(dates[1]/10+0x30);
senddate(dates[1]%10+0x30);
sendstring("\r\n");
sendstring("T:");
senddate(dates[2]/10+0x30);
senddate(dates[2]%10+0x30);
senddate('.');
senddate(dates[3]/10+0x30);
senddate(dates[3]%10+0x30); //手册湿度整数+小数,温度整数+小数,效验和
sendstring("\r\n");
}
}
附图:

作者:湖院老六