基于I2C硬件协议的AHT20温湿度数据采集

本文介绍了基于STM32的硬件I2C协议与AHT20温湿度传感器的结合应用。首先,解释了硬件I2C与软件I2C的区别,强调硬件I2C在效率和灵活性上的特点。接着,详细描述了连接AHT20传感器的过程和代码修改,以及实验中通过吹气改变传感器读数验证实验成功的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于I2C硬件协议的AHT20温湿度数据采集

一、简介

1.1 IIC
所谓硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的;软件I2C一般是用GPIO管脚,用软件控制管脚状态以模拟I2C通信波形。
硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。
模拟I2C 是通过GPIO,软件模拟寄存器的工作方式,而硬件(固件)I2C是直接调用内部寄存器进行配置。如果要从具体硬件上来看,可以去看下芯片手册。因为固件I2C的端口是固定的,所以会有所区别。

如何区分
1、可以看底层配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC,否则就是模拟
2、可以看IIC写函数,看里面有木有调用现成的函数或者给某个寄存器赋值,如果有,则肯定是固件IIC功能,没有的话肯定是数据一个bit一个bit模拟发生送的,肯定用到了循环,则为模拟。
3、根据代码量判断,模拟的代码量肯定比固件的要大。
·硬件IIC用法比较复杂,模拟IIC的流程更清楚一些。
· 硬件IIC速度比模拟快,并且可以用DMA
· 模拟IIC可以在任何管脚上,而硬件只能在固定管脚上
4、软件i2c是程序员使用程序控制SCL,SDA线输出高低电平,模拟i2c协议的时序。一般较硬件i2c稳定,但是程序较为繁琐,但不难。
5、硬件i2c程序员只要调用i2c的控制函数即可,不用直接的去控制SCL,SDA高低电平的输出。但是有些单片机的硬件i2c不太稳定,调试问题较多。

1.2 AHT20
AHT20,新一代温湿度传感器在尺寸与智能 方面建立了新的标准:它嵌入了适于回流焊 的双列扁平无引脚SMD 封装,底面 3 x 3mm , 高度1.0mm。传感器输出经过标定的数字信 号,标准 IIC 格式。
在这里插入图片描述

二、过程

2.1根据资料链接stm32开发板和AHT20模块
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.2 修改代码
本次实验代码是在野火官方提供的代码基础上修改的。
最终结果如图:
在这里插入图片描述

main.c

#include "stm32f10x.h"
#include "bsp_usart.h"
#include "delay.h"
#include "bsp_aht20.h"
#include "bsp_led.h"


int main(void)
{
   

	u32 CT_data[2]={
   0};
    volatile float  hum=0,temp=0;     
     
	USART_Config();			//USART1初始化
	LED_GPIO_Config();		//LED端口初始化
    delay_init();	    	//延时函数初始化	  
    temphum_init();         //初始化温湿度传感器
	
	while(1)
	{
   
        AHT20_Read_CTdata(CT_data);       //不经过CRC校验,直接读取AHT20的温度和湿度数据 

        hum = CT_data[0]*100*10/1024/1024;  //计算得到湿度值(放大了10倍)
        temp = CT_data[1]*200*10/1024/1024-500;//计算得到温度值(放大了10倍)

        printf("湿度:%.1f%%\r\n",(hum/10));
        printf("温度:%.1f度\r\n",(temp/10));
        printf("\r\n");
        
        /*绿灯闪烁提示串口发送状态*/
        green_led_on;
        delay_ms(1000);
		green_led_off;
        delay_ms(1000);
	 }
}

bsp_usart.c

#include "bsp_usart.h"


// 接收缓冲,最大100个字节
uint8_t USART_RX_BUF[100];
// 接收状态标记位
uint16_t USART_RX_FLAG=0;


/**************************************************
		配置嵌套向量中断控制器NVIC
**************************************************/
static void NVIC_Configuration(void)
{
   
  NVIC_InitTypeDef NVIC_InitStructure;
  
  // 嵌套向量中断控制器组选择
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  // 配置USART为中断源
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  // 抢断优先级
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  // 子优先级
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  // 使能中断
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  // 初始化配置NVIC
  NVIC_Init(&NVIC_InitStructure);
}


/**************************************************
			USART初始化配置
**************************************************/
void USART_Config(void)
{
   
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	// 打开串口GPIO的时钟
	DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
	
	// 打开串口外设的时钟
	DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

	// 将USART Tx的GPIO配置为推挽复用模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
	
	// 配置串口的工作参数
	// 配置波特率
	USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
	// 配置 针数据字长
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	// 配置停止位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	// 配置校验位
	USART_InitStructure.USART_Parity = USART_Parity_No ;
	// 配置硬件流控制
	USART_InitStructure.USART_HardwareFlowControl = 
	USART_HardwareFlowControl_None;
	// 配置工作模式,收发一起
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	// 完成串口的初始化配置
	USART_Init(DEBUG_USARTx, &USART_InitStructure);
	
	// 串口中断优先级配置
	NVIC_Configuration();
	
	// 使能串口接收中断
	USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);	
	
	// 使能串口
	USART_Cmd(DEBUG_USARTx, ENABLE);
}




/**************************************************
			发送一个字节
**************************************************/
void Usart_SendByte(USART_TypeDef * pUSARTx, uint8_t ch)
{
   
	// 发送一个字节数据到USART
	USART_SendData(pUSARTx, ch);
	// 等待发送数据寄存器为空
	while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}




/**************************************************
				发送字符串
**************************************************/
void Usart_SendString(USART_TypeDef * pUSARTx, char *str)
{
   
	do
	{
   
		Usart_SendByte(pUSARTx, *str++);
	}while(*str != '\0');
	// 等待发送完成
	while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值