本文主要是介绍STM32103C8通过IIC采集温度(基于AHT20),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
通过IIC采集温度
- 一、IIC
- 1.1 IIC介绍
- 1.2 通信原理
- 1.3 分类
- 二、实现采集
- 三、屏显
- 四、总结
- 五、参考资料
一、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 通信原理
- 主模式时,I2C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止
- 条件结束。起始条件和停止条件都是在主模式下由软件控制产生。
- 从模式时,I2C接口能识别它自己的地址(7位或10位)和广播呼叫地址。软件能够控制开启或禁止广播呼叫地址的识别。
- 数据和地址按8位/字节进进行传输,高位在前。跟在起始条件后的1或2个字节是地址(7位模式为1个字节,10位模式为2个字节)。地址只在主模式发送。
- 在一个字节传输的8个时钟后的第9个时钟期间,接收器必须回送一个应答位(ACK)给发送器。
1.3 分类
在使用IIC时,有两种使用方法,第一种是硬件IIC,即通过硬件上的IIC接口发送数据,第二种是软件IIC,通过控制GPIO接口的输出来模拟IIC,就如通信原理图一般这次使用的软件IIC,硬件IIC速度更快,但软件IIC更灵活。
二、实现采集
实现代码是使用的是学姐的代码,她用的是rct6需要更换设备和更改内存大小
这个方法不再赘述,在我的另一篇文章当中有讲:
https://blog.csdn.net/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.csdn.net/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.csdn.net/junseven164/article/details/121384743?spm=1001.2014.3001.5501
这篇关于STM32103C8通过IIC采集温度(基于AHT20)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!