用的KEIL5。用的芯片是STM32F103VET6。PCB是自己画的。模块没有问题,在别人板子上测试过。
跑的是例程。我不存在引脚没改对的问题。可能有问题的就是寄存器有没有写对。我用的是C1。如下所示,应该没写错?
#define DHT11_IO_IN() {GPIOC->CRL&=0XFFFFFF0F;GPIOC->CRL|=8<<4;}
#define DHT11_IO_OUT() {GPIOC->CRL&=0XFFFFFF0F;GPIOC->CRL|=3<<4;}程序死在下面。也就是无法检测到模块。
u8 DHT11_Check(void)
{
u8 retry=0;
DHT11_IO_IN();//SET INPUT
while (DHT11_DQ_IN&&retry<100)//DHT11»áà-μí40~80us
{
retry++;
delay_us(1);
};
if(retry>=100)return 1;
else retry=0;
while (!DHT11_DQ_IN&&retry<100)//DHT11à-μíoó»áÔù′Îà-¸ß40~80us
{
retry++;
delay_us(1);
};
if(retry>=100)return 1;
return 0;
}
猜测可能是时序问题,但时序不是模块自带的?我也不会改。
模块没有问题,代码是示例,引脚什么都改了,所以可能是板子的问题?
希望有大佬能看看。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
你好,我试了下您的代码,然后还是不好用。然后我用示波器看波形,原本延迟10ms的,在示波器上延迟100ms。然后我跑了一遍历程,测试了delay,发现还是翻了10倍。最后换了个晶振,好用了。,硬件问题。
给你分享一下:
C文件:
/**
******************************************************************************
* 文件名程: bsp_DHT11.c
* 作 者: Warship
* 版 本: V1.0
* 编写日期: 2019-05-04
* 功 能: DHT11温湿度传感器底层驱动程序
******************************************************************************
*/
/* 包含头文件 ----------------------------------------------------------------*/
#include "bsp_DHT11.h"
#include "delay.h"
/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
#define SAMPLE_TIMES 10
/* 私有变量 ------------------------------------------------------------------*/
uint8_t humidity0,temperature0;
uint8_t humid[SAMPLE_TIMES];
uint8_t tempe[SAMPLE_TIMES];
/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
static void DHT11_Mode_IPU(void);
static void DHT11_Mode_Out_PP(void);
static uint8_t DHT11_ReadByte(void);
/* 函数体 --------------------------------------------------------------------*/
/**
* 函数功能: DHT11 初始化函数
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
void DHT11_Init ( void )
{
DHT11_RCC_PORT=1;
DHT11_Mode_Out_PP();
DHT11_Dout_HIGH(); // 拉高GPIO
}
/**
* 函数功能: 使DHT11-DATA引脚变为上拉输入模式
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
static void DHT11_Mode_IPU(void)
{
My_GPIO_Init(DHT11_PORT, DHT11_PIN, Mode_IPU);
}
/**
* 函数功能: 使DHT11-DATA引脚变为推挽输出模式
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
static void DHT11_Mode_Out_PP(void)
{
My_GPIO_Init(DHT11_PORT, DHT11_PIN, Mode_Out_PP+Speed_50MHz);
}
/**
* 函数功能: 从DHT11读取一个字节,MSB先行
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
static uint8_t DHT11_ReadByte ( void )
{
uint8_t i, temp=0;
for(i=0;i<8;i++)
{
/*每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束*/
while(DHT11_DQ_IN == 0);//等待电平变高
/*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1”,
*通过检测 x us后的电平即可区别这两个状 ,x 即下面的延时
*/
delay_us(40); //延时x us 这个延时需要大于数据0持续的时间即可
if(DHT11_DQ_IN == 1)/* x us后仍为高电平表示数据“1” */
{
while( DHT11_DQ_IN ==1);/* 等待数据1的高电平结束 */
temp|=(uint8_t)(0x01<<(7-i)); //把第7-i位置1,MSB先行
}
else // x us后为低电平表示数据“0”
{
temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行
}
}
return temp;
}
//复位DHT11
void DHT11_Rst(void)
{
/*引脚置为输出模式*/
DHT11_Mode_Out_PP(); //DQ线由MCU控制
/*主机拉低*/
DHT11_Dout_LOW();//MCU向DHT11发出一个至少18ms的低电平作为复位信号
/*延时18ms*/
delay_ms(20);
/*之后将总线拉高,主机延时30us等待响应*/
DHT11_Dout_HIGH(); //DQ=1
delay_us(30); //延时30us
}
/**
* 函数功能: 一次完整的数据传输为40bit,高位先出
* 输入参数: DHT11_DataHT11数据类型
* 返 回 值: ERROR: 读取出错
* SUCCESS:读取成功
* 说 明:8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和
*/
uint8_t DHT11_Get_TempAndHumidity(void)
{
uint8_t temp;
uint16_t humi_temp;
DHT11_Data_TypeDef DHT11_Data;
DHT11_Rst();/*复位DHT11*/
/*主机设为输入 读取DHT11的响应信号*/
DHT11_Mode_IPU();
/*判断从机是否有低电平响应信号 如不响应则返回错误,响应则向下运行*/
if(DHT11_DQ_IN==0) //有低电平响应信号
{
/*轮询直到从机发出 的80us 低电平 响应信号结束*/
while(DHT11_DQ_IN==0);//等待响应信号结束
/*轮询直到从机发出的 80us 高电平 标置信号结束*/
while(DHT11_DQ_IN==1);//等待标置信号结束
/*以上部分,相当于原子的DHT11_Check()函数 */
/*开始接收数据*/
DHT11_Data.humi_high8bit= DHT11_ReadByte();
DHT11_Data.humi_low8bit = DHT11_ReadByte();
DHT11_Data.temp_high8bit= DHT11_ReadByte();
DHT11_Data.temp_low8bit = DHT11_ReadByte();
DHT11_Data.check_sum = DHT11_ReadByte();
/*读取结束,引脚改为输出模式*/
DHT11_Mode_Out_PP();
/*主机拉高*/
DHT11_Dout_HIGH();
/* 对数据进行处理 */
humi_temp=DHT11_Data.humi_high8bit*100+DHT11_Data.humi_low8bit;
humidity0 =(float)humi_temp/100;
humi_temp=DHT11_Data.temp_high8bit*100+DHT11_Data.temp_low8bit;
temperature0=(float)humi_temp/100;
/*检查读取的数据是否正确*/
temp = DHT11_Data.humi_high8bit + DHT11_Data.humi_low8bit +
DHT11_Data.temp_high8bit+ DHT11_Data.temp_low8bit;
if(DHT11_Data.check_sum==temp)
{
return SUCCESS;
}
else
return ERROR;
}
else
return ERROR;
}
uint8_t DHT11_Read_TempAndHumidity(void)
{
static u8 i=0;
u32 temp_val;
u8 t;
if(DHT11_Get_TempAndHumidity() == SUCCESS)
{
humid[i]=humidity0;
tempe[i]=temperature0;
if(++i>=SAMPLE_TIMES) i=0;
}
temp_val=0;
for(t=0;t<SAMPLE_TIMES;t++) temp_val+=humid[t];
humidity = temp_val/SAMPLE_TIMES;
temp_val=0;
for(t=0;t<SAMPLE_TIMES;t++) temp_val+=tempe[t];
temperature = temp_val/SAMPLE_TIMES;
return SUCCESS;
}
一周热门 更多>