void start()//开始信号 { dat=1; delayus(); dat=0; delay2(20);//>18ms dat=1; delayus(); delayus(); delayus(); delayus(); } uchar receive_byte()// { uchar i,temp,count; for(i=0;i<8;i++) { count=2; while((!dat)&&count++)//等待50us低电平结束 temp=0; delayus();delayus();delayus();delayus(); if(dat==1)temp=1; count=2; while((dat)&&count++); if(count==1)break; data_byte<<=1; data_byte|=temp; } return data_byte; } void receive()//接收数据 { uchar T_H,T_L,R_H,R_L,check,num_check; uchar count; start(); //开始信号 delayus(); delayus(); dat=1; if(!dat) //读取DHT11响应信号 { count=2; while((!dat)&&count++);//DHT11高电平80us是否结束 count=2; while((dat)&&count++); R_H=receive_byte(); R_L=receive_byte(); T_H=receive_byte(); T_L=receive_byte(); check=receive_byte(); dat=0; //拉低延时50us delayus(); delayus(); delayus(); delayus(); delayus(); dat=1; num_check=R_H+R_L+T_H+T_L; if(num_check=check) { RH=R_H; RL=R_L; TH=T_H; TL=T_L; check=num_check; } } } void DHT11_using() { uchar a; LED1=0; receive(); for(a=0;a<20;a++) //RH是和data1相互对应的(湿度);TH是和data2相互对应的(温度) { LCD_disp_char(2,1,table[RH/10]); // delayus(); LCD_disp_char(3,1,table[RH%10]); // delayus(); LCD_disp_char(5,1,table[TL%10]); // delayus(); LCD_disp_char(2,2,table[TH/10]); // delayus(); LCD_disp_char(3,2,table[TH%10]); // delayus(); LCD_disp_char(5,2,table[TL%10]); // delayus(); } LED1=1; }