STM32103C8通过IIC采集温度(基于AHT20)

本文详细介绍了使用IIC协议通过软件模拟从模式读取AHT20温湿度传感器数据的过程,包括IIC通信原理、代码实现、屏显功能以及遇到的问题与解决办法。通过结合OLED显示屏,实现了数据显示。最后总结了IIC总线的简单性和代码理解的重要性。

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

一、IIC

1.1 IIC介绍

IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。I²C的正确读法为“I平方C”(“I-squared-C”),而“I二C”(“I-two-C”)则是另一种错误但被广泛使用的读法。自2006年10月1日起,使用I²C协议已经不需要支付专利费,但制造商仍然需要付费以获取I²C从属设备地址。

1.2 通信原理

  1. 主模式时,I2C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止
  2. 条件结束。起始条件和停止条件都是在主模式下由软件控制产生。
  3. 从模式时,I2C接口能识别它自己的地址(7位或10位)和广播呼叫地址。软件能够控制开启或禁止广播呼叫地址的识别。
  4. 数据和地址按8位/字节进进行传输,高位在前。跟在起始条件后的1或2个字节是地址(7位模式为1个字节,10位模式为2个字节)。地址只在主模式发送。
  5. 在一个字节传输的8个时钟后的第9个时钟期间,接收器必须回送一个应答位(ACK)给发送器。

1.3 分类

在使用IIC时,有两种使用方法,第一种是硬件IIC,即通过硬件上的IIC接口发送数据,第二种是软件IIC,通过控制GPIO接口的输出来模拟IIC,就如通信原理图一般这次使用的软件IIC,硬件IIC速度更快,但软件IIC更灵活。

二、实现采集

实现代码是使用的是学姐的代码,她用的是rct6需要更换设备和更改内存大小
这个方法不再赘述,在我的另一篇文章当中有讲:

https://blog.youkuaiyun.com/qq_54658073/article/details/121566301?spm=1001.2014.3001.5501

然后我们看一下代码

void read_AHT20(void)
{
	uint8_t   i;

	for(i=0; i<6; i++)
	{
		readByte[i]=0;
	}
	I2C_Start();//I2C启动

	I2C_WriteByte(0x71);//I2C写数据
	ack_status = Receive_ACK();//收到的应答信息
	readByte[0]= I2C_ReadByte();//I2C读取数据
	Send_ACK();//发送应答信息

	readByte[1]= I2C_ReadByte();
	Send_ACK();

	readByte[2]= I2C_ReadByte();
	Send_ACK();

	readByte[3]= I2C_ReadByte();
	Send_ACK();

	readByte[4]= I2C_ReadByte();
	Send_ACK();

	readByte[5]= I2C_ReadByte();
	SendNot_Ack();
	//Send_ACK();

	I2C_Stop();//I2C停止函数
	//判断读取到的第一个字节是不是0x08,0x08是该芯片读取流程中规定的,如果读取过程没有问题,就对读到的数据进行相应的处理
	if( (readByte[0] & 0x68) == 0x08 )
	{
		H1 = readByte[1];
		H1 = (H1<<8) | readByte[2];
		H1 = (H1<<8) | readByte[3];
		H1 = H1>>4;

		H1 = (H1*1000)/1024/1024;

		T1 = readByte[3];
		T1 = T1 & 0x0000000F;
		T1 = (T1<<8) | readByte[4];
		T1 = (T1<<8) | readByte[5];

		T1 = (T1*2000)/1024/1024 - 500;

		AHT20_OutData[0] = (H1>>8) & 0x000000FF;
		AHT20_OutData[1] = H1 & 0x000000FF;

		AHT20_OutData[2] = (T1>>8) & 0x000000FF;
		AHT20_OutData[3] = T1 & 0x000000FF;
	}
	else
	{
		AHT20_OutData[0] = 0xFF;
		AHT20_OutData[1] = 0xFF;

		AHT20_OutData[2] = 0xFF;
		AHT20_OutData[3] = 0xFF;
		printf("读取失败!!!");

	}
	printf("\r\n");
	//根据AHT20芯片中,温度和湿度的计算公式,得到最终的结果,通过串口显示
	printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);
	printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);
	printf("\r\n");
}

这里的注释已经写得很明显了,读取温湿度并通过usart串口发送信息回来
再看一下bsp_i2c.h里面关于SDA和SCL的定义,这两个就是对应要接的引脚

PB6接SCL
PB7接SDA

运行结果:
在这里插入图片描述

三、屏显

这个实验其实就是将oled显示的实验中的显示屏显示与这个实验相结合。
增加一个屏显函数

void show_info(){
  GUI_ShowCHinese(10,10,16,"温湿度显示",1);
  GUI_ShowString(5,50,"温度显示:",16,1);
	GUI_ShowNum(40,50,T1/100,1,16,1);
	GUI_ShowNum(49,50,(T1/10)%10,1,16,1);
	GUI_ShowString(56,50,".",16,1);
	GUI_ShowNum(58,50,T1%10,1,16,1);
	
	GUI_ShowString(70,50,"湿度显示:",16,1);
	GUI_ShowNum(100,50,H1/100,1,16,1);
	GUI_ShowNum(109,50,(H1/10)%10,1,16,1);
	GUI_ShowString(116,50,".",16,1);
	GUI_ShowNum(118,50,H1%10,1,16,1);
}

main函数

int main(void)
{	
	delay_init();     	  
	uart_init(115200);	 
	IIC_Init();
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
		while(1)
	{
		printf("温度湿度显示");
		read_AHT20_once();//读取温湿度
		show_info();//显示
		delay_ms(5000);//延时
		OLED_Clear(0);//清屏
		read_AHT20_once();//读取温湿度
		show_info();
		delay_ms(5000);
		OLED_Clear(0);
		
  }
}

显示效果
在这里插入图片描述

四、总结

I2C总线是一种简单双向二进制同步串行总线,只需两根双向I/O线即可以实现连接在总线上的器件之间的信息传递。这是非常简单的。但是对于代码的理解还是没有特别深入。特别是对于两个实验相结合的时候,我一直不行。还好是在学长学姐的博客的帮助下,还是解决了这个问题。原来是没有吧OLED显示实验的头文件什么的导入进来,导致了两个实验的冲突。

五、参考资料

https://blog.youkuaiyun.com/qq_43279579/article/details/111597278?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163713884016780357227434%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163713884016780357227434&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v2~rank_v29-3-111597278.pc_v2_rank_blog_default&utm_term=%E6%B8%A9%E6%B9%BF%E5%BA%A6&spm=1018.2226.3001.4450
https://blog.youkuaiyun.com/junseven164/article/details/121384743?spm=1001.2014.3001.5501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值