想要在HC32F640PEBT上使用DHT11温湿度模块来检测温湿度,但是板子一直检测不到DHT11模块的存在,是否是我的串口配置代码或者是DHT11驱动代码有问题?网上关于HC32F640PEBT的资料有点少 我找不到类似的案例。
以下为引脚配置
#define DHT11_PORT (PortC)
#define DHT11_PIN (Pin05)
#define DHT11_D0_H PORT_SetBits(DHT11_PORT,DHT11_PIN)//输出高电平
#define DHT11_D0_L PORT_ResetBits(DHT11_PORT,DHT11_PIN)//输出低电平
#define DHT11_D0_R PORT_GetBit(DHT11_PORT,DHT11_PIN)
以下为DHT11引脚驱动代码
void DHT11_IO_IN(void)
{ // Device header
stc_port_init_t stcPortInit;
MEM_ZERO_STRUCT(stcPortInit);
stcPortInit.enPinMode = Pin_Mode_In;
stcPortInit.enExInt = Enable;
stcPortInit.enPullUp = Disable;
PORT_Init(DHT11_PORT,DHT11_PIN, &stcPortInit);
}
void DHT11_IO_OUT(void)
{
stc_port_init_t stcPortInit;
MEM_ZERO_STRUCT(stcPortInit);
stcPortInit.enPinMode = Pin_Mode_Out;
stcPortInit.enExInt = Enable;
stcPortInit.enPullUp = Enable;
PORT_Init(DHT11_PORT,DHT11_PIN, &stcPortInit);
}
//初始化DHT11
uint8_t DHT11_Init(void)
{
stc_port_init_t stcPortInit;
MEM_ZERO_STRUCT(stcPortInit);
stcPortInit.enPinMode = Pin_Mode_Out;
stcPortInit.enExInt = Enable;
stcPortInit.enPullUp = Enable;
PORT_Init(DHT11_PORT,DHT11_PIN, &stcPortInit);
DHT11_Rst();
return DHT11_Check();
}
void DHT11_Rst(void)
{
DHT11_IO_OUT(); //SET OUTPUT
DHT11_D0_L; //拉低DQ
Ddl_Delay1ms(20); //拉低至少18ms
DHT11_D0_H; //DQ=1
Ddl_Delay1us(30); //主机拉高2040us80us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
uint8_t DHT11_Check(void)
{
uint16_t retry=0;
DHT11_IO_IN();//SET INPUT
while (DHT11_D0_R&&retry<100)//DHT11会拉低40
{
retry++;
Ddl_Delay1us(1);
}
if(retry>=100)return 1;
else retry=0;
while (!DHT11_D0_R&&retry<100)//DHT11拉低后会再次拉高40~80us
{
retry++;
Ddl_Delay1us(1);
}
//i=DHT11_D0_R;
//while(i);
if(retry>=100)return 1;
return 0;
}