您好,欢迎访问三七文档
DHT11驱动程序:单片机采用STC12C5A60S2,几个延时函数代码由STC烧录软件自动生成,对于STC其他系列单片机,这些延时函数需要修改。dht11.h文件内容如下:#ifndef__DHT11_H#define__DHT11_H#includereg51.hsbitDHT11_Data=P3^6;#ifndefuchar#defineucharunsignedchar#endif#ifndefuint#defineuintunsignedint#endiftypedefstruct{ucharhumi_int;//湿度的整数部分ucharhumi_deci;//湿度的小数部分uchartemp_int;//温度的整数部分uchartemp_deci;//温度的小数部分ucharcheck_sum;//校验和}DHT11_Data_TypeDef;externuchartemp[5];//DHT11的温度值,前四位为数值,最后一位结束符externucharhumi[5];//DHT11的湿度值,前四位为数值,最后一位结束符staticvoidDelay18ms();//@11.0592MHzstaticvoidDelay30us();//@11.0592MHzstaticvoidDelay40us();//@11.0592MHzstaticucharRead_Byte(void);//从DHT11读取一个字节,MSB先行voidRead_DHT11(void);//读DHT11#endifDht11.c文件内容:#includedht11.h#includeintrins.huchartemp1[5];//DHT11的温度值,前四位为数值,最后一位结束符ucharhumi1[5];//DHT11的湿度值,前四位为数值,最后一位结束符//STC-Y3指令延时18msstaticvoidDelay18ms()//@11.0592MHz{unsignedchari,j,k;_nop_();_nop_();i=1;j=194;k=159;do{do{while(--k);}while(--j);}while(--i);}//STC-Y3指令延时30usstaticvoidDelay30us()//@11.0592MHz{unsignedchari;i=80;while(--i);}//STC-Y3指令延时40usstaticvoidDelay40us()//@11.0592MHz{unsignedchari;_nop_();_nop_();i=107;while(--i);}//从DHT11读取一个字节,MSB先行staticucharRead_Byte(void){uchari,temp=0;for(i=0;i8;i++){/*每bit以50us低电平标置开始,轮询直到从机发出的50us低电平结束*/while(DHT11_Data1==0);/*DHT11以26~28us的高电平表示“0”,以70us高电平表示“1”,*通过检测xus后的电平即可区别这两个状,x即下面的延时*/Delay40us();//延时xus这个延时需要大于数据0持续的时间即可if(DHT11_Data1==1)/*xus后仍为高电平表示数据“1”*/{/*等待数据1的高电平结束*/while(DHT11_Data1==1);temp|=(uchar)(0x01(7-i));//把第7-i位置1,MSB先行}else//xus后为低电平表示数据“0”{temp&=(uchar)~(0x01(7-i));//把第7-i位置0,MSB先行}}returntemp;}//读DHT11_1voidRead_DHT11(void){DHT11_Data_TypeDefdht11;DHT11_Data1=0;//主机拉低Delay18ms();//延时18msDHT11_Data1=1;//总线拉高Delay30us();//延时30us/*判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行*/if(DHT11_Data1==0){/*轮询直到从机发出的80us低电平响应信号结束*/while(DHT11_Data1==0);/*轮询直到从机发出的80us高电平标置信号结束*/while(DHT11_Data1==1);/*开始接收数据*/dht11.humi_int=Read_Byte();dht11.humi_deci=Read_Byte();dht11.temp_int=Read_Byte();dht11.temp_deci=Read_Byte();dht11.check_sum=Read_Byte();/*主机拉高*/DHT11_Data1=1;if(dht11.check_sum==dht11.humi_int+dht11.humi_deci+dht11.temp_int+dht11.temp_deci){temp1[0]=dht11.temp_int/10+'0';//温度的十位temp1[1]=dht11.temp_int%10+'0';//温度的个位temp1[2]='.';//温度小数点temp1[3]=dht11.temp_deci%10+'0';//温度小数点后一位humi1[0]=dht11.humi_int/10+'0';//湿度的十位humi1[1]=dht11.humi_int%10+'0';//湿度的个位humi1[2]='.';//湿度小数点humi1[3]=dht11.humi_deci%10+'0';//湿度小数点后一位}}}
本文标题:DHT11驱动程序
链接地址:https://www.777doc.com/doc-1683059 .html