STM32使用DHT11并将结果输出在七段数码管(proteus仿真)

STM32使用DHT11并将结果输出在七段数码管(proteus仿真)

电路图
STM32使用DHT11并将结果输出在七段数码管(proteus仿真)_第1张图片

步骤一:DHT11 上电后(DHT11 上电后要等待 1S 以越过不稳定状态在此期间不能发送任何指令),测试环境
温湿度数据,幵记录数据,同时 DHT11 的 DATA 数据线由上拉电阻拉高一直保持高电平;此时 DHT11 的
DATA 引脚处于输入状态,时刻检测外部信号。步骤二:微处理器的 I/O 设置为输出同时输出低电平,且低电平保持时间不能小于 18ms,然后微处理器的 I/O
设置为输入状态,由于上拉电阻,微处理器的 I/O 即 DHT11 的 DATA 数据线也随之变高,等待 DHT11 作
出回答信号,发送信号如图所示:
STM32使用DHT11并将结果输出在七段数码管(proteus仿真)_第2张图片
步骤三:DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA
引脚处于输出状态,输出 80 微秒的低电平作为应答信号,紧接着输出 80 微秒的高电平通知外设准备接
收数据,微处理器的 I/O 此时处于输入状态,检测到 I/O 有低电平(DHT11 回应信号)后,等待 80 微秒
的高电平后的数据接收,发送信号如图所示:
STM32使用DHT11并将结果输出在七段数码管(proteus仿真)_第3张图片

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);
 }
	
 

		
  }

你可能感兴趣的:(STM32使用DHT11并将结果输出在七段数码管(proteus仿真))