在洋桃电子第86步中DHT11一节中,烧录源代码会出现温湿度读取以及初始化错误的情况,因此对代码做如下修改
在main函数中,第一个延时delay增加到2000ms
完整代码如下
int main (void)
{//主程序
u8 b[2];
delay_ms(2000); //上电时等待其他器件就绪
RCC_Configuration(); //系统时钟初始化
RELAY_Init();//继电器初始化
I2C_Configuration();//I2C初始化
OLED0561_Init(); //OLED初始化
OLED_DISPLAY_8x16_BUFFER(0," YoungTalk "); //显示字符串
OLED_DISPLAY_8x16_BUFFER(2," DHT11 TEST "); //显示字符串
if(DHT11_Init()==0){ //DHT11初始化 返回0成功,1失败
OLED_DISPLAY_8x16_BUFFER(4,"Humidity: % "); //显示字符串
OLED_DISPLAY_8x16_BUFFER(6,"Temperature: C"); //显示字符串
}else{
OLED_DISPLAY_8x16_BUFFER(4,"DHT11INIT ERROR!"); //显示字符串
}
delay_ms(1000);//DHT11初始化后必要的延时(不得小于1秒)
while(1){
if(DHT11_ReadData(b)==0)
{//读出温湿度值 指针1是湿度 20~90%,指针2是温度 0~50C,数据为十进制
OLED_DISPLAY_8x16(4,9*8,b[0]/10 +0x30);//显示湿度值
OLED_DISPLAY_8x16(4,10*8,b[0]%10 +0x30);//
OLED_DISPLAY_8x16(6,12*8,b[1]/10 +0x30);//显示温度值
OLED_DISPLAY_8x16(6,13*8,b[1]%10 +0x30);//
}
else{
OLED_DISPLAY_8x16_BUFFER(6,"DHT11READ ERROR!"); //显示字符串
}
delay_ms(1000); //延时,刷新数据的频率(不得小于1秒)
}
}
其次对DHT11.C中的Dht11_Check做如下修改
u8 Dht11_Check(void)
{ //等待DHT11回应,返回1:未检测到DHT11,返回0:成功(IO接收)
u16 retry=0;
DHT11_IO_IN();//IO到输入状态
while (GPIO_ReadInputDataBit(DHT11PORT,DHT11_IO)&&retry<100){//DHT11会拉低40~80us
retry++;
delay_us(2);
}
if(retry>=200)return 1; else retry=0;
while (!GPIO_ReadInputDataBit(DHT11PORT,DHT11_IO)&&retry<100){//DHT11拉低后会再次拉高40~80us
retry++;
delay_us(2);
}
if(retry>=200)return 1;
return 0;
}