IIC协议读取温湿度数据

该博客介绍了使用STM32F103完成基于I2C协议的AHT20温湿度传感器数据采集实验。包括用CUBEMX软件配置RCC、SYS等,编译代码时添加AHT代码文件,最终实现每隔2秒采集一次数据并通过串口发送到上位机,还总结了实验收获及注意事项。

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

1、实验内容:

使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。实现每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机。

2、CUBEMX软件来配置

1、配置RCC
在这里插入图片描述
2、配置SYS
在这里插入图片描述

3、配置I2C
在这里插入图片描述
4、配置时钟树
在这里插入图片描述

5、配置USART
在这里插入图片描述

在这里插入图片描述
6、配置NVIC
在这里插入图片描述

7、创建项目,并打开
在这里插入图片描述
在这里插入图片描述

2、编译代码

1、添加AHT代码文件
AHT20-21_DEMO_V1_3.c

/*******************************************/
/*@°æÈ¨ËùÓУº¹ãÖݰÂËɵç×ÓÓÐÏÞ¹«Ë¾          */
/*@×÷ÕߣºÎÂʪ¶È´«¸ÐÆ÷ÊÂÒµ²¿                */
/*@°æ±¾£ºV1.2                              */
/*******************************************/
#include "stm32f10x.h" 
#include "AHT20-21_DEMO_V1_3.h" 




void Delay_N10us(uint32_t t)//ÑÓʱº¯Êý
{
  uint32_t k;

   while(t--)
  {
    for (k = 0; k < 2; k++);//110
  }
}

void SensorDelay_us(uint32_t t)//ÑÓʱº¯Êý
{
		
	for(t = t-2; t>0; t--)
	{
		Delay_N10us(1);
	}
}

void Delay_4us(void)		//ÑÓʱº¯Êý
{	
	Delay_N10us(1);
	Delay_N10us(1);
	Delay_N10us(1);
	Delay_N10us(1);
}
void Delay_5us(void)		//ÑÓʱº¯Êý
{	
	Delay_N10us(1);
	Delay_N10us(1);
	Delay_N10us(1);
	Delay_N10us(1);
	Delay_N10us(1);

}

void Delay_1ms(uint32_t t)		//ÑÓʱº¯Êý
{
   while(t--)
  {
    SensorDelay_us(1000);//////ÑÓʱ1ms
  }
}


void AHT20_Clock_Init(void)		//ÑÓʱº¯Êý
{
	RCC_APB2PeriphClockCmd(CC_APB2Periph_GPIOB,ENABLE);
}

void SDA_Pin_Output_High(void)   //½«PB15ÅäÖÃΪÊä³ö £¬ ²¢ÉèÖÃΪ¸ßµçƽ£¬ PB15×÷ΪI2CµÄSDA
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,& GPIO_InitStruct);
	GPIO_SetBits(GPIOB,GPIO_Pin_15);
}

void SDA_Pin_Output_Low(void)  //½«P15ÅäÖÃΪÊä³ö  ²¢ÉèÖÃΪµÍµçƽ
{

	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,& GPIO_InitStruct);
	GPIO_ResetBits(GPIOB,GPIO_Pin_15);
}

void SDA_Pin_IN_FLOATING(void)  //SDAÅäÖÃΪ¸¡¿ÕÊäÈë
{

	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init( GPIOB,&GPIO_InitStruct);
}

void SCL_Pin_Output_High(void) //SCLÊä³ö¸ßµçƽ£¬P14×÷ΪI2CµÄSCL
{
	GPIO_SetBits(GPIOB,GPIO_Pin_14);
}

void SCL_Pin_Output_Low(void) //SCLÊä³öµÍµçƽ
{
	GPIO_ResetBits(GPIOB,GPIO_Pin_14);
}

void Init_I2C_Sensor_Port(void) //³õʼ»¯I2C½Ó¿Ú,Êä³öΪ¸ßµçƽ
{	
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,& GPIO_InitStruct);
	GPIO_SetBits(GPIOB,GPIO_Pin_15);//Êä³ö¸ßµçƽ
	
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,& GPIO_InitStruct);
	GPIO_SetBits(GPIOB,GPIO_Pin_15);//Êä³ö¸ßµçƽ
	
}
void I2C_Start(void)		 //I2CÖ÷»ú·¢ËÍSTARTÐźÅ
{
	SDA_Pin_Output_High();
	SensorDelay_us(8);
	SCL_Pin_Output_High();
	SensorDelay_us(8);
	SDA_Pin_Output_Low();
	SensorDelay_us(8);
	SCL_Pin_Output_Low();
	SensorDelay_us(8);   
}


void AHT20_WR_Byte(uint8_t Byte) //ÍùAHT20дһ¸ö×Ö½Ú
{
	uint8_t Data,N,i;	
	Data=Byte;
	i = 0x80;
	for(N=0;N<8;N++)
	{
		SCL_Pin_Output_Low(); 
		Delay_4us();	
		if(i&Data)
		{
			SDA_Pin_Output_High();
		}
		else
		{
			SDA_Pin_Output_Low();
		}	
			
    SCL_Pin_Output_High();
		Delay_4us();
		Data <<= 1;
		 
	}
	SCL_Pin_Output_Low();
	SensorDelay_us(8);   
	SDA_Pin_IN_FLOATING();
	SensorDelay_us(8);	
}	


uint8_t AHT20_RD_Byte(void)//´ÓAHT20¶Áȡһ¸ö×Ö½Ú
{
	uint8_t Byte,i,a;
	Byte = 0;
	SCL_Pin_Output_Low();
	SDA_Pin_IN_FLOATING();
	SensorDelay_us(8);	
	for(i=0;i<8;i++)
	{
    SCL_Pin_Output_High();		
		Delay_5us();
		a=0;
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)) a=1;
		Byte = (Byte<<1)|a;
		SCL_Pin_Output_Low();
		Delay_5us();
	}
  SDA_Pin_IN_FLOATING();
	SensorDelay_us(8);	
	return Byte;
}


uint8_t Receive_ACK(void)   //¿´AHT20ÊÇ·ñÓлظ´ACK
{
	uint16_t CNT;
	CNT = 0;
	SCL_Pin_Output_Low();	
	SDA_Pin_IN_FLOATING();
	SensorDelay_us(8);	
	SCL_Pin_Output_High();	
	SensorDelay_us(8);	
	while((GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15))  && CNT < 100) 
	CNT++;
	if(CNT == 100)
	{
		return 0;
	}
 	SCL_Pin_Output_Low();	
	SensorDelay_us(8);	
	return 1;
}

void Send_ACK(void)		  //Ö÷»ú»Ø¸´ACKÐźÅ
{
	SCL_Pin_Output_Low();	
	SensorDelay_us(8);	
	SDA_Pin_Output_Low();
	SensorDelay_us(8);	
	SCL_Pin_Output_High();	
	SensorDelay_us(8);
	SCL_Pin_Output_Low();	
	SensorDelay_us(8);
	SDA_Pin_IN_FLOATING();
	SensorDelay_us(8);
}

void Send_NOT_ACK(void)	//Ö÷»ú²»»Ø¸´ACK
{
	SCL_Pin_Output_Low();	
	SensorDelay_us(8);
	SDA_Pin_Output_High();
	SensorDelay_us(8);
	SCL_Pin_Output_High();	
	SensorDelay_us(8);		
	SCL_Pin_Output_Low();	
	SensorDelay_us(8);
    SDA_Pin_Output_Low();
	SensorDelay_us(8);
}

void Stop_I2C(void)	  //Ò»ÌõЭÒé½áÊø
{
	SDA_Pin_Output_Low();
	SensorDelay_us(8);
	SCL_Pin_Output_High();	
	SensorDelay_us(8);
	SDA_Pin_Output_High();
	SensorDelay_us(8);
}

uint8_t AHT20_Read_Status(void)//¶ÁÈ¡AHT20µÄ״̬¼Ä´æÆ÷
{

	uint8_t Byte_first;	
	I2C_Start();
	AHT20_WR_Byte(0x71);
	Receive_ACK();
	Byte_first = AHT20_RD_Byte();
	Send_NOT_ACK();
	Stop_I2C();
	return Byte_first;
}

uint8_t AHT20_Read_Cal_Enable(void)  //²éѯcal enableλÓÐûÓÐʹÄÜ
{
	uint8_t val = 0;//ret = 0,
  val = AHT20_Read_Status();
	 if((val & 0x68)==0x08)
		 return 1;
   else  return 0;
 }

void AHT20_SendAC(void) //ÏòAHT20·¢ËÍACÃüÁî
{

	I2C_Start();
	AHT20_WR_Byte(0x70);
	Receive_ACK();
	AHT20_WR_Byte(0xac);//0xAC²É¼¯ÃüÁî
	Receive_ACK();
	AHT20_WR_Byte(0x33);
	Receive_ACK();
	AHT20_WR_Byte(0x00);
	Receive_ACK();
	Stop_I2C();

}

//CRCУÑéÀàÐÍ£ºCRC8/MAXIM
//¶àÏîʽ£ºX8+X5+X4+1
//Poly£º0011 0001  0x31
//¸ßλ·Åµ½ºóÃæ¾Í±ä³É 1000 1100 0x8c
//CÏÖʵ´úÂ룺
uint8_t Calc_CRC8(uint8_t *message,uint8_t Num)
{
        uint8_t i;
        uint8_t byte;
        uint8_t crc=0xFF;
  for(byte=0; byte<Num; byte++)
  {
    crc^=(message[byte]);
    for(i=8;i>0;--i)
    {
      if(crc&0x80) crc=(crc<<1)^0x31;
      else crc=(crc<<1);
    }
  }
        return crc;
}

void AHT20_Read_CTdata(uint32_t *ct) //ûÓÐCRCУÑ飬ֱ½Ó¶ÁÈ¡AHT20µÄζȺÍʪ¶ÈÊý¾Ý
{
	volatile uint8_t  Byte_1th=0;
	volatile uint8_t  Byte_2th=0;
	volatile uint8_t  Byte_3th=0;
	volatile uint8_t  Byte_4th=0;
	volatile uint8_t  Byte_5th=0;
	volatile uint8_t  Byte_6th=0;
	 uint32_t RetuData = 0;
	uint16_t cnt = 0;
	AHT20_SendAC();//ÏòAHT10·¢ËÍACÃüÁî
	Delay_1ms(80);//ÑÓʱ80ms×óÓÒ	
    cnt = 0;
	while(((AHT20_Read_Status()&0x80)==0x80))//Ö±µ½×´Ì¬bit[7]Ϊ0£¬±íʾΪ¿ÕÏÐ״̬£¬ÈôΪ1£¬±íʾæ״̬
	{
		SensorDelay_us(1508);
		if(cnt++>=100)
		{
		 break;
		 }
	}
	I2C_Start();
	AHT20_WR_Byte(0x71);
	Receive_ACK();
	Byte_1th = AHT20_RD_Byte();//״̬×Ö£¬²éѯµ½×´Ì¬Îª0x98,±íʾΪæ״̬£¬bit[7]Ϊ1£»×´Ì¬Îª0x1C£¬»òÕß0x0C£¬»òÕß0x08±íʾΪ¿ÕÏÐ״̬£¬bit[7]Ϊ0
	Send_ACK();
	Byte_2th = AHT20_RD_Byte();//ʪ¶È
	Send_ACK();
	Byte_3th = AHT20_RD_Byte();//ʪ¶È
	Send_ACK();
	Byte_4th = AHT20_RD_Byte();//ʪ¶È/ζÈ
	Send_ACK();
	Byte_5th = AHT20_RD_Byte();//ζÈ
	Send_ACK();
	Byte_6th = AHT20_RD_Byte();//ζÈ
	Send_NOT_ACK();
	Stop_I2C();

	RetuData = (RetuData|Byte_2th)<<8;
	RetuData = (RetuData|Byte_3th)<<8;
	RetuData = (RetuData|Byte_4th);
	RetuData =RetuData >>4;
	ct[0] = RetuData;//ʪ¶È
	RetuData = 0;
	RetuData = (RetuData|Byte_4th)<<8;
	RetuData = (RetuData|Byte_5th)<<8;
	RetuData = (RetuData|Byte_6th);
	RetuData = RetuData&0xfffff;
	ct[1] =RetuData; //ζÈ

}


void AHT20_Read_CTdata_crc(uint32_t *ct) //CRCУÑéºó£¬¶ÁÈ¡AHT20µÄζȺÍʪ¶ÈÊý¾Ý
{
	volatile uint8_t  Byte_1th=0;
	volatile uint8_t  Byte_2th=0;
	volatile uint8_t  Byte_3th=0;
	volatile uint8_t  Byte_4th=0;
	volatile uint8_t  Byte_5th=0;
	volatile uint8_t  Byte_6th=0;
	volatile uint8_t  Byte_7th=0;
	 uint32_t RetuData = 0;
	 uint16_t cnt = 0;
	// uint8_t  CRCDATA=0;
	 uint8_t  CTDATA[6]={0};//ÓÃÓÚCRC´«µÝÊý×é
	
	AHT20_SendAC();//ÏòAHT10·¢ËÍACÃüÁî
	Delay_1ms(80);//ÑÓʱ80ms×óÓÒ	
    cnt = 0;
	while(((AHT20_Read_Status()&0x80)==0x80))//Ö±µ½×´Ì¬bit[7]Ϊ0£¬±íʾΪ¿ÕÏÐ״̬£¬ÈôΪ1£¬±íʾæ״̬
	{
		SensorDelay_us(1508);
		if(cnt++>=100)
		{
		 break;
		}
	}
	
	I2C_Start();

	AHT20_WR_Byte(0x71);
	Receive_ACK();
	CTDATA[0]=Byte_1th = AHT20_RD_Byte();//״̬×Ö£¬²éѯµ½×´Ì¬Îª0x98,±íʾΪæ״̬£¬bit[7]Ϊ1£»×´Ì¬Îª0x1C£¬»òÕß0x0C£¬»òÕß0x08±íʾΪ¿ÕÏÐ״̬£¬bit[7]Ϊ0
	Send_ACK();
	CTDATA[1]=Byte_2th = AHT20_RD_Byte();//ʪ¶È
	Send_ACK();
	CTDATA[2]=Byte_3th = AHT20_RD_Byte();//ʪ¶È
	Send_ACK();
	CTDATA[3]=Byte_4th = AHT20_RD_Byte();//ʪ¶È/ζÈ
	Send_ACK();
	CTDATA[4]=Byte_5th = AHT20_RD_Byte();//ζÈ
	Send_ACK();
	CTDATA[5]=Byte_6th = AHT20_RD_Byte();//ζÈ
	Send_ACK();
	Byte_7th = AHT20_RD_Byte();//CRCÊý¾Ý
	Send_NOT_ACK();                           //×¢Òâ: ×îºóÊÇ·¢ËÍNAK
	Stop_I2C();
	
	if(Calc_CRC8(CTDATA,6)==Byte_7th)
	{
	RetuData = (RetuData|Byte_2th)<<8;
	RetuData = (RetuData|Byte_3th)<<8;
	RetuData = (RetuData|Byte_4th);
	RetuData =RetuData >>4;
	ct[0] = RetuData;//ʪ¶È
	RetuData = 0;
	RetuData = (RetuData|Byte_4th)<<8;
	RetuData = (RetuData|Byte_5th)<<8;
	RetuData = (RetuData|Byte_6th);
	RetuData = RetuData&0xfffff;
	ct[1] =RetuData; //ζÈ
		
	}
	else
	{
		ct[0]=0x00;
		ct[1]=0x00;//УÑé´íÎó·µ»ØÖµ£¬¿Í»§¿ÉÒÔ¸ù¾Ý×Ô¼ºÐèÒª¸ü¸Ä
	}//CRCÊý¾Ý
}


void AHT20_Init(void)   //³õʼ»¯AHT20
{	
	Init_I2C_Sensor_Port();
	I2C_Start();
	AHT20_WR_Byte(0x70);
	Receive_ACK();
	AHT20_WR_Byte(0xa8);//0xA8½øÈëNOR¹¤×÷ģʽ
	Receive_ACK();
	AHT20_WR_Byte(0x00);
	Receive_ACK();
	AHT20_WR_Byte(0x00);
	Receive_ACK();
	Stop_I2C();

	Delay_1ms(10);//ÑÓʱ10ms×óÓÒ

	I2C_Start();
	AHT20_WR_Byte(0x70);
	Receive_ACK();
	AHT20_WR_Byte(0xbe);//0xBE³õʼ»¯ÃüÁAHT20µÄ³õʼ»¯ÃüÁîÊÇ0xBE,   AHT10µÄ³õʼ»¯ÃüÁîÊÇ0xE1
	Receive_ACK();
	AHT20_WR_Byte(0x08);//Ïà¹Ø¼Ä´æÆ÷bit[3]ÖÃ1£¬ÎªÐ£×¼Êä³ö
	Receive_ACK();
	AHT20_WR_Byte(0x00);
	Receive_ACK();
	Stop_I2C();
	Delay_1ms(10);//ÑÓʱ10ms×óÓÒ
}
void JH_Reset_REG(uint8_t addr)
{
	
	uint8_t Byte_first,Byte_second,Byte_third,Byte_fourth;
	I2C_Start();
	AHT20_WR_Byte(0x70);//Ô­À´ÊÇ0x70
	Receive_ACK();
	AHT20_WR_Byte(addr);
	Receive_ACK();
	AHT20_WR_Byte(0x00);
	Receive_ACK();
	AHT20_WR_Byte(0x00);
	Receive_ACK();
	Stop_I2C();

	Delay_1ms(5);//ÑÓʱ5ms×óÓÒ
	I2C_Start();
	AHT20_WR_Byte(0x71);//
	Receive_ACK();
	Byte_first = AHT20_RD_Byte();
	Send_ACK();
	Byte_second = AHT20_RD_Byte();
	Send_ACK();
	Byte_third = AHT20_RD_Byte();
	Send_NOT_ACK();
	Stop_I2C();
	
    Delay_1ms(10);//ÑÓʱ10ms×óÓÒ
	I2C_Start();
	AHT20_WR_Byte(0x70);///
	Receive_ACK();
	AHT20_WR_Byte(0xB0|addr);////¼Ä´æÆ÷ÃüÁî
	Receive_ACK();
	AHT20_WR_Byte(Byte_second);
	Receive_ACK();
	AHT20_WR_Byte(Byte_third);
	Receive_ACK();
	Stop_I2C();
	
	Byte_second=0x00;
	Byte_third =0x00;
}

void AHT20_Start_Init(void)
{
	JH_Reset_REG(0x1b);
	JH_Reset_REG(0x1c);
	JH_Reset_REG(0x1e);
}

int32_t main(void)
{
    uint32_t CT_data[2];
	volatile int  c1,t1;
	/***********************************************************************************/
	/**///¢Ù¸ÕÉϵ磬²úƷоƬÄÚ²¿¾ÍÐ÷ÐèҪʱ¼ä£¬ÑÓʱ100~500ms,½¨Òé500ms
	/***********************************************************************************/
	Delay_1ms(500);
	/***********************************************************************************/
	/**///¢ÚÉϵçµÚÒ»´Î·¢0x71¶Áȡ״̬×Ö£¬ÅжÏ״̬×ÖÊÇ·ñΪ0x18,Èç¹û²»ÊÇ0x18,½øÐмĴæÆ÷³õʼ»¯
	/***********************************************************************************/
	if((AHT20_Read_Status()&0x18)!=0x18)
	{
	AHT20_Start_Init(); //ÖØÐ³õʼ»¯¼Ä´æÆ÷
	Delay_1ms(10);
	}
	
	/***********************************************************************************/
	/**///¢Û¸ù¾Ý¿Í»§×Ô¼ºÐèÇó·¢²âÁ¿ÃüÁî¶ÁÈ¡ÎÂʪ¶ÈÊý¾Ý£¬µ±Ç°while£¨1£©Ñ­»··¢²âÁ¿ÃüÁî¶ÁÈ¡ÎÂʪ¶ÈÊý¾Ý£¬½ö¹©²Î¿¼
	/***********************************************************************************/
	while(1)
	{
	 AHT20_Read_CTdata(CT_data);       //²»¾­¹ýCRCУÑ飬ֱ½Ó¶ÁÈ¡AHT20µÄζȺÍʪ¶ÈÊý¾Ý    ÍÆ¼öÿ¸ô´óÓÚ1S¶ÁÒ»´Î
    //AHT20_Read_CTdata_crc(CT_data);  //crcУÑéºó£¬¶ÁÈ¡AHT20µÄζȺÍʪ¶ÈÊý¾Ý 
	

	 c1 = CT_data[0]*100*10/1024/1024;  //¼ÆËãµÃµ½Êª¶ÈÖµc1£¨·Å´óÁË10±¶£©
	 t1 = CT_data[1]*200*10/1024/1024-500;//¼ÆËãµÃµ½Î¶ÈÖµt1£¨·Å´óÁË10±¶£©
	////ÏÂÒ»²½¿Í»§´¦ÀíÏÔʾÊý¾Ý£¬
	 }

 }	

AHT20-21_DEMO_V1_3.h 文件

#ifndef _AHT20_DEMO_
#define _AHT20_DEMO_

#include "stm32f10x.h"  

void Delay_N10us(uint32_t t);//ÑÓʱº¯Êý
void SensorDelay_us(uint32_t t);//ÑÓʱº¯Êý
void Delay_4us(void);		//ÑÓʱº¯Êý
void Delay_5us(void);		//ÑÓʱº¯Êý
void Delay_1ms(uint32_t t);	
void AHT20_Clock_Init(void);		//ÑÓʱº¯Êý
void SDA_Pin_Output_High(void)  ; //½«PB15ÅäÖÃΪÊä³ö £¬ ²¢ÉèÖÃΪ¸ßµçƽ£¬ PB15×÷ΪI2CµÄSDA
void SDA_Pin_Output_Low(void);  //½«P15ÅäÖÃΪÊä³ö  ²¢ÉèÖÃΪµÍµçƽ
void SDA_Pin_IN_FLOATING(void);  //SDAÅäÖÃΪ¸¡¿ÕÊäÈë
void SCL_Pin_Output_High(void); //SCLÊä³ö¸ßµçƽ£¬P14×÷ΪI2CµÄSCL
void SCL_Pin_Output_Low(void); //SCLÊä³öµÍµçƽ
void Init_I2C_Sensor_Port(void); //³õʼ»¯I2C½Ó¿Ú,Êä³öΪ¸ßµçƽ
void I2C_Start(void);		 //I2CÖ÷»ú·¢ËÍSTARTÐźÅ
void AHT20_WR_Byte(uint8_t Byte); //ÍùAHT20дһ¸ö×Ö½Ú
uint8_t AHT20_RD_Byte(void);//´ÓAHT20¶Áȡһ¸ö×Ö½Ú
uint8_t Receive_ACK(void);   //¿´AHT20ÊÇ·ñÓлظ´ACK
void Send_ACK(void)	;	  //Ö÷»ú»Ø¸´ACKÐźÅ
void Send_NOT_ACK(void);	//Ö÷»ú²»»Ø¸´ACK
void Stop_I2C(void);	  //Ò»ÌõЭÒé½áÊø
uint8_t AHT20_Read_Status(void);//¶ÁÈ¡AHT20µÄ״̬¼Ä´æÆ÷
uint8_t AHT20_Read_Cal_Enable(void);  //²éѯcal enableλÓÐûÓÐʹÄÜ
void AHT20_SendAC(void); //ÏòAHT20·¢ËÍACÃüÁî
uint8_t Calc_CRC8(uint8_t *message,uint8_t Num);
void AHT20_Read_CTdata(uint32_t *ct); //ûÓÐCRCУÑ飬ֱ½Ó¶ÁÈ¡AHT20µÄζȺÍʪ¶ÈÊý¾Ý
void AHT20_Read_CTdata_crc(uint32_t *ct); //CRCУÑéºó£¬¶ÁÈ¡AHT20µÄζȺÍʪ¶ÈÊý¾Ý
void AHT20_Init(void);   //³õʼ»¯AHT20
void JH_Reset_REG(uint8_t addr);///ÖØÖüĴæÆ÷
void AHT20_Start_Init(void);///Éϵç³õʼ»¯½øÈëÕý³£²âÁ¿×´Ì¬

3、实验结果

在这里插入图片描述

4、实验总结

了解学习了I2C协议,这次试验既是对I2C有了清晰的认识,也对C8T6有了更多的学习。该实验没有太多的操作流程,按照参考的资料和博客理论上就可以大概完成了,值得注意的是,在连接奥松AHT20传感器一定要注意引脚的接法,接错可能会导致其损坏,说明图可见前面的图片,详细的可查看资料AHT20产品手册a2.pdf。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值