#include "stm32f10x.h" // Device header
#include "delay.h"
#include "DHT11.h"
#include "OLED.h"
uint8_t temp;
uint8_t humi;
int main(void)
{
OLED_Init();
DHT11_IO_OUT();
DHT11_IO_IN();
DHT11_Init();
while(1)
{
DHT11_Read_Data(&temp,&humi);
OLED_ShowNum(1,1,temp,4);
OLED_ShowNum(2,1,humi,4);
}
}
#include "stm32f10x.h" // Device header
#include "DHT11.h"
#include "delay.h"
#define DHT11_PORT GPIOA
#define DHT11_IO GPIO_Pin_7
#define DHT11_RCC RCC_APB2Periph_GPIOA
void DHT11_IO_OUT(void)//输出
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(DHT11_RCC ,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=DHT11_IO;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(DHT11_PORT,&GPIO_InitStructure);
}
void DHT11_IO_IN(void)//输入
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(DHT11_RCC ,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=DHT11_IO;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(DHT11_PORT,&GPIO_InitStructure);
}
void DHT11_RST(void){
DHT11_IO_OUT();
GPIO_ResetBits(DHT11_PORT,DHT11_IO);//主机控制总线,拉低电平,大于18us给从机开始信号
Delay_us(20);
GPIO_SetBits(DHT11_PORT,DHT11_IO);//再拉高总线,等待从机信号
Delay_us(30);
GPIO_ResetBits(DHT11_PORT,DHT11_IO);
}
uint8_t DHT11_Check(void){//检查从机
uint8_t retry;
DHT11_IO_IN();//输入
while((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 0) && retry <100)//如果主机读取高电平或是retry小于100循环,这里是在等待从机应答,等待低电平
{
retry++;
Delay_us(1);
}
if(retry>=100)return 0;
else retry=0;
while ((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO)==1) && retry<100)//这时候从机应答,但是要持续大于80us,之后要拉高DHT80us再开始传输数据
{
retry++;
Delay_us(1);
}
if(retry>=100)return 0;
return 1;
}
uint8_t DHT11_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(DHT11_RCC,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=DHT11_IO;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(DHT11_PORT,&GPIO_InitStructure);
DHT11_RST();
return DHT11_Check();
}
static uint8_t DHT_Read_Bit(void)
{
uint8_t retry = 0;
while((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 1) && retry <100)//等待变为低电平
{
retry++;
Delay_us(1);
}
retry = 0;
while((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 0) && retry <100)//等待变为高电平
{
retry++;
Delay_us(1);
}
Delay_us(40);//等待40us
if(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 1)
return 1;
else
return 0;
}
uint8_t DHT_Read_Byte(void)
{
uint8_t i,dat;
dat = 0;
for(i = 0;i < 8; i++)
{
dat <<= 1;
dat |= DHT_Read_Bit();
}
return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值为(范围:20%~90%)
//返回值:0,正常;1,读取失败
uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)
{
uint8_t i;
uint8_t buf[5];
DHT11_RST();
if(DHT11_Check() == 1)
{
for(i= 0;i < 5;i++)
{
buf[i] = DHT_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi = buf[0];
*temp = buf[2];
}
}
else return 1;
return 0;
}
为什么我的OLED都显示0000