DHT11.c
void GPIO_OD_MODE(void)
{
PRCMPeripheralClkEnable(PRCM_GPIOA1,PRCM_RUN_MODE_CLK);
PinModeSet(PIN_01, PIN_MODE_0);
PinConfigSet(PIN_01,PIN_STRENGTH_2MA,PIN_TYPE_OD_PU); //设置电流驱动能力 2ma ,上拉
GPIODirModeSet(GPIOA1_BASE,GPIO_PIN_2,GPIO_DIR_MODE_OUT); //设置成 GPIO 输出模式,
}
void GPIO_IN_MODE(void)
{
PRCMPeripheralClkEnable(PRCM_GPIOA1,PRCM_RUN_MODE_CLK);
PinModeSet(PIN_01, PIN_MODE_0);
PinConfigSet(PIN_01,PIN_STRENGTH_2MA,PIN_TYPE_ANALOG); //设置电流驱动能力 2ma ,上拉
GPIODirModeSet(GPIOA1_BASE,GPIO_PIN_2,GPIO_DIR_MODE_IN);
}
void DHT11_Start()
{
GPIO_OD_MODE();
GPIOPinWrite(GPIOA1_BASE,GPIO_PIN_2,0);
delayus(20000,80);
GPIOPinWrite(GPIOA1_BASE,GPIO_PIN_2,GPIO_PIN_2);
delayus(25,80);
}
unsigned char DHT11_ReceiveByte()
{
unsigned int i,Temp,Count;
unsigned int Data_Byte=0;
for(i=0;i<8;i++)
{
Count= 2;
GPIO_IN_MODE();
while((!GPIOPinRead(GPIOA1_BASE,GPIO_PIN_2))&&(Count++)); //每发送一个数据前都要发送一个低电平
Temp= 0;
delayus(40,80);
GPIO_IN_MODE();
if(GPIOPinRead(GPIOA1_BASE,GPIO_PIN_2)==1)
{
Temp= 1;
//Count= 2;
//GPIO_IN_MODE();
//while(GPIOPinRead(GPIOA1_BASE,GPIO_PIN_2)&&(Count++));
}
//if(Count==1)
//break;
Data_Byte<<= 1;
Data_Byte|=Temp;
}
return Data_Byte;
}
void DHT11_ReceiveData()
{
unsigned int Count= 2;
DHT11_Start();
//GPIO_OD_MODE();
//GPIOPinWrite(GPIOA1_BASE,GPIO_PIN_2,GPIO_PIN_2);
GPIO_IN_MODE();
if(!GPIOPinRead(GPIOA1_BASE,GPIO_PIN_2)) //如果接受到响应信号
{
Count= 2;
while(!GPIOPinRead(GPIOA1_BASE,GPIO_PIN_2)&&Count++); //拉高延时 准备输出
//Count= 2;
//while(GPIOPinRead(GPIOA1_BASE,GPIO_PIN_2)&&Count++);
Hum_H=DHT11_ReceiveByte();
Hum_l=DHT11_ReceiveByte();
Tem_H=DHT11_ReceiveByte();
Tem_L=DHT11_ReceiveByte();
Check=DHT11_ReceiveByte();
GPIO_OD_MODE();
GPIOPinWrite(GPIOA1_BASE,GPIO_PIN_2,GPIO_PIN_2);
}
}
gaoyang9992006:
时序不对,你可以找个51上的程序,修改。还有能写成宏的都写宏定义的形式,程序可读性更强。
zi hang xv:
回复 gaoyang9992006:
我按照手册上面的时序进行的 ,而且调试了一段时间 请问可以指点 哪里有问题吗?