温湿度传感器代码问题



  • 代码如下:

    #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 & 0x00000001

    void 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的准确性?


Log in to reply