#include "sys.h"
#include "delay.h"
#include "dht11.h"
#include "led.h"
u8 temperoture = 0,humiture = 0;
u8 USART_tx_shidu[8]={0x5A,0xA5,0x05,0x82,0x00,0x1B,0x00,0x00} ;
//--------------------------------------------------------
//éèÖÃòy½Åêäèë
void setpin_input(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ê1ÄüUSART1£¬GPIOAê±Öó
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //¸¡¿Õêäèë
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//--------------------------------------------------------
//éèÖÃòy½Åêä3ö
void setpin_output(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ê1ÄüUSART1£¬GPIOAê±Öó
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //íÆíìêä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void DHT11_rst(void)
{
setpin_output(); //êä3öμíμçƽ
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
delay_ms(20); //Öáéù18msμíμçƽ
GPIO_SetBits(GPIOA,GPIO_Pin_5);
delay_us(20);
//GPIO_ResetBits(GPIOA,GPIO_Pin_5);
//GPIO_SetBits(GPIOA,GPIO_Pin_5);
}
//--------------------------------------------------------
//¿aÆôó|′eDÅoÅ
int check_DHT11(void)
{
u8 count = 0,count1=0;
setpin_input(); //êäèëÄ£ê½,DHT11¿aê¼ó|′e
while(( GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)==0 )) //80usμíμçƽ
{
// count1++;
// delay_us(1);
}
while( (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)==1 )&& count < 100) //80us¸ßμçƽ
{
count++;
delay_us(1);
}
if(count == 100 ) //3¬ê±£¬Ïàó|꧰ü
{
return 0;
}
else
{
return 1;
}
}
//--------------------------------------------------------
//¿aÆôó|′eDÅoÅ
int reset_DHT11(void)
{
DHT11_rst();
if(check_DHT11()) return 1;
else return 0;
}
//--------------------------------------------------
//¶áè¡ò»Î»êy¾Y
uint8_t read_bit(void)
{
uint8_t onebit = 0;
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5) == 0); //50usμíμçƽ
delay_us(6);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5) == 1) //50usoó»1êǸßμçƽμÄêÇêy¾Y1
{
onebit = 1;
}
return onebit;
}
//--------------------------------------------------
//¶áè¡êy¾Y
void read_data(void)
{
uint8_t data[5] = {0,0,0,0,0};
u8 i,j,flag;
do
{
flag = reset_DHT11();
}
while(flag != 1); //Ö±μ½Ïàó33é1|
for(i=0;i<5;i++)
{
for(j=0;j<8;j++)
{
data[i] <<= 1; //×óòÆò»Î»
data[i] |= read_bit(); //»ò
}
}
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5) == 0); //DÅoŽáêøμçƽ
setpin_output(); //éèÖÃêä3öģ꽣¬1òÆeDÅoÅÏß
if(data[4] == data[0]+data[1]+data[2]+data[3])
{
humiture = data[0];
temperoture = data[1];
}
delay_us(2);
}
void shidu_change(u8 x,u8 y)
{
USART_tx_shidu[7]=x;
USART_tx_shidu[6]=y;
}
在check_DHT11()这个函数前,主机信号都是正确的,在说明书范围内,但是经过这个函数,到判断语句的时候,判断语句内容也被纳入到主机发送的高电平中了,所以高电平从原来的的20多us直接变到200多us,不知道是不是这个问题,所以不响应。因为我想前面主机信号对,DHT11就直接响应了,后面判断的就不会被算到高电平时间段了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>