温湿度传感器代码问题
-
代码如下:
#define DHT11_IO_OUT() {GPIO_REG(GPIO_OUTPUT_EN) |=(0x01<<D7);}
#define DHT11_IO_IN() {GPIO_REG(GPIO_INPUT_EN) |= (0x01<<D7);}#define DHT11_DQ_IN1 GPIO_REG(GPIO_INPUT_VAL)>>D7
#define DHT11_DQ_IN DHT11_DQ_IN1 & 0x00000001void delay_ms(uint32_t times);
void delay_us(uint32_t times);void GPIO_SET(uint32_t pin_num,uint32_t pin_val,uint32_t pin_model);
void Dht11Trig(void){DHT11_IO_OUT(); GPIO_REG(GPIO_OUTPUT_VAL)&=~(0x01<<D7); delay_ms(20); GPIO_REG(GPIO_OUTPUT_VAL) |=(0x01<<D7); delay_us(18);
}
uint8_t Dht11Check(void){
uint8_t retry=0;DHT11_IO_IN(); while((GPIO_REG(GPIO_INPUT_VAL) >> D7 & 0x00000001==0)&&retry<100){ retry++; delay_us(1); } if(retry>=100) return 1; while((GPIO_REG(GPIO_INPUT_VAL)>>D7&0x00000001!=0)&&retry<100){ retry++; delay_us(1); } if(retry>=100) return 1; return 0;
}
uint8_t Dht11ReadBit(void){
uint8_t retry=0;
uint8_t i=0;
//等待变为低电平
while((GPIO_REG(GPIO_INPUT_VAL)>>D7&0x00000001==0)&&retry<100){
retry++;
delay_us(1);
}//等待变为高电平 while((GPIO_REG(GPIO_INPUT_VAL)>>D7&0x00000001!=0)&&i<100){ i++; delay_us(1); } delay_us(40); if(GPIO_REG(GPIO_INPUT_VAL)>>D7&0x00000001!=0) return 1; return 0;
}
uint8_t Dht11ReadByte(void){
uint8_t i,dat;
dat=0;
for(i=0;i<8;i++){
dat<<=1;
dat|=Dht11ReadBit();
}
return dat;
}void delay_ms(uint32_t t){
uint32_t i=0;for(i=0;i<t;i++){ delay_us(1000); }
}
void delay_us(uint32_t cnt)
{
uint32_t i = 0;cnt *= 16; for (i = 0; i < cnt; i++) __asm__ __volatile__ ("nop");
}
int main(int argc, char **argv)
{Dht11Trig(); uint8_t * temp; uint8_t *humi; uint8_t dat; uint8_t buf[5]; uint8_t i; if(Dht11Check()==0){ for(i=0;i<5;i++){ buf[i]=Dht11ReadByte(); printf(" buf[i] %d\n",buf[i]); } if(buf[0]+buf[1]+buf[2]+buf[3]==buf[4]){ *humi=buf[0]; *temp=buf[2]; printf(" tem %d humi %d\n",&temp,&humi); } } else printf("Error");
return 0;
}
—————————————————————————————————————————
传感器上的数据口我把它连接到了开发板的D7上,D7是一个inout型的IO口,在给D7一个触发信号后检测D7口电平信号的变化来实现温湿度传感器的数据采集,但现在好像无法采集到数据,麻烦各位大佬给菜鸟解惑,感谢!
-
@voil 精确延时还是要看板子的吧
-
@si 复制这一段代码,提示“Delay”已被定义,请问该怎么解决,我现在可以初始化dht11,但是无法读取数据,请问DHT11会有相关的例程吗?
该如何得到一个精确的延时?我写的微妙延时函数,1us得到的实际效果在1us-2us之间波动。
-
@chshwei
--把微秒延时函数改成这样,cpu是16Mhz,一条指令的时间是1/16us,然后得出一个较为准确的时间。但是现在读传感器的读数不正确
void delay_us(uint32_t cnt){
asm("lw a5,-20(s0)\n\t"
"li a4,8\n\t"
"mul a5,a5,a4\n\t"
"li a4,0\n\t"
"Delay: addi a5,a5,-1\n\t"
"bne a5,a4,Delay\n\t");
}
-
This post is deleted!
-
This post is deleted!
-
请问有没有验证delay_us的准确性?