步骤一:DHT11 上电后(DHT11 上电后要等待 1S 以越过不稳定状态在此期间不能发送任何指令),测试环境
温湿度数据,幵记录数据,同时 DHT11 的 DATA 数据线由上拉电阻拉高一直保持高电平;此时 DHT11 的
DATA 引脚处于输入状态,时刻检测外部信号。步骤二:微处理器的 I/O 设置为输出同时输出低电平,且低电平保持时间不能小于 18ms,然后微处理器的 I/O
设置为输入状态,由于上拉电阻,微处理器的 I/O 即 DHT11 的 DATA 数据线也随之变高,等待 DHT11 作
出回答信号,发送信号如图所示:
步骤三:DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA
引脚处于输出状态,输出 80 微秒的低电平作为应答信号,紧接着输出 80 微秒的高电平通知外设准备接
收数据,微处理器的 I/O 此时处于输入状态,检测到 I/O 有低电平(DHT11 回应信号)后,等待 80 微秒
的高电平后的数据接收,发送信号如图所示:
int main(void)
{
//?????????
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
GPIO_InitTypeDef GPIO_InitStruct = {0};
//端口初始化
HAL_GPIO_WritePin(GPIOB, 1, 0);
HAL_GPIO_WritePin(GPIOB, 4, 0);
HAL_GPIO_WritePin(GPIOB, 8, 0);
HAL_GPIO_WritePin(GPIOB, 32, 0);
HAL_GPIO_WritePin(GPIOA, 1, 1);
int num[10][8]={{0,0,1,1,1,1,1,1},{0,0,0,0,0,1,1,0},{0,1,0,1,1,0,1,1},
{0,1,0,0,1,1,1,1},{0,1,1,0,0,1,1,0},{0,1,1,0,1,1,0,1},
{0,1,1,1,1,1,0,1},{0,0,0,0,0,1,1,1},{0,1,1,1,1,1,1,1},{0,1,1,0,1,1,1,1}};
//int data[8];
/* Infinite loop */
/* USER CODE BEGIN WHILE */
int t[8];//温度的二进制
int h[8];//湿度的二进制
while (1)
{
//先设置pa端口为输出
GPIO_InitStruct.Pin = 1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
//启动PA端口
HAL_GPIO_WritePin(GPIOA, 1, 0);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOA, 1, 1);
//将pa口设置为输入读取数据
GPIO_InitStruct.Pin = 1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
//检测是否启动
while(HAL_GPIO_ReadPin(GPIOA,1)==0);
while(HAL_GPIO_ReadPin(GPIOA,1)==1);
//启动后开始接收数据
int t[8];//温度的二进制
int h[8];//湿度的二进制
int time=0;
int flag=-1;
for(int i=0;i<24;i++)
{
while(HAL_GPIO_ReadPin(GPIOA, 1)==0);
while(HAL_GPIO_ReadPin(GPIOA, 1)==1)
{
time++;
}
if(i<8)
{
if(time>10)
h[i]=1;
else
h[i]=0;
}
else if(i>15)
{
flag++;
if(time>10)
t[flag]=1;
else
t[flag]=0;
}
time=0;
}
//将数据转化
int H=0;int T=0;
int temp=1;
//求湿度
for(int i=0;i<8;i++)
{
H+=temp*h[7-i];
temp*=2;
}
temp=1;
//求温度
for(int i=0;i<8;i++)
{
T+=temp*t[7-i];
temp*=2;
}
//将个位数和十位数分离开来
int a=0,b=0,c=0,d=0;
b=H%10;//求出湿度个位
a=H/10;//湿度十分位
d=T%10;//温度个位
c=T/10;//温度十分位
//湿度显示
for(int i=0;i<8;i++)
{
HAL_GPIO_WritePin(GPIOB, 2, num[a%10][i]);
HAL_GPIO_WritePin(GPIOB, 1, 1);
HAL_GPIO_WritePin(GPIOB, 1, 0);
}
HAL_GPIO_WritePin(GPIOB, 4, 1);
HAL_GPIO_WritePin(GPIOB, 4, 0);
for(int i=0;i<8;i++)
{
HAL_GPIO_WritePin(GPIOB, 16, num[b%10][i]);
HAL_GPIO_WritePin(GPIOB, 8, 1);
HAL_GPIO_WritePin(GPIOB, 8, 0);
}
HAL_GPIO_WritePin(GPIOB, 32, 1);
HAL_GPIO_WritePin(GPIOB, 32, 0);
//温度显示
for(int i=0;i<8;i++)
{
HAL_GPIO_WritePin(GPIOC, 2, num[c%10][i]);
HAL_GPIO_WritePin(GPIOC, 1, 1);
HAL_GPIO_WritePin(GPIOC, 1, 0);
}
HAL_GPIO_WritePin(GPIOC, 4, 1);
HAL_GPIO_WritePin(GPIOC, 4, 0);
for(int i=0;i<8;i++)
{
HAL_GPIO_WritePin(GPIOC, 16, num[d%10][i]);
HAL_GPIO_WritePin(GPIOC, 8, 1);
HAL_GPIO_WritePin(GPIOC, 8, 0);
}
HAL_GPIO_WritePin(GPIOC, 32, 1);
HAL_GPIO_WritePin(GPIOC, 32, 0);
//------------------------------------
GPIO_InitStruct.Pin = 1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA, 1, 1);
HAL_Delay(500);
}
}