资讯详情

基于51的DHT11温湿度读取与发送

DHT11温湿度传感器读取温度,手机通过蓝牙发送值 在这里插入图片描述 总线的空闲状态是高电平,主机拉下总线等待DHT响应11,主机必须降低总线 必须大于18毫秒,以确保DHT起始信号可以检测到。DHT11接收到主机的开始信号后, 等待主机开始信号结束,然后发送80us低电平响应信号.主机发送的开始信号结束 延迟等待20-40us后, 读取DHT11响应信号,主机发送开始信号后,可切换 输入模式或高电平均输出, 总线由上拉电阻拉高。

#include <STC89C5xRC.H> #include "intrins.h" sbit L1=P3^7; sbit dht=P3^3; unsigned int datas[5]; /** *函数名称:Delay30ms *函数功能:延迟30ms *备 注: */ void Delay30ms()  //@11.0592MHz { 
         unsigned char i, j;   i = 54;  j = 199;  do  { 
          while (--j);  } while (--i); } /** *函数名称:Delay40us *函数功能:延迟40us *备 注: */ void Delay40us()  //@11.0592MHz { 
         unsigned char i;   _nop_();  i = 15;  while (--i); }  /** *函数名称:Delay1000ms *函数功能:延迟1秒 *备 注: */ void Delay1000ms()  //@11.0592MHz { 
         unsigned char i, j, k;   _nop_();  i = 8;  j = 1;
	k = 243;
	do
	{ 
       
		do
		{ 
       
			while (--k);
		} while (--j);
	} while (--i);
}
/** *函数名称:UartInit *函数功能:波特率初始化 *备 注: */
void UartInit(void)		//9600bps@11.0592MHz
{ 
       
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR &= 0xBF;		//定时器时钟12T模式
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xFD;		//设置定时初始值
	TH1 = 0xFD;		//设置定时重载值
	ET1 = 0;		//禁止定时器%d中断
	TR1 = 1;		//定时器1开始计时
	ES=1;
	EA=1;
}
/** *函数名称:uartService *函数功能:串口服务函数 *备 注: */
void uartService() interrupt 4
{ 
       
	if(RI==1)
	{ 
       
// uart_dat[uart_temp]=SBUF;
// uart_temp++;
		RI=0;
	}
}
/** *函数名称:sendDate *函数功能:发送一个字节 *备 注: */
void sendDate(unsigned char dat)
{ 
       
	SBUF=dat;
	while(TI==0);
	TI=0;
}
/** *函数名称:sendString *函数功能:发送一个字符串 *备 注: */
void sendString(unsigned char *str)
{ 
       
	while(*str!='\0')
	{ 
       
		sendDate(*str++);
	}
}
/** *函数名称:check_DHT *函数功能:检测DHT是否存在 *备 注: */
void check_DHT()
{ 
       
	dht=1;
	dht=0;
	Delay30ms();
	dht=1;
	while(dht);
	while(!dht);
	while(dht);
}
/** *函数名称:read_Data_From_DHT *函数功能:接收数据 *备 注: */
void read_Data_From_DHT()
{ 
       
	unsigned int i,j;
	char temp,flag;
	check_DHT();
	for(i=0;i<5;i++)
	{ 
       
		for(j=0;j<8;j++)
		{ 
       
			while(!dht);
			Delay40us();
			if(dht==1)
			{ 
       
				flag=1;
				while(dht);
			}
			else
			{ 
       
				flag=0;
			}
			temp=temp<<1;
			temp=temp|flag;
		}
		datas[i]=temp;
	}
}
/** *函数名称:sendInformation *函数功能:通过串口发送出去 *备 注: */
void sendInformation()
{ 
       
	sendString("humidity:");
	sendDate(datas[0]/10+0x30);
	sendDate(datas[0]%10+0x30);
	sendDate('.');
	sendDate(datas[1]/10+0x30);
	sendDate(datas[1]%10+0x30);
	sendString("\r\n");
	sendString("temperature:");
	sendDate(datas[2]/10+0x30);
	sendDate(datas[2]%10+0x30);
	sendDate('.');
	sendDate(datas[3]/10+0x30);
	sendDate(datas[3]%10+0x30);
	sendString("\r\n");
}
/** *函数名称:main *函数功能:主函数 *备 注: */
void main()
{ 
        
	UartInit();
	sendString("welcome!\r\n");
	while(1)
	{ 
       
		read_Data_From_DHT();
		sendInformation();
		Delay1000ms();
	}
}

标签: tr200温度变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台