arduino控制的DHT11温湿度传感器程序
温湿度集成传感器DHT11部分程序
void delayNOP(){_nop_();_nop_();_nop_();_nop_();}// 毫秒级延时子程序/*********************************************************************************/ void delay_ms(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i<250; i++){_nop_();_nop_();_nop_();_nop_();}}}/*********************************************************************************/ //5us级延时程序/*********************************************************************************/ void delay_us(){unint8 i;i--;i--;i--;i--;i--;i--;}/****************************************************************************///收发信号检测,数据读取/****************************************************************************/ char receive(){unint8 i;ST=0;com_data=0;for(i=0;i<=7;i++){respond=2;while((!TRH)&&respond++);delay_us();delay_us();delay_us();if(TRH){temp=1;respond=2;while((TRH)&&respond++);}elsetemp=0;com_data<<=1;com_data|=temp;}return(com_data);}/****************************************************************************/ //湿度读取子程序//温度高8位== TL_data//温度低8位== TH_data//湿度高8位== RH_data//湿度低8位== RH_data//校验8位== CK_data//调用的程序有delay();, Delay_5us();,RECEIVE();/***************************************************************************/ void read_TRH(){int m;//主机拉低18msTRH=0;delay_ms(18);TRH=1;//DA TA总线由上拉电阻拉高主机延时20usdelay_us();delay_us();delay_us();delay_us();//主机设为输入判断从机响应信号TRH=1;//判断DHT11是否有低电平响应信号如不响应则跳出,响应则向下运行if(!TRH){respond=2;//判断DHT11发出80us 的低电平响应信号是否结束while((!TRH)&& respond++);respond=2;//判断从机是否发出80us 的高电平,如发出则进入数据接收状态while(TRH && respond++);//数据接收状态RH_temp = receive();RL_temp = receive();TH_temp = receive();TL_temp = receive();CK_temp = receive();TRH=1;ST=1;//数据校验untemp=(RH_temp+RL_temp+TH_temp+TL_temp);if(untemp==CK_temp){RH_data = RH_temp;RL_data = RL_temp;TH_data = TH_temp;TL_data = TL_temp;CK_data = CK_temp;}}//湿度整数部分str1[0] = (char)(0X30+RH_data/10);str1[1] = (char)(0X30+RH_data%10);//温度整数部分str2[0] = (char)(0X30+TH_data/10);str2[1] = (char)(0X30+TH_data%10);m=(int)(RH_data);if(m>=35)//可改变相应数值,以此控制其他设备{XS=0;//Beep =1; //可适当加一个延迟}else{XS=1;//Beep =0;}}void welcome(){unsigned char i;lcd_dis_pos(1,0);for(i=0;i<16;i++) //显示字符lcd_wdata(wel1[i]);lcd_dis_pos(2,0);for(i=0;i<16;i++) //显示字符lcd_wdata(wel2[i]);lcd_dis_pos(3,0);for(i=0;i<16;i++) //显示字符lcd_wdata(wel3[i]);lcd_dis_pos(4,0);for(i=0;i<16;i++) //显示字符lcd_wdata(wel4[i]);}/****************************************************************************/ //主函数//TH,TL,RH,RL分别代表温湿度的整数和小数部分/****************************************************************************/ void main(){unsigned char i;lcd_init();delay_us();welcome();for(i=0;i<=10;i++){delay_ms(10000);delay_ms(10000);delay_ms(10000);delay_ms(10000);delay_ms(10000);}while(1){read_TRH();//写字符lcd_dis_pos(1,0);for(i=0;i<16;i++) //显示字符lcd_wdata(dis1[i]);lcd_dis_pos(2,0);for(i=0;i<16;i++) //显示字符lcd_wdata(dis2[i]);lcd_dis_pos(3,0);for(i=0;i<16;i++) //显示字符lcd_wdata(dis3[i]);lcd_dis_pos(4,0);for(i=0;i<16;i++) //显示字符lcd_wdata(dis4[i]);//写湿度数据for(i=0;i<2;i++){lcd_pos(2,i+3);lcd_wdata(str1[i]);}for(i=0;i<2;i++){lcd_pos(3,i+3);lcd_wdata(str2[i]);}//延时delay_ms(1000) ;//clr_screen(); //清屏}}。
dht11程序编写流程
dht11程序编写流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 初始化 DHT11 传感器需要将 DHT11 传感器连接到微控制器的适当引脚。
dht11使用手册
dht11使用手册DHT11是一款常用的温湿度传感器,它能够测量并监测环境中的温度和湿度。
以下是关于DHT11的使用手册,希望能够帮助您更好地使用这款传感器。
一、简介DHT11是一款由AM2301温湿度传感器和数字模块构成的测温湿度模块。
它采用单总线通信方式,能够同时测量环境中的温度和湿度,具有测量精度高、稳定性好等优点。
DHT11的使用非常方便,只需将其连接到单片机的某个I/O口即可。
二、使用步骤1.硬件连接将DHT11的VCC引脚连接到单片机或开发板的+5V电源,GND引脚连接到地线,OUT引脚连接到单片机的I/O口(推荐使用GPIO)。
2.初始化在开始数据读取之前,需要先对DHT11进行初始化。
将I/O 口初始化为输出模式,然后输出低电平(0)至少18ms,再输出高电平(1)并保持60-400us。
此时DHT11会响应并开始工作。
3.数据读取初始化完成后,DHT11会自动开始测量环境中的温度和湿度。
等待40ms后,DHT11会自动将测量到的数据通过I/O口发送给单片机或开发板。
单片机或开发板可以通过读取I/O口的状态来获取数据。
4.数据解析从DHT11读取的数据是一个8位的湿度数据和一个8位的温度数据,需要对其进行解析才能得到实际的湿度和温度值。
根据DHT11的通信协议,我们可以使用以下公式来计算湿度和温度值:湿度值= (湿度数据×10) % 100 温度值= (温度数据/10) + 25三、注意事项在使用DHT11时,需要注意以下几点:1.DHT11的VCC引脚电压应保持在4.5-5.5V之间。
2.在读取数据时,需要等待一定的时间以保证数据传输的稳定。
通常情况下,建议等待大约80-200ms。
3.如果连续读取几次数据都失败,可能需要重新初始化DHT11。
4.在连接DHT11时,需要保证OUT引脚处于低电平状态。
如果OUT引脚处于高电平状态,可能会导致DHT11无法正常工作。
5.DHT11的工作环境温度应保持在0-50℃之间,如果环境温度过高或过低,可能会导致测量值不准确。
DHT11程序文件
各位老师,我对温度湿度进行测量,使用数字温湿度传感器DHT11,显示测量值时发现一上电湿度数值就不停跳动,跳动数值幅度有十几,温度数值基本没变,感觉测量湿度数值不正确,请各位帮忙指导下,谢谢。
程序如下,MCU为16F873,晶振为10MHz#include "pic.h"#define uchar unsigned char#define uint unsigned int#define LCD_RS RC5#define LCD_RW RC6#define LCD_EN RC7#define DH RC4 //定义DHT11数据端口#define DH_HIGH() TRISC4=1 //设置数据口为输入#define DH_LOW() TRISC4=0;DH = 0 //设置数据口为输出uchar RH_data_H_temp,RH_data_L_temp,T_data_H_temp,T_data_L_temp,checkdata_temp;uchar RH_data_H,RH_data_L,T_data_H,T_data_L,checkdata;uchar flag,temp,comdata;void delayus(uint x,uchar y){ uint i; uchar j;for(i=x;i>0;i--);for(j=y;j>0;j--);}void COM(){ uchar i;for(i=0;i<8;i++){ flag=2;while((!(DH))&&flag++);//等待高电平if(flag==1)break;delayus(0,2);//delayus(0,2);temp=0;if(DH)temp=1;flag=2;while((DH)&&flag++); //等待低电平//超时则跳出for循环if(flag==1)break;//判断数据位是0还是1 // 如果高电平高过预定0高电平值则数据位为1comdata<<=1;comdata|=temp; //0}}//--------------------------------//-----湿度读取子程序------------//--------------------------------//----以下变量均为全局变量--------//----温度高8位== U8T_data_H------//----温度低8位== U8T_data_L------//----湿度高8位== U8RH_data_H-----//----湿度低8位== U8RH_data_L-----//----校验8位== U8checkdata-----//--------------------------------void RH(void){ //主机拉低18msDH_LOW();delayus(5000,200);DH_HIGH(); //总线由上拉电阻拉高主机延时20-40usdelayus(0,2);delayus(0,2);//主机设为输入判断从机响应信号DH_HIGH();//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!DH){ flag=2;//判断从机是否发出80us 的低电平响应信号是否结束while((!(DH))&&flag++);flag=2;//判断从机是否发出80us 的高电平,如发出则进入数据接收状态while((DH)&&flag++);//数据接收状态COM();RH_data_H_temp=comdata;COM();RH_data_L_temp=comdata;COM();T_data_H_temp=comdata;COM();T_data_L_temp=comdata;COM();checkdata_temp=comdata;DH_HIGH();//数据校验temp=(T_data_H_temp+T_data_L_temp+RH_data_H_temp+RH_data_L_temp);if(temp==checkdata_temp){ RH_data_H=RH_data_H_temp;T_data_H=T_data_H_temp; T_dataL=T_data_L_temp;checkdata=checkdata_temp; }} //fi}void Delayms(uint ms){ uchar i;while(ms--){ for(i=0;i<120;i++);}}--------------下面为液晶模块程序-------- uchar LCD_Busy_Check(){ uchar result;TRISB=0xFF;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;Delayms(1);result=PORTB;LCD_EN=0;return result;}{ while((LCD_Busy_Check()&0x80)==0x80);TRISB=0x00;LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;PORTB=cmd;LCD_EN = 1;Delayms(1);LCD_EN = 0;}void Write_LCD_Data(uchar dat){ while((LCD_Busy_Check()&0x80)==0x80);TRISB=0x00;LCD_RS" = 1;LCD_RW = 0;LCD_EN = 0;PORTB = dat;LCD_EN = 1;Delayms(1);LCD_EN = 0;}void LCD_Initialise(){ Write_LCD_Command(0x01);Delayms(1);Write_LCD_Command(0x38);Delayms(1);Write_LCD_Command(0x0c);Write_LCD_Command(0x06);Delayms(1);}void Set_LCD_POS(uchar pos){Write_LCD_Command(pos|0x80);}void init(){ ADCON1=0x07;TRISA=0x00;TRISC=0x00;}void disp(){ Set_LCD_POS(0x00);Write_LCD_Data(RH_data_H/10+0x30);Set_LCD_POS(0x01);Write_LCD_Data(RH_data_H%10+0x30); Set_LCD_POS(0x02);Write_LCD_Data('%');Set_LCD_POS(0x07);Write_LCD_Data(T_data_H/10+0x30);Set_LCD_POS(0x08);Write_LCD_Data(T_data_H%10+0x30); Set_LCD_POS(0x09);Write_LCD_Data(0xdf);Set_LCD_POS(0x0A);}void main(){ init();LCD_Initialise();DH_HIGH();while(1){ RH();disp();}}。
DHT11温湿度传感器程序
//LCD 控制端口设置
PORTA &= ~((1 << RS) | (1 << RW) | (1 << E)); //
DDRA |= (1 << RS) | (1 << RW) | (1 << E);
}
if(Reset())
{ P_DHT;
while((!(I_DHT)) && ((u16Flag++)<50000));
ReceiveValue = 0;
ReceiveValue1 = 0;
u16Flag = 0;
while((I_DHT) && ((u16Flag++)<50000));
#include <avr/io.h>
#include <util/delay.h>
//口定义
#define PORT_DHT PORTC
//口方向定义
#define DDR_DHT DDRC
//读取口定义
#define PIN_DHT PINC
//数据位定义
#define BIT_DHT PC4
void Write_Data_Byte(unsigned char LCD_Data); //LCD 写字节数据
void Write_Place_xy(unsigned char x,unsigned char y); //指定当前写字符的位置
void Write_Data_String(unsigned char x,unsigned char y,unsigned char *data);//在指定的(x,y)位置上写入字符串数据
温湿度传感器DHT11程序编写
/******************DHT11******************************** FileName:dht11.cAuthor:沧海麒麟Date:2011.05.29Version :1.0Description:适用于ATmega16(L)Function: 利用串口发送温度和湿度到电脑,同时用液晶显示*/#include <iom16v.h>#include <macros.h>#include <avrdef.h>#include "delay.c"#include "LCM1602.c"#define uchar unsigned char#define uint unsigned int#define DDR_1 DDRA|=BIT(PA0)#define DDR_0 DDRA&=~BIT(PA0)#define PORT_1 PORTA|=BIT(PA0)#define PORT_0 PORTA&=~BIT(PA0)#define MOSIN (PINA&0X01)uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; uchar DHT11_5DATA[5];uchar U8temp;uchar flag = 0;uchar humidity[] = "humidity :";uchar temperature[] = "temperature:";void COM(void){uchar i,j,m;for(i=0;i<5;i++){DHT11_5DATA[i]=0X00;for(j=0;j<8;j++){while(!MOSIN);//等待高电平的到来,当高电平到来后便开始计时Delay(60);//for(m=0;m<50;m++); //延时50us后看还是不是高电平,如果是高那么这位就为1,否则为0if(MOSIN){DHT11_5DATA[i] |= BIT(7-j);while(MOSIN);}//end of if}//end of for}//end of for}void DHT11(void){uchar i;DDR_1;PORT_0;Delay_Nms(20);//主机拉低18msPORT_1;//总线由上拉电阻拉高主机延时20usDelay(30);//for(i=0;i<23;i++); //此操作为微秒级的延时DDR_0;//主机设为输入判断从机响应信号Delay(15);//for(i=0;i<10;i++);//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!MOSIN) //{while(!MOSIN);//判断从机是否发出 80us 的低电平响应信号是否结束while(MOSIN);//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态COM();//数据接收状态DDR_1 ;PORT_1 ;U8temp=(DHT11_5DATA[0]+DHT11_5DATA[1]+DHT11_5DATA[2]+DHT11_5DATA[3]);//数据校验if(DHT11_5DATA[4]==U8temp){U8RH_data_H = DHT11_5DATA[0];U8RH_data_L = DHT11_5DATA[1];U8T_data_H = DHT11_5DATA[2];U8T_data_L = DHT11_5DATA[3];U8checkdata = DHT11_5DATA[4];}}}/***********端口初始化函数**********************/void init_port(void){PORTD|= 0x02; //注意这两个管脚要配置为输出DDRD |= 0x02;}/************串口初始化函数*********************/void init_uart0(void){UCSRB = 0x00;UBRRH = 0x00;UBRRL = 0x67;UCSRA = (1 << U2X);//双倍率工作模式UCSRB = (1 << RXEN)|(1 << TXEN);//|(1 << UCSZ2);使能接收器和发射器 UCSRC = 0x80|(1 << UCSZ1)|(1 << UCSZ0);}/************发送一个字节函数********************/void Send_Uart0(uchar data){while(!(UCSRA&(1<<UDRE)));UDR=data;}/************T/C1初始化函数**********************/void Timer1_InterruptMode(void)//T/C1中断方式函数{//stop errant interrupts until set upCLI(); //disable all interruptsTCCR1B = 0x00; //stopTCNT1H = 0xCF; //setupTCNT1L = 0x2C;TCCR1B = 0x03; //start TimerMCUCR = 0x00;GICR = 0x00;TIMSK = 0x04; //timer interrupt sourcesSEI(); //re-enable interrupts//all peripherals are now initialized}/************总初始化函数**********************/void Init_Devices(void){Init_Port();Init_1602(0x18);init_port();init_uart0();Timer1_InterruptMode();}/************中断服务函数**********************/#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF //9 void timer1_ovf_isr(void){//TIMER1 has overflowedTCNT1H = 0xCF; //reload counter high valueTCNT1L = 0x2C; //reload counter low valueflag++;}void main(void){Init_Devices();DisplayString(0,0,humidity);DisplayString(0,1,temperature);while(1){if(flag==10)//1s采集一次{ //调用温湿度读取子程序flag=0;CLI();DHT11();DisplayNumber(12,0,U8RH_data_H);//1602显示湿度Delay_Nms(10);DisplayNumber(12,1,U8T_data_H);//1602显示温度 Send_Uart0(U8RH_data_H);Send_Uart0(U8T_data_H);Send_Uart0(U8checkdata);Send_Uart0(U8temp);SEI();}}}。
单片机温度湿度控制程序(dht11)
1、温度湿度控制主程序(单片机)#include<reg52.h>#include "dht11.h"#define uchar unsigned char#define uint unsigned intsbit beep=P2^3;sbit k1=P3^2;sbit k2=P3^3;sbit k3=P3^6;sbit k4=P3^7;sbit rs=P3^5;sbit lcden=P3^4;uchar table0[]="T:00.00 TM:00.0 ";//初始化液晶温度实测值以及门限值缓存uchar table1[]="H:00.00 HM:00.0 ";//初始化液晶湿度实测值以及门限值缓存uchar table3[]="This is T/H test";//系统开机显示内容初始化缓存uchar table4[]="Result is coming";//系统开机显示内容初始化缓存static uchar flag;extern int temp_value,humi_value;void Delay_1ms(uint ms);uint TM,HM;void delay(uint x)//{uint a,b;for(a=x;a>0;a--)for(b=10;b>0;b--);}void delay1(uint x)//延时程序{uint a,b;for(a=x;a>0;a--)for(b=100;b>0;b--);}void write_com(uchar com)//液晶写指令操作{P0=com;rs=0;lcden=0;delay(10);lcden=1;delay(10);lcden=0;}void write_date(uchar date)//液晶写数据操作{P0=date;rs=1;lcden=0;delay(10);lcden=1;delay(10);lcden=0;}void init()//液晶初始化{write_com(0x38);delay(1);write_com(0x0c);delay(1);write_com(0x06);delay(1);write_com(0x01);delay(1);}void LCD_Display(uchar buff1[],uchar buff2[])//液晶显示程序{uchar aa;init();//液晶初始化write_com(0x80+16);//写入第一行数据指令delay(1);for(aa=0;aa<16;aa++)//写入第一行待显示数据{write_date(buff1[aa]);}write_com(0xc0+16); //写入第二行数据指令for(aa=0;aa<16;aa++)//写入第一行待显示数据{write_date(buff2[aa]);}for(aa=0;aa<16;aa++){write_com(0x18);delay(1);}}void Tem_Ch(uchar AA,uchar nn)//T门限数值替换{switch(AA){case 0:table0[nn]='0';break;case 1:table0[nn]='1';break;case 2:table0[nn]='2';break;case 3:table0[nn]='3';break;case 4:table0[nn]='4';break;case 5:table0[nn]='5';break;case 6:table0[nn]='6';break;case 7:table0[nn]='7';break;case 8:table0[nn]='8';break;case 9:table0[nn]='9';break;}}void Hum_Ch(uchar BB,uchar mm)//H门限数值替换{switch(BB){case 0:table1[mm]='0';break;case 1:table1[mm]='1';break;case 2:table1[mm]='2';break;case 3:table1[mm]='3';break;case 4:table1[mm]='4';break;case 5:table1[mm]='5';break;case 6:table1[mm]='6';break;case 7:table1[mm]='7';break;case 8:table1[mm]='8';break;case 9:table1[mm]='9';break;}}///////////void YZ_Resh()//门限值更新{uchar A1,A2,A3;A1=TM/10;//取十位A2=TM%10;//取个位A3=0;Tem_Ch(A1,11);//写入对应的液晶显示缓存Tem_Ch(A2,12);//写入对应的液晶显示缓存Tem_Ch(A3,14);//写入对应的液晶显示缓存A1=HM/10;A2=HM%10;A3=0;Hum_Ch(A1,11);Hum_Ch(A2,12);Hum_Ch(A3,14);}void key_test()//按键检测/*根据按键的检测结果进行温度湿度门限值的设定*/{bit kk1;bit kk2;bit kk3;bit kk4;uchar temp;k1=0;k2=1;k3=1;k4=1;kk1=k1;kk2=k2;kk3=k3;kk4=k4;if(kk3!=1){delay1(100);if(kk3!=1)//若可开=0且持续一段时间后任然为0,则执行有关操作{temp=P3;//按键一操作TM=TM+1;//提高温度门限值YZ_Resh();////更新液晶显示缓存的门限值LCD_Display(table0,table1);//液晶显示数值}}if(kk4!=1){delay1(100);if(kk4!=1){temp=P3;//按键二操作TM=TM-1;//降低温度门限值YZ_Resh();////更新液晶显示缓存的门限值LCD_Display(table0,table1);//液晶显示数值}}k1=1;k2=0;k3=1;k4=1;kk1=k1;kk2=k2;kk3=k3;kk4=k4;if(kk3!=1){delay1(100);if(kk3!=1){temp=P3;//按键三操作HM=HM+1;//提高湿度门限YZ_Resh();//更新液晶显示缓存的门限值LCD_Display(table0,table1);//液晶显示数值}}if(kk4!=1){delay1(100);if(kk4!=1){temp=P3;//按键四操作HM=HM-1;//降低湿度门限YZ_Resh();//更新液晶显示缓存的门限值LCD_Display(table0,table1);//液晶显示数值}}}void TempAndHumi_Resh()//更新液晶显示缓存中的温度湿度数值/*根据测得的结果将液晶显示缓存中的数据进行替换*/{uchar ge,shi,bai;ge=temp_value%10;shi=temp_value%100/10;bai=temp_value%1000/100;Tem_Ch(bai,2);Tem_Ch(shi,3);Tem_Ch(ge,5);ge=humi_value%10;shi=humi_value%100/10;bai=humi_value%1000/100;Hum_Ch(bai,2);Hum_Ch(shi,3);Hum_Ch(ge,5);}void beep_control()//警报状态控制函数/*如果实测温度超过门限值则报警*/{if(temp_value>(TM*10)){beep=0;}else{if(humi_value>(HM*10)){beep=0;}else{beep=1;}}}void main(){uint m=0;TM=25;//设定温度初始门限值:25°CHM=50;//设定湿度初始门限值:50%YZ_Resh();//更新液晶显示缓存的门限值beep=1;//关闭蜂鸣器LCD_Display(table3,table4);//显示系统本系统信息while(1){key_test();//监测按键状态,并根据对应按键改变温度湿度门限值,并显示if (m<100)//循环计时,3秒钟{m++;Delay_1ms(30);}else//当m=100时即为3秒时间到,则进行温度湿度数据采集{m=0;ReadTempAndHumi();//采集温度湿度数据TempAndHumi_Resh();//更新液晶显示缓存中的温度湿度数值LCD_Display(table0,table1);//显示当前温度湿度实测值以及门限值}beep_control();//根据门限值以及实测值进行警报状态设置}}#include <reg52.h>#include "dht11.h"#define uchar unsigned char#define uint unsigned int#define NUMBER 20#define SIZE 5sbit dht11=P2^2;static uchar status;static uchar value_array[SIZE];//定义存放DHT11采集的5个字节的数组int temp_value,humi_value;static uchar ReadValue(void);extern void Delay_1ms(uint ms)//毫秒延时,延时时间为ms毫秒{uint x,y;for(x=ms;x>0;x--){for(y=124;y>0;y--);}}static void Delay_10us(void)//10微秒延时{uchar i;i--;i--;i--;i--;i--;i--;}static uchar ReadValue(void)//读一个字节数据的程序{uchar count,value=0,i;status=OK;//设定标志位正常状态for(i=8;i>0;i--){value<<=1;//高位在前进行接收数据count=0;while(dht11==0&&count++<NUMBER);if(count>=NUMBER)//若大于最大数值则出错{status=ERROR;//设定错误标志return 0;//函数执行过程发生错误就退出函数}Delay_10us();//进行30us的延时Delay_10us();Delay_10us();if(dht11!=0)//再次检测是否为高电平{value++;//进入本函数说明信号为1,则进行自加while(dht11!=0&&count++<NUMBER){dht11=1;}if(count>=NUMBER){status=ERROR;return 0;}}}return(value);//返回读取的结果}extern uchar ReadTempAndHumi(void)//读取一次温度湿度数据,共5个字节{uchar i=0,check_value=0,count=0;EA=0;dht11=0;//拉低数据线20msDelay_1ms(20);dht11=1;//释放数据线,以用于检测低电平应答信号Delay_10us();//延时40usDelay_10us();Delay_10us();Delay_10us();if(dht11!=0)//检测应答信号,应答信号为低电平{EA=1;//无低电平。
DHT11温湿度传感器驱动程序
/* 本程序适用于DHT11温湿度传感器由于DHT11使用拉高总线的不同时常来代替0和1 0 28US 1 70us 同时数据送入1602a显示*/#include<reg52.h>#include<intrins.h>#include<math.h>#define Data P0//数据端口sbit RS = P2^4; //Pin4sbit RW = P2^5; //Pin5sbit E = P2^6; //Pin6sbit dat=P1^2;unsigned int shidu_h=0,shidu_l=0,wendu_h=0,wendu_l=0,i,xiaoyan=0;//定义湿度温度变量unsigned char code tab[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//定义1602a显示0-9unsigned int a[16]={0} ;void delayus(unsigned char i) //延时2us{while(--i);}void delayms(unsigned char j) //延时1ms{while(--j){delayus(125);delayus(125);delayus(125);delayus(125);}}/*************************************************** ***************//* 写入命令函数1602 *//*************************************************** ***************/void WriteCommand(unsigned int c){delayms(10);//操作前短暂延时,保证信号稳定代替状态监测E=0;RS=0;_nop_();E=1;Data=c;E=0;}/*************************************************** ***************//* 写入数据函数*//*************************************************** ***************/void WriteData(unsigned char c){delayms(10);;//操作前短暂延时,保证信号稳定E=0;RS=1;RW=0;_nop_();E=1;Data=c;E=0;}/*************************************************** ***************//* 写入字节函数*//*************************************************** ***************/void ShowChar(unsigned char pos,unsigned int c){unsigned char p;if (pos>=0x10)p=pos+0xb0; //是第二行则命令代码高4位为0xc p低两位表示位置显示代码只用DDRAM前16位elsep=pos+0x80; //是第一行则命令代码高4位为0x8 p低两位表示位置显示代码只用DDRAM前16位WriteCommand (p);//写命令写入数据指针确定行中哪一位显示WriteData (c); //写数据}/******************************************************************//* 写入字符串函数*//*************************************************** ***************/void ShowString (unsigned char line,unsigned int *ptr){unsigned char l,i;//l表示行中某一位显示l=line<<4; //L为0x01时左移四位为了与b0H相加变为0xc for (i=0;i<16;i++)ShowChar (l++,*(ptr+i));//循环显示16个字符}/*************************************************** ***************//* 初始化函数*//*************************************************** ***************/void InitLcd(){WriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x06); //显示光标移动位置WriteCommand(0x0c); //显示开及光标设置WriteCommand(0x01); //显示清屏}void main(void){InitLcd(); //初始化LCDdelayms(30);while(1){dat=0;delayms(18);//延时18ms拉低主线dat=1;//主机拉高总线/*delayus(20);*/_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_no p_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_no p_();_nop_();_nop_();_nop_();while(!dat);//判断从机是否相应完毕相应完毕会拉高总线while(dat);//等待从机拉高总线准备开始传送数据while(!dat);//判断是否开始1bit 开始会拉高总线for(i=0;i<8;i++){shidu_h<<=1; //右移1位delayus(14); //延时30us判断是否为1if(dat){shidu_h++;}while(dat);//为一则等待从机拉低总线为零直接跳出while(!dat);//判断是否开始1bit 开始会拉高总线}for(i=0;i<8;i++){delayus(14);shidu_l<<=1;if(dat){shidu_l++;}while(dat);}for(i=0;i<8;i++) {delayus(14); wendu_h<<=1; if(dat){wendu_h++; }while(dat); while(!dat);}for(i=0;i<8;i++) {delayus(14); wendu_l<<=1; if(dat){wendu_l++;}while(dat);}for(i=0;i<8;i++){delayus(14);xiaoyan<<=1;if(dat){xiaoyan++;}while(dat);while(!dat);}{a[0]=tab[(wendu_h)/10]; a[1]=tab[(wendu_h)%10]; a[2]=tab[(shidu_h)/10];a[3]=tab[(shidu_h)%10]; a[4]=tab[xiaoyan/10];a[5]=tab[xiaoyan%10]; ShowString(0,a);}delayms(100);shidu_h=0;wendu_h=0;shidu_l=0;wendu_l=0;xiaoyan=0;}}。
湿度传感实验报告
湿度传感实验报告本实验旨在通过湿度传感器来测量环境中的湿度,并且了解湿度对于环境及人体的影响,以及不同湿度条件下传感器的工作特性。
实验材料:1. Arduino开发板2. DHT11湿度传感器3. 连接线4. 计算机实验步骤:1. 将Arduino开发板连接到计算机,并打开Arduino IDE软件。
2. 将DHT11传感器连接到Arduino开发板。
将传感器的VCC引脚连接到5V 接口,GND引脚连接到GND接口,SIG引脚连接到数字引脚2。
3. 在Arduino IDE软件中,选择正确的开发板和端口,并打开示例代码“DHT11库”中的"DHTtester"程序。
4. 上传程序到Arduino开发板中。
5. 观察串口监视器中的输出结果,获取环境湿度的数值。
实验结果:根据上述实验步骤,可以获得环境湿度的数值。
通过修改代码,可以实时获取湿度数值,并进行相应的处理和显示。
在不同时间段或环境条件下,湿度数值可能会有所变化。
讨论与分析:湿度是空气中水蒸汽含量的度量,它对于环境和人体健康都有一定的影响。
湿度过高时,容易导致空气潮湿,增加了霉菌和细菌滋生的机会,对人体呼吸系统和皮肤有不良影响。
湿度过低时,空气干燥,容易引发皮肤干燥、喉咙疼痛等问题。
因此,对于不同环境中的湿度进行监测十分重要。
DHT11湿度传感器采用数字信号输出,具有快速响应、稳定性好、价格低廉等特点,适用于大多数需要测量湿度的应用。
在实验中,我们可以通过读取传感器输出的数值来判断环境湿度的高低。
在实际应用中,湿度传感器可以广泛应用于温室监控、空调控制、智能家居等领域。
通过湿度传感器的数据,可以实时调节环境湿度,提高生活和工作的舒适度。
结论:通过本实验,我们成功使用DHT11湿度传感器对环境湿度进行了测量,并了解了湿度对于环境及人体的影响。
湿度传感器在实际应用中具有重要作用,可以帮助我们及时了解环境的湿度情况,并采取相应的措施进行调节。
DHT11指导手册说明书
DHT11指导手册说明书一、产品概述1. 温度测量范围:0℃~50℃2. 湿度测量范围:20%RH~90%RH3. 温度测量精度:±2℃4. 湿度测量精度:±5%RH5. 响应时间:≤1秒6. 工作电压:3.3V~5.5V二、产品外观及接线方法1. VCC:电源正极(3.3V~5.5V)2. GND:电源负极3. OUT:数字信号输出接线方法如下:1. 将DHT11的VCC引脚连接至电源正极。
2. 将DHT11的GND引脚连接至电源负极。
3. 将DHT11的OUT引脚连接至您的控制器(如单片机)的数字输入端口。
三、使用注意事项1. 在使用DHT11前,请确保电源电压在规定范围内,以免损坏传感器。
2. 为了提高测量精度,请在安装DHT11时,避免将其暴露在直射阳光下,并保持传感器周围通风良好。
3. DHT11的OUT引脚输出的是数字信号,请确保控制器端的输入端口兼容数字信号。
4. 在长时间运行过程中,请定期检查DHT11的连接线是否牢固,防止因线缆松动导致的测量数据不准确。
DHT11指导手册说明书四、编程与通信协议1. 初始化:在开始通信前,请确保DHT11已经上电,并将控制器的输入端口设置为输入模式。
2. 开始信号:主机(控制器)将数据线拉低至少18毫秒,然后拉高,以唤醒DHT11。
3. DHT11响应:DHT11在检测到开始信号后,会拉低数据线80微秒,作为响应信号,随后拉高数据线80微秒,准备发送数据。
4. 数据接收:DHT11以每bit 50微秒的低电平表示“0”,以每bit 2628微秒的低电平后跟随70微秒的高电平表示“1”。
数据传输顺序为:湿度整数、湿度小数、温度整数、温度小数、校验和。
5. 校验和计算:校验和是前四个字节的简单累加,用于验证数据传输的正确性。
6. 编程示例:下面是一个简单的伪代码示例,用于读取DHT11的数据: void setup() {pinMode(DHT11_PIN, INPUT);}void loop() {int humidity = readDHT11Humidity();int temperature = readDHT11Temperature();// 处理温湿度数据}int readDHT11Humidity() {// 发送开始信号// 接收数据// 返回湿度值}int readDHT11Temperature() {// 发送开始信号// 接收数据// 返回温度值}五、安装与调试1. 安装位置:选择一个适合的环境进行安装,避免高温、高湿或直射阳光的地方,以确保测量准确性。
温湿度一体化传感器DHT11可用程序
/****************************************************************** DHT11.h 的驱动程序。
用于温湿度一体传感器DHT11的驱动程序。
单片机为STC89C52,晶振频率为11.0592MHz。
单线串口,记得不要接到P3口上,会出现未知问题。
口上,会出现未知问题。
的说明书来编程。
时序要求很严格,建议详细参照DHT11的说明书来编程。
*******************************************************************/ #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dht_dat=P1^0; //用哪个I/O口自选,注意不要用P3口uchar dht_t1=0,dht_t2=0; //依次为温度整数部分和温度小数部分依次为温度整数部分和温度小数部分uchar dht_d1=0,dht_d2=0; //依次为湿度整数部分和湿度小数部分依次为湿度整数部分和湿度小数部分uchar dht_chk=0; //和校验,可选择是否使用,具体参照数据手册和校验,可选择是否使用,具体参照数据手册 uchar dht_num=0; //用于while循环中计数,超时则跳出循环循环中计数,超时则跳出循环#ifndef __INF_NEC__ #define __INF_NEC__ extern void dht_delay_10us(); extern void dht_delay_10ms(uchar t); extern uchar dht_readat(); extern void dht_getdat(); extern void dht_init(); #endif void dht_delay_10us() //自己调,一定要尽量精确到10us,很重要,很重要{ uchar i=0; for(i=0;i<1;i++); } void dht_delay_10ms(uchar t) //大概10ms就行,粗略延时就行,粗略延时{ uchar i=0,j=0,k=0; for(i=0;i<t;i++) { for(j=0;j<40;j++)for(k=0;k<75;k++); } } uchar dht_readat() //接收一个8位数据,先高位后低位位数据,先高位后低位{ uchar i=0,dat=0; for(i=0;i<8;i++) { dht_num=2; while((dht_dat==0)&&(dht_num++)); dht_delay_10us();dht_delay_10us();dht_delay_10us();dht_delay_10us(); dat=dat<<1; if(dht_dat==1) { dht_num=2; dat=dat|0x01; while((dht_dat==1)&&(dht_num++)); } } return dat; } void dht_getdat() //给DHT11一个开始信号,然后读取一次数据,共五个8位字节位字节 { uchar i=0; dht_dat=0; dht_delay_10ms(4); dht_dat=1; //单片机给起始脉冲信号单片机给起始脉冲信号dht_delay_10us();dht_delay_10us();dht_delay_10us();dht_delay_10us(); dht_dat=1; //稍作延时,等待DHT11返回响应(响应为低电平)返回响应(响应为低电平) if(dht_dat==0) //有响应才接收数据,否则不作处理有响应才接收数据,否则不作处理{ dht_num=2;while((dht_dat==0)&&(dht_num++)); dht_num=2;while((dht_dat==1)&&(dht_num++)); dht_d1=dht_readat(); dht_d2=dht_readat(); dht_t1=dht_readat(); dht_t2=dht_readat(); dht_chk=dht_readat();//一次读出五个数据一次读出五个数据} dht_dat=1; //释放总线释放总线dht_delay_10ms(10); //稍作延时稍作延时} void dht_init() //DHT11的初始化函数,别忘了写程序时先加上之的初始化函数,别忘了写程序时先加上之{ dht_delay_10ms(100); //DHT11上电前准备时间,大概1s dht_dat=1; //总线准备总线准备} 说明:各位朋友请注意一点,如果用STC89C52系列单片机的话,用单线串口原件与之连接时注意不要接到P3的八个口上。
温湿度检测器DHT11程序及显示程序
附录1:#include <regx52.h>#include <intrins.h>#include "DHT11.H"#include "DHT11.C"unsigned char range[4]={55,75,10,30}; //温湿度上下限初值unsigned char Humi_Temp_Tab[8]={6,9,0,0,7,8,0,0}; //数码管显示初值unsigned char numt1=0; //T1中断计数标志unsigned char numt0=0;unsigned char codeTab_Seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段码 0-9unsigned char code Tab_Dig[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位选第一位到第八位unsigned char code units[4]={0x39,0x71,0x77,0x76}; //单位C/F/RH/**********************************************//* 温湿度采集函数 *//**********************************************/void getdata(){if(start_DHT11()){read_DHT11();}if(check_sum()){Humi_Temp_Tab[0]=DHT_data.DH_H/10;Humi_Temp_Tab[1]=DHT_data.DH_H%10;Humi_Temp_Tab[2]=DHT_data.DH_L/10; //存储湿度数据if(flag == 0){Humi_Temp_Tab[4]=DHT_data.T_H/10;Humi_Temp_Tab[5]=DHT_data.T_H%10;Humi_Temp_Tab[6]=DHT_data.T_L/10;//存储摄氏温度数据}else{Humi_Temp_Tab[4]=(9*DHT_data.T_H/5+32)/10;Humi_Temp_Tab[5]=(9*DHT_data.T_H/5+32)%10;Humi_Temp_Tab[6]=(18*DHT_data.T_H+320)%100%10;//存储华氏温度数据}}}/**********************************************//* 主函数 *//**********************************************/void main(){delay_ms(500); //先进行延时等待进入稳定状态P0 = 0;P1 = 0x0C; //初始化P1口EA = 0;TR1 = 0;TR0 = 0;TMOD = 0x11; //设置定时器 T0和T1,且工作方式都为方式1TH1 = (65536-5000)/256;TL1 = (65536-5000)%256;TH0 = (65536-2000)/256;TL0 = (65536-2000)%256; //设定初值2msTR1 = 1;TR0 = 1;EA = 1;ET0 = 1;ET1 = 1; //打开中断定时器T0和T1PT1 = 0;PT0 = 1; //强制设置优先级delay_ms(1000);while(1){if(DHT_data.DH_H<range[0]) //湿度小于下限{bee = 0;delay_ms(100);bee = 1;delay_ms(100);}if(DHT_data.DH_H>range[1]) //湿度大于上限{bee = 0;delay_ms(100);bee = 1;delay_ms(100);}if(DHT_data.T_H<range[2]) //温度小于下限{bee = 0;delay_ms(10);bee = 1;delay_ms(10);}if(DHT_data.T_H>range[3]) //温度大于上限{bee = 0;delay_ms(10);bee = 1;delay_ms(10);}}}/**********************************************//* 定时器T0中断 *//**********************************************/void T0_timer() interrupt 1{unsigned char KData = 0x00;TR0 = 0; //进入T0后将T0中断关闭TH0 = (65536-2000)/256;TL0 = (65536-2000)%256;switch(numt0){case 0: P0 = 0; Seg_ce = 1; Seg_ce = 0; //段选开关if(flag2 == 1)P0 = Tab_Seg[range[0]/10];//显示湿度下限的十位elseP0 = Tab_Seg[Humi_Temp_Tab[0]];//显示读取的湿度的十位Seg_ce = 1; Seg_ce = 0;.P0 = Tab_Dig[0]; //位选第一位Dig_ce = 1; Dig_ce = 0;numt0++;break;case 1: P0 = 0; Seg_ce = 1; Seg_ce = 0;if(flag2 == 1)P0 = Tab_Seg[range[0]%10];//显示湿度下限的个位elseP0 = Tab_Seg[Humi_Temp_Tab[1]];//显示读取的湿度的个位Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig[1]; //位选第二位Dig_ce = 1; Dig_ce = 0;numt0++;break;case 2: P0 = 0; Seg_ce = 1; Seg_ce = 0;if(flag2 == 1)P0 = Tab_Seg[range[1]/10];//显示湿度上限的十位elseP0 = units[2];//显示单位RSeg_ce = 1; Seg_ce = 0;P0 = Tab_Dig[2]; //位选第三位Dig_ce = 1; Dig_ce = 0;numt0++;break;case 3: P0 = 0; Seg_ce = 1; Seg_ce = 0;if(flag2 == 1)P0 = Tab_Seg[range[1]%10];//显示湿度上限的个位elseP0 = units[3]; //显示单位H Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig[3]; //位选第四位Dig_ce = 1; Dig_ce = 0;numt0++;break;case 4: P0 = 0; Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig[4];//位选第五位,且同时拉低键盘第四行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0; //扫描键盘第四行switch(KData){case 0xfe:case 0xfd:case 0xfb:case 0xf7:default:break;}while(KData != 0xff){KData = P0;}Key_ce = 1;if(flag2 == 1)P0 = Tab_Seg[range[2]/10];//显示温度下限的十位elseP0 = Tab_Seg[Humi_Temp_Tab[4]];//显示读取的温度的十位Seg_ce = 1; Seg_ce = 0;numt0++;break;case 5: P0 = 0; Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig[5];//位选第六位,且同时拉低键盘第三行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0;//扫描键盘第三行switch(KData){case 0xfe:if(range[0]<range[1]&&flag2==1)range[0]++;break; //湿度下限加case 0xfd:if(range[1]<90&&flag2==1)range[1]++;break; //湿度上限加case 0xfb:if(range[2]<range[3]&&flag2==1range[2]++;break; //温度下限加case 0xf7:if(range[3]<50&&flag2==1)range[3]++;break; //温度上限加default:break;}while(KData != 0xff){KData = P0;}Key_ce = 1;if(flag2 == 1)P0 = Tab_Seg[range[2]%10];//显示温度下限的个位elseP0 = Tab_Seg[Humi_Temp_Tab[5]]-0x80; //显示读取温度的个位(带小数点的)Seg_ce = 1; Seg_ce = 0;numt0++;break;case 6: P0 = 0; Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig[6];//位选第七位,且同时拉低键盘第二行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0; //扫描键盘第二行switch(KData){case 0xfe:if(range[0]>20&&flag2==1)range[0]--;break; //湿度下限减case 0xfd:if(range[0]<range[1]&&flag2==1)range[1]--;break; //湿度上限减case 0xfb:if(range[2]>0&&flag2==1)range[2]--;break; //温度下限减case 0xf7:if(range[2]<range[3]&&flag2==1)range[3]--;break; //温度上限减default:break;}while(KData != 0xff){KData = P0;}Key_ce = 1;if(flag2 == 1)P0 = Tab_Seg[range[3]/10];//显示温度上限的十位elseP0 = Tab_Seg[Humi_Temp_Tab[6]];//显示读取温度的小数位的十位Seg_ce = 1; Seg_ce = 0;numt0++;break;case 7: P0 = 0; Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig[7];//位选第八位,且同时拉低键盘第一行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0; //扫描键盘第一行switch(KData){case 0xfe:flag2 = ~flag2;TR1 = ~TR1;break;//进入和退出限制调整模式case 0xfd:flag = ~flag;break;//进行华氏摄氏温度的转换设置case 0xfb:case 0xf7:default:break;}while(KData != 0xff){KData = P0;}Key_ce = 1;if(flag == 0&&flag2 == 0)P0 = units[0]; //显示单位Celse if(flag == 1&&flag2 == 0)P0 = units[1]; //显示单位Felse if(flag2 == 1)P0 = Tab_Seg[range[3]%10];//显示温度上限的个位Seg_ce = 1; Seg_ce = 0;numt0 = 0;break;default:numt0 = 0;break;}TR0 = 1; //打开T0}/**********************************************//* 定时器T1中断 *//**********************************************/void T1_timer() interrupt 3{TR1 = 0; //关闭T0TH1 = (65536-50000)/256;TL1 = (65536-50000)%256;if(numt1 == 25){getdata(); //采集数据numt1 = 0;}elsenumt1++;TR1 = 1; //打开T0}#ifndef __DHT11_h__#define __DHT11_h__#include <REGX52.H>/**********************************************//* 引脚定义 *//**********************************************/sbit DHT_bus = P2^0 ; //DHT11数据传输口sbit Key_ce=P1^3; //按键输出使能sbit Seg_ce=P1^0; //段选位sbit Dig_ce=P1^1; //位选位sbit bee = P2^1; //蜂鸣器控制口/**********************************************//* 函数声明 *//**********************************************/bit start_DHT11(void); //开始void read_DHT11(void); //读取void delay_20us(void); //20us延时void delay_ms(unsigned char m); //N ms延时bit check_sum(void); //和校验/**********************************************//* 宏定义 *//**********************************************/#define HIGH 1#define LOW 0/**********************************************//* 变量定义 *//**********************************************/#define DHT_timeover 5 //高电平维持时间,用于识别“数据0”和“数据1”bit flag2 = 0; //设置调节上下限模式转换标志bit flag=0; //设置摄氏和华氏温度模式转换标志/**********************************************//* 结构体 *//**********************************************/struct DHT_data{unsigned char DH_H; //湿度整数unsigned char DH_L; //湿度小数unsigned char T_H; //温度整数unsigned char T_L; //温度小数unsigned char Checksum; //校验和}DHT_data;#endif#include "DHT11.h"#include <intrins.h>/**********************************************//* 开始 DHT11 温湿度计 *//* 输入:无 *//* 输出:应答标志 0:应答失败 1:应答成功 *//**********************************************/bit start_DHT11(void){bit DHT_start;DHT_start = 0;DHT_bus = HIGH;DHT_bus = LOW; //拉低18ms以上delay_ms(18);TR0 = 0;DHT_bus = HIGH;delay_20us();delay_20us(); //拉高20~40uswhile(!DHT_bus){DHT_start = 1;} //DHT应答,DHT拉低80us后拉高80us,然后开始传输数据//数据(40bit)=8bit湿度整数+8bit湿度小数+8bit温度整数+8bit 温度小数+8bit校验和while(DHT_bus){};return(DHT_start); //应答成功返回1}/**********************************************//* 读取 DHT11 温湿度计 *//* 读取结果存在DHT_data结构体内 *//* 输入:无输出:无 *//**********************************************/void read_DHT11(void){unsigned char m,n,timer_dht;unsigned char *p;p=&DHT_data.DH_H; //数据放在DHT_date的结构体中for(m=0;m<5;m++){for(n=0;n<8;n++){while(~DHT_bus); //DHT拉低12-14us表示1bit数据开始timer_dht=0x00;while(DHT_bus) //随后DHT拉高总线,单片机通过高电平维持的时间判断“数据0”还是“数据1”{ //数据0维持26~28us高电平,数据1维持116~118us高电平timer_dht++; //由于此处对延时时间的长度要求很高,所以采用另一种办法判断}if(timer_dht>DHT_timeover){*p<<=1;*p|=0x01;}else{*p<<=1;*p&=0xfe;}}p++;}TR0 = 1;}/**********************************************//* 20us 精确延时 *//* 51用在12Mhz晶振下 *//* 调用函数使用LCALL和RET指令,共花费4个周期 *//* 因此只有16个NOP *//**********************************************/.void delay_20us(void){_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();}/**********************************************//* N ms 延时 *//* while()额外占用约5周期 *//* 因此内层while(40--)20us 大约1ms *//* Nms延时函数(未测试) *//**********************************************/void delay_ms(unsigned char m){unsigned char n = 38;while(m--){while(n--){delay_20us();}}}/**********************************************//* 校验和判断 *//* 校验位 = 湿度整数位+湿度小数位+温度整数位+温度小数位之和 *//* 校验正确返回:1 失败返回:0 *//**********************************************/bit check_sum(void){if(DHT_data.Checksum==(DHT_data.DH_H+DHT_data.DH_L+DHT_data.T _H+DHT_data.T_L))return(1); //校验正确elsereturn(0); //校验失败}Word 资料。
dht11模块测量温湿度的流程
DHT11模块测量温湿度的流程概述本文将介绍D HT11模块的使用方法,包括连接电路、读取数据的流程以及温湿度的计算方法。
连接电路首先,我们需要将DH T11模块与单片机进行连接。
需要使用3个引脚:V C C、GN D和数据引脚。
具体的连接方式如下:-将DH T11模块的VC C引脚连接到单片机的3.3V或5V电源引脚上。
-将DH T11模块的GN D引脚连接到单片机的地(GN D)引脚上。
-将DH T11模块的数据引脚连接到单片机的任意可用的数字引脚上。
连接完成后,我们可以开始测量温湿度了。
测量温湿度的流程1.初始化在开始测量之前,我们需要对DH T11模块进行初始化。
初始化的步骤包括向D HT11发送一个低电平的信号,并延时至少18毫秒。
这个低电平信号将引导D HT11进入测量模式。
2.接收数据初始化完成后,D HT11模块会将测量到的温湿度数据以串行的形式发送回来。
我们需要准备好接收数据的缓冲区,并准备接收数据的引脚。
3.解析数据接收到数据后,我们需要对它进行解析。
D H T11模块发送的数据包括温度和湿度的整数部分和小数部分。
我们需要按照一定的规则将这些数据进行解析,得到最终的温度和湿度数值。
4.计算温湿度解析完数据后,我们可以根据DH T11模块的计算公式来得到真实的温度和湿度数值。
这个公式在D HT11模块的数据手册中有详细的说明。
5.显示结果最后,我们可以将测量得到的温湿度数据显示在单片机的L CD屏幕上,或者通过串口进行输出。
以上就是使用DH T11模块测量温湿度的完整流程。
通过连接电路、初始化、接收数据、解析数据和计算温湿度,我们可以准确地测量环境中的温度和湿度,为后续的应用提供数据支持。
小结本文介绍了使用D HT11模块测量温湿度的流程。
通过连接电路、初始化、接收数据、解析数据和计算温湿度,我们可以轻松地获取环境的温湿度数据。
这对于许多物联网和环境监测应用来说是非常重要的。
希望通过本文的介绍,你能够更好地理解和应用DH T11模块。
DHT11检测的温湿度控制系统程序
case 0xbd:number=2;break;
case 0xbe:number=3;break;
case 0xd7:number=4;break;
case 0xdb:number=5;break;
case 0xdd:number=6;break;
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit tempAndHumi=P2^0; //温湿传感器数据传输
/*LCD1602液晶显示*/
Delayy_10us();
Delayy_10us();
U8temp=0;
if(tempAndHumi)
U8temp=1;
U8FLAG=2;
while((tempAndHumi)&&U8FLAG++);
if(U8FLAG==1)
break;
U8comdata<<=1;
U8comdata|=U8temp;
void Dis_code()
{ unsigned char num=0;
unsigned char key;
unsigned char j;
unsigned char flag;
init();
write_com(0x80);
{write_data(table2[j]);
//delay_50us(1); //显示温湿字样
基于arduino的dht11温湿度传感器的使用
基于arduino的dht11温湿度传感器的使⽤ DHT11是⼀款有已校准数字信号输出的温湿度传感器。
其精度湿度+-5%RH,温度+-2℃,量程湿度20-90%RH,温度0~50℃。
DHT11数字温湿度传感器是⼀款含有已校准数字信号输出的温湿度复合传感器,它应⽤专⽤的数字模块采集技术和温湿度传感技术,确保产品具有极⾼的可靠性和卓越的长期稳定性。
传感器包括⼀个电阻式感湿元件和⼀个NTC测温元件,并与⼀个⾼性能8位单⽚机相连接。
因此该产品具有品质卓越、超快响应、抗⼲扰能⼒强、性价⽐极⾼等优点。
每个DHT11传感器都在极为精确的湿度校验室中进⾏校准。
校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调⽤这些校准系数。
单线制串⾏接⼝,使系统集成变得简易快捷。
超⼩的体积、极低的功耗,信号传输距离可达 20 ⽶以上,使其成为该类应⽤中,在苛刻应⽤场合的最佳选择。
产品为4针单排引脚封装,连接⽅便。
DHT11温湿度传感器常应⽤于暖通空调、汽车、消费品、湿度调节器、除湿器、医疗、⾃动控制等领域。
DHT11温湿度传感器电⽓特性 温湿度传感器DHT11封装形式及接⼝说明 建议连接线长度短于20⽶时⽤5K上拉电阻,⼤于20⽶时根据实际情况使⽤合适的上拉电阻(若购买的是已集成的模块,模块上已加上拉电阻,以下请忽略),当然,如果你想要精简的话, STC增强型单⽚机⾃带的推挽输出功能不失为⼀个选择,其相当于外接了⼀个2k的上拉电阻,但在设计电路时需注意:整个单⽚机的推荐不超过55mA,即从-VCC流⼊的电流不超过55mA,从MCU-GND流出的电流不超过55mA,整体流⼊、流出电流均不超过55mA,封装尺⼨及典型应⽤电路图如下图所⽰。
DHT11温湿度传感器典型应⽤电路 DHT11温湿度传感器时序图 DHT11温湿度传感器连接图 将DHT11的正极与5V电源接⼝相连,负极与GND相连,中间的数据接⼝与2号引脚相连。
DHT11温湿度测量电路图及程序
PO=Oxff;
PO=table[j/1O];
dula=1;
dula=0;
delay(1);
P0=0xff;
P0=wei[i+1];
wela=1;
wela=0;
P0=0xff;
P0=table[j%10];
dula=1;
dula=0;
delay(1);
}
void mai n()
{
while(1)
}
retur n data_byte;
}
void receive()
uchar T_H,T_L,R_H,R_L,check, num _check;
uchar count;
start();〃开始信号
io=1;
if(!io)〃读取DHT11响应信号
{Байду номын сангаас
coun t=2;
while((!io)&&count++);//DHT11高电平80us是否结束
LLAU
五门
「1H
91啊
N工
frl91
口U
丁】初
廿]利
□□A
0
i
■<■1
II
G
H
ll
J
n
L
他
J
n
9
tod
0
fi
g
p
91
t
阳
J
u
r
IfM
q
fir
c
IJ
6(
i
CtNU
9H—
j
(IND
UK
□L
□9
dht11温湿度模块执行流程
dht11温湿度模块执行流程咱就来说说这个DHT11温湿度模块的执行流程哈。
一、模块简介。
这个DHT11温湿度模块呀,可好玩儿了呢。
它就像一个小小的温湿度侦探,专门负责探测周围环境的温湿度情况。
这个小模块看起来不是很起眼,但本事可不小哦。
它是那种单总线的数字温湿度传感器,这就意味着它和其他设备连接起来很方便,就像两个人简单打个招呼就能开始合作一样。
二、硬件连接。
咱先说说硬件连接这事儿。
你得把DHT11模块和你的主控制器连起来呀,就像是给这个小侦探找个家一样。
一般来说呢,它就三个引脚,一个接电源,一个接地,还有一个就是数据引脚啦。
这个数据引脚可重要了,就像是小侦探和总部联系的专线一样。
连接的时候可得小心点哦,要是接错了,就像你把左脚的鞋子穿到右脚上,肯定是不行的啦。
你得确保每根线都稳稳当当的,这样小模块才能正常工作呢。
三、初始化。
接下来就是初始化啦。
这个就像是给小侦探做个上岗前的准备工作。
在程序里,你要对这个DHT11模块进行初始化设置。
这就好比告诉小侦探,“你要开始工作啦,按照我们的规矩来哦。
”这个初始化的过程呢,就是要把相关的寄存器呀,变量呀什么的都设置好。
比如说,要确定好通信的波特率之类的东西。
要是初始化没做好,小侦探可能就会懵圈,不知道该怎么工作啦。
四、发送请求。
然后呢,就是要向DHT11模块发送请求啦。
这就像是你对小侦探说,“你去看看现在的温湿度是多少呗。
”这个请求的发送可是有讲究的哦。
你得按照特定的时序来发送信号,就像你跟人说话要有礼貌,要有正确的语序一样。
如果时序不对,小模块可能就不理解你的意思,就不会给你反馈温湿度信息啦。
这时候你就得像哄小朋友一样,重新检查下你的请求发送是否正确。
五、接收数据。
发送完请求,就等着接收数据喽。
小侦探接到你的请求后,就会开始工作,然后把它探测到的温湿度数据发回来。
这个接收数据的过程就像是接收小侦探的调查报告一样。
不过呢,这个数据可不是直接就能用的,它是经过编码的。