DHT11和DS18B20一样,都是单总线芯片,同DHT10不同,它的四根引脚中有一条是空脚,与DS18B20相似,对时序的要求比较高,不同之处在于写程序的时候数据的采集必须间隔1s以上,不然采集会失败。
还有,DHT11的数据口最好要接一个上拉电阻,或者单片机内部上拉也可以。
DHT11的数据手册网上有,上面有时序操作的详细介绍。个人建议写这个程序的时候要一边写一边检测(比如写完复位子程序之后就在主函数中调用它一次,看它是否执行成功。。。),不然很可能到最后找不到错误出在哪里,本人就是一直写完然后不好使,最后又重写的!
闲话不说了,下面帮助大家分析一下DHT11的时序图(数据手册上有),因为DHT11对时序的要求很高,所以很可能写完程序不好使。本人建议:延时子函数最好自己用示波器检测一下,自己算出来的在10us下误差会很大的。
进入正题:下面我说的话可以参照下面的程序看。
数据手册前面的一些内容自己了解就可以了,先看数据手册上主机复位信号和DHT11相应信号那部分。
主机先控制总线,拉低至少18ms,然后再拉高20~40us,(这时如果硬件没有问题的话DHT11会有响应的)所以现在主机释放总线(把DDRXN 寄存器清零),等待DHT11的响应,如果成功DHT11会产生40~50us的低电平,和40~50us的高电平。这里可以由程序完成检测。
接下来在一次采集中,把总线一直交给DHT11,它会给主机传送一个40位的二进制数,前0~7位是湿度的整数部分,8~15位是湿度的小数部分;16~23位是温度的整数部分,24~31位是温度的小数部分;最后八位是校验位。这些数据要通过程序进行处理,转换成温湿度的实际值,并由显示部分显示出来。(本人用的是数码管,建议用1602显示会更方便一些)。
后面的处理部分我就不一一讲解了,我在程序中是有注释的,自己把程序加入到工程中看效果会好很多的,也可以用专门的阅读软件来看(source insignte),不然字体都一个颜色非常乱。
================================================
//这里是delay.h /*************我开发板的晶振是16M的,具体的延时子函数要自己仔细写*************/
#ifndef __DELAY_H
#define __DELAY_H
void delay_us(unsigned int xus);
void delay_ms(unsigned int xms);
#endif
================================================
//这里是delay.c
#include"delay.h"
#include
//延时微妙子函数
void delay_us(unsigned int xus)
{
unsigned int i,j;
for(i=0;i
#endif
#ifndef __MACROS_H
#include
#endif
#define DDR_1 DDRC|=BIT(PC0)
#define DDR_0 DDRC&=~BIT(PC0)
#define PORTC_1 PORTC|=BIT(PC0)
#define PORTC_0 PORTC&=~BIT(PC0)
#define DQ (PINC&0x01)
void caiji(void);
long int dht(void);
void init_dht11(void);
//void ceshi(void);
#endif
================================================
//这里是dht11.c
#include"dht11.h"
unsigned char dht_data[5],a,b;
unsigned int s1,s0,t1,t0,sd,wd,wsd;
void caiji(void)
{
unsigned char i,j;
//delay_ms(900);
for(i=0;i<5;i++)
{
dht_data[i]=0x00; //数组清零
for(j=0;j<8;j++)
{
while(!DQ); //判断是否为高电平
//延时50us若为高电平则为一,否则为零
delay_us(50);
if(DQ)
{
dht_data[i]|=BIT(7-j); //保存数据
while(DQ);//低电平检测
}
}
}
}
void init_dht11(void)
{
DDR_1; //设置主机输出
PORTC_0; //总线拉低至少18ms
delay_ms(20);
PORTC_1; //总线由主机拉高大约30us
delay_us(30);
DDR_0; //主机设置为输入,检测从机信号
while(DQ);
}
long int dht(void)
{
init_dht11();
if(!DQ)
{
while(!DQ);
while(DQ); //经以上两句后开始接收信号
caiji();
DDR_1;
PORTC_1;
//校验
a=
(
dht_data[0]+dht_data[1]+dht_data[2]+dht_data[3]
);
if(a==dht_data[4])
{
s1=dht_data[0];
s0=dht_data[1];
t1=dht_data[2];
t0=dht_data[3];
}
//s为湿度,t为温度
sd=s1;
sd<<=8;
sd|=s0;
wd=t1;
wd<<=8;
wd|=t0;
wsd=sd<<16;
wsd|=wd;
}
return wsd;
}
[page]
================================================
//这里是xianshi.h
#ifndef __XIANSHI_H
#define __XIANSHI_H
#ifndef __IOM128V_H
#include
#endif
#define SCK_0 PORTB&=~(1<>16;
//下面为把温度和湿度换算成十进制并且四舍五入
temp=(t>>8);
temp_shi=temp/10;
temp_ge=temp%10;
SH=(s>>8);
SH_shi=SH/10;
SH_ge=SH%10;
int_part=SH_shi*10+SH_ge;
float_part=0;
for(i=0;i<50;i++)
{
digitron_show(int_part,float_part);
}
}
void digitron_show(unsigned int int_part,unsigned int float_part)
{
PORTA=0x01;
send_595(table[float_part/10]);
send_595(0x00);
delay_ms(5);
PORTA=0x02;
send_595(table[(int_part%10)+10]);
send_595(0x00);
delay_ms(5);
PORTA=0x04;
send_595(table[int_part/10]);
send_595(0x00);
delay_ms(5);
}
================================================
//这里是MAIN.C
#include
#include
#include"delay.h"
#include"dht11.h"
#include"xianshi.h"
#pragma interrupt_handler Timer0_COMP:16
#define uchar unsigned char
uchar k=0;
void init(void);
void main()
{
init();//初始化
TCCR0=0X0F;
DDRA=0XFF;
TCCR0=0X0f;//CTC模式
OCR0=145;//10ms
TIMSK=0X02;
SEI();
while(1);
}
//初始化子函数
void init(void)
{
DDRA=0XFF;
DDRB=0XFF;
}
void Timer0_COMP(void)
{
TCCR0=0X08;
CLI();
k++;
if(k==255)
{
k=0;
show();
}
TCCR0=0X0f;//重置初值
SEI();
}
程序到这里结束,希望大家多提宝贵意见哦!!!
关键字:Mega128 DHT11 温湿度传感器
引用地址:
基于Mega128的DHT11温湿度传感器
推荐阅读最新更新时间:2024-03-16 14:26
通过STM32的C8t6获取DHT11的温湿度数据
本项目通过STM32的C8t6获取DHT11的温湿度数据,以及空气质量传感器MQ135,通过一块ESP8266模块连接wifi,把数据上传到机智云平台,可通过手机APP查看。 1、模块准备 一块STM32F103C8T6一块IIC的OLED模块一个DHT11一个MQ135空气质量模块一块ATK-8266wifi模块一个ST-link下载模块杜邦线若干 2、程序准备 首先,先让C8T6能够在OLED上正常显示温度、湿度、以及空气污染气体传感器。在这里我主要说一下MQ135的计算,至于DHT11如何显示温度湿度。关于MQ135:MQ-135气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sn02)。当传感器所处环
[单片机]
msp430g2553+pcf8574+dht11+lcd1602
先放硬件连接图 DHT11驱动子程序 模块功能:检测温湿度信息 DHT11.h #ifndef DHT11_H_ #define DHT11_H_ #include msp430g2553.h #define delay_us(x) __delay_cycles((long)(((double)8000000)*((double)x)/1000000.0)) #define delay_ms(x) __delay_cycles((long)(((double)8000000)*((double)x)/1000.0)) //输出数据P1.5 #define SET_DATA P1OUT |= BIT5 //拉高数据线
[单片机]
STM32 AM2305高精度温湿度传感器驱动
最近用到的温湿度传感器,AM2305驱动,单总线,上电后至少要延时2S才能读取温湿度,温度精度很高,跟DS18B20一样,数据带校验,不会出现DS18B20那样,并且时序要求不高 /************************************************************************************************************* * 文件名: AM2305.c * 功能: STM32 AM2305高精度温湿度传感器驱动 * 作者: cp1300@139.com * 创建时间: 2014-09-20 * 最后
[单片机]
温湿度传感器DHT11的驱动程序
#include typedef.h #include msp430g2553.h #include TemDHT11.h #ifndef _DHT11_TYPE #define _DHT11_TYPE //连接端口 #define DHT11_Dir P2DIR #define DHT11_In P2IN #define DHT11_Out P2OUT #define DHT11_Bit BIT4 #endif //8bit湿度+8bit湿度小数点 //8bit温度+8bit温度小数点 //数据位为0是高电平26~28us | 1高电平70us u8 DHT11_Data = {0}; //从DHT11中读
[单片机]
I2C总线数字式温湿度传感器SHT11及其在单片机系统的应用
摘要:SHT11是瑞士Sensirion公司生产的具有I2C总线接口的单片全校准数字式相对湿度和温度传感器。该传感器采用独特的CMOSens TM技术,具有数字式输出、免调试、免标定、免外围电路及全互换的特点。文中对传感器的性能特点、接口时序与命令进行了详细的阐述,给出了SHT11与单片机的接口电路及相应程序。
关键词:数字式;温湿度传感器;I2C总线;单片机
1 概述
温湿度的测量在仓储管理、生产制造、气象观测、科学研究以及日常生活中被广泛应用,传统的模拟式湿度传感器一般都要设计信号调理电路并需要经过复杂的校准和标定过程,因此测量精度难以保证,且在线性度、重复性、互换性、一致性等方面往往不尽人意。SHT11是瑞士Sens
[单片机]
STM32驱动DHT11温湿度传感器
DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够 实时的采集本地湿度和温度。 DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一 个 I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式 进行校验,有效的保证数据传输的准确性。DHT11 功耗很低,5V 电源电压下,工作平均最大 电流 0.5mA。 DHT11 的技术参数如下: 工作电压范围:3.3V -5.5V 工作电流 :平均 0.5mA 输出:单总线数字信号 测量范围:湿度 20~90%RH
[单片机]
Si7001温湿度传感器在家庭等数据采集系统的应用
前言 随着生活水平的提高,家具智能化的需求逐步显现,温度、湿度等数据采集的应用也开始显现出越来越大的市场潜力。 本文中,通过Silicon Labs的Si7001温湿度传感器,C8051F985低功耗MCU,CP2403 LCD驱动,和LCD显示器构建一个用于家庭等温度、湿度数据采集的系统,该系统主要用于方便、及时的获取室内、外的温度、湿度等数据(也可和其他传感器集成扩展数据采集应用范围)。 家庭数据采集系统的工作原理 本文使用的Si7001温湿度传感器,C8051F985低功耗处理器,CP2403 LCD驱动,都具有I²C通信接口,可做成模块,只需要选用自己的LCD显示器即可。 典型应用如下: 室内、室外各放置2个Si70
[工业控制]
基于arduino的dht11温湿度传感器的使用
DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃。 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集
[嵌入式]