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();
}
}