当前位置:首页 > 消费电子 > 消费电子
[导读]DHT11和DS18B20一样,都是单总线芯片,同DHT10不同,它的四根引脚中有一条是空脚,与DS18B20相似,对时序的要求比较高,不同之处在于写程序的时候数据的采集必须间隔1s以上,不然采集会失败。还有,DHT11的数据口最好

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

{

NOP();NOP();NOP();NOP();NOP();NOP();

NOP();NOP();NOP();NOP();

}

}

//延时毫秒子函数

void delay_ms(unsigned int xms)

{

unsigned int i,j;

for(i=0;i

{

for(j=0;j<2288;j++);

}

}

================================================

//这里是dht11.h

#ifndef __DHT11_H

#define __DHT11_H

#ifndef __IOM128V_H

#include

#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;

}

================================================

//这里是xianshi.h

#ifndef __XIANSHI_H

#define __XIANSHI_H

#ifndef __IOM128V_H

#include

#endif

#define SCK_0 PORTB&=~(1<

#define SCK_1 PORTB|=(1<

#define LCK_0 PORTB&=~(1<

#define LCK_1 PORTB|=(1<

#define SDI_0 PORTB&=~(1<

#define SDI_1 PORTB|=(1<

void init(void);

void send_595(unsigned char dat);

void digitron_show(unsigned int int_part,unsigned int float_part);

#endif

================================================

//这里是xianshi.c

#include"xianshi.h"

#ifndef __DELAY_H

#include"delay.h"

#endif

#ifndef __DHT11_H

#include"dht11.h"

#endif

//数码管显示数组定义

const unsigned char table[]=

{

0x3F,// 0

0x06,// 1

0x5B,// 2

0x4F,// 3

0x66,// 4

0x6D,// 5

0x7D,// 6

0x07,// 7

0x7F,// 8

0x6F,// 9

0x3F+0x80,// 0.

0x06+0x80,// 1.

0x5B+0x80,// 2.

0x4F+0x80,// 3.

0x66+0x80,// 4.

0x6D+0x80,// 5.

0x7D+0x80,// 6.

0x07+0x80,// 7.

0x7F+0x80,// 8.

0x6F+0x80// 9.

};

unsigned int s,t,st,int_part,float_part,temp,SH;

//发送一字节数据到595

void send_595(unsigned char dat)

{

unsigned char i;

LCK_0;

SDI_1;

SCK_0;

//上面的三条语句为了初始化端口状态

for(i=0;i<8;i++)

{

LCK_0;//时钟线拉低

if(dat&0x80)

SDI_1;

else SDI_0;

dat=dat<<1;

delay_us(100);

LCK_1; //时钟线拉高将数据读入595的移位寄存器

delay_us(100);

}

SCK_1; //发送数据到并行端口

SCK_0;

}

void show(void)

{

unsigned char temp_shi,temp_ge,SH_shi,SH_ge,x,y;

unsigned int i;

st=dht();

t=st&0x0000ffff;

s=st&0xffff0000;

s=s>>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();

}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

传感器的DATA口需要接4.7K的上拉电阻。上拉电阻的作用是在单片机不进行输出以及传感器待机时,使得DATA口为高电平,当总线闲置时, 其状态为高电平。

关键字: dht11 温湿度传感器 上拉电阻

以科技创新力量,重新定义产业办公及产业洞察视角 成都2023年8月16日 /美通社/ -- 由仲量联行(纽交所代码:JLL)主办的睿见论坛之"REDEFINE 焕新成都产链 · 重构城市价值&q...

关键字: 数据分析 楼宇 BSP DEFINE

温湿度传感器的应用非常广泛,在各种领域都有使用,尤其是在需要实时记录温湿度等参数变化的场所中最为明显。有了这样的温湿度传感器人们和各种系统就可以根据设备记录的内容,对其进行科学高效的管理,分析和控制,温度传感器按传感器与...

关键字: 温湿度传感器 温湿度监控系统

温湿度传感器是人们最常见到传感器之一。通过一定的检测装置测量空气中的温湿度,将温湿度转换为电信号或其他所需方式的信息导出,以满足用户的需求。因为温度和湿度与物理量本身和现实生活密切相关,所以温湿度集成的传感器会相应产生。...

关键字: 温湿度传感器 温湿度传感器原理

通过温湿度传感器可以测试出空间环境的相对湿度以及湿度、饱和湿度等,它对于许多行业具有重要意义。在选择该种设备时要注意外部材料是否具备防腐蚀性,同时要综合及抗震性、耐压性等进行选购。那么选择温湿度传感器还有哪些注意事项呢?

关键字: 温湿度传感器 温湿度传感器选型

温湿度传感器作为一种常见的传感器,主要作用是监测空气中的温湿度数值,并按照一定的规律转变成电信号或其他形式进行输出,帮助用户达到监测温湿度的要求。对比传统单一的温湿度测量器,温湿度传感器可依托于物联网技术实现远程监测,随...

关键字: 温湿度传感器 温湿度传感器应用

本文中,小编将对温湿度传感器予以介绍,如果你想对它的详细情况有所认识,或者想要增进对它的了解程度,不妨请看以下内容哦。

关键字: 传感器 温湿度传感器

温度:度量物体冷热的物理量,是国际单位制中7个基本物理量之一。在生产和科学研究中,许多物理现象和化学过程都是在一定的温度下进行的人们的生活也和他密切相关。 湿度:湿度很久以前就与生活存在着密切的关系,但用数量来进行表示...

关键字: 温湿度传感器 温湿度传感器应用

产品基于LoRa®无线通信技术,具备本地存储功能,可存储高达3000条传感器数据,且支持断网数据重传与数据回传功能,确保信息可追溯,避免数据丢失。

关键字: 星纵物联 温湿度传感器 LoRa无线通信技术

摘要:针对运输方面较为薄弱的冷链物流监测环节,利用无线传感器网络,设计了一种冷链物流监测系统。该方法能够通过温湿度传感器和GPS,来对冷链物流系统运输环境的温湿度进行实时监测,并对运输路线进行实时跟踪,以掌握冷链运输关键...

关键字: 物联网 冷链物流 温湿度传感器 GPS
关闭
关闭