中级会员
 
- 积分
- 229
- 金钱
- 229
- 注册时间
- 2015-7-22
- 在线时间
- 44 小时
|
5金钱
我用的是mini版的STM32,DHT11温湿度模块的应用,不知道为什么,LCD上显示的温湿度一直都是12,没有任何的 变化,求帮助
第一个文件是DHT.c文件
#include "dht11.h"
#include "delay.h"
//复位DHT11
void DHT11_Rst(void)
{
DHT11_IO_OUT(); //SET OUTPUT
DHT11_DQ_OUT=0; //拉低DQ
delay_ms(20); //拉低至少18ms
DHT11_DQ_OUT=1; //DQ=1
delay_us(30); //主机拉高20~40us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
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拉低后会再次拉高40~80us
{
retry++;
delay_us(1);
};
if(retry>=100)return 1;
return 0;
}
//从DHT11读取一个位
//返回值:1/0
u8 DHT11_Read_Bit(void)
{
u8 retry=0;
while(DHT11_DQ_IN&&retry<100)//等待变为低电平
{
retry++;
delay_us(1);
}
retry=0;
while(!DHT11_DQ_IN&&retry<100)//等待变高电平
{
retry++;
delay_us(1);
}
delay_us(40);//等待40us
if(DHT11_DQ_IN)return 1;
else return 0;
}
//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)
{
u8 i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 buf[5];
u8 i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)//读取40位数据
{
buf=DHT11_Read_Byte();
}
if(((buf[0]+buf[1]+buf[2]+buf[3])&0xff)==buf[4])
{
*humi=buf[0];
*temp=buf[2];
}
}else return 1;
return 0;
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在
u8 DHT11_Init(void)
{
RCC->APB2ENR|=1<<8; //使能PORTD口时钟
RCC->APB2ENR|=1<<5; //使能PORTD口时钟
GPIOD->CRL&=0XFFFFF0FF;//PORTD.2 推挽输出
GPIOD->CRL|=0X00000300;
GPIOD->ODR|=1<<2; //输出1
DHT11_Rst();
return DHT11_Check();
}
下面的文件是DHT.H文件
#ifndef __DHT11_H
#define __DHT11_H
#include "sys.h"
//IO方向设置
#define DHT11_IO_IN() {GPIOC->CRL&=0XFFFFF0FF;GPIOC->CRL|=8<<3;}
#define DHT11_IO_OUT() {GPIOC->CRL&=0XFFFFF0FF;GPIOC->CRL|=3<<8;}
////IO操作函数
#define DHT11_DQ_OUT PCout(6) //数据端口 PC6
#define DHT11_DQ_IN   Cin(6) //数据端口 PC6
u8 DHT11_Init(void); //初始化DHT11
u8 DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度
u8 DHT11_Read_Byte(void); //读出一个字节
u8 DHT11_Read_Bit(void); //读出一个位
u8 DHT11_Check(void); //检测是否存在DHT11
void DHT11_Rst(void); //复位DHT11
#endif
最后一个文件是main.c文件的主函数
int main(void)
{
u8 t=0;
u8 temperature;
u8 humidity;
// Stm32_Clock_Init(9); //系统时钟设置
uart_init(9600); //串口初始化为9600
delay_init(); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
LCD_Init();
DHT11_Init(); //初始化LCD
// usmart_dev.init(72); //初始化USMART
// KEY_Init(); //按键初始化
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(60,50,200,16,16,"WarShip STM32");
LCD_ShowString(60,70,200,16,16,"DHT11 TEST");
LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(60,110,200,16,16,"2012/9/12");
while(!DHT11_Init())//HT11初始化
{
LCD_ShowString(60,130,200,16,16,"DHT11 Error");
delay_ms(200);
LCD_Fill(60,130,239,130+16,WHITE);
delay_ms(200);
}
LCD_ShowString(60,130,200,16,16,"DHT11 OK");
  OINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,150,200,16,16,"Temp: C");
LCD_ShowString(60,170,200,16,16,"Humi: %");
while(1)
{
if(t%10==0)//每100ms读取一次
{
DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
LCD_ShowNum(60+40,150,temperature ,2,16);
LCD_ShowNum(60+40,170,humidity,2,16); //显示湿度
}
delay_ms(10);
t++;
if(t==20)
{
t=0;
LED0=!LED0;
}
}
}
|
最佳答案
查看完整内容[请看2#楼]
程序太长,没有细看,给你建议如下:
1.对照下时序图,一般这个传感器还有DS18B20出不来数据,都是时序没对上,你可以调的精准一点,因为你用的是STM32,滴答计时器的延时是很准确的。
2.你可以线不要屏幕显示,先从串口出来,用PC的串口调试助手看看你的数据是不是对的。调通了在加LCD。
3.DHT11的程序网上到处是,基于51的,好多好多,可以对照一下,是不是少了什么,流程对不对。然后单步调试看看,为什么你的都是12.
4.dht11和 ...
|