调试通过的DHT11程序(在LPC1313--晶振为12Mhz)

注:参考网上程序

调试过程:

单总线对时序要求很苛刻,但凡出现不了结果,十有八九就是延时精度不够,调试调试,关键在于试,要在允许范围之内,大胆尝试

  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     

 

posted @ 2013-10-18 16:40  Iamchritian  阅读(1128)  评论(0编辑  收藏  举报