DHT11温湿度传感器读取温度,并且通过蓝牙发送值手机
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必
须大于18毫秒,保证DHT11能检测到起始信号。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();
}
}