Humidity.c部分
#include "stm32f10x.h" // Device header
#include "Delay.h" // Device header
uint16_t i,temperature[5],Flag;
//单总线IO口配置俩种输出模式
void Humidity_Init()//单总线先用推挽输出发送数据
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitTypeStruct;
GPIO_InitTypeStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitTypeStruct.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitTypeStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitTypeStruct);
GPIO_SetBits(GPIOB,GPIO_Pin_11 | GPIO_Pin_12);//默认电平信号高
}
void DHI11_IO_Init()//换成浮空输入 接收数据
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitTypeStruct;
GPIO_InitTypeStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitTypeStruct.GPIO_Pin = GPIO_Pin_11;
GPIO_InitTypeStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitTypeStruct);
GPIO_SetBits(GPIOB,GPIO_Pin_11);//默认电平信号高
}
int Humidity_Start()
{
Humidity_Init();
GPIO_SetBits(GPIOB,GPIO_Pin_11);//拉高信号并且等待响应
Delay_us(2);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);//拉低信号
Delay_ms(20);
GPIO_SetBits(GPIOB,GPIO_Pin_11);//拉高信号并且等待响应
Delay_us(40);
}
uint16_t Get_DATA()//开始接收
{
uint16_t Data;
for(i=0;i<8;++i)//接收一个8bit数据
{
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0);//等待低电平
Delay_us(40);
Data<<=1;//数据左移
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 1)//此时检测到高电平就是1否则0
Data|=0X01;
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 1);//等待高电平过去
}
return Data;
}
uint16_t receive_data()
{
Humidity_Start();
DHI11_IO_Init();
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0)
{
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0);//主机发出信号之后DHT会响应先低电平然后高电平
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 1);//这个时候得先while循环将这个时间段过去
temperature[0] = Get_DATA();
temperature[1] = Get_DATA();
temperature[2] = Get_DATA();
temperature[3] = Get_DATA();
temperature[4] = Get_DATA();
Delay_us(50);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);//拉低信号
Delay_us(50);
GPIO_SetBits(GPIOB,GPIO_Pin_11);//拉高信号并且等待响应
if(temperature[0]+ temperature[1]+ temperature[2]+ temperature[3] == temperature[4])
{
Flag=1;GPIO_ResetBits(GPIOB,GPIO_Pin_12);//拉低信号
}
}
}
uint16_t Get_temperature()
{
return temperature[0] + temperature[1];
}
uint16_t Get_Humidity()
{
return temperature[2] + temperature[3];
}
Humidity.h部分
#ifndef __HUMIDITY_H
#define __HUMIDITY_H
uint16_t Get_temperature();
uint16_t Get_Humidity();
void Humidity_Init();
int Humidity_Start();
uint16_t receive_data();
#endif
Mian函数的部分
#include "stm32f10x.h" // Device header
#include "OLED.h" // Device header
#include "Humidity.h" // Device header
uint16_t Humidity,Temperature;
int main(void)
{
OLED_Init();
OLED_ShowChar(1,1,'A');
while(1)
{
receive_data();
Temperature = Get_temperature();
Humidity = Get_Humidity();
OLED_ShowNum(1,4,Temperature,4);
OLED_ShowNum(2,4,Humidity,4);
}
}
大问题没有,小问题可能存在