DHT11對時序要求很嚴格,延時必須準確差異少下面貼上我修改后的代碼
void DHT11WriteStart(void)//開始標志
{
DHT11_GPIO_OUT(); //輸出
gpio_set (DTH11_PORT, 1);
gpio_set (DTH11_PORT, 0);
DELAY_MS(20);
gpio_set (DTH11_PORT, 1);
DELAY_US(30) ;
DHT11_GPIO_IN(); //主機發送信號等待
}
u8 DHT11ReadByte(void)
{
u8 temp=0,i,cout;
for(i=0;i<8;i++)
{
while( gpio_get(DTH11_PORT)==0);//DHT11輸出低電平
DELAY_US(60) ;
if(gpio_get(DTH11_PORT)==1) //60us是否高電平,是標志1
{
while(gpio_get(DTH11_PORT)==1)
temp|=(u8)(0x01<<(7-i));
}
else //否表示0
{
temp&=(u8)~(0x01<<(7-i));
}
}
return temp;
}
char a[5];
int temp;
//時序圖編寫的接受函數
void DHT11Read(void)
{
int count=0;
DHT11WriteStart();
if(DHT11_DATA_IN==0)
{
while(gpio_get(DTH11_PORT)==0);
while(gpio_get(DTH11_PORT) ==1);
DHT11.RH= DHT11ReadByte();
DHT11.RL= DHT11ReadByte();
DHT11.TH= DHT11ReadByte();
DHT11.TL= DHT11ReadByte();
DHT11.sum= DHT11ReadByte();
DHT11_GPIO_OUT();
DHT11_DATA_OUT=1;
}
}
到此結束,剩下的代碼也就很容易的。
本壇也有很多類似的stm32 的DHT11的類似,所以我發了個k60
有什么問題評論區就行了,我看到了就會回復了。
|