延時時間不對
時序不對
給一個你參考。
- void DHT11_Start()
- {
- DATA=1; //空閑狀態為高電平
- delay_us(2);
- DATA=0; //主機發出開始信號,將總線拉低至少18ms
- delay_ms(20);
- DATA=1; //拉高總線并延時等待20--40us
- delay_us(30);
- }
- uchar Receive_Byte() //讀取一個字節數據
- {
- uchar i,dat;
- for(i=0;i<8;i++)
- {
- while(DATA==0); //等待數據低電平部分過去
- delay_us(8); //延時50us,若DATA還為高電平則為數據1,否則為數據0
- dat<<=1;
- if(DATA==1)
- {
- dat|=0x01;
- }
- while(DATA==1); //等待此幀數據高電平完全過去
- }
- return dat;
- }
- void DHT11_ReadData()
- {
- uchar H1,H2,T1,T2,check,Humanity_H,Humanity_L,Temperature_H,Temperature_L;
- DHT11_Start(); //主機發出開始信號
- if(DATA==0) //DHT11響應信號
- {
- while(DATA==0); //DHT11響應信號,80us
- delay_us(40); //DHT11響應信號,拉高延時80us,準備輸出
- H1=Receive_Byte();
- H2=Receive_Byte();
- T1=Receive_Byte();
- T2=Receive_Byte();
- check=Receive_Byte();
- delay_us(25); //當一次數據傳輸完成后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進入空閑狀態。
- if((H1+H2+T1+T2)==check) //數據檢驗
- {
- Humanity_H=H1;
- Humanity_L=H2;
- Temperature_H=T1;
- Temperature_L=T2;
- }
- DHT11_Data[0]=Humanity_H/10;
- DHT11_Data[1]=Humanity_H%10;
- DHT11_Data[2]=Humanity_L/10;
- DHT11_Data[3]=Humanity_L%10;
- DHT11_Data[4]=Temperature_H/10;
- DHT11_Data[5]=Temperature_H%10;
- DHT11_Data[6]=Temperature_L/10;
- DHT11_Data[7]=Temperature_L%10;
- }
- }
復制代碼
|