完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1.概述:
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。 2.精确度高 DHT11与ds18b20传感器一样,在时序方面有的严格的要求,在读时序和写时序对延时时间必须在严格的范围内。 DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度20-90%RH, 温度0~50℃。 DHT11利用单总线协议,因此有严格的时序。 主机先要发送一个至少18ms的低电平,在这个过程中,DHT11内部完成AD转换等操作,当主机拉高后,有20-40us时间,这个时间用于主机做输入输出切换,当主机释放总线控制权(此时主机为输入状态,总线被上拉电阻拉高),DHT11尝试将总线拉低,成功拉低后就开始准备发送数据了,再拉高一次就开始传输数据了。 **3.接线** vcc->3v3,GND->GND,数据线out->P0.7 4.源码如下: Init.c一些串口配置的初始化内容 #include "init.h" #define uint unsigned int #define uchar unsigned char // 串口初始化函数 void InitUart() { CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ晶振 while(CLKCONSTA & 0x40); // 等待晶振稳定 CLKCONCMD &= ~0x47; // 设置系统主时钟频率为 32MHZ PERCFG = 0x00; //位置1 P0口 P0SEL = 0x0c; //P0_2,P0_3,P0_4,P0_5用作串口,第二功能 P2DIR &= ~0xC0; //P0 优先作为UART0 ,优先级 U0CSR |= 0x80; //UART 方式 U0GCR |= 11; //U0GCR与U0BAUD配合 U0BAUD |= 216; // 波特率设为115200 UTX0IF = 0; //UART0 TX 中断标志初始置位0 } void UartSendString(char *Data, int len)//串口发送函数 { uint i; for(i=0;i U0DBUF = *Data++; while(UTX0IF == 0); UTX0IF = 0; } } //下面是头文件的一些函数声明 #include void InitClock(void); void InitSensor(void); void InitUart(void);//串口的初始化函数 void UartSendString(char *Data, int len); DHT11.c #include #include "DHT11.h" #define DATA_PIN P0_7 //温湿度定义 uchar ucharFLAG,uchartemp; uchar shidu,wendu; uchar ucharT_data_H,ucharT_data_L,ucharRH_data_H,ucharRH_data_L,ucharcheckdata; uchar ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_temp,ucharRH_data_L_temp,ucharcheckdata_temp; uchar ucharcomdata; //延时函数 void Delay_us() //1 us延时 { asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); } void Delay_10us() //10 us延时 { #if 0 Delay_us(); Delay_us(); Delay_us(); Delay_us(); Delay_us(); Delay_us(); Delay_us(); Delay_us(); Delay_us(); Delay_us(); #else int i = 10; while(i--); #endif } void Delay_ms(uint Time)//n ms延时 { unsigned char i; while(Time--) { for(i=0;i<100;i++) Delay_10us(); } } //温湿度传感 void COM(void) // 温湿写入 { uchar i; for(i=0;i<8;i++) { ucharFLAG=2; while((!DATA_PIN)&&ucharFLAG++); Delay_10us(); Delay_10us(); Delay_10us(); uchartemp=0; if(DATA_PIN)uchartemp=1; ucharFLAG=2; while((DATA_PIN)&&ucharFLAG++); if(ucharFLAG==1)break; ucharcomdata<<=1; ucharcomdata|=uchartemp; } } void DHT11(void) //温湿传感启动 { DATA_PIN=0; Delay_ms(20); //>18MS DATA_PIN=1; P0DIR &= ~0x80; //重新配置IO口方向 Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); if(!DATA_PIN)//如果if中进不去问题一:程序一直进不来,原因可能在延时函数中没有精确 { ucharFLAG=2; while((!DATA_PIN)&&ucharFLAG++); ucharFLAG=2; while((DATA_PIN)&&ucharFLAG++); COM(); ucharRH_data_H_temp=ucharcomdata; COM(); ucharRH_data_L_temp=ucharcomdata; COM(); ucharT_data_H_temp=ucharcomdata; COM(); ucharT_data_L_temp=ucharcomdata; COM(); ucharcheckdata_temp=ucharcomdata; DATA_PIN=1; uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_temp+ucharRH_data_L_temp);//检验 if(uchartemp==ucharcheckdata_temp) { ucharRH_data_H=ucharRH_data_H_temp; ucharRH_data_L=ucharRH_data_L_temp; ucharT_data_H=ucharT_data_H_temp; ucharT_data_L=ucharT_data_L_temp; ucharcheckdata=ucharcheckdata_temp; } wendu=ucharT_data_H; shidu=ucharRH_data_H; } else //没用成功读取,返回0 { wendu=21; shidu=15; } P0DIR |= 0x80; //IO口需要重新配置 } //头文件 #include typedef unsigned char uchar; typedef unsigned int uint; extern void Delay_ms(unsigned int xms); //延时函数 extern void COM(void); // 温湿写入 extern void DHT11(void); //温湿传感启动 extern uchar wendu,shidu;//定义程外部文件可以访问的变量,就不用再主函数中在重复定义 主函数: #include #include #include "DHT11.h" #include "init.h" #include #define uint unsigned int #define uchar unsigned char #define SIZE 40 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr)[0]) #define String "Temp Alarm!rn" #define String1 "Humi Alarm!rn" char strTemp[SIZE]; char str[1] = "%"; void DelayMS(uint msec)//1毫米延时 { uint i,j; for (i=0; i } void main() { DelayMS(1000); //InitClock(); InitUart(); P0SEL &= 0x7f; while(1) { memset(strTemp, 0, ARRAY_SIZE(strTemp)); DHT11(); sprintf(strTemp,"DHT11-Temperature: %02drn",(uint)wendu); UartSendString(strTemp, sizeof(strTemp)); DelayMS(500); if((uint)wendu>28) { UartSendString(String,sizeof(String)); } DelayMS(1000); memset(strTemp, 0, ARRAY_SIZE(strTemp)); sprintf(strTemp,"DHT11-Humidity: %02d%crn",(uint)shidu,str[0]); UartSendString(strTemp, sizeof(strTemp)); DelayMS(500); if((uint)shidu>24) { UartSendString(String1,sizeof(String1)); } DelayMS(2000); } } 最后串口打印出来的结果 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 00:40 , Processed in 1.178098 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号