注:参考网上程序
调试过程:
单总线对时序要求很苛刻,但凡出现不了结果,十有八九就是延时精度不够,调试调试,关键在于试,要在允许范围之内,大胆尝试
1 #define DHT11_EXT 2 #include "includes.h" 3 4 #define NUMBER 50 5 unsigned char status = 1; 6 7 void delay(unsigned int i)//延时函数 8 { 9 while(i--) 10 { 11 __nop(); 12 } 13 14 } 15 16 unsigned char DHT11_Read_Char(void) 17 { 18 unsigned char count,value = 0,i; 19 GPIO0DIR_in(); 20 for(i=8;i>0;i--) 21 { 22 value<<=1; //高位在先 23 count = 0; 24 //每一位数据之前都会有50us的低电平时间,等待50us低电平结束 25 while((!DATA_PIN)&&(count++<NUMBER)); 26 if(count>=NUMBER) 27 { 28 status = 0; 29 return 0; 30 } 31 /********26-28us的高电平为0,70us的高电平为1********/ 32 //while(DATA_PIN); //这里一直都是高电平,则跟下面的延时无关 33 34 delay(45); //延时30us 35 //30--28.7us 36 //35--33.2us 37 //40--37.7us 38 //45--42.2us 39 40 //判断数据线是否还是为高 41 if(DATA_PIN) 42 { 43 value++; 44 //等待剩余的高电平(约40us)结束 45 while((DATA_PIN)&&(count++<(NUMBER+50))); 46 if(count>=(NUMBER+20)) 47 { 48 status = 0; 49 return 0; 50 } 51 //while(DATA_PIN); 52 } 53 } 54 return(value); 55 } 56 57 //-------------------------------- 58 //-----湿度读取子程序 ------------ 59 //-------------------------------- 60 //----以下变量均为全局变量-------- 61 //----温度高8位== U8T_data_H------ 62 //----温度低8位== U8T_data_L------ 63 //----湿度高8位== U8H_data_H------ 64 //----湿度低8位== U8H_data_L------ 65 //----校验 8位 == U8checkdata----- 66 //----调用相关子程序如下---------- 67 //-------------------------------- 68 69 unsigned int DHT11_Read_Humidity(void) 70 { 71 unsigned char i = 0,check_value = 0; 72 unsigned int count = 0; 73 unsigned int temp_value,humi_value_L,humi_value_H,humi_value; 74 unsigned char value_array[5]; 75 GPIO0DIR_out(); 76 DATA0(); 77 delay(22000); //主机拉低(必须大于)18ms ,以保证DHT11能检测到起始信号 78 //20000--18ms 79 //25000--22ms 80 //30000--27ms 81 DATA1(); 82 //总线由上拉电阻拉高 主机延时(20us-40us) 83 //25--23us 84 //30--27us 85 //35--33us 86 //40--37us 87 GPIO0DIR_in(); 88 delay(65); 89 //主机设为输入 判断从机响应信号 90 91 //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 92 if(!DATA_PIN) // 93 { 94 //判断从机是否发出 80us 的低电平响应信号是否结束 95 while((!DATA_PIN)&&(count++<(NUMBER+20))); 96 if(count>=(NUMBER+20)) 97 { 98 return 0; 99 } 100 //while(DATA_BACK_0()); 101 count = 0; 102 //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 103 while((DATA_PIN)&&(count++<(NUMBER+20))); 104 if(count>=(NUMBER+20)) 105 { 106 return 0; 107 } 108 //while(DATA_PIN); 109 // while(!DATA_BACK_0()); 110 /***********读取温度的值*************/ 111 for(i=0;i<5;i++) 112 { 113 value_array[i] = DHT11_Read_Char(); 114 115 if(status == 0) 116 { 117 return 0; 118 } 119 if(i<4) 120 { 121 check_value+=value_array[i]; 122 } 123 } 124 /************************************/ 125 //数据校验 126 if(check_value == value_array[4]) 127 { 128 //将湿度保存起来 129 humi_value_H = value_array[0]; 130 humi_value_L = value_array[1]; 131 humi_value_H<<=8; 132 humi_value = humi_value_H | humi_value_L; 133 } 134 }// 135 return humi_value; 136 } 137